ZGlmZiAtLWdpdCBhL2ZpbmFsL0NNYWtlTGlzdHMudHh0IGIvZmluYWwvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxMTE4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMiBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikKK2FkZF9zdWJkaXJlY3RvcnkocnVudGltZSkKZGlmZiAtLWdpdCBhL2ZpbmFsL0NSRURJVFMudHh0IGIvZmluYWwvQ1JFRElUUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxZGEyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0NSRURJVFMudHh0CkBAIC0wLDAgKzEsNTMgQEAKK1RoaXMgZmlsZSBpcyBhIHBhcnRpYWwgbGlzdCBvZiBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhlIExMVk0vb3Blbm1wCitwcm9qZWN0LiAgSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgYSBwYXRjaCBvciBtYWRlIHNvbWUgb3RoZXIgY29udHJpYnV0aW9uIHRvCitMTFZNL29wZW5tcCwgcGxlYXNlIHN1Ym1pdCBhIHBhdGNoIHRvIHRoaXMgZmlsZSB0byBhZGQgeW91cnNlbGYsIGFuZCBpdCB3aWxsIGJlCitkb25lIQorCitUaGUgbGlzdCBpcyBzb3J0ZWQgYnkgc3VybmFtZSBhbmQgZm9ybWF0dGVkIHRvIGFsbG93IGVhc3kgZ3JlcHBpbmcgYW5kCitiZWF1dGlmaWNhdGlvbiBieSBzY3JpcHRzLiAgVGhlIGZpZWxkcyBhcmU6IG5hbWUgKE4pLCBlbWFpbCAoRSksIHdlYi1hZGRyZXNzCisoVyksIFBHUCBrZXkgSUQgYW5kIGZpbmdlcnByaW50IChQKSwgZGVzY3JpcHRpb24gKEQpLCBhbmQgc25haWwtbWFpbCBhZGRyZXNzCisoUykuCisKK046IENhcmxvIEJlcnRvbGxpCitXOiBodHRwOi8vaWJtLmNvbQorRDogSUJNIGNvbnRyaWJ1dG9yIHRvIFBvd2VyUEMgc3VwcG9ydCBpbiBDTWFrZSBmaWxlcyBhbmQgZWxzZXdoZXJlLgorCitOOiBTdW5pdGEgQ2hhbmRyYXNla2FyYW4KK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBCYXJiYXJhIENoYXBtYW4KK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBVbml2ZXJzaXR5IG9mIEhvdXN0b24gCitXOiBodHRwOi8vd2ViLmNzLnVoLmVkdS9+b3BlbnVoL2Rvd25sb2FkLworRDogT3BlblVIIHRlc3Qgc3VpdGUKKworTjogSW50ZWwgQ29ycG9yYXRpb24gT3Blbk1QIHJ1bnRpbWUgdGVhbQorVzogaHR0cDovL29wZW5tcHJ0bC5vcmcKK0Q6IENyZWF0ZWQgdGhlIHJ1bnRpbWUuCisKK046IEpvaG4gTWVsbG9yLUNydW1tZXkgYW5kIG90aGVyIG1lbWJlcnMgb2YgdGhlIE9wZW5NUCBUb29scyBXb3JraW5nIEdyb3VwCitFOiBqb2hubWNAcmljZS5lZHUKK0Q6IE9wZW5NUCBUb29scyBJbnRlcmZhY2UgKE9NUFQpCisKK046IE1hdHRoaWFzIE11bGxlcgorRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IFRhbCBOZXZvCitFOiB0YWxAc2NhbGVtcC5jb20KK0Q6IFNjYWxlTVAgY29udHJpYnV0b3IgdG8gaW1wcm92ZSBydW50aW1lIHBlcmZvcm1hbmNlIHRoZXJlLgorVzogaHR0cDovL3NjYWxlbXAuY29tCisKK046IFBhdmVsIE5leXRjaGV2CitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogU3RldmVuIE5vb25hbgorRTogc3RldmVuQHVwbGlua2xhYnMubmV0CitEOiBQYXRjaGVzIGZvciB0aGUgQVJNIGFyY2hpdGVjdHVyZSBhbmQgcmVtb3ZhbCBvZiBzZXZlcmFsIGluY29uc2lzdGVuY2llcy4KKworTjogQWxwIFRva2VyCitFOiBhbHBAbnVhbnRpLmNvbQorRDogTWFraW5nIGJ1aWxkIHdvcmsgZm9yIEZyZWVCU0QuCisKK046IENoZW5nIFdhbmcgCitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKZGlmZiAtLWdpdCBhL2ZpbmFsL0xJQ0VOU0UudHh0IGIvZmluYWwvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkYzIwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMTI0IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHNvZnR3YXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgYm90aCB0aGUKK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgIkJTRC1MaWtlIiBsaWNlbnNlIGFuZCB0aGUgTUlUIGxpY2Vuc2UuICBBcyBhIHVzZXIgb2YKK3RoaXMgY29kZSB5b3UgbWF5IGNob29zZSB0byB1c2UgaXQgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuICBBcyBhIGNvbnRyaWJ1dG9yLAoreW91IGFncmVlIHRvIGFsbG93IHlvdXIgY29kZSB0byBiZSB1c2VkIHVuZGVyIGJvdGguICBUaGUgZnVsbCB0ZXh0IG9mIHRoZQorcmVsZXZhbnQgbGljZW5zZXMgaXMgaW5jbHVkZWQgYmVsb3cuCisKK0luIGFkZGl0aW9uLCBhIGxpY2Vuc2UgYWdyZWVtZW50IGZyb20gdGhlIGNvcHlyaWdodC9wYXRlbnQgaG9sZGVycyBvZiB0aGUKK3NvZnR3YXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlIGlzIGluY2x1ZGVkIGJlbG93LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCitPcGVuIFNvdXJjZSBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMTk5Ny0yMDE1IEludGVsIENvcnBvcmF0aW9uCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0RldmVsb3BlZCBieToKKyAgICBPcGVuTVAgUnVudGltZSBUZWFtCisgICAgSW50ZWwgQ29ycG9yYXRpb24KKyAgICBodHRwOi8vd3d3Lm9wZW5tcHJ0bC5vcmcKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgd2l0aAordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBPcGVuTVAgUnVudGltZSBUZWFtIG5vciB0aGUKKyAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQ09OVFJJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBXSVRIIFRIRQorU09GVFdBUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5cmlnaHQgKGMpIDE5OTctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ludGVsIENvcnBvcmF0aW9uCisKK1NvZnR3YXJlIEdyYW50IExpY2Vuc2UgQWdyZWVtZW50ICgiQWdyZWVtZW50IikKKworRXhjZXB0IGZvciB0aGUgbGljZW5zZSBncmFudGVkIGhlcmVpbiB0byB5b3UsIEludGVsIENvcnBvcmF0aW9uICgiSW50ZWwiKSByZXNlcnZlcworYWxsIHJpZ2h0LCB0aXRsZSwgYW5kIGludGVyZXN0IGluIGFuZCB0byB0aGUgU29mdHdhcmUgKGRlZmluZWQgYmVsb3cpLgorCitEZWZpbml0aW9uCisKKyJTb2Z0d2FyZSIgbWVhbnMgdGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gYXMgd2VsbCBhcyBhbnkgb3JpZ2luYWwgd29yayBvZgorYXV0aG9yc2hpcCwgaW5jbHVkaW5nIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucyB0byBhbiBleGlzdGluZyB3b3JrLCB0aGF0CitpcyBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBieSBJbnRlbCB0byBsbHZtLm9yZyAoaHR0cDovL2xsdm0ub3JnKSAoIkxMVk0iKSBmb3IKK2luY2x1c2lvbiBpbiwgb3IgZG9jdW1lbnRhdGlvbiBvZiwgYW55IG9mIHRoZSBwcm9kdWN0cyBvd25lZCBvciBtYW5hZ2VkIGJ5IExMVk0KKyh0aGUgIldvcmsiKS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiIG1lYW5zIGFueSBmb3JtIG9mCitlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50IHRvIExMVk0gb3IgaXRzCityZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljCittYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlCittYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIExMVk0gZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZwordGhlIFdvcmssIGJ1dCBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG90aGVyd2lzZS4KKworMS4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKKyAgIEFncmVlbWVudCwgSW50ZWwgaGVyZWJ5IGdyYW50cyB0byB5b3UgYW5kIHRvIHJlY2lwaWVudHMgb2YgdGhlIFNvZnR3YXJlCisgICBkaXN0cmlidXRlZCBieSBMTFZNIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAgIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUKKyAgIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgIFNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MuCisKKzIuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCisgICBBZ3JlZW1lbnQsIEludGVsIGhlcmVieSBncmFudHMgeW91IGFuZCB0byByZWNpcGllbnRzIG9mIHRoZSBTb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgYnkgTExWTSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UKKyAgIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIKKyAgIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgYnkgSW50ZWwgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IEludGVsJ3MgU29mdHdhcmUgYWxvbmUgb3IgYnkKKyAgIGNvbWJpbmF0aW9uIG9mIHRoZSBTb2Z0d2FyZSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggU29mdHdhcmUgd2FzCisgICBzdWJtaXR0ZWQuIElmIGFueSBlbnRpdHkgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IEludGVsIG9yIGFueQorICAgb3RoZXIgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZworICAgdGhhdCBJbnRlbCdzIFNvZnR3YXJlLCBvciB0aGUgV29yayB0byB3aGljaCBJbnRlbCBoYXMgY29udHJpYnV0ZWQgY29uc3RpdHV0ZXMKKyAgIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQKKyAgIHRvIHRoYXQgZW50aXR5IHVuZGVyIHRoaXMgQWdyZWVtZW50IGZvciB0aGUgU29mdHdhcmUgb3IgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCB0aGUgc29mdHdhcmUgaXMKK3Byb3ZpZGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAorZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL01ha2VmaWxlIGIvZmluYWwvb2ZmbG9hZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NWUzNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9NYWtlZmlsZQpAQCAtMCwwICsxLDIyNCBAQAorIw0KKyMjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisjLy8NCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKyMvLw0KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuDQorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLg0KKyMvLw0KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKyMNCisNCisjIE1BS0VGSUxFIFBBUkFNRVRFUlMNCisjDQorIyByb290X2RpciAtIHBhdGggdG8gcm9vdCBkaXJlY3Rvcnkgb2YgbGlib2ZmbG9hZA0KKyMgYnVpbGRfZGlyIC0gcGF0aCB0byBidWlsZCBkaXJlY3RvcnkNCisjIG1wc3NfZGlyIC0gcGF0aCB0byByb290IGRpcmVjdG9yeSBvZiBtcHNzDQorIyBtcHNzX3ZlcnNpb24gLSB2ZXJzaW9uIG9mIHRoZSBtcHNzIChlLmcuLCB2ZXJzaW9uICIzLjMueCIgd291bGQgYmUgIjMzIikNCisjIGxpYmlvbXBfaG9zdF9kaXIgLSBwYXRoIHRvIGhvc3QgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgaXMgaWNjKQ0KKyMgbGliaW9tcF90YXJnZXRfZGlyIC0gcGF0aCB0byB0YXJnZXQgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNhcnJ5IGlmIGNvbXBpbGVyX3RhcmdldCBpcyBpY2MpDQorIyBvbXBfaGVhZGVyX2RpciAtIHBhdGggdG8gb21wLmggKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgYW5kIGNvbXBpbGVyX3RhcmdldCBhcmUgaWNjKQ0KKyMgb3NfaG9zdCAtIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbQ0KKyMgb3NfdGFyZ2V0IC0gdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0NCisjIGNvbXBpbGVyX2hvc3QgLSBob3N0IGNvbXBpbGVyDQorIyBjb21waWxlcl90YXJnZXQgLSB0YXJnZXQgY29tcGlsZXINCisjIG9wdGlvbnNfaG9zdCAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgaG9zdCBjb21waWxlcg0KKyMgb3B0aW9uc190YXJnZXQgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRhcmdldCBjb21waWxlcg0KKyMNCisNCisjIERpcmVjdG9yaWVzDQorcm9vdF9kaXI/PS4NCitidWlsZF9kaXI/PSQocm9vdF9kaXIpL2J1aWxkDQorYnVpbGRfaG9zdF9kaXI9JChidWlsZF9kaXIpL2hvc3QNCitidWlsZF90YXJnZXRfZGlyPSQoYnVpbGRfZGlyKS90YXJnZXQNCitvYmpfaG9zdF9kaXI9JChidWlsZF9kaXIpL29ial9ob3N0DQorb2JqX3RhcmdldF9kaXI9JChidWlsZF9kaXIpL29ial90YXJnZXQNCitzb3VyY2VfZGlyPSQocm9vdF9kaXIpL3NyYw0KK2ltcG9ydGVkX2Rpcj0kKHNvdXJjZV9kaXIpL2ltcG9ydGVkDQorDQorIyBPUw0KK29zX2hvc3Q/PWxpbnV4DQorb3NfdGFyZ2V0Pz1saW51eA0KK2lmbmVxICgkKG9zX2hvc3QpXyQob3NfdGFyZ2V0KSwgbGludXhfbGludXgpDQorICAkKGVycm9yICJPbmx5IGxpbnV4IGlzIHN1cHBvcnRlZCIpDQorZW5kaWYNCisNCisjIENvbXBpbGVycw0KK2NvbXBpbGVyX2hvc3Q/PWdjYw0KK2NvbXBpbGVyX3RhcmdldD89Z2NjDQorDQorIyBNUFNTDQorbXBzc192ZXJzaW9uPz0zMA0KK21wc3NfZGlyPz0vDQorbXBzc19wcmVzZW50PSQoc2hlbGwgaWYgdGVzdCAtZCAkKG1wc3NfZGlyKTsgdGhlbiBlY2hvIE9LOyBlbHNlIGVjaG8gS087IGZpKQ0KK2lmbmVxICgkKG1wc3NfcHJlc2VudCksIE9LKQ0KKyAgJChlcnJvciAiQ2Fubm90IGZpbmQgTVBTUyBkaXJlY3RvcnkgJChtcHNzX2RpcikiKQ0KK2VuZGlmDQorDQoraWZlcSAoJChzaGVsbCB0ZXN0ICQobXBzc192ZXJzaW9uKSAtZ3QgMzM7IGVjaG8gJCQ/KSwgMCkNCisgIGNvaV9kaXI9JChtcHNzX2Rpcikvc3lzcm9vdHMvazFvbS1tcHNzLWxpbnV4L3Vzcg0KKyAgY29pX2luY2x1ZGU9JChjb2lfZGlyKS9pbmNsdWRlL2ludGVsLWNvaQ0KKyAgY29pX2xpYl9ob3N0PSQobXBzc19kaXIpL2xpYjY0DQorICBjb2lfbGliX2RldmljZT0kKGNvaV9kaXIpL2xpYjY0DQorZWxzZQ0KKyAgY29pX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL2NvaQ0KKyAgY29pX2luY2x1ZGU9JChjb2lfZGlyKS9pbmNsdWRlDQorICBjb2lfbGliX2hvc3Q9JChjb2lfZGlyKS9ob3N0LWxpbnV4LXJlbGVhc2UvbGliDQorICBjb2lfbGliX2RldmljZT0kKGNvaV9kaXIpL2RldmljZS1saW51eC1yZWxlYXNlL2xpYg0KK2VuZGlmDQorbXlvX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL215bw0KKw0KKyMgU291cmNlcw0KK3NyY19saWJvZmZsb2FkX2NvbW1vbj1kdl91dGlsLmNwcCBsaWJvZmZsb2FkX2Vycm9yLmMgbGlib2ZmbG9hZF9tc2cuYyBvZmZsb2FkX2NvbW1vbi5jcHAgb2ZmbG9hZF90YWJsZS5jcHAgb2ZmbG9hZF90cmFjZS5jcHAgb2ZmbG9hZF91dGlsLmNwcA0KKw0KK3NyY19saWJvZmZsb2FkX2hvc3Q9JChzcmNfbGlib2ZmbG9hZF9jb21tb24pIGNlYW5fdXRpbC5jcHAgY29pL2NvaV9jbGllbnQuY3BwIGNvbXBpbGVyX2lmX2hvc3QuY3BwIG9mZmxvYWRfZW5naW5lLmNwcCBvZmZsb2FkX2Vudi5jcHAgb2ZmbG9hZF9ob3N0LmNwcCBvZmZsb2FkX29tcF9ob3N0LmNwcCBvZmZsb2FkX3RpbWVyX2hvc3QuY3BwIG9mZmxvYWRfb3JzbC5jcHAgb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYyBvZmZsb2FkX215b19ob3N0LmNwcA0KK3NyY19saWJvZmZsb2FkX2hvc3Q6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfaG9zdCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK3NyY19saWJvZmZsb2FkX3RhcmdldD0kKHNyY19saWJvZmZsb2FkX2NvbW1vbikgY29pL2NvaV9zZXJ2ZXIuY3BwIGNvbXBpbGVyX2lmX3RhcmdldC5jcHAgb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcCBvZmZsb2FkX3RhcmdldC5jcHAgb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwIG9mZmxvYWRfbXlvX3RhcmdldC5jcHANCitzcmNfbGlib2ZmbG9hZF90YXJnZXQ6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfdGFyZ2V0KSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQorc3JjX29mbGQ9b2ZsZGJlZ2luLmNwcCBvZmxkZW5kLmNwcA0KK3NyY19vZmxkOj0kKGZvcmVhY2ggZmlsZSwkKHNyY19vZmxkKSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQoraGVhZGVycz0kKHdpbGRjYXJkICQoc291cmNlX2RpcikvKi5oKSAkKHdpbGRjYXJkICQoc291cmNlX2RpcikvY29pLyouaCkgJCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpL29yc2wtbGl0ZS9pbmNsdWRlLyouaCkNCitpZm5lcSAoJChvbXBfaGVhZGVyX2RpciksICkNCisgIGhlYWRlcnMrPSQoaW1wb3J0ZWRfZGlyKS9vbXAuaA0KK2VuZGlmDQorDQorIyBPYmplY3RzDQorb2JqX2xpYm9mZmxvYWRfaG9zdD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX2hvc3QpKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouYz0ubykNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX2hvc3QpLCQob2JqX2hvc3RfZGlyKS8kKGZpbGUpKQ0KKw0KK29ial9saWJvZmZsb2FkX3RhcmdldD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX3RhcmdldCkpDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKG9ial9saWJvZmZsb2FkX3RhcmdldDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChvYmpfbGlib2ZmbG9hZF90YXJnZXQ6LmM9Lm8pDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX3RhcmdldCksJChvYmpfdGFyZ2V0X2RpcikvJChmaWxlKSkNCisNCitvYmpfb2ZsZD0kKG5vdGRpciAkKHNyY19vZmxkKSkNCitvYmpfb2ZsZDo9JChvYmpfb2ZsZDouY3BwPS5vKQ0KK29ial9vZmxkX2hvc3Q9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF9ob3N0X2RpcikvJChmaWxlKSkNCitvYmpfb2ZsZF90YXJnZXQ9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF90YXJnZXRfZGlyKS8kKGZpbGUpKQ0KKw0KKyMgT3B0aW9ucw0KK29wdHNfY29tbW9uPS1PMiAtdyAtZnBpYyAtYyAtRENPSV9MSUJSQVJZX1ZFUlNJT049MiAtRE1ZT19TVVBQT1JUIC1ET0ZGTE9BRF9ERUJVRz0xIC1EU0VQX1NVUFBPUlQgLURUSU1JTkdfU1VQUE9SVCAtSSQoY29pX2luY2x1ZGUpIC1JJChteW9fZGlyKS9pbmNsdWRlIC1JJChzb3VyY2VfZGlyKQ0KK2lmbmVxICgkKG9tcF9oZWFkZXJfZGlyKSwgKQ0KKyAgb3B0c19jb21tb24rPS1JJChpbXBvcnRlZF9kaXIpDQorZW5kaWYNCisNCitvcHRzX2xpYm9mZmxvYWQ9LXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJvZmZsb2FkLnNvLjUgLWxkbCAtbHN0ZGMrKyAtbGlvbXA1DQorDQorb3B0c19saWJvZmZsb2FkX2hvc3Q9JChvcHRzX2xpYm9mZmxvYWQpIC1MJChjb2lfbGliX2hvc3QpIC1sY29pX2hvc3QgLUwkKG15b19kaXIpL2xpYiAtbG15by1jbGllbnQNCitpZm5lcSAoJChsaWJpb21wX2hvc3RfZGlyKSwgKQ0KKyAgb3B0c19saWJvZmZsb2FkX2hvc3QrPS1MJChsaWJpb21wX2hvc3RfZGlyKQ0KK2VuZGlmDQorDQorb3B0c19saWJvZmZsb2FkX3RhcmdldD0kKG9wdHNfbGlib2ZmbG9hZCkgLUwkKGNvaV9saWJfZGV2aWNlKSAtbGNvaV9kZXZpY2UgLUwkKG15b19kaXIpL2xpYiAtbG15by1zZXJ2aWNlDQoraWZuZXEgKCQobGliaW9tcF90YXJnZXRfZGlyKSwgKQ0KKyAgb3B0c19saWJvZmZsb2FkX3RhcmdldCs9LUwkKGxpYmlvbXBfdGFyZ2V0X2RpcikNCitlbmRpZg0KKw0KK29wdGlvbnNfaG9zdD89DQorb3B0c19ob3N0PSQob3B0aW9uc19ob3N0KSAtREhPU1RfTElCUkFSWT0xIC1ETVBTU19WRVJTSU9OPSQobXBzc192ZXJzaW9uKQ0KK2lmZXEgKCQob3NfaG9zdCksIGxpbnV4KQ0KKyAgb3B0c19ob3N0Kz0tRExJTlVYDQorZW5kaWYNCisNCitvcHRpb25zX3RhcmdldD89DQorb3B0c190YXJnZXQ9JChvcHRpb25zX3RhcmdldCkgLURIT1NUX0xJQlJBUlk9MA0KK2lmZXEgKCQob3NfdGFyZ2V0KSwgbGludXgpDQorICBvcHRzX3RhcmdldCs9LURMSU5VWA0KK2VuZGlmDQoraWZlcSAoJChjb21waWxlcl90YXJnZXQpLCBpY2MpDQorICBvcHRzX3RhcmdldCs9LW1taWMNCitlbmRpZg0KKw0KKyMgTWFrZSB0YXJnZXRzDQorLlBIT05ZOiBhbGwgY2xlYW4gaW5mbw0KKw0KK2FsbDogaW5mbyAkKGJ1aWxkX2hvc3RfZGlyKS9saWJvZmZsb2FkLnNvICQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zbyAkKG9ial9vZmxkX2hvc3QpICQob2JqX29mbGRfdGFyZ2V0KQ0KKw0KKw0KKyQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc286ICQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc28uNSB8ICQoYnVpbGRfaG9zdF9kaXIpDQorCWxuIC1mICQ8ICRADQorDQorJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zby41OiAkKG9ial9saWJvZmZsb2FkX2hvc3QpIHwgJChidWlsZF9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfbGlib2ZmbG9hZF9ob3N0KSAkKG9wdHNfaG9zdCkgJF4gLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9jb2kvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQob2JqX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2Rpcikvb3JzbC1saXRlL2xpYi8lLmMgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zbzogJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvLjUgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCWxuIC1mICQ8ICRADQorDQorJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvLjU6ICQob2JqX2xpYm9mZmxvYWRfdGFyZ2V0KSB8ICQoYnVpbGRfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19saWJvZmZsb2FkX3RhcmdldCkgJChvcHRzX3RhcmdldCkgJF4gLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jICQoaGVhZGVycykgfCAkKG9ial90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9jb2kvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9vcnNsLWxpdGUvbGliLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorDQorJChidWlsZF9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKGJ1aWxkX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKw0KKyQoaW1wb3J0ZWRfZGlyKS9vbXAuaDogJChvbXBfaGVhZGVyX2Rpcikvb21wLmggfCAkKGltcG9ydGVkX2RpcikNCisJY3AgJDwgJEANCisNCisNCiskKGJ1aWxkX2hvc3RfZGlyKSAkKGJ1aWxkX3RhcmdldF9kaXIpICQob2JqX2hvc3RfZGlyKSAkKG9ial90YXJnZXRfZGlyKTogfCAkKGJ1aWxkX2RpcikNCisJJChzaGVsbCBta2RpciAtcCAkQCA+L2Rldi9udWxsIDI+L2Rldi9udWxsKQ0KKwlAZWNobyAiQ3JlYXRlZCAkQCBkaXJlY3RvcnkiDQorDQorJChidWlsZF9kaXIpOg0KKwkkKHNoZWxsIG1rZGlyIC1wICRAID4vZGV2L251bGwgMj4vZGV2L251bGwpDQorCUBlY2hvICJDcmVhdGVkICRAIGRpcmVjdG9yeSINCisNCiskKGltcG9ydGVkX2Rpcik6DQorCSQoc2hlbGwgbWtkaXIgLXAgJEAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCkNCisJQGVjaG8gIkNyZWF0ZWQgJEAgZGlyZWN0b3J5Ig0KKw0KKw0KK2NsZWFuOg0KKwkkKHNoZWxsIHJtIC1yZiAkKGJ1aWxkX2RpcikpDQorCUBlY2hvICJSZW1vdmUgJChidWlsZF9kaXIpIGRpcmVjdG9yeSINCisNCisNCitpbmZvOg0KKwlAZWNobyAicm9vdF9kaXIgPSAkKHJvb3RfZGlyKSINCisJQGVjaG8gImJ1aWxkX2RpciA9ICQoYnVpbGRfZGlyKSINCisJQGVjaG8gIm1wc3NfZGlyID0gJChtcHNzX2RpcikiDQorCUBlY2hvICJtcHNzX3ZlcnNpb24gPSAkKG1wc3NfdmVyc2lvbikiDQorCUBlY2hvICJsaWJpb21wX2hvc3RfZGlyID0gJChsaWJpb21wX2hvc3RfZGlyKSINCisJQGVjaG8gImxpYmlvbXBfdGFyZ2V0X2RpciA9ICQobGliaW9tcF90YXJnZXRfZGlyKSINCisJQGVjaG8gIm9tcF9oZWFkZXJfZGlyID0gJChvbXBfaGVhZGVyX2RpcikiDQorCUBlY2hvICJvc19ob3N0ID0gJChvc19ob3N0KSINCisJQGVjaG8gIm9zX3RhcmdldCA9ICQob3NfdGFyZ2V0KSINCisJQGVjaG8gImNvbXBpbGVyX2hvc3QgPSAkKGNvbXBpbGVyX2hvc3QpIg0KKwlAZWNobyAiY29tcGlsZXJfdGFyZ2V0ID0gJChjb21waWxlcl90YXJnZXQpIg0KKwlAZWNobyAib3B0aW9uc19ob3N0ID0gJChvcHRpb25zX2hvc3QpIg0KKwlAZWNobyAib3B0aW9uc190YXJnZXQgPSAkKG9wdGlvbnNfdGFyZ2V0KSINCisNCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL1JFQURNRS50eHQgYi9maW5hbC9vZmZsb2FkL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWI5ZmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDEyOSBAQAorDQorCSAgICAgICBSRUFETUUgZm9yIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5DQorCSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24NCis9PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24NCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4NCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoNCisNCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnDQorDQoraW4gdGhpcyBkaXJlY3RvcnkuDQorDQorVGhhdCB3aWxsIHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQNCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQ0KK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4NCisNCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tDQord3d3LmRveHlnZW4ub3JnLg0KKw0KKw0KK1NvZnR3YXJlIFJlcXVpcmVtZW50cw0KKz09PT09PT09PT09PT09PT09PT09PQ0KKw0KK0ludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5IHJlcXVpcmVzIGFkZGl0aW9uYWwgc29mdHdhcmU6DQorDQorMSkgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkuICBZb3UgY2FuIGVpdGhlciBkb3dubG9hZCB0aGUgc291cmNlDQorY29kZSBmb3IgdGhhdCAoZnJvbSBvcGVubXBydGwub3JnIG9yIG9wZW5tcC5sbHZtLm9yZykgb3Igc2ltcGx5IHVzZSB0aGUNCitjb21waWxlZCB2ZXJzaW9uIGRpc3RyaWJ1dGVkIHdpdGggdGhlIEludGVsIGNvbXBpbGVycy4NCisyKSBJbnRlbChSKSBDT0kgUnVudGltZSBMaWJyYXJ5IGFuZCBJbnRlbChSKSBNWU8gUnVudGltZSBMaWJyYXJ5LiAgVGhlc2UNCitsaWJyYXJpZXMgYXJlIHBhcnQgb2YgSW50ZWwoUikgTWFueWNvcmUgUGxhdGZvcm0gU29mdHdhcmUgU3RhY2sgKE1QU1MpLiAgWW91DQorY2FuIGRvd25sb2FkIE1QU1Mgc291cmNlIGNvZGUgb3IgYmluYXJpZXMgZnJvbQ0KK3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbnRlbC1tYW55Y29yZS1wbGF0Zm9ybS1zb2Z0d2FyZS1zdGFjay1tcHNzLg0KK0JpbmFyaWVzIGluY2x1ZGUgaG9zdCBsaWJyYXJpZXMgZm9yIEludGVsKFIpIDY0IEFyY2hpdGVjdHVyZSBhbmQgdGFyZ2V0DQorbGlicmFyaWVzIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuDQorDQorQWxzbyB5b3Ugd2lsbCByZXF1aXJlIGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgZW5hYmxlIHRoZSB0YXJnZXQgY29kZSB0byBydW4NCitvbiBkZXZpY2UuICBJZiB5b3UgdGFyZ2V0IHRoZSBJbnRlbChSKSBYZW9uIFBoaSAoVE0pIGNvcHJvY2Vzc29yLCB0aGVzZQ0KK2xpYnJhcmllcyBjYW4gYmUgdGFrZW4gZnJvbSBNUFNTIHRvby4NCisNCisNCitIb3cgdG8gQnVpbGQgdGhlIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoZSBNYWtlZmlsZSBhdCB0aGUgdG9wLWxldmVsIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3Qgd2hhdCBpdCBuZWVkcyB0bw0KK2J1aWxkIHRoZSBJbnRlbChSKSBPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeS4gIFRvIHNlZSB0aGUgZGVmYXVsdCBzZXR0aW5ncywNCit0eXBlOg0KKw0KK21ha2UgaW5mbw0KKw0KK1lvdSBjYW4gY2hhbmdlIHRoZSBNYWtlZmlsZSdzIGJlaGF2aW9yIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOg0KKw0KK3Jvb3RfZGlyOgkgICAgICBUaGUgcGF0aCB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQ0KKwkJICAgICAgdG9wLWxldmVsIE1ha2VmaWxlLiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24gdGhlDQorCQkgICAgICB2YWx1ZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4NCisNCitidWlsZF9kaXI6CSAgICAgIFRoZSBwYXRoIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwNCisJCSAgICAgIHRha2Ugb24gdmFsdWUgW3Jvb3RfZGlyXS9idWlsZC4NCisNCittcHNzX2RpcjoJICAgICAgVGhlIHBhdGggdG8gdGhlIEludGVsKFIpIE1hbnljb3JlIFBsYXRmb3JtIFNvZnR3YXJlDQorCQkgICAgICBTdGFjayBpbnN0YWxsIGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB0YWtlIG9uDQorCQkgICAgICB0aGUgdmFsdWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSdzIHJvb3QgZGlyZWN0b3J5Lg0KKw0KK2xpYmlvbXBfaG9zdF9kaXI6ICAgICBUaGUgcGF0aCB0byB0aGUgaG9zdCBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeS4NCisJCSAgICAgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdGhlIGhvc3QgY29tcGlsZXIgaXMgb3RoZXINCisJCSAgICAgIHRoYW4gaWNjLg0KKw0KK2xpYmlvbXBfdGFyZ2V0X2RpcjogICBUaGUgcGF0aCB0byB0aGUgdGFyZ2V0IEludGVsKFIpIE9wZW5NUCogUnVudGltZQ0KKwkJICAgICAgTGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdGhlIHRhcmdldA0KKwkJICAgICAgY29tcGlsZXIgaXMgb3RoZXIgdGhhbiBpY2MuDQorDQorb21wX2hlYWRlcl9kaXI6ICAgICAgIFRoZSBwYXRoIHRvIHRoZSBoZWFkZXIgZmlsZSA8b21wLmg+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+ZGltW2ldLmxvd2VyLCBhZHAtPmRpbVtpXS51cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRwLT5kaW1baV0uc3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3IgY19jZWFuX3ZhciB0aGUgYmFzZSBhZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhCisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyX3B0ciB0aGUgYmFzZSBhZGRyIGlzIGRlcmVmZXJlbmNlZCB0byBnZXQgdG8gdGhlIGRhdGEKKyAgICAgICAgZ2VuZXJhdGVfbWVtX3JhbmdlcyhzcGFjZXMsIGFkcCwgZGVyZWYsICZwcmludF9yYW5nZSk7CisgICAgfQorfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkZWJjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oCkBAIC0wLDAgKzEsMTAxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgQ0VBTl9VVElMX0hfSU5DTFVERUQKKyNkZWZpbmUgQ0VBTl9VVElMX0hfSU5DTFVERUQKKworI2lmIE1QU1NfVkVSU0lPTiA+IDMzCisjaW5jbHVkZSA8c291cmNlL0NPSUJ1ZmZlcl9zb3VyY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgTVBTU19WRVJTSU9OIDw9IDMzCisvLyBDRUFOIGV4cHJlc3Npb24gcmVwcmVzZW50YXRpb24KK3N0cnVjdCBkaW1fZGVzYyB7CisgICAgaW50NjRfdCBzaXplOyAgICAgICAvLyBMZW5ndGggb2YgZGF0YSB0eXBlCisgICAgaW50NjRfdCBsaW5kZXg7ICAgICAvLyBMb3dlciBpbmRleAorICAgIGludDY0X3QgbG93ZXI7ICAgICAgLy8gTG93ZXIgc2VjdGlvbiBib3VuZAorICAgIGludDY0X3QgdXBwZXI7ICAgICAgLy8gVXBwZXIgc2VjdGlvbiBib3VuZAorICAgIGludDY0X3Qgc3RyaWRlOyAgICAgLy8gU3RyaWRlCit9OworCitzdHJ1Y3QgYXJyX2Rlc2MgeworICAgIGludDY0X3QgYmFzZTsgICAgICAgLy8gQmFzZSBhZGRyZXNzCisgICAgaW50NjRfdCByYW5rOyAgICAgICAvLyBSYW5rIG9mIGFycmF5CisgICAgZGltX2Rlc2MgZGltWzFdOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgQ2VhblJlYWREaW0geworICAgIGludDY0X3QgY291bnQ7IC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24KKyAgICBpbnQ2NF90IHNpemU7ICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uLgorfTsKKworc3RydWN0IENlYW5SZWFkUmFuZ2VzIHsKKyAgICB2b2lkICogIHB0cjsKKyAgICBpbnQ2NF90IGN1cnJlbnRfbnVtYmVyOyAgIC8vIHRoZSBudW1iZXIgb2YgcmFuZ2VzIHJlYWQKKyAgICBpbnQ2NF90IHJhbmdlX21heF9udW1iZXI7IC8vIG51bWJlciBvZiBjb250aWd1b3VzIHJhbmdlcworICAgIGludDY0X3QgcmFuZ2Vfc2l6ZTsgICAgICAgLy8gc2l6ZSBvZiBtYXggY29udGlndW91cyByYW5nZQorICAgIGludCAgICAgbGFzdF9ub25jb250X2luZDsgLy8gc2l6ZSBvZiBEaW0gYXJyYXkKKyAgICBpbnQ2NF90IGluaXRfb2Zmc2V0OyAgICAgIC8vIG9mZnNldCBvZiAxLXN0IGVsZW1lbnQgZnJvbSBhcnJheSBsZWZ0IGJvdW5kCisgICAgQ2VhblJlYWREaW0gRGltWzFdOworfTsKKworLy8gYXJyYXkgZGVzY3JpcHRvciBsZW5ndGgKKyNkZWZpbmUgX19hcnJfZGVzY19sZW5ndGgocmFuaykgXAorICAgIChzaXplb2YoaW50NjRfdCkgKyBzaXplb2YoZGltX2Rlc2MpICogKHJhbmspKQorCisvLyByZXR1cm5zIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCit2b2lkIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmbGVuZ3RoKTsKKworLy8gZGVmaW5lIGlmIGRhdGEgYXJyYXkgZGVzY3JpYmVkIGJ5IGFyZ3VtZW50IGlzIGNvbnRpZ3VvdXMgb25lCitib29sIGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoY29uc3QgYXJyX2Rlc2MgKmFwKTsKKworLy8gYWxsb2NhdGUgZWxlbWVudCBvZiBDZWFuUmVhZFJhbmdlcyB0eXBlIGluaXRpYWxpemVkCisvLyB0byByZWFkIGNvbnNlcXVlbnRseSBjb250aWd1b3VzIHJhbmdlcyBkZXNjcmliZWQgYnkgImFwIiBhcmd1bWVudAorQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGNvbnN0IGFycl9kZXNjICphcCk7CisKKy8vIGNoZWNrIGlmIHJhbmdlcyBkZXNjcmliZWQgYnkgMSBhcmd1bWVudCBjb3VsZCBiZSB0cmFuc2ZlcnJlZCBpbnRvIHJhbmdlcworLy8gZGVzY3JpYmVkIGJ5IDItbmQgb25lCitib29sIGNlYW5fcmFuZ2VzX21hdGNoKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcxLAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcyCispOworCisvLyBmaXJzdCBhcmd1bWVudCAtIHJldHVybmVkIHZhbHVlIGJ5IGNhbGwgdG8gaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYy4KKy8vIHJldHVybnMgdHJ1ZSBpZiBvZmZzZXQgYW5kIGxlbmd0aCBvZiBuZXh0IHJhbmdlIGlzIHNldCBzdWNjZXNzZnVseS4KKy8vIHJldHVybnMgZmFsc2UgaWYgdGhlIHJhbmdlcyBpcyBvdmVyLgorYm9vbCBnZXRfbmV4dF9yYW5nZSgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nLAorICAgIGludDY0X3QgKm9mZnNldAorKTsKKworLy8gcmV0dXJucyBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMKK2ludDY0X3QgY2Vhbl9nZXRfdHJhbnNmX3NpemUoQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZyk7CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorLy8gcHJpbnRzIGFycmF5IGRlc2NyaXB0b3IgY29udGVudHMgdG8gc3RkZXJyCit2b2lkICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWZlcmVuY2UpOworI2Vsc2UKKyNkZWZpbmUgX19hcnJfZGVzY19kdW1wKAorICAgIHNwYWNlcywKKyAgICBuYW1lLAorICAgIGFkcCwKKyAgICBkZXJlZmVyZW5jZSkKKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKyNlbmRpZiAvLyBDRUFOX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGM3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIENPSSBob3N0IGludGVyZmFjZQorCisjaW5jbHVkZSAiY29pX2NsaWVudC5oIgorI2luY2x1ZGUgIi4uL29mZmxvYWRfY29tbW9uLmgiCisKK25hbWVzcGFjZSBDT0kgeworCisjZGVmaW5lIENPSV9WRVJTSU9OMSAgICAiQ09JXzEuMCIKKyNkZWZpbmUgQ09JX1ZFUlNJT04yICAgICJDT0lfMi4wIgorCitib29sICAgICAgICAgICAgaXNfYXZhaWxhYmxlOworc3RhdGljIHZvaWQqICAgIGxpYl9oYW5kbGU7CisKKy8vIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBmcm9tIENPSSBsaWJyYXJ5CitDT0lSRVNVTFQgKCpFbmdpbmVHZXRDb3VudCkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopOworQ09JUkVTVUxUICgqRW5naW5lR2V0SGFuZGxlKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90LCBDT0lFTkdJTkUqKTsKKworQ09JUkVTVUxUICgqUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkpKENPSUVOR0lORSwgY29uc3QgY2hhciosIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBpbnQsIGNvbnN0IGNoYXIqKiwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSVBST0NFU1MqKTsKK0NPSVJFU1VMVCAoKlByb2Nlc3NEZXN0cm95KShDT0lQUk9DRVNTLCBpbnQzMl90LCB1aW50OF90LCBpbnQ4X3QqLCB1aW50MzJfdCopOworQ09JUkVTVUxUICgqUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcykoQ09JUFJPQ0VTUywgdWludDMyX3QsIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUZVTkNUSU9OKik7CitDT0lSRVNVTFQgKCpQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5KShDT0lQUk9DRVNTLCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JTElCUkFSWSopOworQ09JUkVTVUxUICgqUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzKSh1aW50MzJfdCwgY29uc3Qgdm9pZCoqLCBjb25zdCB1aW50NjRfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgY29uc3QgdWludDY0X3QqKTsKKworQ09JUkVTVUxUICgqUGlwZWxpbmVDcmVhdGUpKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsIENPSVBJUEVMSU5FKik7CitDT0lSRVNVTFQgKCpQaXBlbGluZURlc3Ryb3kpKENPSVBJUEVMSU5FKTsKK0NPSVJFU1VMVCAoKlBpcGVsaW5lUnVuRnVuY3Rpb24pKENPSVBJUEVMSU5FLCBDT0lGVU5DVElPTiwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lCVUZGRVIqLCBjb25zdCBDT0lfQUNDRVNTX0ZMQUdTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QsIHZvaWQqLCB1aW50MTZfdCwgQ09JRVZFTlQqKTsKKworQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKik7CitDT0lSRVNVTFQgKCpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLCB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckRlc3Ryb3kpKENPSUJVRkZFUik7CitDT0lSRVNVTFQgKCpCdWZmZXJNYXApKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLCB2b2lkKiopOworQ09JUkVTVUxUICgqQnVmZmVyVW5tYXApKENPSU1BUElOU1RBTkNFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyV3JpdGUpKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyUmVhZCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckNvcHkpKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckdldFNpbmtBZGRyZXNzKShDT0lCVUZGRVIsIHVpbnQ2NF90Kik7CitDT0lSRVNVTFQgKCpCdWZmZXJTZXRTdGF0ZSkoQ09JQlVGRkVSLCBDT0lQUk9DRVNTLCBDT0lfQlVGRkVSX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKKworQ09JUkVTVUxUICgqRXZlbnRXYWl0KSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LCB1aW50OF90LCB1aW50MzJfdCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90Kik7CisKK3VpbnQ2NF90ICAoKlBlcmZHZXRDeWNsZUZyZXF1ZW5jeSkodm9pZCk7CisKK2Jvb2wgaW5pdCh2b2lkKQoreworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZSA9ICJsaWJjb2lfaG9zdC5zby4wIjsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImNvaV9ob3N0LmRsbCI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIENPSSBsaWJyYXJ5ICVzIC4uLlxuIiwgbGliX25hbWUpOworICAgIGxpYl9oYW5kbGUgPSBETF9vcGVuKGxpYl9uYW1lKTsKKyAgICBpZiAobGliX2hhbmRsZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBsb2FkIHRoZSBsaWJyYXJ5XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVuZ2luZUdldENvdW50ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFbmdpbmVHZXRDb3VudCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEVuZ2luZUdldENvdW50ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUVuZ2luZUdldENvdW50Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVuZ2luZUdldEhhbmRsZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSV9JU0FfVFlQRSwgdWludDMyX3QsIENPSUVOR0lORSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFbmdpbmVHZXRIYW5kbGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChFbmdpbmVHZXRIYW5kbGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JRW5naW5lR2V0SGFuZGxlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwgY29uc3Qgdm9pZCosIHVpbnQ2NF90LCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSVBST0NFU1MqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIGludDMyX3QsIHVpbnQ4X3QsIGludDhfdCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUHJvY2Vzc0Rlc3Ryb3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0Rlc3Ryb3kiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIHVpbnQzMl90LCBjb25zdCBjaGFyKiosIENPSUZVTkNUSU9OKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgdWludDY0X3QsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lMSUJSQVJZKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjIpOworICAgIGlmIChQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDMyX3QsIGNvbnN0IHZvaWQqKiwgY29uc3QgdWludDY0X3QqLCBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGlwZWxpbmVDcmVhdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQUk9DRVNTLCBDT0lfQ1BVX01BU0ssIHVpbnQzMl90LCBDT0lQSVBFTElORSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZUNyZWF0ZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFBpcGVsaW5lQ3JlYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lQ3JlYXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFBpcGVsaW5lRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBJUEVMSU5FKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGlwZWxpbmVEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVEZXN0cm95ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lRGVzdHJveSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQaXBlbGluZVJ1bkZ1bmN0aW9uID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUElQRUxJTkUsIENPSUZVTkNUSU9OLCB1aW50MzJfdCwgY29uc3QgQ09JQlVGRkVSKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JX0FDQ0VTU19GTEFHUyosIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MTZfdCwgdm9pZCosIHVpbnQxNl90LCBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZVJ1bkZ1bmN0aW9uIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVSdW5GdW5jdGlvbiA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQaXBlbGluZVJ1bkZ1bmN0aW9uIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLCBDT0lCVUZGRVIqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyQ3JlYXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ3JlYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckNyZWF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJDcmVhdGVGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckRlc3Ryb3kgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIpKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyRGVzdHJveSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJEZXN0cm95Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlck1hcCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJNYXAiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJNYXAgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyTWFwIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclVubWFwID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JTUFQSU5TVEFOQ0UsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclVubWFwIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyVW5tYXAgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyVW5tYXAiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyV3JpdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIHVpbnQ2NF90LCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlcldyaXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyV3JpdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyV3JpdGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyUmVhZCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclJlYWQiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJSZWFkID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlclJlYWQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyQ29weSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDb3B5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ29weSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDb3B5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckdldFNpbmtBZGRyZXNzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJHZXRTaW5rQWRkcmVzcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlckdldFNpbmtBZGRyZXNzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckdldFNpbmtBZGRyZXNzIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclNldFN0YXRlID0KKyAgICAgICAgKENPSVJFU1VMVCgqKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFX0ZMQUcsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyU2V0U3RhdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJTZXRTdGF0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJTZXRTdGF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBFdmVudFdhaXQgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCosIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUV2ZW50V2FpdCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEV2ZW50V2FpdCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lFdmVudFdhaXQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGVyZkdldEN5Y2xlRnJlcXVlbmN5ID0KKyAgICAgICAgKHVpbnQ2NF90ICgqKSh2b2lkKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGVyZkdldEN5Y2xlRnJlcXVlbmN5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGVyZkdldEN5Y2xlRnJlcXVlbmN5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBlcmZHZXRDeWNsZUZyZXF1ZW5jeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpc19hdmFpbGFibGUgPSB0cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZmluaSh2b2lkKQoreworICAgIGlzX2F2YWlsYWJsZSA9IGZhbHNlOworCisgICAgaWYgKGxpYl9oYW5kbGUgIT0gMCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgRExfY2xvc2UobGliX2hhbmRsZSk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGxpYl9oYW5kbGUgPSAwOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgQ09JCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc1YThiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgaW50ZXJmYWNlIGJldHdlZW4gb2ZmbG9hZCBsaWJyYXJ5IGFuZCB0aGUgQ09JIEFQSSBvbiB0aGUgaG9zdAorCisjaWZuZGVmIENPSV9DTElFTlRfSF9JTkNMVURFRAorI2RlZmluZSBDT0lfQ0xJRU5UX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGNvbW1vbi9DT0lQZXJmX2NvbW1vbi5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lFbmdpbmVfc291cmNlLmg+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+CisKK3VpbnQ2NF90IF9yZHRzYygpCit7CisgIHVpbnQzMl90IGVheCwgZWR4OworICBhc20gdm9sYXRpbGUgKCJyZHRzYyIgOiAiPWEiIChlYXgpLCAiPWQiIChlZHgpKTsKKyAgcmV0dXJuICgodWludDY0X3QpZWR4IDw8IDMyKSB8IGVheDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL3VzZV9tcHNzMi50eHQgYi9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGY0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0CkBAIC0wLDAgKzEgQEAKKzIuMS42NzIwLTEzCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzc193aW4udHh0IGIvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhmNDgzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dApAQCAtMCwwICsxIEBACisyLjEuNjcyMC0xMwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9CdWlsZF9XaXRoX0NNYWtlLnR4dCBiL2ZpbmFsL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0NTQzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQKQEAgLTAsMCArMSwyMTYgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIEJ1aWxkIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSB1c2luZyBDTWFrZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9PT09IFZlcnNpb24gb2YgQ01ha2UgcmVxdWlyZWQ6IHYyLjguMCBvciBhYm92ZSA9PT09CisgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIGNhbGwgY21ha2UgaW5pdGlhbGx5LCB0aGVuIHJlcGVhdGVkbHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistIFdoZW4gY2FsbGluZyBjbWFrZSBmb3IgdGhlIGZpcnN0IHRpbWUsIGFsbCBuZWVkZWQgY29tcGlsZXIgb3B0aW9ucworICBtdXN0IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgQWZ0ZXIgdGhpcyBpbml0aWFsIGNhbGwgdG8KKyAgY21ha2UsIHRoZSBjb21waWxlciBkZWZpbml0aW9ucyBtdXN0IG5vdCBiZSBpbmNsdWRlZCBmb3IgZnVydGhlciBjYWxscworICB0byBjbWFrZS4gIE90aGVyIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG11bHRpcGxlCisgIHRpbWVzIGluY2x1ZGluZyBhbGwgZGVmaW5pdGlvbnMgaW4gdGhlIEJ1aWxkIG9wdGlvbnMgc2VjdGlvbiBiZWxvdy4KKy0gRXhhbXBsZSBvZiBjb25maWd1cmluZywgYnVpbGRpbmcsIHJlY29uZmlndXJpbmcsIHJlYnVpbGRpbmc6CisgICQgbWtkaXIgYnVpbGQKKyAgJCBjZCBidWlsZAorICAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC1ETElCT01QX0FSQ0g9aTM4NiAuLiAgIyBJbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlCisgIC4uLgorICAkIG1ha2UgY2xlYW4KKyAgJCBjbWFrZSAtRExJQk9NUF9BUkNIPXg4Nl82NCAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4gICAgICAgICAgICAgICAgICAgICAgICMgU2Vjb25kIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlCisgIC4uLgorICAkIHJtIC1yZiAqCisgICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfQVJDSD14ODZfNjQgLi4gIyBUaGlyZCBjb25maWd1cmF0aW9uCisgICQgbWFrZQorLSBOb3RpY2UgaW4gdGhlIGV4YW1wbGUgaG93IHRoZSBjb21waWxlciBkZWZpbml0aW9ucyBhcmUgb25seSBzcGVjaWZpZWQKKyAgZm9yIGFuIGVtcHR5IGJ1aWxkIGRpcmVjdG9yeSwgYnV0IG90aGVyIEJ1aWxkIG9wdGlvbnMgYXJlIHVzZWQgYXQgYW55IHRpbWUuCistIFRoZSBmaWxlIENNYWtlQ2FjaGUudHh0IHdoaWNoIGlzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gY21ha2UKKyAgaXMgYSBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggaG9sZHMgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBCdWlsZCBvcHRpb25zLgorICBUaGVzZSBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCB1c2luZyBhIHRleHQgZWRpdG9yIHRvIG1vZGlmeSAKKyAgQ01ha2VDYWNoZS50eHQgYXMgb3Bwb3NlZCB0byB1c2luZyBkZWZpbml0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLgorLSBUbyBoYXZlIGNtYWtlIGNyZWF0ZSBhIHBhcnRpY3VsYXIgdHlwZSBvZiBidWlsZCBnZW5lcmF0b3IgZmlsZSBzaW1wbHkgCisgIGlubHVkZSB0aGUgLUcgPEdlbmVyYXRvciBuYW1lPiBvcHRpb246CisgICQgY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAuLi4KKyAgWW91IGNhbiBzZWUgYSBsaXN0IG9mIGdlbmVyYXRvcnMgY21ha2Ugc3VwcG9ydHMgYnkgZXhlY3V0aW5nIGNtYWtlIHdpdGgKKyAgbm8gYXJndW1lbnRzIGFuZCBhIGxpc3Qgd2lsbCBiZSBwcmludGVkLgorCis9PT09PT09PT09PT09PT09PT09PT0KK0luc3RydWN0aW9ucyB0byBCdWlsZAorPT09PT09PT09PT09PT09PT09PT09CisgJCBjZCBsaWJvbXBfdG9wX2xldmVsLyBbIGRpcmVjdG9yeSB3aXRoIHNyYy8gLCBleHBvcnRzLyAsIHRvb2xzLyAsIGV0Yy4gXQorICQgbWtkaXIgYnVpbGQKKyAkIGNkIGJ1aWxkCisKKyBbIFVuaXgqIExpYnJhcmllcyBdCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC4uCisKKyBbIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIExpYnJhcnkgKEludGVsKFIpIE1JQyBMaWJyYXJ5KSBdCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC1ETElCT01QX0FSQ0g9bWljIC4uCisKKyBbIFdpbmRvd3MgTGlicmFyaWVzIF0KKyAkIGNtYWtlIC1HIDxHZW5lcmF0b3IgVHlwZT4gLURDTUFLRV9DX0NPTVBJTEVSPTxDIENvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIENvbXBpbGVyPiAtRENNQUtFX0FTTV9NQVNNX0NPTVBJTEVSPVttbCB8IG1sNjRdIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC4uCisKKyAkIG1ha2UKKyAkIG1ha2UgaW5zdGFsbAorCis9PT09PT09PT09PT09PT09PT0KK01hYyogRmF0IExpYnJhcmllcworPT09PT09PT09PT09PT09PT09CitPbiBPUyBYKiBtYWNoaW5lcywgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdW5pdmVyc2FsIChvciBmYXQpIGxpYnJhcmllcyB3aGljaAoraW5jbHVkZSBib3RoIGkzODYgYW5kIHg4Nl82NCBhcmNoaXRlY3R1cmUgb2JqZWN0cyBpbiBhCitzaW5nbGUgYXJjaGl2ZS4KKyAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC1EQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVM9J2kzODY7eDg2XzY0JyAuLgorICQgbWFrZQorVGhlcmUgaXMgYWxzbyBhbiBvcHRpb24gLURMSUJPTVBfT1NYX0FSQ0hJVEVDVFVSRVMgd2hpY2ggY2FuIGJlIHNldCBpbiBjYXNlCit0aGlzIGlzIGFuIExMVk0gc291cmNlIHRyZWUgYnVpbGQgd2hpY2ggd2lsbCBvbmx5IHNldCB0aGUgbGlib21wIGxpYnJhcnkKK3RvIGEgdW5pdmVyc2FsIGZhdCBsaWJyYXJ5IGFuZCBwcmV2ZW50IGhhdmluZyB0aGUgZW50aXJlIGxsdm0vY2xhbmcgYnVpbGQKK3Byb2R1Y2UgdW5pdmVyc2FsIGJpbmFyaWVzLgorCis9PT09PT09PT09PQorTWljcm8gdGVzdHMKKz09PT09PT09PT09CitBZnRlciB0aGUgbGlicmFyeSBoYXMgYmVlbiBidWlsdCwgdGhlcmUgYXJlIGZpdmUgb3B0aW9uYWwgbWljcm90ZXN0cyB0aGF0CitjYW4gYmUgcGVyZm9ybWVkLiAgU29tZSB3aWxsIGJlIHNraXBwZWQgYmFzZWQgdXBvbiB0aGUgcGxhdGZvcm0uCitUbyBydW4gdGhlIHRlc3RzLAorJCBtYWtlIGxpYm9tcC1taWNyby10ZXN0cworCis9PT09PT09PT09PT09CitDTWFrZSBvcHRpb25zCis9PT09PT09PT09PT09CistRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXIgbmFtZT4KK1NwZWNpZnkgdGhlIEMgY29tcGlsZXIKKworLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlciBuYW1lPgorU3BlY2lmeSB0aGUgQysrIGNvbXBpbGVyCisKKy1EQ01BS0VfRm9ydHJhbl9DT01QSUxFUj08Rm9ydHJhbiBjb21waWxlciBuYW1lPgorVGhpcyBvcHRpb24gaXMgb25seSBuZWVkZWQgd2hlbiAtRExJQk9NUF9GT1JUUkFOX01PRFVMRVMgaXMgb24uCitTbyB0eXBpY2FsbHksIGEgRm9ydHJhbiBjb21waWxlciBpcyBub3QgbmVlZGVkIGR1cmluZyB0aGUgYnVpbGQuCitTcGVjaWZ5IHRoZSBGb3J0cmFuIGNvbXBpbGVyCisKKy1EQ01BS0VfQVNNX01BU01fQ09NUElMRVI9W21sIHwgbWw2NCBdCitUaGlzIG9wdGlvbiBpcyBXaW5kb3dzKiBPbmx5CisKKy1ETElCT01QX0FSQ0g9aTM4Nnx4ODZfNjR8YXJtfHBwYzY0fHBwYzY0bGV8YWFyY2g2NHxtaWMKK1RoZSBkZWZhdWx0IGZvciB0aGUgb3B0aW9uIGlzIGNob3NlbiBiYXNlZCBvbiB0aGUgcHJvYmluZyB0aGUgY29tcGlsZXIgZm9yIAorYXJjaGl0ZWN0dXJlIG1hY3JvcyAoZS5nLiwgaXMgX194ODZfNjRfXyBwcmVkZWZpbmVkIGJ5IGNvbXBpbGVyPykuCisKKz09PT0gRmlyc3QgdmFsdWVzIGxpc3RlZCBhcmUgdGhlIGRlZmF1bHQgdmFsdWUgPT09PQorLURMSUJPTVBfTElCX1RZUEU9bm9ybWFsfHByb2ZpbGV8c3R1YnMKK0xpYnJhcnkgdHlwZSBjYW4gYmUgbm9ybWFsLCBwcm9maWxlLCBvciBzdHVicy4KKworLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2V8RGVidWd8UmVsV2l0aERlYkluZm8KK0J1aWxkIHR5cGUgY2FuIGJlIFJlbGVhc2UsIERlYnVnLCBvciBSZWxXaXRoRGViSW5mby4KKworLURMSUJPTVBfT01QX1ZFUlNJT049NDF8NDB8MzAKK09wZW5NUCB2ZXJzaW9uIGNhbiBiZSBlaXRoZXIgNDEsIDQwIG9yIDMwLgorCistRExJQk9NUF9NSUNfQVJDSD1rbmN8a25mCitUaGlzIHZhbHVlIGlzIGlnbm9yZWQgaWYgTElCT01QX0FSQ0ggIT0gbWljCitJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLCBjYW4gYmUga25mIG9yIGtuYy4KKyAgCistRExJQk9NUF9GT1JUUkFOX01PRFVMRVM9b2ZmfG9uCitTaG91bGQgdGhlIEZvcnRyYW4gbW9kdWxlcyBiZSBjcmVhdGVkIChyZXF1aXJlcyBGb3J0cmFuIGNvbXBpbGVyKQorCistRExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1M9b258b2ZmICAgICAgIAorU2hvdWxkIGFkYXB0aXZlIChUU1gtYmFzZWQpIGxvY2tzIGJlIGluY2x1ZGVkPyAgCitUaGVzZSBhcmUgeDg2IHNwZWNpZmljLiAgVGhpcyBmZWF0dXJlIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0IAorZm9yIGkzODYgYW5kIHg4Nl82NC4gIE90aGVyd2lzZSwgaXQgaXMgdHVybmVkIG9mZi4KKworLURMSUJPTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQ9b2ZmfG9uCitTaG91bGQgNDA5Ni1ieXRlIGFsaWdubWVudCBiZSB1c2VkIGZvciBjZXJ0YWluIGRhdGEgc3RydWN0dXJlcz8KK1RoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbiBtdWx0aW5vZGUgc3lzdGVtcyB3aGVyZSBhIHNtYWxsIENBQ0hFX0xJTkUKK3NldHRpbmcgbGVhZHMgdG8gZmFsc2Ugc2hhcmluZy4gIFRoaXMgb3B0aW9uIGlzIG9mZiBieSBkZWZhdWx0LgorCistRExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTPW9ufG9mZgorU2hvdWxkIHZlcnNpb25lZCBzeW1ib2xzIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5PworVGhpcyBvcHRpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgRUxGIGJhc2VkIGxpYnJhcmllcyB3aGVyZSB2ZXJzaW9uCitzeW1ib2xzIGFyZSBzdXBwb3J0ZWQgKExpbnV4LCBzb21lIEJTRCogdmFyaWFudHMpLiAgSXQgaXMgb2ZmCitieSBkZWZhdWx0IGZvciBXaW5kb3dzIGFuZCBNYWMsIGJ1dCBvbiBmb3Igb3RoZXIgVW5peCBiYXNlZCBvcGVyYXRpbmcKK3N5c3RlbXMuCisKKy1ETElCT01QX09NUFRfU1VQUE9SVD1vZmZ8b24KK1Nob3VsZCBPTVBUIHN1cHBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkPyAoTm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzKQorSWYgTElCT01QX09NUFRfU1VQUE9SVCBpcyBvZmYsIHRoZW4gYm90aCBvbXB0X2JsYW1lIGFuZCBvbXB0X3RyYWNlIGFyZSBpZ25vcmVkLgorCistRExJQk9NUF9PTVBUX0JMQU1FPW9ufG9mZgorU2hvdWxkIE9NUFQgYmxhbWUgZnVuY3Rpb25hbGl0eSBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQ/CisKKy1ETElCT01QX09NUFRfVFJBQ0U9b258b2ZmCitTaG91bGQgT01QVCB0cmFjZSBmdW5jdGlvbmFsaXR5IGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZD8KKworLURMSUJPTVBfU1RBVFM9b2ZmfG9uCitTaG91bGQgaW5jbHVkZSBzdGF0cy1nYXRoZXJpbmcgY29kZSBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQ/CisKKy1ETElCT01QX1VTRV9ERUJVR0dFUj1vZmZ8b24KK1Nob3VsZCB0aGUgZnJpZW5kbHkgZGVidWdnZXIgaW50ZXJmYWNlIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZD8KKworLURMSUJPTVBfVVNFX0hXTE9DPW9mZnxvbgorU2hvdWxkIHRoZSBId2xvYyBsaWJyYXJ5IGJlIHVzZWQgZm9yIGFmZmluaXR5PworVGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLgoraHR0cDovL3d3dy5vcGVuLW1waS5vcmcvcHJvamVjdHMvaHdsb2MKKworLURMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVI9L3BhdGgvdG8vaHdsb2MvaW5zdGFsbC9kaXIKK0RlZmF1bHQ6IC91c3IvbG9jYWwKK1RoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBpZiBMSUJPTVBfVVNFX0hXTE9DIGlzIG9uLgorU3BlY2lmaWVzIGluc3RhbGwgbG9jYXRpb24gb2YgSHdsb2MuIFRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSB3aWxsIGxvb2sgZm9yCitod2xvYy5oIGluICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9pbmNsdWRlIGFuZCB0aGUgbGlicmFyeSBpbiAKKyR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9saWIuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitIb3cgdG8gYXBwZW5kIGZsYWdzIHRvIHRoZSBidWlsZAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gVGhlc2UgZmxhZ3MgYXJlICphcHBlbmRlZCouICBUaGV5IGRvIG5vdCAKKyAgb3ZlcndyaXRlIGFueSBvZiB0aGUgcHJlc2V0IGZsYWdzLgorLURMSUJPTVBfQ1BQRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gLS0gQWRkaXRpb25hbCBDIHByZXByb2Nlc3NvciBmbGFncworLURMSUJPTVBfQ0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+ICAgLS0gQWRkaXRpb25hbCBDIGNvbXBpbGVyIGZsYWdzCistRExJQk9NUF9DWFhGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAtLSBBZGRpdGlvbmFsIEMrKyBjb21waWxlciBmbGFncworLURMSUJPTVBfQVNNRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gLS0gQWRkaXRpb25hbCBhc3NlbWJseSBmbGFncworLURMSUJPTVBfTERGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgLS0gQWRkaXRpb25hbCBsaW5rZXIgZmxhZ3MKKy1ETElCT01QX0xJQkZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+IC0tIEFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsKKy1ETElCT01QX0ZGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgIC0tIEFkZGl0aW9uYWwgRm9ydHJhbiBjb21waWxlciBmbGFncworCis9PT09PT09PT09PT09PT09PT09PT09PQorRXhhbXBsZSB1c2FnZXMgb2YgQ01ha2UKKz09PT09PT09PT09PT09PT09PT09PT09CistLS0tIFR5cGljYWwgdXNhZ2UgLS0tLQorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWljYyAtRENNQUtFX0NYWF9DT01QSUxFUj1pY3BjIC4uCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAuLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWNsYW5nIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWNsYW5nKysgLi4KKworLS0tLSBXaXRoIFZhcmlvdXMgT3B0aW9ucyAtLS0tCistIEJ1aWxkIHRoZSBpMzg2IExpbnV4IGxpYnJhcnkgdXNpbmcgR0NDKgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfQVJDSD1pMzg2IC4uCisKKy0gQnVpbGQgdGhlIHg4Nl82NCBkZWJ1ZyBNYWMgbGlicmFyeSB1c2luZyBDbGFuZyoKK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC1ETElCT01QX0FSQ0g9eDg2XzY0IC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAuLgorCistIEJ1aWxkIHRoZSBsaWJyYXJ5IChhcmNoaXRlY3R1cmUgZGV0ZXJtaW5lZCBieSBwcm9iaW5nIGNvbXBpbGVyKSB1c2luZyB0aGUKKyAgSW50ZWwoUikgQyBDb21waWxlciBhbmQgdGhlIEludGVsKFIpIEMrKyBDb21waWxlci4gQWxzbywgY3JlYXRlIHRoZSBmb3J0cmFuIG1vZHVsZXMgdXNpbmcKKyAgdGhlIEludGVsKFIpIEZvcnRyYW4gQ29tcGlsZXIuCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9aWNjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWljcGMgLURDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSPWlmb3J0IC1ETElCT01QX0ZPUlRSQU5fTU9EVUxFUz1vbiAuLgorCistIEhhdmUgQ01ha2UgRmluZCB0aGUgQy9DKysgY29tcGlsZXIsIGFuZCBzcGVjaWZ5IGFkZGl0aW9uYWwgZmxhZ3MgZm9yIHRoZSBDIGNvbXBpbGVyLCBwcmVwcm9jZXNzb3IsIGFuZCBDKysgY29tcGlsZXIuCitjbWFrZSAtRExJQk9NUF9DRkxBR1M9Jy1zcGVjaWZpYy1mbGFnJyAtRExJQk9NUF9DUFBGTEFHUz0nLURORVdfRkVBVFVSRT0xIC1ET0xEX0ZFQVRVUkU9MCcgLURMSUJPTVBfQ1hYRkxBR1M9Jy0tb25lLXNwZWNpZmljLWZsYWcgLS10d28tc3BlY2lmaWMtZmxhZycgLi4KKworLS0tLSBCdWlsZCB0aGUgc3R1YnMgbGlicmFyeSAtLS0tCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAtRExJQk9NUF9MSUJfVFlQRT1zdHVicyAuLgorCis9PT09PT09PT0KK0Zvb3Rub3RlcworPT09PT09PT09CitbKl0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMTE4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzNDMgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBDTUFLRSBsaWJvbXAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjggRkFUQUxfRVJST1IpCisKKyMgQWRkIGNtYWtlIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIGN1c3RvbSBjbWFrZSBmdW5jdGlvbnMKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UgJHtDTUFLRV9NT0RVTEVfUEFUSH0pCisKKyMgU3RhbmRhbG9uZSBidWlsZCBvciBwYXJ0IG9mIExMVk0/CitzZXQoTElCT01QX1NUQU5EQUxPTkVfQlVJTEQgRkFMU0UpCitpZigiJHtDTUFLRV9TT1VSQ0VfRElSfSIgU1RSRVFVQUwgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSIgT1IKKyAgICIke0NNQUtFX1NPVVJDRV9ESVJ9L3J1bnRpbWUiIFNUUkVRVUFMICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQorICBwcm9qZWN0KGxpYm9tcCBDIENYWCkKKyAgc2V0KExJQk9NUF9TVEFOREFMT05FX0JVSUxEIFRSVUUpCitlbmRpZigpCisKKyMgU2V0IGxpYm9tcCB2ZXJzaW9uCitzZXQoTElCT01QX1ZFUlNJT05fTUFKT1IgNSkKK3NldChMSUJPTVBfVkVSU0lPTl9NSU5PUiAwKQorCisjIFRoZXNlIGluY2x1ZGUgZmlsZXMgYXJlIGluIHRoZSBjbWFrZS8gc3ViZGlyZWN0b3J5CitpbmNsdWRlKExpYm9tcFV0aWxzKQoraW5jbHVkZShMaWJvbXBHZXRBcmNoaXRlY3R1cmUpCitpbmNsdWRlKExpYm9tcEhhbmRsZUZsYWdzKQoraW5jbHVkZShMaWJvbXBEZWZpbml0aW9ucykKKworIyBEZXRlcm1pbmUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKK2lmKCR7TElCT01QX1NUQU5EQUxPTkVfQlVJTER9KQorICAjIElmIGFkZGluZyBhIG5ldyBhcmNoaXRlY3R1cmUsIHRha2UgYSBsb29rIGF0IGNtYWtlL0xpYm9tcEdldEFyY2hpdGVjdHVyZS5jbWFrZQorICBsaWJvbXBfZ2V0X2FyY2hpdGVjdHVyZShMSUJPTVBfREVURUNURURfQVJDSCkKKyAgc2V0KExJQk9NUF9BUkNIICR7TElCT01QX0RFVEVDVEVEX0FSQ0h9IENBQ0hFIFNUUklORworICAgICJUaGUgYXJjaGl0ZWN0dXJlIHRvIGJ1aWxkIGZvciAoeDg2XzY0L2kzODYvYXJtL3BwYzY0L3BwYzY0bGUvYWFyY2g2NC9taWMpLiIpCisgICMgQWxsb3cgdXNlciB0byBjaG9vc2UgYSBzdWZmaXggZm9yIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorICBzZXQoTElCT01QX0xJQkRJUl9TVUZGSVggIiIgQ0FDSEUgU1RSSU5HCisgICAgInN1ZmZpeCBvZiBsaWIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBlLmcuLCA2NCA9PiBsaWI2NCIpCisgICMgU2hvdWxkIGFzc2VydGlvbnMgYmUgZW5hYmxlZD8gIFRoZXkgYXJlIG9uIGJ5IGRlZmF1bHQuCisgIHNldChMSUJPTVBfRU5BQkxFX0FTU0VSVElPTlMgVFJVRSBDQUNIRSBCT09MCisgICAgImVuYWJsZSBhc3NlcnRpb25zPyIpCisgIHNldChMSUJPTVBfRU5BQkxFX1dFUlJPUiBGQUxTRSBDQUNIRSBCT09MCisgICAgIkVuYWJsZSAtV2Vycm9yIGZsYWdzIHRvIHR1cm4gd2FybmluZ3MgaW50byBlcnJvcnMgZm9yIHN1cHBvcnRpbmcgY29tcGlsZXJzLiIpCisgICMgQ01BS0VfQlVJTERfVFlQRSB3YXMgbm90IGRlZmluZWQsIHNldCBkZWZhdWx0IHRvIFJlbGVhc2UKKyAgaWYoTk9UIENNQUtFX0JVSUxEX1RZUEUpCisgICAgc2V0KENNQUtFX0JVSUxEX1RZUEUgUmVsZWFzZSkKKyAgZW5kaWYoKQorZWxzZSgpICMgUGFydCBvZiBMTFZNIGJ1aWxkCisgICMgRGV0ZXJtaW5lIHRoZSBuYXRpdmUgYXJjaGl0ZWN0dXJlIGZyb20gTExWTS4KKyAgc3RyaW5nKFRPTE9XRVIgIiR7TExWTV9UQVJHRVRfQVJDSH0iIExJQk9NUF9OQVRJVkVfQVJDSCkKKyAgaWYoIExJQk9NUF9OQVRJVkVfQVJDSCBTVFJFUVVBTCAiaG9zdCIgKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiXlteLV0qIiBMSUJPTVBfTkFUSVZFX0FSQ0ggJHtMTFZNX0hPU1RfVFJJUExFfSkKKyAgZW5kaWYgKCkKKyAgaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgImlbMi02XTg2IikKKyAgICBzZXQoTElCT01QX0FSQ0ggaTM4NikKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBTVFJFUVVBTCAieDg2IikKKyAgICBzZXQoTElCT01QX0FSQ0ggaTM4NikKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBTVFJFUVVBTCAiYW1kNjQiKQorICAgIHNldChMSUJPTVBfQVJDSCB4ODZfNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggU1RSRVFVQUwgIng4Nl82NCIpCisgICAgc2V0KExJQk9NUF9BUkNIIHg4Nl82NCkKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBNQVRDSEVTICJwb3dlcnBjIikKKyAgICBzZXQoTElCT01QX0FSQ0ggcHBjNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAiYWFyY2g2NCIpCisgICAgc2V0KExJQk9NUF9BUkNIIGFhcmNoNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAiYXJtNjQiKQorICAgIHNldChMSUJPTVBfQVJDSCBhYXJjaDY0KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgImFybSIpCisgICAgc2V0KExJQk9NUF9BUkNIIGFybSkKKyAgZWxzZSgpCisgICAgIyBsYXN0IGRpdGNoIGVmZm9ydAorICAgIGxpYm9tcF9nZXRfYXJjaGl0ZWN0dXJlKExJQk9NUF9BUkNIKQorICBlbmRpZiAoKQorICBzZXQoTElCT01QX0xJQkRJUl9TVUZGSVggJHtMTFZNX0xJQkRJUl9TVUZGSVh9KQorICBzZXQoTElCT01QX0VOQUJMRV9BU1NFUlRJT05TICR7TExWTV9FTkFCTEVfQVNTRVJUSU9OU30pCisgIHNldChMSUJPTVBfRU5BQkxFX1dFUlJPUiAke0xMVk1fRU5BQkxFX1dFUlJPUn0pCitlbmRpZigpCitsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX0FSQ0ggMzJlIHg4Nl82NCAzMiBpMzg2IGFybSBwcGM2NCBwcGM2NGxlIGFhcmNoNjQgbWljKQorCitzZXQoTElCT01QX0xJQl9UWVBFIG5vcm1hbCBDQUNIRSBTVFJJTkcKKyAgIlBlcmZvcm1hbmNlLFByb2ZpbGluZyxTdHVicyBsaWJyYXJ5IChub3JtYWwvcHJvZmlsZS9zdHVicykiKQorbGlib21wX2NoZWNrX3ZhcmlhYmxlKExJQk9NUF9MSUJfVFlQRSBub3JtYWwgcHJvZmlsZSBzdHVicykKK3NldChMSUJPTVBfT01QX1ZFUlNJT04gNDEgQ0FDSEUgU1RSSU5HCisgICJUaGUgT3Blbk1QIHZlcnNpb24gKDQxLzQwLzMwKSIpCitsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX09NUF9WRVJTSU9OIDQxIDQwIDMwKQorIyBTZXQgdGhlIE9wZW5NUCBZZWFyIGFuZCBNb250aCBhc3Npb2NpYXRlZCB3aXRoIHZlcnNpb24KK2lmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDQwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCA0MCkKKyAgc2V0KExJQk9NUF9PTVBfWUVBUl9NT05USCAyMDEzMDcpCitlbHNlaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgMzAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDMwKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMTEwNykKK2Vsc2UoKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMDUwNSkKK2VuZGlmKCkKK3NldChMSUJPTVBfTUlDX0FSQ0gga25jIENBQ0hFIFNUUklORworICAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIChJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlKSAoa25mL2tuYykuICBJZ25vcmVkIGlmIG5vdCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGJ1aWxkLiIpCitpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJtaWMiKQorICBsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX01JQ19BUkNIIGtuZiBrbmMpCitlbmRpZigpCitzZXQoTElCT01QX0ZPUlRSQU5fTU9EVUxFUyBGQUxTRSBDQUNIRSBCT09MCisgICJDcmVhdGUgRm9ydHJhbiBtb2R1bGUgZmlsZXM/IChyZXF1aXJlcyBmb3J0cmFuIGNvbXBpbGVyKSIpCisKKyMgLSBTdXBwb3J0IGZvciB1bml2ZXJzYWwgZmF0IGJpbmFyeSBidWlsZHMgb24gTWFjCisjIC0gSGF2aW5nIHRoaXMgZXh0cmEgdmFyaWFibGUgYWxsb3dzIHBlb3BsZSB0byBidWlsZCB0aGlzIGxpYnJhcnkgYXMgYSB1bml2ZXJzYWwgbGlicmFyeQorIyAgIHdpdGhvdXQgZm9yY2luZyBhIHVuaXZlcnNhbCBidWlsZCBvZiB0aGUgbGx2bS9jbGFuZyBjb21waWxlci4KK3NldChMSUJPTVBfT1NYX0FSQ0hJVEVDVFVSRVMgIiR7Q01BS0VfT1NYX0FSQ0hJVEVDVFVSRVN9IiBDQUNIRSBTVFJJTkcKKyAgIkZvciBNYWMgYnVpbGRzLCBzZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcyB0byBidWlsZCBmb3IgdW5pdmVyc2FsIGZhdCBiaW5hcnkuIikKK3NldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAke0xJQk9NUF9PU1hfQVJDSElURUNUVVJFU30pCisKKyMgVXNlciBzcGVjaWZpZWQgZmxhZ3MuICBUaGVzZSBhcmUgYXBwZW5kZWQgdG8gdGhlIGNvbmZpZ3VyZWQgZmxhZ3MuCitzZXQoTElCT01QX0NGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEMgY29tcGlsZXIgZmxhZ3MuIikKK3NldChMSUJPTVBfQ1hYRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBDKysgY29tcGlsZXIgZmxhZ3MuIikKK3NldChMSUJPTVBfQ1BQRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBDIHByZXByb2Nlc3NvciBmbGFncy4iKQorc2V0KExJQk9NUF9BU01GTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIGFzc2VtYmxlciBmbGFncy4iKQorc2V0KExJQk9NUF9MREZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgbGlua2VyIGZsYWdzLiIpCitzZXQoTElCT01QX0xJQkZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgbGlua2VkIGxpYnMgZmxhZ3MuIChlLmcuLCAtbG0pIikKK3NldChMSUJPTVBfRkZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgRm9ydHJhbiBjb21waWxlciBmbGFncy4gIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgTElCT01QX0ZPUlRSQU5fTU9EVUxFUz09VFJVRS4iKQorCisjIFNob3VsZCB0aGUgbGlib21wIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBoZWFkZXJzIGJlIGNvcGllZCBpbnRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZXhwb3J0cy8gZGlyZWN0b3J5CisjIFR1cm5pbmcgdGhpcyB0byBGQUxTRSBhaWRzIHBhcmFsbGVsIGJ1aWxkcyB0byBub3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlci4KKyMgQ3VycmVudGx5LCB0aGUgdGVzdHN1aXRlIG1vZHVsZSBleHBlY3RzIHRoZSBqdXN0IGJ1aWx0IE9wZW5NUCBsaWJyYXJ5IHRvIGJlIGxvY2F0ZWQgaW5zaWRlIHRoZSBleHBvcnRzLworIyBkaXJlY3RvcnkuICBUT0RPOiBoYXZlIHRlc3RzdWl0ZSBydW4gdW5kZXIgbGx2bS1saXQgZGlyZWN0bHkuICBXZSBjYW4gdGhlbiBnZXQgcmlkIG9mIGNvcHlpbmcgdG8gZXhwb3J0cy8KK3NldChMSUJPTVBfQ09QWV9FWFBPUlRTIFRSVUUgQ0FDSEUgU1RSSU5HCisgICJTaG91bGQgZXhwb3J0cyBiZSBjb3BpZWQgaW50byBzb3VyY2UgZXhwb3J0cy8gZGlyZWN0b3J5PyIpCisKKyMgSFdMT0Mtc3VwcG9ydAorc2V0KExJQk9NUF9VU0VfSFdMT0MgRkFMU0UgQ0FDSEUgQk9PTAorICAiVXNlIEh3bG9jIChodHRwOi8vd3d3Lm9wZW4tbXBpLm9yZy9wcm9qZWN0cy9od2xvYy8pIGxpYnJhcnkgZm9yIGFmZmluaXR5PyIpCitzZXQoTElCT01QX0hXTE9DX0lOU1RBTExfRElSIC91c3IvbG9jYWwgQ0FDSEUgUEFUSAorICAiSW5zdGFsbCBwYXRoIGZvciBod2xvYyBsaWJyYXJ5IikKKworIyBHZXQgdGhlIGJ1aWxkIG51bWJlciBmcm9tIGttcF92ZXJzaW9uLmMKK2xpYm9tcF9nZXRfYnVpbGRfbnVtYmVyKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iIExJQk9NUF9WRVJTSU9OX0JVSUxEKQorbWF0aChFWFBSIExJQk9NUF9WRVJTSU9OX0JVSUxEX1lFQVIgIiR7TElCT01QX1ZFUlNJT05fQlVJTER9LzEwMDAwIikKK21hdGgoRVhQUiBMSUJPTVBfVkVSU0lPTl9CVUlMRF9NT05USF9EQVkgIiR7TElCT01QX1ZFUlNJT05fQlVJTER9JTEwMDAwIikKKworIyBDdXJyZW50bHkgZG9uJ3QgcmVjb3JkIGFueSB0aW1lc3RhbXBzCitzZXQoTElCT01QX0JVSUxEX0RBVEUgIk5vX1RpbWVzdGFtcCIpCisKKyMgQXJjaGl0ZWN0dXJlCitzZXQoSUEzMiBGQUxTRSkKK3NldChJTlRFTDY0IEZBTFNFKQorc2V0KEFSTSBGQUxTRSkKK3NldChBQVJDSDY0IEZBTFNFKQorc2V0KFBQQzY0QkUgRkFMU0UpCitzZXQoUFBDNjRMRSBGQUxTRSkKK3NldChQUEM2NCBGQUxTRSkKK3NldChNSUMgRkFMU0UpCitpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJpMzg2IiBPUiAiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICIzMiIpICAgICMgSUEtMzIgYXJjaGl0ZWN0dXJlCisgIHNldChJQTMyIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAieDg2XzY0IiBPUiAiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICIzMmUiKSAjIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZQorICBzZXQoSU5URUw2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgImFybSIpICMgQVJNIGFyY2hpdGVjdHVyZQorICBzZXQoQVJNIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAicHBjNjQiKSAjIFBQQzY0QkUgYXJjaGl0ZWN0dXJlCisgIHNldChQUEM2NEJFIFRSVUUpCisgIHNldChQUEM2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgInBwYzY0bGUiKSAjIFBQQzY0TEUgYXJjaGl0ZWN0dXJlCisgIHNldChQUEM2NExFIFRSVUUpCisgIHNldChQUEM2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgImFhcmNoNjQiKSAjIEFBUkNINjQgYXJjaGl0ZWN0dXJlCisgIHNldChBQVJDSDY0IFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAibWljIikgIyBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKyAgc2V0KE1JQyBUUlVFKQorZW5kaWYoKQorCisjIFNldCBzb21lIGZsYWdzIGJhc2VkIG9uIGJ1aWxkX3R5cGUKK3NldChSRUxFQVNFX0JVSUxEIEZBTFNFKQorc2V0KERFQlVHX0JVSUxEIEZBTFNFKQorc2V0KFJFTFdJVEhERUJJTkZPX0JVSUxEIEZBTFNFKQorc2V0KE1JTlNJWkVSRUxfQlVJTEQgRkFMU0UpCitzdHJpbmcoVE9MT1dFUiAiJHtDTUFLRV9CVUlMRF9UWVBFfSIgbGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlKQoraWYoIiR7bGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlfSIgU1RSRVFVQUwgInJlbGVhc2UiKQorICBzZXQoUkVMRUFTRV9CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJkZWJ1ZyIpCisgIHNldChERUJVR19CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJyZWx3aXRoZGViaW5mbyIpCisgIHNldChSRUxXSVRIREVCSU5GT19CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJtaW5zaXplcmVsIikKKyAgc2V0KE1JTlNJWkVSRUxfQlVJTEQgVFJVRSkKK2VuZGlmKCkKKworIyBJbmNsdWRlIGl0dCBub3RpZnkgaW50ZXJmYWNlPworc2V0KExJQk9NUF9VU0VfSVRUX05PVElGWSBUUlVFIENBQ0hFIEJPT0wKKyAgIkVuYWJsZSBJVFQgbm90aWZ5PyIpCisKKyMgbm9ybWFsLCBwcm9maWxlLCBzdHVicyBsaWJyYXJ5Lgorc2V0KE5PUk1BTF9MSUJSQVJZIEZBTFNFKQorc2V0KFNUVUJTX0xJQlJBUlkgRkFMU0UpCitzZXQoUFJPRklMRV9MSUJSQVJZIEZBTFNFKQoraWYoIiR7TElCT01QX0xJQl9UWVBFfSIgU1RSRVFVQUwgIm5vcm1hbCIpCisgIHNldChOT1JNQUxfTElCUkFSWSBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9MSUJfVFlQRX0iIFNUUkVRVUFMICJwcm9maWxlIikKKyAgc2V0KFBST0ZJTEVfTElCUkFSWSBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9MSUJfVFlQRX0iIFNUUkVRVUFMICJzdHVicyIpCisgIHNldChTVFVCU19MSUJSQVJZIFRSVUUpCitlbmRpZigpCisKKyMgU2V0dGluZyBkaXJlY3RvcnkgbmFtZXMKK3NldChMSUJPTVBfQkFTRV9ESVIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorc2V0KExJQk9NUF9TUkNfRElSICR7TElCT01QX0JBU0VfRElSfS9zcmMpCitzZXQoTElCT01QX1RPT0xTX0RJUiAke0xJQk9NUF9CQVNFX0RJUn0vdG9vbHMpCitzZXQoTElCT01QX0lOQ19ESVIgJHtMSUJPTVBfU1JDX0RJUn0vaW5jbHVkZS8ke0xJQk9NUF9PTVBfVkVSU0lPTn0pCitzZXQoTElCT01QX0JJTkFSWV9ESVIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIEVuYWJsaW5nIEZvcnRyYW4gaWYgaXQgaXMgbmVlZGVkCitpZigke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9KQorICBlbmFibGVfbGFuZ3VhZ2UoRm9ydHJhbikKK2VuZGlmKCkKKyMgRW5hYmxlIE1BU00gQ29tcGlsZXIgaWYgaXQgaXMgbmVlZGVkIChXaW5kb3dzIG9ubHkpCitpZihXSU4zMikKKyAgZW5hYmxlX2xhbmd1YWdlKEFTTV9NQVNNKQorZW5kaWYoKQorCisjIEdldHRpbmcgbGVnYWwgdHlwZS9hcmNoCitsaWJvbXBfZ2V0X2xlZ2FsX3R5cGUoTElCT01QX0xFR0FMX1RZUEUpCitsaWJvbXBfZ2V0X2xlZ2FsX2FyY2goTElCT01QX0xFR0FMX0FSQ0gpCisKKyMgQ29tcGlsZXIgZmxhZyBjaGVja3MsIGxpYnJhcnkgY2hlY2tzLCB0aHJlYWRpbmcgY2hlY2ssIGV0Yy4KK2luY2x1ZGUoY29uZmlnLWl4KQorCisjIElzIHRoZXJlIGEgcXVhZCBwcmVjaXNpb24gZGF0YSB0eXBlIGF2YWlsYWJsZT8KKyMgVE9ETzogTWFrZSB0aGlzIGEgcmVhbCBmZWF0dXJlIGNoZWNrCitzZXQoTElCT01QX1VTRV9RVUFEX1BSRUNJU0lPTiAiJHtMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTn0iIENBQ0hFIEJPT0wKKyAgIlNob3VsZCAxMjgtYml0IHByZWNpc2lvbiBlbnRyeSBwb2ludHMgYmUgYnVpbHQ/IikKK2lmKExJQk9NUF9VU0VfUVVBRF9QUkVDSVNJT04gQU5EIChOT1QgTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04pKQorICBsaWJvbXBfZXJyb3Jfc2F5KCIxMjgtYml0IHF1YWQgcHJlY2lzaW9uIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKworIyBsaWJnb21wIGRyb3AtaW4gY29tcGF0aWJpbGl0eSByZXF1aXJlcyB2ZXJzaW9uZWQgc3ltYm9scworc2V0KExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTICIke0xJQk9NUF9IQVZFX1ZFUlNJT05fU1lNQk9MU30iIENBQ0hFIEJPT0wKKyAgIlNob3VsZCB2ZXJzaW9uIHN5bWJvbHMgYmUgdXNlZD8gVGhlc2UgcHJvdmlkZSBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGxpYmdvbXAuIikKK2lmKExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTIEFORCAoTk9UIExJQk9NUF9IQVZFX1ZFUlNJT05fU1lNQk9MUykpCisgIGxpYm9tcF9lcnJvcl9zYXkoIlZlcnNpb24gc3ltYm9scyBmdW5jdGlvbmFsaXR5IHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgT24gbXVsdGlub2RlIHN5c3RlbXMsIGxhcmdlciBhbGlnbm1lbnQgaXMgZGVzaXJlZCB0byBhdm9pZCBmYWxzZSBzaGFyaW5nCitzZXQoTElCT01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlNob3VsZCBsYXJnZXIgYWxpZ25tZW50ICg0MDk2IGJ5dGVzKSBiZSB1c2VkIGZvciBzb21lIGxvY2tzIGFuZCBkYXRhIHN0cnVjdHVyZXM/IikKKworIyBCdWlsZCBjb2RlIHRoYXQgYWxsb3dzIHRoZSBPcGVuTVAgbGlicmFyeSB0byBjb252ZW5pZW50bHkgaW50ZXJmYWNlIHdpdGggZGVidWdnZXJzCitzZXQoTElCT01QX1VTRV9ERUJVR0dFUiBGQUxTRSBDQUNIRSBCT09MCisgICJFbmFibGUgZGVidWdnZXIgaW50ZXJmYWNlIGNvZGU/IikKKworIyBTaG91bGQgd2UgbGluayB0byBDKysgbGlicmFyeT8KK3NldChMSUJPTVBfVVNFX1NURENQUExJQiBGQUxTRSBDQUNIRSBCT09MCisgICJTaG91bGQgd2UgbGluayB0byBDKysgbGlicmFyeT8iKQorCisjIFRTWCAoeDg2KSBiYXNlZCBsb2NrcyBoYXZlIF9fYXNtIGNvZGUgd2hpY2ggY2FuIGJlIHRyb3VibGVzb21lIGZvciBzb21lIGNvbXBpbGVycy4KKyMgVE9ETzogTWFrZSB0aGlzIGEgcmVhbCBmZWF0dXJlIGNoZWNrCitzZXQoTElCT01QX1VTRV9BREFQVElWRV9MT0NLUyAiJHtMSUJPTVBfSEFWRV9BREFQVElWRV9MT0NLU30iIENBQ0hFIEJPT0wKKyAgIlNob3VsZCBUU1gtYmFzZWQgbG9jayBiZSBjb21waWxlZCAoYWRhcHRpdmUgbG9jayBpbiBrbXBfbG9jay5jcHApLiAgVGhlc2UgYXJlIHg4NiBzcGVjaWZpYy4iKQoraWYoTElCT01QX1VTRV9BREFQVElWRV9MT0NLUyBBTkQgKE5PVCBMSUJPTVBfSEFWRV9BREFQVElWRV9MT0NLUykpCisgIGxpYm9tcF9lcnJvcl9zYXkoIkFkYXB0aXZlIGxvY2tzIChUU1gpIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKworIyAtIHN0YXRzLWdhdGhlcmluZyBlbmFibGVzIE9wZW5NUCBzdGF0cyB3aGVyZSB0aGluZ3MgbGlrZSB0aGUgbnVtYmVyIG9mCisjIHBhcmFsbGVsIHJlZ2lvbnMsIGNsb2NrIHRpY2tzIHNwZW50IGluIHBhcnRpY3VsYXIgb3Blbm1wIHJlZ2lvbnMgYXJlIHJlY29yZGVkLgorc2V0KExJQk9NUF9TVEFUUyBGQUxTRSBDQUNIRSBCT09MCisgICJTdGF0cy1HYXRoZXJpbmcgZnVuY3Rpb25hbGl0eT8iKQoraWYoTElCT01QX1NUQVRTIEFORCAoTk9UIExJQk9NUF9IQVZFX1NUQVRTKSkKKyAgbGlib21wX2Vycm9yX3NheSgiU3RhdHMtZ2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKyMgVGhlIHN0YXRzIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZXMgdGhlIHN0ZCBjKysgbGlicmFyeQoraWYoTElCT01QX1NUQVRTKQorICBzZXQoTElCT01QX1VTRV9TVERDUFBMSUIgVFJVRSkKK2VuZGlmKCkKKworIyBPTVBULXN1cHBvcnQKK3NldChMSUJPTVBfT01QVF9ERUJVRyBGQUxTRSBDQUNIRSBCT09MCisgICJUcmFjZSBPTVBUIGluaXRpYWxpemF0aW9uPyIpCitzZXQoTElCT01QX09NUFRfU1VQUE9SVCBGQUxTRSBDQUNIRSBCT09MCisgICJPTVBULXN1cHBvcnQ/IikKK3NldChMSUJPTVBfT01QVF9CTEFNRSBUUlVFIENBQ0hFIEJPT0wKKyAgIk9NUFQtYmxhbWU/IikKK3NldChMSUJPTVBfT01QVF9UUkFDRSBUUlVFIENBQ0hFIEJPT0wKKyAgIk9NUFQtdHJhY2U/IikKK2lmKExJQk9NUF9PTVBUX1NVUFBPUlQgQU5EIChOT1QgTElCT01QX0hBVkVfT01QVF9TVVBQT1JUKSkKKyAgbGlib21wX2Vycm9yX3NheSgiT3Blbk1QIFRvb2xzIEludGVyZmFjZSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIEVycm9yIGNoZWNrIGh3bG9jIHN1cHBvcnQgYWZ0ZXIgY29uZmlnLWl4IGhhcyBydW4KK2lmKExJQk9NUF9VU0VfSFdMT0MgQU5EIChOT1QgTElCT01QX0hBVkVfSFdMT0MpKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJId2xvYyByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIFNldHRpbmcgZmluYWwgbGlicmFyeSBuYW1lCitzZXQoTElCT01QX0RFRkFVTFRfTElCX05BTUUgbGlib21wKQoraWYoJHtQUk9GSUxFX0xJQlJBUll9KQorICBzZXQoTElCT01QX0RFRkFVTFRfTElCX05BTUUgJHtMSUJPTVBfREVGQVVMVF9MSUJfTkFNRX1wcm9mKQorZW5kaWYoKQoraWYoJHtTVFVCU19MSUJSQVJZfSkKKyAgc2V0KExJQk9NUF9ERUZBVUxUX0xJQl9OQU1FICR7TElCT01QX0RFRkFVTFRfTElCX05BTUV9c3R1YnMpCitlbmRpZigpCitzZXQoTElCT01QX0xJQl9OQU1FICR7TElCT01QX0RFRkFVTFRfTElCX05BTUV9IENBQ0hFIFNUUklORyAiQmFzZSBPTVAgbGlicmFyeSBuYW1lIikKK3NldChMSUJPTVBfTElCX0ZJTEUgJHtMSUJPTVBfTElCX05BTUV9JHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9KQorCisjIFByaW50IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgYWxsIHZhcmlhYmxlcyBhcmUgc2V0LgoraWYoJHtMSUJPTVBfU1RBTkRBTE9ORV9CVUlMRH0pCisgIGxpYm9tcF9zYXkoIk9wZXJhdGluZyBTeXN0ZW0gICAgIC0tICR7Q01BS0VfU1lTVEVNX05BTUV9IikKKyAgbGlib21wX3NheSgiVGFyZ2V0IEFyY2hpdGVjdHVyZSAgLS0gJHtMSUJPTVBfQVJDSH0iKQorICBpZigke01JQ30pCisgICAgbGlib21wX3NheSgiSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSAgICAtLSAke0xJQk9NUF9NSUNfQVJDSH0iKQorICBlbmRpZigpCisgIGxpYm9tcF9zYXkoIkJ1aWxkIFR5cGUgICAgICAgICAgIC0tICR7Q01BS0VfQlVJTERfVFlQRX0iKQorICBsaWJvbXBfc2F5KCJPcGVuTVAgVmVyc2lvbiAgICAgICAtLSAke0xJQk9NUF9PTVBfVkVSU0lPTn0iKQorICBsaWJvbXBfc2F5KCJMaWIgVHlwZSAgICAgICAgICAgICAtLSAke0xJQk9NUF9MSUJfVFlQRX0iKQorICBsaWJvbXBfc2F5KCJGb3J0cmFuIE1vZHVsZXMgICAgICAtLSAke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9IikKKyAgIyB3aWxsIHNheSBkZXZlbG9wbWVudCBpZiBhbGwgemVyb3MKKyAgaWYoJHtMSUJPTVBfVkVSU0lPTl9CVUlMRH0gU1RSRVFVQUwgMDAwMDAwMDApCisgICAgc2V0KExJQk9NUF9CVUlMRCBEZXZlbG9wbWVudCkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9CVUlMRCAke0xJQk9NUF9WRVJTSU9OX0JVSUxEfSkKKyAgZW5kaWYoKQorICBsaWJvbXBfc2F5KCJCdWlsZCAgICAgICAgICAgICAgICAtLSAke0xJQk9NUF9CVUlMRH0iKQorICBsaWJvbXBfc2F5KCJVc2UgU3RhdHMtZ2F0aGVyaW5nICAtLSAke0xJQk9NUF9TVEFUU30iKQorICBsaWJvbXBfc2F5KCJVc2UgRGVidWdnZXItc3VwcG9ydCAtLSAke0xJQk9NUF9VU0VfREVCVUdHRVJ9IikKKyAgbGlib21wX3NheSgiVXNlIElUVCBub3RpZnkgICAgICAgLS0gJHtMSUJPTVBfVVNFX0lUVF9OT1RJRll9IikKKyAgbGlib21wX3NheSgiVXNlIE9NUFQtc3VwcG9ydCAgICAgLS0gJHtMSUJPTVBfT01QVF9TVVBQT1JUfSIpCisgIGlmKCR7TElCT01QX09NUFRfU1VQUE9SVH0pCisgICAgbGlib21wX3NheSgiVXNlIE9NUFQtYmxhbWUgICAgICAgLS0gJHtMSUJPTVBfT01QVF9CTEFNRX0iKQorICAgIGxpYm9tcF9zYXkoIlVzZSBPTVBULXRyYWNlICAgICAgIC0tICR7TElCT01QX09NUFRfVFJBQ0V9IikKKyAgZW5kaWYoKQorICBsaWJvbXBfc2F5KCJVc2UgQWRhcHRpdmUgbG9ja3MgICAtLSAke0xJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1N9IikKKyAgbGlib21wX3NheSgiVXNlIHF1YWQgcHJlY2lzaW9uICAgLS0gJHtMSUJPTVBfVVNFX1FVQURfUFJFQ0lTSU9OfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBId2xvYyBsaWJyYXJ5ICAgIC0tICR7TElCT01QX1VTRV9IV0xPQ30iKQorZW5kaWYoKQorCithZGRfc3ViZGlyZWN0b3J5KHNyYykKK2FkZF9zdWJkaXJlY3RvcnkodGVzdCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9SRUFETUUudHh0IGIvZmluYWwvcnVudGltZS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDNiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMTUgQEAKKworICAgICAgICAgICAgICAgUkVBRE1FIGZvciB0aGUgTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKyAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0hvdyB0byBCdWlsZCBEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgbWFpbiBkb2N1bWVudGF0aW9uIGlzIGluIERveHlnZW4qIGZvcm1hdCwgYW5kIHRoaXMgZGlzdHJpYnV0aW9uCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4gIAorSG93ZXZlciwgYW4gSFRNTCB2ZXJzaW9uIGNhbiBiZSBidWlsdCBieSBleGVjdXRpbmc6CisKKyUgZG94eWdlbiBkb2MvZG94eWdlbi9jb25maWcgCisKK2luIHRoZSBydW50aW1lIGRpcmVjdG9yeS4KKworVGhhdCB3aWxsIHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQKK2RpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IHBvaW50aW5nIGEgd2ViIGJyb3dzZXIgYXQgdGhlCitpbmRleC5odG1sIGZpbGUgdGhlcmUuCisKK0lmIHlvdSBkb24ndCBoYXZlIERveHlnZW4gaW5zdGFsbGVkLCB5b3UgY2FuIGRvd25sb2FkIGl0IGZyb20KK3d3dy5kb3h5Z2VuLm9yZy4KKworCitIb3cgdG8gQnVpbGQgdGhlIExMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJbi10cmVlIGJ1aWxkOgorCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUKK0NoZWNrIG91dCBvcGVubXAgaW50byBsbHZtL3Byb2plY3RzCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWJ1aWxkCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vbGx2bSAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+CiskIG1ha2Ugb21wCisKK091dC1vZi10cmVlIGJ1aWxkOgorCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUKK0NoZWNrIG91dCBvcGVubXAKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZS9vcGVubXAvcnVudGltZQorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZAorJCBjbWFrZSBwYXRoL3RvL29wZW5tcCAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+CiskIG1ha2UKKworRm9yIGRldGFpbHMgYWJvdXQgYnVpbGRpbmcsIHBsZWFzZSBsb29rIGF0IEJ1aWxkX1dpdGhfQ01ha2UudHh0CisKK0FyY2hpdGVjdHVyZXMgU3VwcG9ydGVkCis9PT09PT09PT09PT09PT09PT09PT09PQorKiBJQS0zMiBhcmNoaXRlY3R1cmUgCisqIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZQorKiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKyogQVJNKiBhcmNoaXRlY3R1cmUKKyogQWFyY2g2NCAoNjQtYml0IEFSTSkgYXJjaGl0ZWN0dXJlCisqIElCTShSKSBQb3dlciBhcmNoaXRlY3R1cmUgKGJpZyBlbmRpYW4pCisqIElCTShSKSBQb3dlciBhcmNoaXRlY3R1cmUgKGxpdHRsZSBlbmRpYW4pCisKK1N1cHBvcnRlZCBSVEwgQnVpbGQgQ29uZmlndXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IElBLTMyIGFyY2hpdGVjdHVyZSwgSW50ZWwoUikgNjQsIGFuZCAKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgfCAgIGljYy9pY2wgICAgIHwgICAgZ2NjICAgICAgfCAgIGNsYW5nICAgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IExpbnV4KiBPUyAgIHwgICBZZXMoMSw1KSAgICB8ICBZZXMoMiw0KSAgIHwgWWVzKDQsNiw3KSAgIHwKK3wgRnJlZUJTRCogICAgfCAgIE5vICAgICAgICAgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcsOCkgfAorfCBPUyBYKiAgICAgICB8ICAgWWVzKDEsMyw0KSAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNykgICB8Cit8IFdpbmRvd3MqIE9TIHwgICBZZXMoMSw0KSAgICB8ICBObyAgICAgICAgIHwgTm8gICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCwgaWNjL2ljbCB2ZXJzaW9ucyAxMi54IGFyZSAKKyAgICBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLgorKDIpIEdDQyogdmVyc2lvbiA0LjcgaXMgc3VwcG9ydGVkLgorKDMpIEZvciBpY2Mgb24gT1MgWCosIE9TIFgqIHZlcnNpb24gMTAuNS44IGlzIHN1cHBvcnRlZC4KKyg0KSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgbm90IHN1cHBvcnRlZC4KKyg1KSBPbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUsIGljYy9pY2wgdmVyc2lvbnMgMTMuMCAKKyAgICBvciBsYXRlciBhcmUgcmVxdWlyZWQuCisoNikgQ2xhbmcqIHZlcnNpb24gMy4zIGlzIHN1cHBvcnRlZC4KKyg3KSBDbGFuZyogY3VycmVudGx5IGRvZXMgbm90IG9mZmVyIGEgc29mdHdhcmUtaW1wbGVtZW50ZWQgMTI4IGJpdCBleHRlbmRlZCAKKyAgICBwcmVjaXNpb24gdHlwZS4gIFRodXMsIGFsbCBlbnRyeSBwb2ludHMgcmVsaWFudCBvbiB0aGlzIHR5cGUgYXJlIHJlbW92ZWQKKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nCisgICAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlOgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl8qCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2XyoKKyAgICBfX2ttcGNfYXRvbWljXypfZnAKKyg4KSBDb21tdW5pdHkgY29udHJpYnV0aW9uIHByb3ZpZGVkIEFTIElTLCBub3QgdGVzdGVkIGJ5IEludGVsLgorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUJNKFIpIFBvd2VyIDcgYW5kIFBvd2VyIDgKKworICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgZ2NjICAgICAgfCAgIGNsYW5nICAgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICBZZXMoMSwyKSAgfCBZZXMoMyw0KSAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gUG93ZXIgNywgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLgorKDIpIE9uIFBvd2VyIDgsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC4KKygzKSBPbiBQb3dlciA3LCBjbGFuZyB2ZXJzaW9uIDMuNyBpcyBzdXBwb3J0ZWQuCisoNCkgT24gUG93ZXIgOCwgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLgorCisKK0Zyb250LWVuZCBDb21waWxlcnMgdGhhdCB3b3JrIHdpdGggdGhpcyBSVEwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZvbGxvd2luZyBjb21waWxlcnMgYXJlIGtub3duIHRvIGRvIGNvbXBhdGlibGUgY29kZSBnZW5lcmF0aW9uIGZvcgordGhpcyBSVEw6IGNsYW5nIChmcm9tIHRoZSBPcGVuTVAgZGV2ZWxvcG1lbnQgYnJhbmNoIGF0CitodHRwOi8vY2xhbmctb21wLmdpdGh1Yi5pby8gKSwgSW50ZWwgY29tcGlsZXJzLCBHQ0MuICBTZWUgdGhlIGRvY3VtZW50YXRpb24KK2ZvciBtb3JlIGRldGFpbHMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGljZXMKKz09PT09PT0KKworKk90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tGb3J0cmFuRmxhZy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tGb3J0cmFuRmxhZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzdiM2FkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0ZvcnRyYW5GbGFnLmNtYWtlCkBAIC0wLDAgKzEsNzMgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBDaGVja2luZyBhIGZvcnRyYW4gY29tcGlsZXIgZmxhZworIyBUaGVyZSBpcyBubyByZWFsIHRyaXZpYWwgd2F5IHRvIGRvIHRoaXMgaW4gQ01ha2UsIHNvIHdlIGltcGxlbWVudCBpdCBoZXJlCisjIHRoaXMgd2lsbCBoYXZlICR7Ym9vbGVhbn0gPSBUUlVFIGlmIHRoZSBmbGFnIHN1Y2NlZWRzLCBvdGhlcndpc2UgZmFsc2UuCitmdW5jdGlvbihsaWJvbXBfY2hlY2tfZm9ydHJhbl9mbGFnIGZsYWcgYm9vbGVhbikKKyAgaWYoTk9UIERFRklORUQgIiR7Ym9vbGVhbn0iKQorICAgIHNldChyZXR2YWwgVFJVRSkKKyAgICBzZXQoZm9ydHJhbl9zb3VyY2UKKyIgICAgICBwcm9ncmFtIGhlbGxvCisgICAgICAgICAgIHByaW50ICosIFwiSGVsbG8gV29ybGQhXCIKKyAgICAgIGVuZCBwcm9ncmFtIGhlbGxvIikKKworICBzZXQoZmFpbGVkX3JlZ2V4ZXMgIltFZV1ycm9yO1tVdV1ua25vd247W1NzXWtpcHBpbmciKQorICBpZihDTUFLRV9WRVJTSU9OIFZFUlNJT05fR1JFQVRFUiAzLjEgT1IgQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0VRVUFMIDMuMSkKKyAgICBpbmNsdWRlKENoZWNrRm9ydHJhblNvdXJjZUNvbXBpbGVzKQorICAgIGNoZWNrX2ZvcnRyYW5fc291cmNlX2NvbXBpbGVzKCIke2ZvcnRyYW5fc291cmNlfSIgJHtib29sZWFufSBGQUlMX1JFR0VYICIke2ZhaWxlZF9yZWdleGVzfSIpCisgICAgc2V0KCR7Ym9vbGVhbn0gJHske2Jvb2xlYW59fSBQQVJFTlRfU0NPUEUpCisgICAgcmV0dXJuKCkKKyAgZWxzZSgpCisgICAgIyBPdXIgbWFudWFsIGNoZWNrIGZvciBjbWFrZSB2ZXJzaW9ucyB0aGF0IGRvbid0IGhhdmUgQ2hlY2tGb3J0cmFuU291cmNlQ29tcGlsZXMKKyAgICBzZXQoYmFzZV9kaXIgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9mb3J0cmFuX2ZsYWdfY2hlY2spCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2Jhc2VfZGlyfSkKKyAgICBmaWxlKFdSSVRFICR7YmFzZV9kaXJ9L2ZvcnRyYW5fc291cmNlLmYgIiR7Zm9ydHJhbl9zb3VyY2V9IikKKworICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtib29sZWFufSIpCisgICAgZXhlY3V0ZV9wcm9jZXNzKAorICAgICAgQ09NTUFORCAke0NNQUtFX0ZvcnRyYW5fQ09NUElMRVJ9ICIke2ZsYWd9IiAke2Jhc2VfZGlyfS9mb3J0cmFuX3NvdXJjZS5mCisgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke2Jhc2VfZGlyfQorICAgICAgUkVTVUxUX1ZBUklBQkxFIGV4aXRfY29kZQorICAgICAgT1VUUFVUX1ZBUklBQkxFIE9VVFBVVAorICAgICAgRVJST1JfVkFSSUFCTEUgT1VUUFVUCisgICAgKQorCisgICAgaWYoJHtleGl0X2NvZGV9IEVRVUFMIDApCisgICAgICBmb3JlYWNoKHJlZ2V4IElOIExJU1RTIGZhaWxlZF9yZWdleGVzKQorICAgICAgICBpZigiJHtPVVRQVVR9IiBNQVRDSEVTICR7cmVnZXh9KQorICAgICAgICAgIHNldChyZXR2YWwgRkFMU0UpCisgICAgICAgIGVuZGlmKCkKKyAgICAgIGVuZGZvcmVhY2goKQorICAgIGVsc2UoKQorICAgICAgc2V0KHJldHZhbCBGQUxTRSkKKyAgICBlbmRpZigpCisKKyAgICBpZigke3JldHZhbH0pCisgICAgICBzZXQoJHtib29sZWFufSAxIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7Ym9vbGVhbn0iKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IC0gU3VjY2VzcyIpCisgICAgICBmaWxlKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlT3V0cHV0LmxvZworICAgICAgICAiUGVyZm9ybWluZyBGb3J0cmFuIENvbXBpbGVyIEZsYWcgdGVzdCAke2Jvb2xlYW59IHN1Y2NlZWRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgorICAgICAgICAiJHtPVVRQVVR9XG4iCisgICAgICAgICJTb3VyY2UgZmlsZSB3YXM6XG4ke2ZvcnRyYW5fc291cmNlfVxuIikKKyAgICBlbHNlKCkKKyAgICAgIHNldCgke2Jvb2xlYW59ICIiIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7Ym9vbGVhbn0iKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IC0gRmFpbGVkIikKKyAgICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2cKKyAgICAgICAgIlBlcmZvcm1pbmcgRm9ydHJhbiBDb21waWxlciBGbGFnIHRlc3QgJHtib29sZWFufSBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKKyAgICAgICAgIiR7T1VUUFVUfVxuIgorICAgICAgICAiU291cmNlIGZpbGUgd2FzOlxuJHtmb3J0cmFuX3NvdXJjZX1cbiIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgc2V0KCR7Ym9vbGVhbn0gJHtyZXR2YWx9IFBBUkVOVF9TQ09QRSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0xpbmtlckZsYWcuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrTGlua2VyRmxhZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWEzOGUzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0xpbmtlckZsYWcuY21ha2UKQEAgLTAsMCArMSw2OCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIENoZWNraW5nIGEgbGlua2VyIGZsYWcgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeQorIyBUaGVyZSBpcyBubyByZWFsIHRyaXZpYWwgd2F5IHRvIGRvIHRoaXMgaW4gQ01ha2UsIHNvIHdlIGltcGxlbWVudCBpdCBoZXJlCisjIHRoaXMgd2lsbCBoYXZlICR7Ym9vbGVhbn0gPSBUUlVFIGlmIHRoZSBmbGFnIHN1Y2NlZWRzLCBvdGhlcndpc2UgRkFMU0UuCitmdW5jdGlvbihsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcgZmxhZyBib29sZWFuKQorICBpZihOT1QgREVGSU5FRCAiJHtib29sZWFufSIpCisgIHNldChyZXR2YWwgVFJVRSkKKyAgc2V0KGxpYnJhcnlfc291cmNlCisgICAgImludCBmb28oaW50IGEpIHsgcmV0dXJuIGEqYTsgfSIpCisgIHNldChjbWFrZV9zb3VyY2UKKyAgICAiY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKKyAgICAgcHJvamVjdChmb28gQykKKyAgICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgXCIke2ZsYWd9XCIpCisgICAgIGFkZF9saWJyYXJ5KGZvbyBTSEFSRUQgc3JjX3RvX2xpbmsuYykiKQorICBzZXQoZmFpbGVkX3JlZ2V4ZXMgIltFZV1ycm9yO1tVdV1ua25vd247W1NzXWtpcHBpbmc7TElOSyA6IHdhcm5pbmciKQorICBzZXQoYmFzZV9kaXIgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9saW5rX2ZsYWdfY2hlY2tfJHtib29sZWFufSkKKyAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2Jhc2VfZGlyfSkKKyAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2Jhc2VfZGlyfS9idWlsZCkKKyAgZmlsZShXUklURSAke2Jhc2VfZGlyfS9zcmNfdG9fbGluay5jICIke2xpYnJhcnlfc291cmNlfSIpCisgIGZpbGUoV1JJVEUgJHtiYXNlX2Rpcn0vQ01ha2VMaXN0cy50eHQgIiR7Y21ha2Vfc291cmNlfSIpCisKKyAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IikKKyAgdHJ5X2NvbXBpbGUoCisgICAgdHJ5X2NvbXBpbGVfcmVzdWx0CisgICAgJHtiYXNlX2Rpcn0vYnVpbGQKKyAgICAke2Jhc2VfZGlyfQorICAgIGZvbworICAgIE9VVFBVVF9WQVJJQUJMRSBPVVRQVVQpCisKKyAgaWYodHJ5X2NvbXBpbGVfcmVzdWx0KQorICAgIGZvcmVhY2gocmVnZXggSU4gTElTVFMgZmFpbGVkX3JlZ2V4ZXMpCisgICAgICBpZigiJHtPVVRQVVR9IiBNQVRDSEVTICR7cmVnZXh9KQorICAgICAgICBzZXQocmV0dmFsIEZBTFNFKQorICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICBlbHNlKCkKKyAgICBzZXQocmV0dmFsIEZBTFNFKQorICBlbmRpZigpCisKKyAgaWYoJHtyZXR2YWx9KQorICAgIHNldCgke2Jvb2xlYW59IDEgQ0FDSEUgSU5URVJOQUwgIlRlc3QgJHtib29sZWFufSIpCisgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IC0gU3VjY2VzcyIpCisgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZU91dHB1dC5sb2cKKyAgICAgICJQZXJmb3JtaW5nIEMgTGlua2VyIEZsYWcgdGVzdCAke2Jvb2xlYW59IHN1Y2NlZWRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgorICAgICAgIiR7T1VUUFVUfVxuIgorICAgICAgIlNvdXJjZSBmaWxlIHdhczpcbiR7bGlicmFyeV9zb3VyY2V9XG4iKQorICBlbHNlKCkKKyAgICBzZXQoJHtib29sZWFufSAiIiBDQUNIRSBJTlRFUk5BTCAiVGVzdCAke2Jvb2xlYW59IikKKyAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0gLSBGYWlsZWQiKQorICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2cKKyAgICAgICJQZXJmb3JtaW5nIEMgTGlua2VyIEZsYWcgdGVzdCAke2Jvb2xlYW59IGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgorICAgICAgIiR7T1VUUFVUfVxuIgorICAgICAgIlNvdXJjZSBmaWxlIHdhczpcbiR7bGlicmFyeV9zb3VyY2V9XG4iKQorICBlbmRpZigpCisKKyAgc2V0KCR7Ym9vbGVhbn0gJHtyZXR2YWx9IFBBUkVOVF9TQ09QRSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBEZWZpbml0aW9ucy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wRGVmaW5pdGlvbnMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjZmJiOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wRGVmaW5pdGlvbnMuY21ha2UKQEAgLTAsMCArMSwzMiBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitmdW5jdGlvbihsaWJvbXBfZ2V0X2RlZmluaXRpb25zX2ZsYWdzIGNwcGZsYWdzKQorICBzZXQoY3BwZmxhZ3NfbG9jYWwpCisKKyAgaWYoV0lOMzIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1dJTkRPV1MiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9XSU5OVCIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1dJTjMyX1dJTk5UPTB4MDUwMSIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1VTUkRMTCIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0lURVJBVE9SX0RFQlVHX0xFVkVMPTAiIElGX1RSVUUgREVCVUdfQlVJTEQpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0RFQlVHIiBJRl9UUlVFIERFQlVHX0JVSUxEKQorICBlbHNlKCkKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfR05VX1NPVVJDRSIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1JFRU5UUkFOVCIpCisgIGVuZGlmKCkKKworICAjIENNYWtlIGRvZXNuJ3QgaW5jbHVkZSBDUFBGTEFHUyBmcm9tIGVudmlyb25tZW50LCBidXQgd2Ugd2lsbC4KKyAgc2V0KCR7Y3BwZmxhZ3N9ICR7Y3BwZmxhZ3NfbG9jYWx9ICR7TElCT01QX0NQUEZMQUdTfSAkRU5We0NQUEZMQUdTfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wRXhwb3J0cy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wRXhwb3J0cy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZjYjIwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBFeHBvcnRzLmNtYWtlCkBAIC0wLDAgKzEsOTggQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBMaWJvbXBFeHBvcnRzLmNtYWtlCisjICAgQ29weSBsaWJyYXJ5IGFuZCBoZWFkZXIgZmlsZXMgaW50byB0aGUgZXhwb3J0cy8gc3ViZGlyZWN0b3J5IGFmdGVyIGxpYnJhcnkgYnVpbGQKKworIyBDcmVhdGUgdGhlIHN1ZmZpeCBmb3IgdGhlIGV4cG9ydCBkaXJlY3RvcnkKKyMgLSBPbmx5IGFkZCB0byBzdWZmaXggd2hlbiBub3QgYSBkZWZhdWx0IHZhbHVlCisjIC0gRXhhbXBsZSBzdWZmaXg6IC5kZWIuMzAuczEKKyMgICBmaW5hbCBleHBvcnQgZGlyZWN0b3J5OiBleHBvcnRzL2xpbl8zMmUuZGViLjMwLnMxL2xpYgorIyAtIFRoZXNlIHN1ZmZpeGVzIGltcGx5IHRoZSBidWlsZCBpcyBhIERlYnVnLCBPcGVuTVAgMy4wLCBTdGF0cy1HYXRoZXJpbmcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorc2V0KGxpYm9tcF9zdWZmaXgpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLmRlYiBERUJVR19CVUlMRCkKK2xpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAuZGlhIFJFTFdJVEhERUJJTkZPX0JVSUxEKQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5taW4gTUlOU0laRVJFTF9CVUlMRCkKK2lmKE5PVCAiJHtMSUJPTVBfT01QX1ZFUlNJT059IiBTVFJFUVVBTCAiNDEiKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLiR7TElCT01QX09NUF9WRVJTSU9OfSkKK2VuZGlmKCkKK2xpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAuczEgTElCT01QX1NUQVRTKQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5vbXB0IExJQk9NUF9PTVBUX1NVUFBPUlQpCitpZigke0xJQk9NUF9PTVBUX1NVUFBPUlR9KQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLm5vLW9tcHQtYmxhbWUgSUZfRkFMU0UgTElCT01QX09NUFRfQkxBTUUpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAubm8tb21wdC10cmFjZSBJRl9GQUxTRSBMSUJPTVBfT01QVF9UUkFDRSkKK2VuZGlmKCkKK3N0cmluZyhSRVBMQUNFICI7IiAiIiBsaWJvbXBfc3VmZml4ICIke2xpYm9tcF9zdWZmaXh9IikKKworIyBTZXQgZXhwb3J0cyBsb2NhdGlvbnMKK2lmKCR7TUlDfSkKKyAgc2V0KGxpYm9tcF9wbGF0Zm9ybSAiJHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9XyR7TElCT01QX01JQ19BUkNIfSIpICMgZS5nLiwgbGluX2tuZiwgbGluX2tuYworZWxzZSgpCisgIGlmKCR7SUEzMn0pCisgICAgc2V0KGxpYm9tcF9wbGF0Zm9ybSAiJHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9XzMyIikKKyAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgc2V0KGxpYm9tcF9wbGF0Zm9ybSAiJHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9XzMyZSIpCisgIGVsc2UoKQorICAgIHNldChsaWJvbXBfcGxhdGZvcm0gIiR7TElCT01QX1BFUkxfU0NSSVBUX09TfV8ke0xJQk9NUF9BUkNIfSIpICMgZS5nLiwgbGluX2FybSwgbGluX3BwYzY0CisgIGVuZGlmKCkKK2VuZGlmKCkKK3NldChMSUJPTVBfRVhQT1JUU19ESVIgIiR7TElCT01QX0JBU0VfRElSfS9leHBvcnRzIikKK3NldChMSUJPTVBfRVhQT1JUU19QTEFURk9STV9ESVIgIiR7TElCT01QX0VYUE9SVFNfRElSfS8ke2xpYm9tcF9wbGF0Zm9ybX0ke2xpYm9tcF9zdWZmaXh9IikKK3NldChMSUJPTVBfRVhQT1JUU19DTU5fRElSICIke0xJQk9NUF9FWFBPUlRTX0RJUn0vY29tbW9uJHtsaWJvbXBfc3VmZml4fS9pbmNsdWRlIikKK3NldChMSUJPTVBfRVhQT1JUU19JTkNfRElSICIke0xJQk9NUF9FWFBPUlRTX1BMQVRGT1JNX0RJUn0vaW5jbHVkZSIpCitzZXQoTElCT01QX0VYUE9SVFNfTU9EX0RJUiAiJHtMSUJPTVBfRVhQT1JUU19QTEFURk9STV9ESVJ9L2luY2x1ZGVfY29tcGF0IikKK3NldChMSUJPTVBfRVhQT1JUU19MSUJfRElSICIke0xJQk9NUF9FWFBPUlRTX0RJUn0vJHtsaWJvbXBfcGxhdGZvcm19JHtsaWJvbXBfc3VmZml4fS9saWIiKQorCisjIFB1dCBoZWFkZXJzIGluIGV4cG9ydHMvIGRpcmVjdG9yeSBwb3N0IGJ1aWxkCithZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIG9tcCBQT1NUX0JVSUxECisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0xJQk9NUF9FWFBPUlRTX0NNTl9ESVJ9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IG9tcC5oICR7TElCT01QX0VYUE9SVFNfQ01OX0RJUn0KKykKK2lmKCR7TElCT01QX09NUFRfU1VQUE9SVH0pCisgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXB0LmggJHtMSUJPTVBfRVhQT1JUU19DTU5fRElSfQorICApCitlbmRpZigpCitpZigke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9KQorICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIGxpYm9tcC1tb2QgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0xJQk9NUF9FWFBPUlRTX01PRF9ESVJ9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgb21wX2xpYi5oICR7TElCT01QX0VYUE9SVFNfQ01OX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXBfbGliLm1vZCAke0xJQk9NUF9FWFBPUlRTX01PRF9ESVJ9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgb21wX2xpYl9raW5kcy5tb2QgJHtMSUJPTVBfRVhQT1JUU19NT0RfRElSfQorICApCitlbmRpZigpCisKKyMgQ29weSBPcGVuTVAgbGlicmFyeSBpbnRvIGV4cG9ydHMvIGRpcmVjdG9yeSBwb3N0IGJ1aWxkCitpZihXSU4zMikKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZKQorZWxzZSgpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QX09VVFBVVF9ESVJFQ1RPUlkgb21wIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSkKK2VuZGlmKCkKK2lmKE5PVCBMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSkKKyAgc2V0KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKK2VuZGlmKCkKK2FkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKykKKworIyBDb3B5IFdpbmRvd3MgaW1wb3J0IGxpYnJhcnkgaW50byBleHBvcnRzLyBkaXJlY3RvcnkgcG9zdCBidWlsZAoraWYoV0lOMzIpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkgb21waW1wIEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSkKKyAgaWYoTk9UIExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZKQorICAgIHNldChMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisgIGVuZGlmKCkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXBpbXAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0xJQk9NUF9FWFBPUlRTX0xJQl9ESVJ9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfSU1QX0xJQl9GSUxFfSAke0xJQk9NUF9FWFBPUlRTX0xJQl9ESVJ9CisgICkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBHZXRBcmNoaXRlY3R1cmUuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEdldEFyY2hpdGVjdHVyZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjNjNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBHZXRBcmNoaXRlY3R1cmUuY21ha2UKQEAgLTAsMCArMSw2NiBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGZyb20gcHJlZGVmaW5lZCBjb21waWxlciBtYWNyb3MKKyMgVGhlIGFyY2hpdGVjdHVyZSBuYW1lIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHVuZGVyc2NvcmVzIChpLmUuLCBDIGlkZW50aWZpZXIpCisKKyMgdm9pZCBnZXRfYXJjaGl0ZWN0dXJlKHN0cmluZyogcmV0dXJuX2FyY2gpCisjIC0gUmV0dXJucyB0aGUgYXJjaGl0ZWN0dXJlIGluIHJldHVybl9hcmNoCitmdW5jdGlvbihsaWJvbXBfZ2V0X2FyY2hpdGVjdHVyZSByZXR1cm5fYXJjaCkKKyAgc2V0KGRldGVjdF9hcmNoX3NyY190eHQgIgorICAgICNpZiBkZWZpbmVkKF9fS05DX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPW1pYworICAgICNlbGlmIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9fYW1kNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fQU1ENjQpCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXg4Nl82NAorICAgICNlbGlmIGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fSUEzMl9fKSB8fCBkZWZpbmVkKF9NX0k4NikgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9fWDg2X18pIHx8IGRlZmluZWQoX1g4Nl8pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWkzODYKKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfN19fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN1JfXykgfHwgIGRlZmluZWQoX19BUk1fQVJDSF83QV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN01fXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF83U19fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZLX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVFX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF80X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF80VF9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfM19fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfM01fXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzJfXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkgfHwgZGVmaW5lZChfQVJNKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hYXJjaDY0CisgICAgI2VsaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1wcGM2NGxlCisgICAgI2VsaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1wcGM2NAorICAgICNlbHNlCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPVVua25vd25BcmNoaXRlY3R1cmUKKyAgICAjZW5kaWYKKyAgIikKKyAgIyBXcml0ZSBvdXQgJHtkZXRlY3RfYXJjaF9zcmNfdHh0fSB0byBhIGZpbGUgd2l0aGluIHRoZSBjbWFrZS8gc3ViZGlyZWN0b3J5CisgIGZpbGUoV1JJVEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJvbXBfZGV0ZWN0X2FyY2guYyIgJHtkZXRlY3RfYXJjaF9zcmNfdHh0fSkKKworICAjIFRyeSB0byBjb21waWxlIHVzaW5nIHRoZSBDIENvbXBpbGVyLiAgSXQgd2lsbCBhbHdheXMgZXJyb3Igb3V0IHdpdGggYW4gI2Vycm9yIGRpcmVjdGl2ZSwgc28gc3RvcmUgZXJyb3Igb3V0cHV0IHRvICR7bG9jYWxfYXJjaGl0ZWN0dXJlfQorICB0cnlfcnVuKHJ1bl9kdW1teSBjb21waWxlX2R1bW15ICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlib21wX2RldGVjdF9hcmNoLmMiIENPTVBJTEVfT1VUUFVUX1ZBUklBQkxFIGxvY2FsX2FyY2hpdGVjdHVyZSkKKworICAjIE1hdGNoIHRoZSBpbXBvcnRhbnQgYXJjaGl0ZWN0dXJlIGxpbmUgYW5kIHN0b3JlIG9ubHkgdGhhdCBtYXRjaGluZyBzdHJpbmcgaW4gJHtsb2NhbF9hcmNoaXRlY3R1cmV9CisgIHN0cmluZyhSRUdFWCBNQVRDSCAiQVJDSElURUNUVVJFPShbYS16QS1aMC05X10rKSIgbG9jYWxfYXJjaGl0ZWN0dXJlICIke2xvY2FsX2FyY2hpdGVjdHVyZX0iKQorCisgICMgR2V0IHJpZCBvZiB0aGUgQVJDSElURUNUVVJFPSBwYXJ0IG9mIHRoZSBzdHJpbmcKKyAgc3RyaW5nKFJFUExBQ0UgIkFSQ0hJVEVDVFVSRT0iICIiIGxvY2FsX2FyY2hpdGVjdHVyZSAiJHtsb2NhbF9hcmNoaXRlY3R1cmV9IikKKworICAjIHNldCB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSBhcmNoaXRlY3R1cmUgZGV0ZWN0ZWQgKGUuZy4sIDMyZSwgMzIsIGFybSwgcHBjNjQsIGV0Yy4pCisgIHNldCgke3JldHVybl9hcmNofSAiJHtsb2NhbF9hcmNoaXRlY3R1cmV9IiBQQVJFTlRfU0NPUEUpCisKKyAgIyBSZW1vdmUgJHtkZXRlY3RfYXJjaF9zcmNfdHh0fSBmcm9tIGNtYWtlLyBzdWJkaXJlY3RvcnkKKyAgZmlsZShSRU1PVkUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJvbXBfZGV0ZWN0X2FyY2guYyIpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEhhbmRsZUZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBIYW5kbGVGbGFncy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmI1MjRmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBIYW5kbGVGbGFncy5jbWFrZQpAQCAtMCwwICsxLDIwNyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFNldHVwIHRoZSBmbGFncyBjb3JyZWN0bHkgZm9yIGNtYWtlIChjb3ZlcnQgdG8gc3RyaW5nKQorIyBQcmV0dHkgdGhlbSB1cCAoU1RSSVAgYW55IGJlZ2lubmluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwKKyMgcmVtb3ZlIGR1cGxpY2F0ZXMsIHJlbW92ZSBlbXB0eSBlbnRyaWVzKQorbWFjcm8obGlib21wX3NldHVwX2ZsYWdzIGZsYWdzKQorICBpZihOT1QgIiR7JHtmbGFnc319IiBTVFJFUVVBTCAiIikgIyBpZiBmbGFncyBhcmUgZW1wdHksIGRvbid0IGRvIGFueXRoaW5nCisgICAgc2V0KGZsYWdzX2xvY2FsKQorICAgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgJHtmbGFnc30pICMgcmVtb3ZlIGR1cGxpY2F0ZXMKKyAgICBsaXN0KFJFTU9WRV9JVEVNICR7ZmxhZ3N9ICIiKSAjIHJlbW92ZSBlbXB0eSBpdGVtcworICAgIGxpYm9tcF9saXN0X3RvX3N0cmluZygiJHske2ZsYWdzfX0iIGZsYWdzX2xvY2FsKQorICAgIHN0cmluZyhTVFJJUCAiJHtmbGFnc19sb2NhbH0iIGZsYWdzX2xvY2FsKQorICAgIHNldCgke2ZsYWdzfSAiJHtmbGFnc19sb2NhbH0iKQorICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgR2V0cyBmbGFncyBjb21tb24gdG8gYm90aCB0aGUgQyBhbmQgQysrIGNvbXBpbGVyCitmdW5jdGlvbihsaWJvbXBfZ2V0X2NfYW5kX2N4eGZsYWdzX2NvbW1vbiBmbGFncykKKyAgc2V0KGZsYWdzX2xvY2FsKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1zdGQ9YysrMTEgTElCT01QX0hBVkVfU1REX0NQUDExX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLWZuby1leGNlcHRpb25zIExJQk9NUF9IQVZFX0ZOT19FWENFUFRJT05TX0ZMQUcpCisgIGlmKCR7TElCT01QX0VOQUJMRV9XRVJST1J9KQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVdlcnJvciBMSUJPTVBfSEFWRV9XRVJST1JfRkxBRykKKyAgZW5kaWYoKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tc2lnbi1jb21wYXJlIExJQk9NUF9IQVZFX1dOT19TSUdOX0NPTVBBUkVfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVudXNlZC1mdW5jdGlvbiBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX0ZVTkNUSU9OX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby11bnVzZWQtbG9jYWwtdHlwZWRlZiBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX0xPQ0FMX1RZUEVERUZfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVudXNlZC12YWx1ZSBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX1ZBTFVFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby11bnVzZWQtdmFyaWFibGUgTElCT01QX0hBVkVfV05PX1VOVVNFRF9WQVJJQUJMRV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tc3dpdGNoIExJQk9NUF9IQVZFX1dOT19TV0lUQ0hfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLWNvdmVyZWQtc3dpdGNoLWRlZmF1bHQgTElCT01QX0hBVkVfV05PX0NPVkVSRURfU1dJVENIX0RFRkFVTFRfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLWRlcHJlY2F0ZWQtcmVnaXN0ZXIgTElCT01QX0hBVkVfV05PX0RFUFJFQ0FURURfUkVHSVNURVJfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLWdudS1hbm9ueW1vdXMtc3RydWN0IExJQk9NUF9IQVZFX1dOT19HTlVfQU5PTllNT1VTX1NUUlVDVF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW5rbm93bi1wcmFnbWFzIExJQk9NUF9IQVZFX1dOT19VTktOT1dOX1BSQUdNQVNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIExJQk9NUF9IQVZFX1dOT19NSVNTSU5HX0ZJRUxEX0lOSVRJQUxJWkVSU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tbWlzc2luZy1icmFjZXMgTElCT01QX0hBVkVfV05PX01JU1NJTkdfQlJBQ0VTX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1jb21tZW50IExJQk9NUF9IQVZFX1dOT19DT01NRU5UX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1zZWxmLWFzc2lnbiBMSUJPTVBfSEFWRV9XTk9fU0VMRl9BU1NJR05fRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXZsYS1leHRlbnNpb24gTElCT01QX0hBVkVfV05PX1ZMQV9FWFRFTlNJT05fRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLWZvcm1hdC1wZWRhbnRpYyBMSUJPTVBfSEFWRV9XTk9fRk9STUFUX1BFREFOVElDX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL0dTIExJQk9NUF9IQVZFX0dTX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL0VIc2MgTElCT01QX0hBVkVfRUhTQ19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC9PeS0gTElCT01QX0hBVkVfT1lfX0ZMQUcpCisgICMgSW50ZWwoUikgQyBDb21waWxlciBmbGFncworICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC9Rc2FmZXNlaCBMSUJPTVBfSEFWRV9RU0FGRVNFSF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzIExJQk9NUF9IQVZFX0VYVEVOREVEX0ZMT0FUX1RZUEVTX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVFsb25nX2RvdWJsZSBMSUJPTVBfSEFWRV9MT05HX0RPVUJMRV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1RZGlhZy1kaXNhYmxlOjE3NyBMSUJPTVBfSEFWRV9ESUFHX0RJU0FCTEVfMTc3X0ZMQUcpCisgIGlmKCR7UkVMRUFTRV9CVUlMRH0gT1IgJHtSRUxXSVRIREVCSU5GT19CVUlMRH0pCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtUWlubGluZS1taW4tc2l6ZT0xIExJQk9NUF9IQVZFX0lOTElORV9NSU5fU0laRV9GTEFHKQorICBlbmRpZigpCisgICMgQXJjaGl0ZWN0dXJhbCBDIGFuZCBDKysgZmxhZ3MKKyAgaWYoJHtJQTMyfSkKKyAgICBpZihDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1tMzIgTElCT01QX0hBVkVfTTMyX0ZMQUcpCisgICAgZW5kaWYoKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL2FyY2g6U1NFMiBMSUJPTVBfSEFWRV9BUkNIX1NTRTJfRkxBRykKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1tc3NlMiBMSUJPTVBfSEFWRV9NU1NFMl9GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLWZhbGlnbi1zdGFjaz1tYWludGFpbi0xNi1ieXRlIExJQk9NUF9IQVZFX0ZBTElHTl9TVEFDS19GTEFHKQorICBlbHNlaWYoJHtNSUN9KQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLW1taWMgTElCT01QX0hBVkVfTU1JQ19GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLWZ0bHMtbW9kZWw9aW5pdGlhbC1leGVjIExJQk9NUF9IQVZFX0ZUTFNfTU9ERUxfRkxBRykKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsICItb3B0LXN0cmVhbWluZy1zdG9yZXMgbmV2ZXIiIExJQk9NUF9IQVZFX09QVF9TVFJFQU1JTkdfU1RPUkVTX0ZMQUcpCisgIGVuZGlmKCkKKyAgc2V0KCR7ZmxhZ3N9ICR7ZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBDIGNvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2NmbGFncyBjZmxhZ3MpCisgIHNldChjZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9nZXRfY19hbmRfY3h4ZmxhZ3NfY29tbW9uKGNmbGFnc19sb2NhbCkKKyAgIyBmbGFncyBvbmx5IGZvciB0aGUgQyBDb21waWxlcgorICBsaWJvbXBfYXBwZW5kKGNmbGFnc19sb2NhbCAvVFAgTElCT01QX0hBVkVfVFBfRkxBRykKKyAgbGlib21wX2FwcGVuZChjZmxhZ3NfbG9jYWwgIi14IGMrKyIgTElCT01QX0hBVkVfWF9DUFBfRkxBRykKKyAgc2V0KGNmbGFnc19sb2NhbCAke2NmbGFnc19sb2NhbH0gJHtMSUJPTVBfQ0ZMQUdTfSkKKyAgbGlib21wX3NldHVwX2ZsYWdzKGNmbGFnc19sb2NhbCkKKyAgc2V0KCR7Y2ZsYWdzfSAke2NmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIEMrKyBjb21waWxlciBmbGFncworZnVuY3Rpb24obGlib21wX2dldF9jeHhmbGFncyBjeHhmbGFncykKKyAgc2V0KGN4eGZsYWdzX2xvY2FsKQorICBsaWJvbXBfZ2V0X2NfYW5kX2N4eGZsYWdzX2NvbW1vbihjeHhmbGFnc19sb2NhbCkKKyAgc2V0KGN4eGZsYWdzX2xvY2FsICR7Y3h4ZmxhZ3NfbG9jYWx9ICR7TElCT01QX0NYWEZMQUdTfSkKKyAgbGlib21wX3NldHVwX2ZsYWdzKGN4eGZsYWdzX2xvY2FsKQorICBzZXQoJHtjeHhmbGFnc30gJHtjeHhmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIEFzc2VtYmxlciBmbGFncworZnVuY3Rpb24obGlib21wX2dldF9hc21mbGFncyBhc21mbGFncykKKyAgc2V0KGFzbWZsYWdzX2xvY2FsKQorICBsaWJvbXBfYXBwZW5kKGFzbWZsYWdzX2xvY2FsICIteCBhc3NlbWJsZXItd2l0aC1jcHAiIExJQk9NUF9IQVZFX1hfQVNTRU1CTEVSX1dJVEhfQ1BQX0ZMQUcpCisgICMgQXJjaGl0ZWN0dXJhbCBhc3NlbWJsZXIgZmxhZ3MKKyAgaWYoJHtJQTMyfSkKKyAgICBpZihDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgICBsaWJvbXBfYXBwZW5kKGFzbWZsYWdzX2xvY2FsIC1tMzIgTElCT01QX0hBVkVfTTMyX0ZMQUcpCisgICAgZW5kaWYoKQorICAgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgL3NhZmVzZWggTElCT01QX0hBVkVfU0FGRVNFSF9NQVNNX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChhc21mbGFnc19sb2NhbCAvY29mZiBMSUJPTVBfSEFWRV9DT0ZGX01BU01fRkxBRykKKyAgZWxzZWlmKCR7TUlDfSkKKyAgICBsaWJvbXBfYXBwZW5kKGFzbWZsYWdzX2xvY2FsIC1tbWljIExJQk9NUF9IQVZFX01NSUNfRkxBRykKKyAgZW5kaWYoKQorICBzZXQoYXNtZmxhZ3NfbG9jYWwgJHthc21mbGFnc19sb2NhbH0gJHtMSUJPTVBfQVNNRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoYXNtZmxhZ3NfbG9jYWwpCisgIHNldCgke2FzbWZsYWdzfSAke2FzbWZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgTGlua2VyIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2xkZmxhZ3MgbGRmbGFncykKKyAgc2V0KGxkZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAiJHtDTUFLRV9MSU5LX0RFRl9GSUxFX0ZMQUd9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7TElCT01QX0xJQl9OQU1FfS5kZWYiCisgICAgSUZfREVGSU5FRCBDTUFLRV9MSU5LX0RFRl9GSUxFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAiJHtDTUFLRV9DX09TWF9DVVJSRU5UX1ZFUlNJT05fRkxBR30ke0xJQk9NUF9WRVJTSU9OX01BSk9SfS4ke0xJQk9NUF9WRVJTSU9OX01JTk9SfSIKKyAgICBJRl9ERUZJTkVEIENNQUtFX0NfT1NYX0NVUlJFTlRfVkVSU0lPTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgIiR7Q01BS0VfQ19PU1hfQ09NUEFUSUJJTElUWV9WRVJTSU9OX0ZMQUd9JHtMSUJPTVBfVkVSU0lPTl9NQUpPUn0uJHtMSUJPTVBfVkVSU0lPTl9NSU5PUn0iCisgICAgSUZfREVGSU5FRCBDTUFLRV9DX09TWF9DT01QQVRJQklMSVRZX1ZFUlNJT05fRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1XbCwtLXdhcm4tc2hhcmVkLXRleHRyZWwgTElCT01QX0hBVkVfV0FSTl9TSEFSRURfVEVYVFJFTF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC0tYXMtbmVlZGVkIExJQk9NUF9IQVZFX0FTX05FRURFRF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgIi1XbCwtLXZlcnNpb24tc2NyaXB0PSR7TElCT01QX1NSQ19ESVJ9L2V4cG9ydHNfc28udHh0IiBMSUJPTVBfSEFWRV9WRVJTSU9OX1NDUklQVF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLXN0YXRpYy1saWJnY2MgTElCT01QX0hBVkVfU1RBVElDX0xJQkdDQ19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC16LG5vZXhlY3N0YWNrIExJQk9NUF9IQVZFX1pfTk9FWEVDU1RBQ0tfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1XbCwtZmluaT1fX2ttcF9pbnRlcm5hbF9lbmRfZmluaSBMSUJPTVBfSEFWRV9GSU5JX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtbm8taW50ZWwtZXh0ZW5zaW9ucyBMSUJPTVBfSEFWRV9OT19JTlRFTF9FWFRFTlNJT05TX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtc3RhdGljLWludGVsIExJQk9NUF9IQVZFX1NUQVRJQ19JTlRFTF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgL1NBRkVTRUggTElCT01QX0hBVkVfU0FGRVNFSF9GTEFHKQorICAjIEFyY2hpdGVjdHVyYWwgbGlua2VyIGZsYWdzCisgIGlmKCR7SUEzMn0pCisgICAgaWYoQ01BS0VfU0laRU9GX1ZPSURfUCBFUVVBTCA4KQorICAgICAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1tMzIgTElCT01QX0hBVkVfTTMyX0ZMQUcpCisgICAgZW5kaWYoKQorICAgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtbXNzZTIgTElCT01QX0hBVkVfTVNTRTJfRkxBRykKKyAgZWxzZWlmKCR7TUlDfSkKKyAgICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLW1taWMgTElCT01QX0hBVkVfTU1JQ19GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLXggTElCT01QX0hBVkVfWF9GTEFHKQorICBlbmRpZigpCisgIHNldChsZGZsYWdzX2xvY2FsICR7bGRmbGFnc19sb2NhbH0gJHtMSUJPTVBfTERGTEFHU30pCisgIGxpYm9tcF9zZXR1cF9mbGFncyhsZGZsYWdzX2xvY2FsKQorICBzZXQoJHtsZGZsYWdzfSAke2xkZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBMaWJyYXJ5IGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2xpYmZsYWdzIGxpYmZsYWdzKQorICBzZXQobGliZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgIiR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0iKQorICBsaWJvbXBfYXBwZW5kKGxpYmZsYWdzX2xvY2FsICIke0xJQk9NUF9IV0xPQ19MSUJSQVJZfSIgTElCT01QX1VTRV9IV0xPQykKKyAgaWYoJHtJQTMyfSkKKyAgICBsaWJvbXBfYXBwZW5kKGxpYmZsYWdzX2xvY2FsIC1saXJjX3BpYyBMSUJPTVBfSEFWRV9JUkNfUElDX0xJQlJBUlkpCisgIGVuZGlmKCkKKyAgSUYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiTmV0QlNEIikKKyAgICBsaWJvbXBfYXBwZW5kKGxpYmZsYWdzX2xvY2FsIC1sbSkKKyAgRU5ESUYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiTmV0QlNEIikKKyAgc2V0KGxpYmZsYWdzX2xvY2FsICR7bGliZmxhZ3NfbG9jYWx9ICR7TElCT01QX0xJQkZMQUdTfSkKKyAgbGlib21wX3NldHVwX2ZsYWdzKGxpYmZsYWdzX2xvY2FsKQorICBzZXQoJHtsaWJmbGFnc30gJHtsaWJmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIEZvcnRyYW4gZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfZmZsYWdzIGZmbGFncykKKyAgc2V0KGZmbGFnc19sb2NhbCkKKyAgaWYoJHtJQTMyfSkKKyAgICBsaWJvbXBfYXBwZW5kKGZmbGFnc19sb2NhbCAtbTMyIExJQk9NUF9IQVZFX00zMl9GT1JUUkFOX0ZMQUcpCisgIGVuZGlmKCkKKyAgc2V0KGZmbGFnc19sb2NhbCAke2ZmbGFnc19sb2NhbH0gJHtMSUJPTVBfRkZMQUdTfSkKKyAgbGlib21wX3NldHVwX2ZsYWdzKGZmbGFnc19sb2NhbCkKKyAgc2V0KCR7ZmZsYWdzfSAke2ZmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIFBlcmwgZ2VuZXJhdGUtZGVmcy5wbCBmbGFncyAoRm9yIFdpbmRvd3Mgb25seSkKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfZ2RmbGFncyBnZGZsYWdzKQorICBzZXQoZ2RmbGFnc19sb2NhbCkKKyAgaWYoJHtJQTMyfSkKKyAgICBzZXQobGlib21wX2dkZmxhZ19hcmNoIGFyY2hfMzIpCisgIGVsc2VpZigke0lOVEVMNjR9KQorICAgIHNldChsaWJvbXBfZ2RmbGFnX2FyY2ggYXJjaF8zMmUpCisgIGVsc2UoKQorICAgIHNldChsaWJvbXBfZ2RmbGFnX2FyY2ggYXJjaF8ke0xJQk9NUF9BUkNIfSkKKyAgZW5kaWYoKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EICR7bGlib21wX2dkZmxhZ19hcmNofSIpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgbXN2Y19jb21wYXQiKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIG5vcm0iIE5PUk1BTF9MSUJSQVJZKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIHByb2YiIFBST0ZJTEVfTElCUkFSWSkKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBzdHViIiBTVFVCU19MSUJSQVJZKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIEhBVkVfUVVBRCIgTElCT01QX1VTRV9RVUFEX1BSRUNJU0lPTikKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBVU0VfREVCVUdHRVIiIExJQk9NUF9VU0VfREVCVUdHRVIpCisgIGlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDQxIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCA0MSkKKyAgICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIE9NUF80MSIpCisgIGVuZGlmKCkKKyAgaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQwKQorICAgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgT01QXzQwIikKKyAgZW5kaWYoKQorICBpZigke0xJQk9NUF9PTVBfVkVSU0lPTn0gR1JFQVRFUiAzMCBPUiAke0xJQk9NUF9PTVBfVkVSU0lPTn0gRVFVQUwgMzApCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBPTVBfMzAiKQorICBlbmRpZigpCisgIGlmKCR7REVCVUdfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgS01QX0RFQlVHIikKKyAgZW5kaWYoKQorICBzZXQoJHtnZGZsYWdzfSAke2dkZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVkMjMxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBNaWNyb1Rlc3RzLmNtYWtlCkBAIC0wLDAgKzEsMjI1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhlIGZvbGxvd2luZyBtaWNyby10ZXN0cyBhcmUgc21hbGwgdGVzdHMgdG8gcGVyZm9ybSBvbiB0aGUgbGlicmFyeSBqdXN0IGNyZWF0ZWQuCisjIFRoZXJlIGFyZSBjdXJyZW50bHkgZml2ZSBtaWNyby10ZXN0czoKKyMgKDEpIHRlc3QtdG91Y2gKKyMgIC0gQ29tcGlsZSBhbmQgcnVuIGEgc21hbGwgcHJvZ3JhbSB1c2luZyBuZXdseSBjcmVhdGVkIGxpYm9tcCBsaWJyYXJ5CisjICAtIEZhaWxzIGlmIHRlc3QtdG91Y2guYyBkb2VzIG5vdCBjb21waWxlIG9yIGlmIHRlc3QtdG91Y2guYyBkb2VzIG5vdCBydW4gYWZ0ZXIgY29tcGlsYXRpb24KKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IGdjYyBvciBnKyssIGdyZXAsIGJvdXJuZSBzaGVsbAorIyAgLSBBdmFpbGFibGUgZm9yIGFsbCBVbml4LE1hYyxXaW5kb3dzIGJ1aWxkcy4gIE5vdCBhdmFpbGFibGUgb24gSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBidWlsZHMuCisjICgyKSB0ZXN0LXJlbG8KKyMgIC0gVGVzdHMgZHluYW1pYyBsaWJyYXJpZXMgZm9yIHBvc2l0aW9uLWRlcGVuZGVudCBjb2RlIChjYW4gbm90IGhhdmUgYW55IHBvc2l0aW9uIGRlcGVuZGVudCBjb2RlKQorIyAgLSBGYWlscyBpZiBURVhUUkVMIGlzIGluIG91dHB1dCBvZiByZWFkZWxmIC1kIGxpYm9tcC5zbyBjb21tYW5kCisjICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiByZWFkZWxmLCBncmVwLCBib3VybmUgc2hlbGwKKyMgIC0gQXZhaWxhYmxlIGZvciBVbml4LCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGR5bmFtaWMgbGlicmFyeSBidWlsZHMuIE5vdCBhdmFpbGFibGUgb3RoZXJ3aXNlLgorIyAoMykgdGVzdC1leGVjc3RhY2sKKyMgIC0gVGVzdHMgaWYgc3RhY2sgaXMgZXhlY3V0YWJsZQorIyAgLSBGYWlscyBpZiBzdGFjayBpcyBleGVjdXRhYmxlLiBTaG91bGQgb25seSBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuIE5vdCBleGVjdHVhYmxlLgorIyAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgcmVhZGVsZgorIyAgLSBBdmFpbGFibGUgZm9yIFVuaXggZHluYW1pYyBsaWJyYXJ5IGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjICg0KSB0ZXN0LWluc3RyIChJbnRlbChSKSBNSUMgQXJjaGl0ZWN1dHJlIG9ubHkpCisjICAtIFRlc3RzIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgbGlicmFyaWVzIGZvciB2YWxpZCBpbnN0cnVjdGlvbiBzZXQKKyMgIC0gRmFpbHMgaWYgZmluZHMgaW52YWxpZCBpbnN0cnVjdGlvbiBmb3IgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSAod2Fzbid0IGNvbXBpbGVkIHdpdGggY29ycmVjdCBmbGFncykKKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHBlcmwsIG9iamR1bXAKKyMgIC0gQXZhaWxhYmxlIGZvciBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGFuZCBpMzg2IGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjICg1KSB0ZXN0LWRlcHMKKyMgIC0gVGVzdHMgbmV3bHkgY3JlYXRlZCBsaWJvbXAgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAtIEZhaWxzIGlmIHNlZXMgYSBkZXBlbmRlbmNlIG5vdCBsaXN0ZWQgaW4gdGRfZXhwIHZhcmlhYmxlIGJlbG93CisjICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiBwZXJsLCAodW5peClyZWFkZWxmLCAobWFjKW90b29sWzY0XSwgKHdpbmRvd3MpbGluay5leGUKKyMgIC0gQXZhaWxhYmxlIGZvciBVbml4LE1hYyxXaW5kb3dzLCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGR5bmFtaWMgYnVpbGRzIGFuZCBXaW5kb3dzCisjICAgIHN0YXRpYyBidWlsZHMuIE5vdCBhdmFpbGFibGUgb3RoZXJ3aXNlLgorCisjIGdldCBsaWJyYXJ5IGxvY2F0aW9uCitpZihXSU4zMikKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZIG9tcGltcCBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkpCisgIGlmKE5PVCBMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSkKKyAgICBzZXQoTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorICBlbmRpZigpCitlbHNlKCkKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQorZW5kaWYoKQoraWYoTk9UIExJQk9NUF9PVVRQVVRfRElSRUNUT1JZKQorICBzZXQoTElCT01QX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorZW5kaWYoKQorCisjIHRlc3QtdG91Y2gKK2ZpbmRfcHJvZ3JhbShMSUJPTVBfU0hFTEwgc2gpCitpZihXSU4zMikKKyAgaWYoTElCT01QX1NIRUxMKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF90YXJnZXRzIHRlc3QtdG91Y2gtbWQvLnN1Y2Nlc3MgdGVzdC10b3VjaC1tdC8uc3VjY2VzcykKKyAgZW5kaWYoKQorICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXIgJHtDTUFLRV9DX0NPTVBJTEVSfSkKKyAgIyB0ZXN0LXRvdWNoIGNvbXBpbGF0aW9uIGZsYWdzCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9ub2xvZ28pCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAke0xJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9JTVBfTElCX0ZJTEV9KQorICBpZigke0lBMzJ9KQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGRmbGFncyAvc2FmZXNlaCkKKyAgZW5kaWYoKQorZWxzZSgpICMgKFVuaXggYmFzZWQgc3lzdGVtcywgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSwgYW5kIE1hYykKKyAgaWYoTElCT01QX1NIRUxMKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF90YXJnZXRzIHRlc3QtdG91Y2gtcnQvLnN1Y2Nlc3MpCisgIGVuZGlmKCkKKyAgIyBwaWNrIHRlc3QtdG91Y2ggY29tcGlsZXIKKyAgaWYoJHtMSUJPTVBfVVNFX1NURENQUExJQn0pCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX2NvbXBpbGVyICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSkKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX2NvbXBpbGVyICR7Q01BS0VfQ19DT01QSUxFUn0pCisgIGVuZGlmKCkKKyAgIyB0ZXN0LXRvdWNoIGNvbXBpbGF0aW9uIGZsYWdzCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAiJHtDTUFLRV9USFJFQURfTElCU19JTklUfSIpCisgIGlmKCR7SUEzMn0pCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgZW5kaWYoKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2xpYnMgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9KQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2xpYnMgIiR7TElCT01QX0hXTE9DX0xJQlJBUll9IiBMSUJPTVBfVVNFX0hXTE9DKQorICBpZihBUFBMRSkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZW52ICJEWUxEX0xJQlJBUllfUEFUSD0uOiR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9OiRFTlZ7RFlMRF9MSUJSQVJZX1BBVEh9IikKKyAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2xkZmxhZ3MgIi1XbCwtcnBhdGgsJHtMSUJPTVBfSFdMT0NfTElCUkFSWV9ESVJ9IiBMSUJPTVBfVVNFX0hXTE9DKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZW52ICJMRF9MSUJSQVJZX1BBVEg9Ljoke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfTokRU5We0xEX0xJQlJBUllfUEFUSH0iKQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGRmbGFncyAiLVdsLC1ycGF0aD0ke0xJQk9NUF9IV0xPQ19MSUJSQVJZX0RJUn0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGVuZGlmKCkKK2VuZGlmKCkKK21hY3JvKGxpYm9tcF90ZXN0X3RvdWNoX3JlY2lwZSB0ZXN0X3RvdWNoX2RpcikKKyAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX2RlcGVuZGVuY2llcyAke0xJQk9NUF9TUkNfRElSfS90ZXN0LXRvdWNoLmMgb21wKQorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZXhlICR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSkKKyAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX29iaiAke3Rlc3RfdG91Y2hfZGlyfS90ZXN0LXRvdWNoJHtDTUFLRV9DX09VVFBVVF9FWFRFTlNJT059KQorICBpZihXSU4zMikKKyAgICBpZigke1JFTEVBU0VfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgICAgaWYoJHt0ZXN0X3RvdWNoX2Rpcn0gTUFUQ0hFUyAidGVzdC10b3VjaC1tdCIpCisgICAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9NVCkKKyAgICAgIGVsc2UoKQorICAgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAvTUQpCisgICAgICBlbmRpZigpCisgICAgZWxzZSgpCisgICAgICBpZigke3Rlc3RfdG91Y2hfZGlyfSBNQVRDSEVTICJ0ZXN0LXRvdWNoLW10IikKKyAgICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgL01UZCkKKyAgICAgIGVsc2UoKQorICAgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAvTURkKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfb3V0X2ZsYWdzIC1GZSR7bGlib21wX3Rlc3RfdG91Y2hfZXhlfSAtRm8ke2xpYm9tcF90ZXN0X3RvdWNoX29ian0pCisgICAgbGlzdChBUFBFTkQgbGlib21wX3Rlc3RfdG91Y2hfZGVwZW5kZW5jaWVzIG9tcGltcCkKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX291dF9mbGFncyAtbyAke2xpYm9tcF90ZXN0X3RvdWNoX2V4ZX0pCisgIGVuZGlmKCkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAgJHt0ZXN0X3RvdWNoX2Rpcn0vLnN1Y2Nlc3MgJHtsaWJvbXBfdGVzdF90b3VjaF9leGV9ICR7bGlib21wX3Rlc3RfdG91Y2hfb2JqfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHt0ZXN0X3RvdWNoX2Rpcn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVtb3ZlIC1mICR7dGVzdF90b3VjaF9kaXJ9LyoKKyAgICBDT01NQU5EICR7bGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXJ9ICR7bGlib21wX3Rlc3RfdG91Y2hfb3V0X2ZsYWdzfSAke2xpYm9tcF90ZXN0X3RvdWNoX2NmbGFnc30KKyAgICAgICR7TElCT01QX1NSQ19ESVJ9L3Rlc3QtdG91Y2guYyAke2xpYm9tcF90ZXN0X3RvdWNoX2xkZmxhZ3N9ICR7bGlib21wX3Rlc3RfdG91Y2hfbGlic30KKyAgICBDT01NQU5EICR7TElCT01QX1NIRUxMfSAtYyBcIiR7bGlib21wX3Rlc3RfdG91Y2hfZW52fSAke2xpYm9tcF90ZXN0X3RvdWNoX2V4ZX1cIgorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCAke3Rlc3RfdG91Y2hfZGlyfS8uc3VjY2VzcworICAgIERFUEVORFMgJHtsaWJvbXBfdGVzdF90b3VjaF9kZXBlbmRlbmNpZXN9CisgICkKK2VuZG1hY3JvKCkKK2xpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfZW52ICJLTVBfVkVSU0lPTj0xIikKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LXRvdWNoIERFUEVORFMgJHtsaWJvbXBfdGVzdF90b3VjaF90YXJnZXRzfSkKK2lmKFdJTjMyKQorICBsaWJvbXBfdGVzdF90b3VjaF9yZWNpcGUodGVzdC10b3VjaC1tdCkKKyAgbGlib21wX3Rlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtbWQpCitlbHNlKCkKKyAgbGlib21wX3Rlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtcnQpCitlbmRpZigpCisKKyMgdGVzdC1yZWxvCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1yZWxvIERFUEVORFMgdGVzdC1yZWxvLy5zdWNjZXNzKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIHRlc3QtcmVsby8uc3VjY2VzcyB0ZXN0LXJlbG8vcmVhZGVsZi5sb2cKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90ZXN0LXJlbG8KKyAgQ09NTUFORCByZWFkZWxmIC1kICR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0xJQl9GSUxFfSA+IHRlc3QtcmVsby9yZWFkZWxmLmxvZworICBDT01NQU5EIGdyZXAgLWUgVEVYVFJFTCB0ZXN0LXJlbG8vcmVhZGVsZi5sb2cgXDsgdGVzdCAkJD8gLWVxIDEKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoIHRlc3QtcmVsby8uc3VjY2VzcworICBERVBFTkRTIG9tcAorKQorCisjIHRlc3QtZXhlY3N0YWNrCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1leGVjc3RhY2sgREVQRU5EUyB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtZXhlY3N0YWNrCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vY2hlY2stZXhlY3N0YWNrLnBsIC0tb3M9JHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9CisgICAgLS1hcmNoPSR7TElCT01QX0FSQ0h9ICR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0xJQl9GSUxFfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1leGVjc3RhY2svLnN1Y2Nlc3MKKyAgREVQRU5EUyBvbXAKKykKKworIyB0ZXN0LWluc3RyCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1pbnN0ciBERVBFTkRTIHRlc3QtaW5zdHIvLnN1Y2Nlc3MpCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAgdGVzdC1pbnN0ci8uc3VjY2VzcworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtaW5zdHIKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLWFyY2g9JHtMSUJPTVBfQVJDSH0gLS1zaG93IC0tbWljLWFyY2g9JHtMSUJPTVBfTUlDX0FSQ0h9ICR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0xJQl9GSUxFfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1pbnN0ci8uc3VjY2VzcworICBERVBFTkRTIG9tcCAke0xJQk9NUF9UT09MU19ESVJ9L2NoZWNrLWluc3RydWN0aW9uLXNldC5wbAorKQorCisjIHRlc3QtZGVwcworYWRkX2N1c3RvbV90YXJnZXQobGlib21wLXRlc3QtZGVwcyBERVBFTkRTIHRlc3QtZGVwcy8uc3VjY2VzcykKK3NldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzKQoraWYoQ01BS0VfU1lTVEVNX05BTUUgTUFUQ0hFUyAiRnJlZUJTRCIpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNyBsaWJ0aHIuc28uMykKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmh3bG9jLnNvLjUgTElCT01QX1VTRV9IV0xPQykKK2Vsc2VpZihDTUFLRV9TWVNURU1fTkFNRSBNQVRDSEVTICJOZXRCU0QiKQorICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjEyIGxpYnB0aHJlYWQuc28uMSBsaWJtLnNvLjApCisgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJod2xvYy5zby41IExJQk9NUF9VU0VfSFdMT0MpCitlbHNlaWYoQVBQTEUpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliKQorZWxzZWlmKFdJTjMyKQorICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBrZXJuZWwzMi5kbGwpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBwc2FwaS5kbGwgTElCT01QX09NUFRfU1VQUE9SVCkKK2Vsc2UoKQorICBpZigke01JQ30pCisgICAgc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliYy5zby42IGxpYnB0aHJlYWQuc28uMCBsaWJkbC5zby4yKQorICAgIGlmKCIke0xJQk9NUF9NSUNfQVJDSH0iIFNUUkVRVUFMICJrbmYiKQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxkLWxpbnV4LWwxb20uc28uMikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJnY2Nfcy5zby4xKQorICAgIGVsc2VpZigiJHtMSUJPTVBfTUlDX0FSQ0h9IiBTVFJFUVVBTCAia25jIikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC1rMW9tLnNvLjIpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJkbC5zby4yIGxpYmdjY19zLnNvLjEpCisgICAgaWYoJHtJQTMyfSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXguc28uMikKKyAgICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXgteDg2LTY0LnNvLjIpCisgICAgZWxzZWlmKCR7QVJNfSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliZmZpLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliZmZpLnNvLjUpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXgtYXJtaGYuc28uMykKKyAgICBlbHNlaWYoJHtQUEM2NH0pCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliYy5zby42KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxkNjQuc28uMSkKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYnB0aHJlYWQuc28uMCBJRl9GQUxTRSBTVFVCU19MSUJSQVJZKQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJod2xvYy5zby41IExJQk9NUF9VU0VfSFdMT0MpCisgIGVuZGlmKCkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYnN0ZGMrKy5zby42IExJQk9NUF9VU0VfU1REQ1BQTElCKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGlibS5zby42IExJQk9NUF9TVEFUUykKK2VuZGlmKCkKKyMgUGVybCBzY3JpcHQgZXhwZWN0cyBjb21tYSBzZXBhcmF0ZWQgbGlzdAorc3RyaW5nKFJFUExBQ0UgIjsiICIsIiBsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzICIke2xpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHN9IikKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICB0ZXN0LWRlcHMvLnN1Y2Nlc3MKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90ZXN0LWRlcHMKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1kZXBlbmRzLnBsIC0tb3M9JHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9CisgICAgLS1hcmNoPSR7TElCT01QX0FSQ0h9IC0tZXhwZWN0ZWQ9IiR7bGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwc30iICR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0xJQl9GSUxFfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1kZXBzLy5zdWNjZXNzCisgIERFUEVORFMgb21wICR7TElCT01QX1RPT0xTX0RJUn0vY2hlY2stZGVwZW5kcy5wbAorKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBVdGlscy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wVXRpbHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4MWE2YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wVXRpbHMuY21ha2UKQEAgLTAsMCArMSwxOTEgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyB2b2lkIGxpYm9tcF9zYXkoc3RyaW5nIG1lc3NhZ2VfdG9fdXNlcik7CisjIC0gcHJpbnRzIG91dCBtZXNzYWdlX3RvX3VzZXIKK21hY3JvKGxpYm9tcF9zYXkgbWVzc2FnZV90b191c2VyKQorICBtZXNzYWdlKFNUQVRVUyAiTElCT01QOiAke21lc3NhZ2VfdG9fdXNlcn0iKQorZW5kbWFjcm8oKQorCisjIHZvaWQgbGlib21wX3dhcm5pbmdfc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyIHdpdGggYSB3YXJuaW5nCittYWNybyhsaWJvbXBfd2FybmluZ19zYXkgbWVzc2FnZV90b191c2VyKQorICBtZXNzYWdlKFdBUk5JTkcgIkxJQk9NUDogJHttZXNzYWdlX3RvX3VzZXJ9IikKK2VuZG1hY3JvKCkKKworIyB2b2lkIGxpYm9tcF9lcnJvcl9zYXkoc3RyaW5nIG1lc3NhZ2VfdG9fdXNlcik7CisjIC0gcHJpbnRzIG91dCBtZXNzYWdlX3RvX3VzZXIgd2l0aCBhbiBlcnJvciBhbmQgZXhpdHMgY21ha2UKK21hY3JvKGxpYm9tcF9lcnJvcl9zYXkgbWVzc2FnZV90b191c2VyKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJMSUJPTVA6ICR7bWVzc2FnZV90b191c2VyfSIpCitlbmRtYWNybygpCisKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IFsoSUZfVFJVRSB8IElGX0ZBTFNFIHwgSUZfVFJVRV8xXzAgKSBCT09MRUFOXSkKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+KQorIyAgIC0gdW5jb25kaXRpb25hbGx5IGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiA8Qk9PTEVBTj4pCisjICAgLSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiBCT09MRUFOIGlzIHRydWUKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IElGX1RSVUUgPEJPT0xFQU4+KQorIyAgIC0gYXBwZW5kcyA8ZmxhZz4gdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMgaWYgQk9PTEVBTiBpcyB0cnVlCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiBJRl9GQUxTRSA8Qk9PTEVBTj4pCisjICAgLSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiBCT09MRUFOIGlzIGZhbHNlCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiBJRl9ERUZJTkVEIDxWQVJJQUJMRT4pCisjICAgLSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiBWQVJJQUJMRSBpcyBkZWZpbmVkCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiBJRl9UUlVFXzFfMCA8Qk9PTEVBTj4pCisjICAgLSBhcHBlbmRzIDxmbGFnPj0xIHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIDxCT09MRUFOPiBpcyB0cnVlLCA8ZmxhZz49MCBvdGhlcndpc2UKKyMgZS5nLiwgbGlib21wX2FwcGVuZCgiLUQgVVNFX0ZFQVRVUkUiIElGX1RSVUVfMV8wIEhBVkVfRkVBVFVSRSkKKyMgICAgIGFwcGVuZHMgIi1EIFVTRV9GRUFUVVJFPTEiIGlmIEhBVkVfRkVBVFVSRSBpcyB0cnVlCisjICAgICBvciAiLUQgVVNFX0ZFQVRVUkU9MCIgaWYgSEFWRV9GRUFUVVJFIGlzIGZhbHNlCittYWNybyhsaWJvbXBfYXBwZW5kIGZsYWdzIGZsYWcpCisgIGlmKE5PVCAoJHtBUkdDfSBFUVVBTCAyIE9SICR7QVJHQ30gRVFVQUwgMyBPUiAke0FSR0N9IEVRVUFMIDQpKQorICAgIGxpYm9tcF9lcnJvcl9zYXkoImxpYm9tcF9hcHBlbmQ6IHRha2VzIDIsIDMsIG9yIDQgYXJndW1lbnRzIikKKyAgZW5kaWYoKQorICBpZigke0FSR0N9IEVRVUFMIDIpCisgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICBlbHNlaWYoJHtBUkdDfSBFUVVBTCAzKQorICAgIGlmKCR7QVJHVjJ9KQorICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICAgIGVuZGlmKCkKKyAgZWxzZSgpCisgICAgaWYoJHtBUkdWMn0gU1RSRVFVQUwgIklGX1RSVUUiKQorICAgICAgaWYoJHtBUkdWM30pCisgICAgICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9IikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlaWYoJHtBUkdWMn0gU1RSRVFVQUwgIklGX0ZBTFNFIikKKyAgICAgIGlmKE5PVCAke0FSR1YzfSkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICAgICAgZW5kaWYoKQorICAgIGVsc2VpZigke0FSR1YyfSBTVFJFUVVBTCAiSUZfREVGSU5FRCIpCisgICAgICBpZihERUZJTkVEICR7QVJHVjN9KQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCR7QVJHVjJ9IFNUUkVRVUFMICJJRl9UUlVFXzFfMCIpCisgICAgICBpZigke0FSR1YzfSkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ309MSIpCisgICAgICBlbHNlKCkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ309MCIpCisgICAgICBlbmRpZigpCisgICAgZWxzZSgpCisgICAgICBsaWJvbXBfZXJyb3Jfc2F5KCJsaWJvbXBfYXBwZW5kOiB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiBJRl9UUlVFLCBJRl9GQUxTRSwgSUZfREVGSU5FRCwgSUZfVFJVRV8xXzAiKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorZW5kbWFjcm8oKQorCisjIHZvaWQgbGlib21wX2dldF9sZWdhbF9hcmNoKHN0cmluZyogcmV0dXJuX2FyY2hfc3RyaW5nKTsKKyMgLSByZXR1cm5zICh0aHJvdWdoIHJldHVybl9hcmNoX3N0cmluZykgdGhlIGZvcm1hbCBhcmNoaXRlY3R1cmUKKyMgICBzdHJpbmcgb3Igd2FybnMgdXNlciBvZiB1bmtub3duIGFyY2hpdGVjdHVyZQorZnVuY3Rpb24obGlib21wX2dldF9sZWdhbF9hcmNoIHJldHVybl9hcmNoX3N0cmluZykKKyAgaWYoJHtJQTMyfSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJJQS0zMiIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJJbnRlbChSKSA2NCIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtNSUN9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtBUk19KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkFSTSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtQUEM2NEJFfSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJQUEM2NEJFIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke1BQQzY0TEV9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIlBQQzY0TEUiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7QUFSQ0g2NH0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiQUFSQ0g2NCIgUEFSRU5UX1NDT1BFKQorICBlbHNlKCkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICIke0xJQk9NUF9BUkNIfSIgUEFSRU5UX1NDT1BFKQorICAgIGxpYm9tcF93YXJuaW5nX3NheSgibGlib21wX2dldF9sZWdhbF9hcmNoKCk6IFdhcm5pbmc6IFVua25vd24gYXJjaGl0ZWN0dXJlOiBVc2luZyAke0xJQk9NUF9BUkNIfSIpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9jaGVja192YXJpYWJsZShzdHJpbmcgdmFyLCAuLi4pOworIyAtIHJ1bnMgdGhyb3VnaCBhbGwgdmFsdWVzIGNoZWNraW5nIGlmICR7dmFyfSA9PSB2YWx1ZQorIyAtIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGRvIG5vdCBtYXR0ZXIKKyMgLSBpZiB0aGUgdmFyIGlzIGZvdW5kLCB0aGVuIGp1c3QgcHJpbnQgaXQgb3V0CisjIC0gaWYgdGhlIHZhciBpcyBub3QgZm91bmQsIHRoZW4gZXJyb3Igb3V0CitmdW5jdGlvbihsaWJvbXBfY2hlY2tfdmFyaWFibGUgdmFyKQorICBzZXQodmFsaWRfZmxhZyAwKQorICBzdHJpbmcoVE9MT1dFUiAiJHske3Zhcn19IiB2YXJfbG93ZXIpCisgIGZvcmVhY2godmFsdWUgSU4gTElTVFMgQVJHTikKKyAgICBzdHJpbmcoVE9MT1dFUiAiJHt2YWx1ZX0iIHZhbHVlX2xvd2VyKQorICAgIGlmKCIke3Zhcl9sb3dlcn0iIFNUUkVRVUFMICIke3ZhbHVlX2xvd2VyfSIpCisgICAgICBzZXQodmFsaWRfZmxhZyAxKQorICAgICAgc2V0KHRoZV92YWx1ZSAiJHt2YWx1ZX0iKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIGlmKCR7dmFsaWRfZmxhZ30gRVFVQUwgMCkKKyAgICBsaWJvbXBfZXJyb3Jfc2F5KCJsaWJvbXBfY2hlY2tfdmFyaWFibGUoKTogJHt2YXJ9ID0gJHske3Zhcn19IGlzIHVua25vd24iKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfZ2V0X2J1aWxkX251bWJlcihzdHJpbmcgc3JjX2Rpciwgc3RyaW5nKiByZXR1cm5fYnVpbGRfbnVtYmVyKTsKKyMgLSBncmFiIHRoZSBlaWdodCBkaWdpdCBidWlsZCBudW1iZXIgKG9yIDAwMDAwMDAwKSBmcm9tIGttcF92ZXJzaW9uLmMKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfYnVpbGRfbnVtYmVyIHNyY19kaXIgcmV0dXJuX2J1aWxkX251bWJlcikKKyAgIyBzZXRzIGZpbGVfbGluZXNfbGlzdCB0byBhIGxpc3Qgb2YgYWxsIGxpbmVzIGluIGttcF92ZXJzaW9uLmMKKyAgZmlsZShTVFJJTkdTICIke3NyY19kaXJ9L3NyYy9rbXBfdmVyc2lvbi5jIiBmaWxlX2xpbmVzX2xpc3QpCisKKyAgIyBydW5zIHRocm91Z2ggZWFjaCBsaW5lIGluIGttcF92ZXJzaW9uLmMKKyAgZm9yZWFjaChsaW5lIElOIExJU1RTIGZpbGVfbGluZXNfbGlzdCkKKyAgICAjIGlmIHRoZSBsaW5lIGJlZ2lucyB3aXRoICIjZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEIiB0aGVuIHdlIHRha2Ugbm90IG9mIHRoZSBidWlsZCBudW1iZXIKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIl5bIFx0XSojZGVmaW5lWyBcdF0rS01QX1ZFUlNJT05fQlVJTEQiIHZhbGlkICIke2xpbmV9IikKKyAgICBpZihOT1QgIiR7dmFsaWR9IiBTVFJFUVVBTCAiIikgIyBpZiB3ZSBtYXRjaGVkICIjZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEIiwgdGhlbiBncmFiIHRoZSBidWlsZCBudW1iZXIKKyAgICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJeWyBcdF0qI2RlZmluZVsgXHRdK0tNUF9WRVJTSU9OX0JVSUxEWyBcdF0rKFswLTldKykiICJcXDEiCisgICAgICAgICAgIGJ1aWxkX251bWJlciAiJHtsaW5lfSIKKyAgICAgICkKKyAgICBlbmRpZigpCisgIGVuZGZvcmVhY2goKQorICBzZXQoJHtyZXR1cm5fYnVpbGRfbnVtYmVyfSAiJHtidWlsZF9udW1iZXJ9IiBQQVJFTlRfU0NPUEUpICMgcmV0dXJuIGJ1aWxkIG51bWJlcgorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgbGlib21wX2dldF9sZWdhbF90eXBlKHN0cmluZyogcmV0dXJuX2xlZ2FsX3R5cGUpOworIyAtIHNldCB0aGUgbGVnYWwgdHlwZSBuYW1lIFBlcmZvcm1hbmNlL1Byb2ZpbGluZy9TdHViCitmdW5jdGlvbihsaWJvbXBfZ2V0X2xlZ2FsX3R5cGUgcmV0dXJuX2xlZ2FsX3R5cGUpCisgIGlmKCR7Tk9STUFMX0xJQlJBUll9KQorICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiUGVyZm9ybWFuY2UiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7UFJPRklMRV9MSUJSQVJZfSkKKyAgICBzZXQoJHtyZXR1cm5fbGVnYWxfdHlwZX0gIlByb2ZpbGluZyIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtTVFVCU19MSUJSQVJZfSkKKyAgICBzZXQoJHtyZXR1cm5fbGVnYWxfdHlwZX0gIlN0dWIiIFBBUkVOVF9TQ09QRSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgbGlib21wX2FkZF9zdWZmaXgoc3RyaW5nIHN1ZmZpeCwgbGlzdDxzdHJpbmc+KiBsaXN0X29mX2l0ZW1zKTsKKyMgLSByZXR1cm5zIGxpc3Rfb2ZfaXRlbXMgd2l0aCBzdWZmaXggYXBwZW5kZWQgdG8gYWxsIGl0ZW1zCisjIC0gb3JpZ2luYWwgbGlzdCBpcyBtb2RpZmllZAorZnVuY3Rpb24obGlib21wX2FkZF9zdWZmaXggc3VmZml4IGxpc3Rfb2ZfaXRlbXMpCisgIHNldChsb2NhbF9saXN0ICIiKQorICBmb3JlYWNoKGl0ZW0gSU4gTElTVFMgIiR7bGlzdF9vZl9pdGVtc30iKQorICAgIGlmKE5PVCAiJHtpdGVtfSIgU1RSRVFVQUwgIiIpCisgICAgICBsaXN0KEFQUEVORCBsb2NhbF9saXN0ICIke2l0ZW19JHtzdWZmaXh9IikKKyAgICBlbmRpZigpCisgIGVuZGZvcmVhY2goKQorICBzZXQoJHtsaXN0X29mX2l0ZW1zfSAiJHtsb2NhbF9saXN0fSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgbGlib21wX2xpc3RfdG9fc3RyaW5nKGxpc3Q8c3RyaW5nPiBsaXN0X29mX3RoaW5ncywgc3RyaW5nKiByZXR1cm5fc3RyaW5nKTsKKyMgLSBjb252ZXJ0cyBhIGxpc3QgdG8gYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nCitmdW5jdGlvbihsaWJvbXBfbGlzdF90b19zdHJpbmcgbGlzdF9vZl90aGluZ3MgcmV0dXJuX3N0cmluZykKKyAgc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBvdXRwdXRfdmFyaWFibGUgIiR7bGlzdF9vZl90aGluZ3N9IikKKyAgc2V0KCR7cmV0dXJuX3N0cmluZ30gIiR7b3V0cHV0X3ZhcmlhYmxlfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgbGlib21wX3N0cmluZ190b19saXN0KHN0cmluZyBzdHIsIGxpc3Q8c3RyaW5nPiogcmV0dXJuX2xpc3QpOworIyAtIGNvbnZlcnRzIGEgc3RyaW5nIHRvIGEgc2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0CisjIC0gd2hhdCBpdCByZWFsbHkgZG9lcyBpcyBqdXN0IHN0cmluZ19yZXBsYWNlIGFsbCBydW5uaW5nIHdoaXRlc3BhY2UgdG8gYSBzZW1pY29sb24KKyMgLSBpbiBjbWFrZSwgYSBsaXN0IGlzIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnM6IGkuZS4sIGxpc3Qgb2YgZm91ciBpdGVtcywgbGlzdCA9ICJpdGVtMTtpdGVtMjtpdGVtMztpdGVtNCIKK2Z1bmN0aW9uKGxpYm9tcF9zdHJpbmdfdG9fbGlzdCBzdHIgcmV0dXJuX2xpc3QpCisgIHNldChvdXRzdHIpCisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJbIFx0XSsiICI7IiBvdXRzdHIgIiR7c3RyfSIpCisgIHNldCgke3JldHVybl9saXN0fSAiJHtvdXRzdHJ9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvY29uZmlnLWl4LmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9jb25maWctaXguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3OGE3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvY29uZmlnLWl4LmNtYWtlCkBAIC0wLDAgKzEsMjU5IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK2luY2x1ZGUoQ2hlY2tDQ29tcGlsZXJGbGFnKQoraW5jbHVkZShDaGVja0NTb3VyY2VDb21waWxlcykKK2luY2x1ZGUoQ2hlY2tDWFhDb21waWxlckZsYWcpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGUpCitpbmNsdWRlKENoZWNrTGlicmFyeUV4aXN0cykKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZXMpCitpbmNsdWRlKExpYm9tcENoZWNrTGlua2VyRmxhZykKK2luY2x1ZGUoTGlib21wQ2hlY2tGb3J0cmFuRmxhZykKKworIyBDaGVjayBmb3IgdmVyc2lvbmVkIHN5bWJvbHMKK2Z1bmN0aW9uKGxpYm9tcF9jaGVja192ZXJzaW9uX3N5bWJvbHMgcmV0dmFsKQorICBzZXQoc291cmNlX2NvZGUKKyAgICAiI2luY2x1ZGUgPHN0ZGlvLmg+CisgICAgdm9pZCBmdW5jMSgpIHsgcHJpbnRmKFwiSGVsbG9cIik7IH0KKyAgICB2b2lkIGZ1bmMyKCkgeyBwcmludGYoXCJXb3JsZFwiKTsgfQorICAgIF9fYXNtX18oXCIuc3ltdmVyIGZ1bmMxLCBmdW5jQFZFUjFcIik7CisgICAgX19hc21fXyhcIi5zeW12ZXIgZnVuYzIsIGZ1bmNAVkVSMlwiKTsKKyAgICBpbnQgbWFpbigpIHsKKyAgICAgIGZ1bmMxKCk7CisgICAgICBmdW5jMigpOworICAgICAgcmV0dXJuIDA7CisgICAgfSIpCisgIHNldCh2ZXJzaW9uX3NjcmlwdF9zb3VyY2UgIlZFUjEgeyB9OyBWRVIyIHsgfSBWRVIxOyIpCisgIGZpbGUoV1JJVEUgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L19fdmVyc2lvbl9zY3JpcHQudHh0ICIke3ZlcnNpb25fc2NyaXB0X3NvdXJjZX0iKQorICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L19fdmVyc2lvbl9zY3JpcHQudHh0KQorICBjaGVja19jX3NvdXJjZV9jb21waWxlcygiJHtzb3VyY2VfY29kZX0iICR7cmV0dmFsfSkKKyAgc2V0KCR7cmV0dmFsfSAkeyR7cmV0dmFsfX0gUEFSRU5UX1NDT1BFKQorICBmaWxlKFJFTU9WRSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vX192ZXJzaW9uX3NjcmlwdC50eHQpCitlbmRmdW5jdGlvbigpCisKKyMgSW5jbHVkZXMgdGhlIGFyY2hpdGVjdHVyZSBmbGFnIGluIGJvdGggY29tcGlsZSBhbmQgbGluayBwaGFzZQorZnVuY3Rpb24obGlib21wX2NoZWNrX2FyY2hpdGVjdHVyZV9mbGFnIGZsYWcgcmV0dmFsKQorICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7ZmxhZ30iKQorICBjaGVja19jX2NvbXBpbGVyX2ZsYWcoIiR7ZmxhZ30iICR7cmV0dmFsfSkKKyAgc2V0KCR7cmV0dmFsfSAkeyR7cmV0dmFsfX0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIENoZWNraW5nIEMsIENYWCwgTGlua2VyIEZsYWdzCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygtc3RkPWMrKzExIExJQk9NUF9IQVZFX1NURF9DUFAxMV9GTEFHKQorY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLWZuby1leGNlcHRpb25zIExJQk9NUF9IQVZFX0ZOT19FWENFUFRJT05TX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoIi14IGMrKyIgTElCT01QX0hBVkVfWF9DUFBfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2Vycm9yIExJQk9NUF9IQVZFX1dFUlJPUl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW51c2VkLWZ1bmN0aW9uIExJQk9NUF9IQVZFX1dOT19VTlVTRURfRlVOQ1RJT05fRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3VudXNlZC1sb2NhbC10eXBlZGVmIExJQk9NUF9IQVZFX1dOT19VTlVTRURfTE9DQUxfVFlQRURFRl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW51c2VkLXZhbHVlIExJQk9NUF9IQVZFX1dOT19VTlVTRURfVkFMVUVfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3VudXNlZC12YXJpYWJsZSBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX1ZBUklBQkxFX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdzd2l0Y2ggTElCT01QX0hBVkVfV05PX1NXSVRDSF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCBMSUJPTVBfSEFWRV9XTk9fQ09WRVJFRF9TV0lUQ0hfREVGQVVMVF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZGVwcmVjYXRlZC1yZWdpc3RlciBMSUJPTVBfSEFWRV9XTk9fREVQUkVDQVRFRF9SRUdJU1RFUl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xc2lnbi1jb21wYXJlIExJQk9NUF9IQVZFX1dOT19TSUdOX0NPTVBBUkVfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2dudS1hbm9ueW1vdXMtc3RydWN0IExJQk9NUF9IQVZFX1dOT19HTlVfQU5PTllNT1VTX1NUUlVDVF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW5rbm93bi1wcmFnbWFzIExJQk9NUF9IQVZFX1dOT19VTktOT1dOX1BSQUdNQVNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV21pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIExJQk9NUF9IQVZFX1dOT19NSVNTSU5HX0ZJRUxEX0lOSVRJQUxJWkVSU19GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XbWlzc2luZy1icmFjZXMgTElCT01QX0hBVkVfV05PX01JU1NJTkdfQlJBQ0VTX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdjb21tZW50IExJQk9NUF9IQVZFX1dOT19DT01NRU5UX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdzZWxmLWFzc2lnbiBMSUJPTVBfSEFWRV9XTk9fU0VMRl9BU1NJR05fRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3ZsYS1leHRlbnNpb24gTElCT01QX0hBVkVfV05PX1ZMQV9FWFRFTlNJT05fRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2Zvcm1hdC1wZWRhbnRpYyBMSUJPTVBfSEFWRV9XTk9fRk9STUFUX1BFREFOVElDX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLW1zc2UyIExJQk9NUF9IQVZFX01TU0UyX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLWZ0bHMtbW9kZWw9aW5pdGlhbC1leGVjIExJQk9NUF9IQVZFX0ZUTFNfTU9ERUxfRkxBRykKK2xpYm9tcF9jaGVja19hcmNoaXRlY3R1cmVfZmxhZygtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCitsaWJvbXBfY2hlY2tfYXJjaGl0ZWN0dXJlX2ZsYWcoLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKK2lmKFdJTjMyKQorICAjIENoZWNrIFdpbmRvd3MgTVNWQyBzdHlsZSBmbGFncy4KKyAgY2hlY2tfY19jb21waWxlcl9mbGFnKC9UUCBMSUJPTVBfSEFWRV9UUF9GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvRUhzYyBMSUJPTVBfSEFWRV9FSFNDX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9HUyBMSUJPTVBfSEFWRV9HU19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvT3ktIExJQk9NUF9IQVZFX095X19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvYXJjaDpTU0UyIExJQk9NUF9IQVZFX0FSQ0hfU1NFMl9GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvUXNhZmVzZWggTElCT01QX0hBVkVfUVNBRkVTRUhfRkxBRykKKyAgIyBJdCBpcyBkaWZmaWN1bHQgdG8gY3JlYXRlIGEgZHVtbXkgbWFzbSBhc3NlbWJseSBmaWxlCisgICMgYW5kIHRoZW4gY2hlY2sgdGhlIE1BU00gYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGVzZSBmbGFncyBleGlzdCBhbmQgd29yaywKKyAgIyBzbyB3ZSBhc3N1bWUgdGhleSBkbyBmb3IgV2luZG93cy4KKyAgc2V0KExJQk9NUF9IQVZFX1NBRkVTRUhfTUFTTV9GTEFHIFRSVUUpCisgIHNldChMSUJPTVBfSEFWRV9DT0ZGX01BU01fRkxBRyBUUlVFKQorICAjIENoYW5nZSBXaW5kb3dzIGZsYWdzIC9NRHggdG8gL01UeAorICBmb3JlYWNoKGxpYm9tcF9sYW5nIElOIElURU1TIEMgQ1hYKQorICAgIGZvcmVhY2gobGlib21wX2J0eXBlIElOIElURU1TIERFQlVHIFJFTFdJVEhERUJJTkZPIFJFTEVBU0UgTUlOU0laRVJFTCkKKyAgICAgIHN0cmluZyhSRVBMQUNFICIvTUQiICIvTVQiCisgICAgICAgIENNQUtFXyR7bGlib21wX2xhbmd9X0ZMQUdTXyR7bGlib21wX2J0eXBlfQorICAgICAgICAiJHtDTUFLRV8ke2xpYm9tcF9sYW5nfV9GTEFHU18ke2xpYm9tcF9idHlwZX19IgorICAgICAgKQorICAgIGVuZGZvcmVhY2goKQorICBlbmRmb3JlYWNoKCkKK2Vsc2UoKQorICAjIEl0IGlzIGRpZmZpY3VsdCB0byBjcmVhdGUgYSBkdW1teSBhc3NlbWJseSBmaWxlIHRoYXQgY29tcGlsZXMgaW50byBhbgorICAjIGV4ZWN0dWFibGUgZm9yIGV2ZXJ5IGFyY2hpdGVjdHVyZSBhbmQgdGhlbiBjaGVjayB0aGUgQyBjb21waWxlciB0bworICAjIHNlZSBpZiAteCBhc3NlbWJsZXItd2l0aC1jcHAgZXhpc3RzIGFuZCB3b3Jrcywgc28gd2UgYXNzdW1lIGl0IGRvZXMgZm9yIG5vbi1XaW5kb3dzLgorICBzZXQoTElCT01QX0hBVkVfWF9BU1NFTUJMRVJfV0lUSF9DUFBfRkxBRyBUUlVFKQorZW5kaWYoKQoraWYoJHtMSUJPTVBfRk9SVFJBTl9NT0RVTEVTfSkKKyAgbGlib21wX2NoZWNrX2ZvcnRyYW5fZmxhZygtbTMyIExJQk9NUF9IQVZFX00zMl9GT1JUUkFOX0ZMQUcpCitlbmRpZigpCisKKyMgQ2hlY2sgbGlua2VyIGZsYWdzCitpZihXSU4zMikKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC9TQUZFU0VIIExJQk9NUF9IQVZFX1NBRkVTRUhfRkxBRykKK2Vsc2VpZihOT1QgQVBQTEUpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLXggTElCT01QX0hBVkVfWF9GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLVdsLC0td2Fybi1zaGFyZWQtdGV4dHJlbCBMSUJPTVBfSEFWRV9XQVJOX1NIQVJFRF9URVhUUkVMX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLS1hcy1uZWVkZWQgTElCT01QX0hBVkVfQVNfTkVFREVEX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtMSUJPTVBfU1JDX0RJUn0vZXhwb3J0c19zby50eHQiIExJQk9NUF9IQVZFX1ZFUlNJT05fU0NSSVBUX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtc3RhdGljLWxpYmdjYyBMSUJPTVBfSEFWRV9TVEFUSUNfTElCR0NDX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLXosbm9leGVjc3RhY2sgTElCT01QX0hBVkVfWl9OT0VYRUNTVEFDS19GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLVdsLC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pIExJQk9NUF9IQVZFX0ZJTklfRkxBRykKK2VuZGlmKCkKKworIyBDaGVjayBJbnRlbChSKSBDIENvbXBpbGVyIHNwZWNpZmljIGZsYWdzCitpZihDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJJbnRlbCIpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9RbG9uZ19kb3VibGUgTElCT01QX0hBVkVfTE9OR19ET1VCTEVfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL1FkaWFnLWRpc2FibGU6MTc3IExJQk9NUF9IQVZFX0RJQUdfRElTQUJMRV8xNzdfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL1FpbmxpbmUtbWluLXNpemU9MSBMSUJPTVBfSEFWRV9JTkxJTkVfTUlOX1NJWkVfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLVFvcHRpb24sY3BwLC0tZXh0ZW5kZWRfZmxvYXRfdHlwZXMgTElCT01QX0hBVkVfRVhURU5ERURfRkxPQVRfVFlQRVNfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLWZhbGlnbi1zdGFjaz1tYWludGFpbi0xNi1ieXRlIExJQk9NUF9IQVZFX0ZBTElHTl9TVEFDS19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygiLW9wdC1zdHJlYW1pbmctc3RvcmVzIG5ldmVyIiBMSUJPTVBfSEFWRV9PUFRfU1RSRUFNSU5HX1NUT1JFU19GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLXN0YXRpYy1pbnRlbCBMSUJPTVBfSEFWRV9TVEFUSUNfSU5URUxfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1uby1pbnRlbC1leHRlbnNpb25zIExJQk9NUF9IQVZFX05PX0lOVEVMX0VYVEVOU0lPTlNfRkxBRykKKyAgY2hlY2tfbGlicmFyeV9leGlzdHMoaXJjX3BpYyBfaW50ZWxfZmFzdF9tZW1jcHkgIiIgTElCT01QX0hBVkVfSVJDX1BJQ19MSUJSQVJZKQorZW5kaWYoKQorCisjIENoZWNraW5nIFRocmVhZGluZyByZXF1aXJlbWVudHMKK2ZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEKQoraWYoV0lOMzIpCisgIGlmKE5PVCBDTUFLRV9VU0VfV0lOMzJfVEhSRUFEU19JTklUKQorICAgIGxpYm9tcF9lcnJvcl9zYXkoIk5lZWQgV2luMzIgdGhyZWFkIGludGVyZmFjZSBvbiBXaW5kb3dzLiIpCisgIGVuZGlmKCkKK2Vsc2UoKQorICBpZihOT1QgQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCisgICAgbGlib21wX2Vycm9yX3NheSgiTmVlZCBwdGhyZWFkIGludGVyZmFjZSBvbiBVbml4LWxpa2Ugc3lzdGVtcy4iKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgRmluZCBwZXJsIGV4ZWN1dGFibGUKKyMgUGVybCBpcyB1c2VkIHRvIGNyZWF0ZSBvbXAuaCAoYW5kIG90aGVyIGhlYWRlcnMpIGFsb25nIHdpdGgga21wX2kxOG5faWQuaW5jIGFuZCBrbXBfaTE4bl9kZWZhdWx0LmluYworZmluZF9wYWNrYWdlKFBlcmwgUkVRVUlSRUQpCisjIFRoZSBwZXJsIHNjcmlwdHMgdGFrZSB0aGUgLS1vcz0gZmxhZyB3aGljaCBleHBlY3RzIGEgY2VydGFpbiBmb3JtYXQgZm9yIG9wZXJhdGluZyBzeXN0ZW1zLiAgVW50aWwgdGhlCisjIHBlcmwgc2NyaXB0cyBhcmUgcmVtb3ZlZCwgdGhlIG1vc3QgcG9ydGFibGUgd2F5IHRvIGhhbmRsZSB0aGlzIGlzIHRvIGhhdmUgYWxsIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQKKyMgYXJlIG5laXRoZXIgV2luZG93cyBub3IgTWFjIChNb3N0IFVuaXggZmxhdm9ycykgYmUgY29uc2lkZXJlZCBsaW4gdG8gdGhlIHBlcmwgc2NyaXB0cy4gIFRoaXMgaXMgcm9vdGVkCisjIGluIHRoYXQgYWxsIHRoZSBQZXJsIHNjcmlwdHMgY2hlY2sgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIHdpbGwgZmFpbCBpZiBpdCBpc24ndCAidmFsaWQiLiAgVGhpcworIyB0ZW1wb3Jhcnkgc29sdXRpb24gbGV0cyB1cyBhdm9pZCB0cnlpbmcgdG8gZW51bWVyYXRlIGFsbCB0aGUgcG9zc2libGUgT1MgdmFsdWVzIGluc2lkZSB0aGUgUGVybCBtb2R1bGVzLgoraWYoV0lOMzIpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfT1Mgd2luKQorZWxzZWlmKEFQUExFKQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX09TIG1hYykKK2Vsc2UoKQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX09TIGxpbikKK2VuZGlmKCkKKworIyBDaGVja2luZyBmZWF0dXJlcworIyBDaGVjayBpZiB2ZXJzaW9uIHN5bWJvbCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBhcmUgc3VwcG9ydGVkCitsaWJvbXBfY2hlY2tfdmVyc2lvbl9zeW1ib2xzKExJQk9NUF9IQVZFX1ZFUlNJT05fU1lNQk9MUykKKworIyBDaGVjayBpZiBxdWFkIHByZWNpc2lvbiB0eXBlcyBhcmUgYXZhaWxhYmxlCitpZihDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJHTlUiKQorICBzZXQoTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04gVFJVRSkKK2Vsc2VpZihDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJJbnRlbCIpCisgIGlmKExJQk9NUF9IQVZFX0VYVEVOREVEX0ZMT0FUX1RZUEVTX0ZMQUcpCisgICAgc2V0KExJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OIFRSVUUpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTiBUUlVFKQorICBlbmRpZigpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OIEZBTFNFKQorZW5kaWYoKQorCisjIENoZWNrIGlmIGFkYXB0aXZlIGxvY2tzIGFyZSBhdmFpbGFibGUKK2lmKCgke0lBMzJ9IE9SICR7SU5URUw2NH0pIEFORCBOT1QgTVNWQykKKyAgc2V0KExJQk9NUF9IQVZFX0FEQVBUSVZFX0xPQ0tTIFRSVUUpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9IQVZFX0FEQVBUSVZFX0xPQ0tTIEZBTFNFKQorZW5kaWYoKQorCisjIENoZWNrIGlmIHN0YXRzLWdhdGhlcmluZyBpcyBhdmFpbGFibGUKK2lmKCR7TElCT01QX1NUQVRTfSkKKyAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoCisgICAgICJfX3RocmVhZCBpbnQgeDsKKyAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSAKKyAgICAgeyB4ID0gYXJnYzsgcmV0dXJuIHg7IH0iCisgICAgIExJQk9NUF9IQVZFX19fVEhSRUFEKQorICBjaGVja19jX3NvdXJjZV9jb21waWxlcygKKyAgICAgImludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgCisgICAgIHsgdW5zaWduZWQgbG9uZyBsb25nIHQgPSBfX2J1aWx0aW5fcmVhZGN5Y2xlY291bnRlcigpOyByZXR1cm4gMDsgfSIKKyAgICAgTElCT01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIpCisgIGlmKE5PVCBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUikKKyAgICBpZigke0lBMzJ9IE9SICR7SU5URUw2NH0pCisgICAgICBjaGVja19pbmNsdWRlX2ZpbGUoeDg2aW50cmluLmggTElCT01QX0hBVkVfWDg2SU5UUklOX0gpCisgICAgICBsaWJvbXBfYXBwZW5kKENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TIC1ETElCT01QX0hBVkVfWDg2SU5UUklOX0ggTElCT01QX0hBVkVfWDg2SU5UUklOX0gpCisgICAgICBjaGVja19jX3NvdXJjZV9jb21waWxlcygKKyAgICAgICAgIiNpZmRlZiBMSUJPTVBfSEFWRV9YODZJTlRSSU5fSAorICAgICAgICAgIyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4KKyAgICAgICAgICNlbmRpZgorICAgICAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7IHVuc2lnbmVkIGxvbmcgbG9uZyB0ID0gX19yZHRzYygpOyByZXR1cm4gMDsgfSIgTElCT01QX0hBVkVfX19SRFRTQykKKyAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUykKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgaWYoTElCT01QX0hBVkVfX19USFJFQUQgQU5EIChMSUJPTVBfSEFWRV9fX1JEVFNDIE9SIExJQk9NUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSKSkKKyAgICBzZXQoTElCT01QX0hBVkVfU1RBVFMgVFJVRSkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9IQVZFX1NUQVRTIEZBTFNFKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgT01QVCBzdXBwb3J0IGlzIGF2YWlsYWJsZQorIyBDdXJyZW50bHksIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKCkgaXMgcmVxdWlyZWQgZm9yIE9NUFQKKyMgV2VhayBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIFVuaWNlcywgTElCUFNBUEkgaXMgdXNlZCBmb3IgV2luZG93cworY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoImludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICB2b2lkKiBwID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgIHJldHVybiAwO30iIExJQk9NUF9IQVZFX19fQlVJTFRJTl9GUkFNRV9BRERSRVNTKQorY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIl9fYXR0cmlidXRlX18gKCh3ZWFrKSkgaW50IGZvbyhpbnQgYSkgeyByZXR1cm4gYSphOyB9CisgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICByZXR1cm4gZm9vKGFyZ2MpO30iIExJQk9NUF9IQVZFX1dFQUtfQVRUUklCVVRFKQorY2hlY2tfaW5jbHVkZV9maWxlcygid2luZG93cy5oO3BzYXBpLmgiIExJQk9NUF9IQVZFX1BTQVBJX0gpCitjaGVja19saWJyYXJ5X2V4aXN0cyhwc2FwaSBFbnVtUHJvY2Vzc01vZHVsZXMgIiIgTElCT01QX0hBVkVfTElCUFNBUEkpCitpZihMSUJPTVBfSEFWRV9QU0FQSV9IIEFORCBMSUJPTVBfSEFWRV9MSUJQU0FQSSkKKyAgc2V0KExJQk9NUF9IQVZFX1BTQVBJIFRSVUUpCitlbmRpZigpCitpZihOT1QgTElCT01QX0hBVkVfX19CVUlMVElOX0ZSQU1FX0FERFJFU1MpCisgIHNldChMSUJPTVBfSEFWRV9PTVBUX1NVUFBPUlQgRkFMU0UpCitlbHNlKCkKKyAgaWYoTElCT01QX0hBVkVfV0VBS19BVFRSSUJVVEUgT1IgTElCT01QX0hBVkVfUFNBUEkpCisgICAgc2V0KExJQk9NUF9IQVZFX09NUFRfU1VQUE9SVCBUUlVFKQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0hBVkVfT01QVF9TVVBQT1JUIEZBTFNFKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgSFdMT0Mgc3VwcG9ydCBpcyBhdmFpbGFibGUKK2lmKCR7TElCT01QX1VTRV9IV0xPQ30pCisgIGlmKFdJTjMyKQorICAgIHNldChMSUJPTVBfSEFWRV9IV0xPQyBGQUxTRSkKKyAgICBsaWJvbXBfc2F5KCJVc2luZyBod2xvYyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgeWV0IikKKyAgZWxzZSgpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9pbmNsdWRlKQorICAgIGNoZWNrX2luY2x1ZGVfZmlsZShod2xvYy5oIExJQk9NUF9IQVZFX0hXTE9DX0gpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTKQorICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzKGh3bG9jIGh3bG9jX3RvcG9sb2d5X2luaXQgCisgICAgICAke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vbGliIExJQk9NUF9IQVZFX0xJQkhXTE9DKQorICAgIGZpbmRfbGlicmFyeShMSUJPTVBfSFdMT0NfTElCUkFSWSBod2xvYyAke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vbGliKQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoTElCT01QX0hXTE9DX0xJQlJBUllfRElSICR7TElCT01QX0hXTE9DX0xJQlJBUll9IFBBVEgpCisgICAgaWYoTElCT01QX0hBVkVfSFdMT0NfSCBBTkQgTElCT01QX0hBVkVfTElCSFdMT0MgQU5EIExJQk9NUF9IV0xPQ19MSUJSQVJZKQorICAgICAgc2V0KExJQk9NUF9IQVZFX0hXTE9DIFRSVUUpCisgICAgZWxzZSgpCisgICAgICBzZXQoTElCT01QX0hBVkVfSFdMT0MgRkFMU0UpCisgICAgICBsaWJvbXBfc2F5KCJDb3VsZCBub3QgZmluZCBod2xvYyIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCitlbmRpZigpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvZG9jL1JlZmVyZW5jZS5wZGYgYi9maW5hbC9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2M0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vY29uZmlnIGIvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1MzEwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vY29uZmlnCkBAIC0wLDAgKzEsMTgyMiBAQAorIyBEb3h5ZmlsZSAxLm84LjINCisNCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtDQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuDQorIw0KKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLg0KKyMgVGhlIGZvcm1hdCBpczoNCisjICAgICAgIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQ0KKyMgRm9yIGxpc3RzIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOg0KKyMgICAgICAgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQ0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoIiAiKS4NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUNCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwNCisjIHRleHQgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZQ0KKyMgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUNCisjIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLg0KKw0KK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOA0KKw0KKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3Igc2VxdWVuY2Ugb2Ygd29yZHMpIHRoYXQgc2hvdWxkDQorIyBpZGVudGlmeSB0aGUgcHJvamVjdC4gTm90ZSB0aGF0IGlmIHlvdSBkbyBub3QgdXNlIERveHl3aXphcmQgeW91IG5lZWQNCisjIHRvIHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBwcm9qZWN0IG5hbWUgaWYgaXQgY29udGFpbnMgc3BhY2VzLg0KKw0KK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSAiTExWTSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSINCisNCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4NCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3INCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLg0KKw0KK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPQ0KKw0KKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbg0KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlcg0KKyMgYSBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4NCisNCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0NCisNCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzDQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QNCisjIGV4Y2VlZCA1NSBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuDQorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitQUk9KRUNUX0xPR08gICAgICAgICAgID0NCisNCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkNCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24NCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4NCisNCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jL2RveHlnZW4vZ2VuZXJhdGVkDQorDQorIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQ0KKyMgNDA5NiBzdWItZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dA0KKyMgZm9ybWF0IGFuZCB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLg0KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mDQorIyBzb3VyY2UgZmlsZXMsIHdoZXJlIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQNCisjIG90aGVyd2lzZSBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLg0KKw0KK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwNCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzDQorIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuDQorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToNCisjIEFmcmlrYWFucywgQXJhYmljLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsIENoaW5lc2UtVHJhZGl0aW9uYWwsDQorIyBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVzcGVyYW50bywgRmFyc2ksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLA0KKyMgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2gNCisjIG1lc3NhZ2VzKSwgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwNCisjIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywNCisjIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFVrcmFpbmlhbiwgYW5kIFZpZXRuYW1lc2UuDQorDQorT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gNCisNCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbg0KKyMgdGhlIGZpbGUgYW5kIGNsYXNzIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YURvYykuDQorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLg0KKw0KK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgcHJlcGVuZA0KKyMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24uDQorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlDQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuDQorDQorUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUw0KKw0KKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yDQorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZw0KKyMgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZCBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZQ0KKyMgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dCBhbmQgdGhlIHJlc3VsdCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcw0KKyMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuDQorIyBJZiBsZWZ0IGJsYW5rLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoIiRuYW1lIiBpcyBhdXRvbWF0aWNhbGx5DQorIyByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkpOiAiVGhlICRuYW1lIGNsYXNzIiAiVGhlICRuYW1lIHdpZGdldCINCisjICJUaGUgJG5hbWUgZmlsZSIgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyINCisjICJyZXByZXNlbnRzIiAiYSIgImFuIiAidGhlIg0KKw0KK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbg0KKyMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZg0KKyMgZGVzY3JpcHRpb24uDQorDQorQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PDQorDQorIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwNCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQ0KKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQNCisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLg0KKw0KK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTw0KKw0KKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsDQorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldA0KKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuDQorDQorRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcNCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcw0KKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YNCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4NCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlDQorIyBwYXRoIHRvIHN0cmlwLiBOb3RlIHRoYXQgeW91IHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28NCisjIHJlbGF0aXZlIHBhdGhzLCB3aGljaCB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzDQorIyBzdGFydGVkLg0KKw0KK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQ0KKw0KKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YNCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscw0KKyMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLg0KKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcw0KKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQNCisjIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLg0KKw0KK1NUUklQX0ZST01fSU5DX1BBVEggICAgPQ0KKw0KKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyDQorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3VyIGZpbGUgc3lzdGVtDQorIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uDQorDQorU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlDQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYw0KKyMgY29tbWVudHMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMNCisjICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pDQorDQorSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsDQorIyBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUNCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBjb21tZW50cw0KKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nDQorIyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pDQorDQorUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBEb3h5Z2VuDQorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8NCisjIGNvbW1lbnRzKSBhcyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLg0KKyMgVGhlIG5ldyBkZWZhdWx0IGlzIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkDQorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuDQorDQorTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PDQorDQorIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhbiB1bmRvY3VtZW50ZWQNCisjIG1lbWJlciBpbmhlcml0cyB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0DQorIyByZS1pbXBsZW1lbnRzLg0KKw0KK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UNCisjIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwNCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuDQorDQorU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PDQorDQorIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4NCisjIERveHlnZW4gdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuDQorDQorVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgNCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMNCisjIGFzIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLg0KKyMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0bw0KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoDQorIyB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nICJTaWRlIEVmZmVjdHM6Ii4NCisjIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLg0KKw0KK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAib3RoZXI9PHN1cD4qPC9zdXA+Ig0KKw0KKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiB3b3JkLWtleXdvcmQgbWFwcGluZ3MgKFRDTCBvbmx5KS4NCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcNCisjICJjbGFzcz1pdGNsOjpjbGFzcyIgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZQ0KKyMgaXRjbDo6Y2xhc3MgbWVhbmluZy4NCisNCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMNCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4NCisjIEZvciBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3QNCisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLg0KKw0KK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTw0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhDQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yDQorIyBKYXZhLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsIHF1YWxpZmllZA0KKyMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4NCisNCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbg0KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcg0KKyMgRm9ydHJhbi4NCisNCitPUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETA0KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yDQorIyBWSERMLg0KKw0KK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTw0KKw0KKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdA0KKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4NCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQNCisjIHVzaW5nIHRoaXMgdGFnLiBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sDQorIyBhbmQgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsDQorIyBKYXZhc2NyaXB0LCBDU2hhcnAsIEMsIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLCBDLA0KKyMgQysrLiBGb3IgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdA0KKyMgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLiBOb3RlDQorIyB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZSB0aGUNCisjIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLg0KKw0KK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPQ0KKw0KKyMgSWYgTUFSS0RPV05fU1VQUE9SVCBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsDQorIyBjb21tZW50cyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlDQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuDQorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91DQorIyBjYW4gbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLg0KKyMgRGlzYWJsZSBvbmx5IGluIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4NCisNCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTDQorDQorIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkIGNsYXNzZXMsDQorIyBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuIGJlDQorIyBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yDQorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uDQorDQorQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUw0KKw0KKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudA0KKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkDQorIyBzZXQgdGhpcyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kDQorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsgdi5zLg0KKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZXMgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uDQorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuDQorDQorQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PDQorDQorIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bw0KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4NCisNCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIHNvdXJjZXMgb25seS4NCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYw0KKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuDQorDQorU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PDQorDQorIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8NCisjIGluZGljYXRlIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcw0KKyMgb3B0aW9uIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgbWFrZSBkb3h5Z2VuIHJlcGxhY2UgdGhlIGdldCBhbmQNCisjIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoaXMgd2lsbCBvbmx5IHdvcmsNCisjIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMNCisjIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQNCisjIHNldCB0aGlzIG9wdGlvbiB0byBOTy4NCisNCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTDQorDQorIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DDQorIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0DQorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQNCisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuDQorDQorRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PDQorDQorIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mDQorIyB0aGUgc2FtZSB0eXBlIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYQ0KKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8NCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nDQorIyB0aGUgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4NCisNCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTDQorDQorIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZA0KKyMgdW5pb25zIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nDQorIyBAaW5ncm91cCkgaW5zdGVhZCBvZiBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4gcGFnZXMpIG9yDQorIyBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuDQorDQorSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PDQorDQorIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZA0KKyMgdW5pb25zIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4gdGhlIGRvY3VtZW50YXRpb24NCisjIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsIG5hbWVzcGFjZSwgb3IgZ3JvdXANCisjIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpLA0KKyMgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucyBhcmUgc2hvd24gb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuDQorIyBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLg0KKw0KK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTw0KKw0KKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtDQorIyBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28NCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdA0KKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwNCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseQ0KKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQNCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4NCisNCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8NCisNCisjIFRoZSBTWU1CT0xfQ0FDSEVfU0laRSBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZSB1c2UgdG8NCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLg0KKyMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suDQorIyBGb3Igc21hbGwgdG8gbWVkaXVtIHNpemUgcHJvamVjdHMgKDwxMDAwIGlucHV0IGZpbGVzKSB0aGUgZGVmYXVsdCB2YWx1ZSBpcw0KKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UNCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZQ0KKyMgY2F1c2luZyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsdHkuDQorIyBJZiB0aGUgc3lzdGVtIGhhcyBlbm91Z2ggcGh5c2ljYWwgbWVtb3J5IGluY3JlYXNpbmcgdGhlIGNhY2hlIHdpbGwgaW1wcm92ZSB0aGUNCisjIHBlcmZvcm1hbmNlIGJ5IGtlZXBpbmcgbW9yZSBzeW1ib2xzIGluIG1lbW9yeS4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB3b3JrcyBvbg0KKyMgYSBsb2dhcml0aG1pYyBzY2FsZSBzbyBpbmNyZWFzaW5nIHRoZSBzaXplIGJ5IG9uZSB3aWxsIHJvdWdobHkgZG91YmxlIHRoZQ0KKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6DQorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLA0KKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMuDQorDQorU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDANCisNCisjIFNpbWlsYXIgdG8gdGhlIFNZTUJPTF9DQUNIRV9TSVpFIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZQ0KKyMgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuDQorIyB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZQ0KKyMgc2FtZSBzeW1ib2wgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIHRoZSBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YNCisjIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLg0KKyMgSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcw0KKyMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwNCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLg0KKw0KK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4NCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLg0KKyMgUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcw0KKyMgdGhlIEVYVFJBQ1RfUFJJVkFURSBhbmQgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUw0KKw0KK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3MNCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9QUklWQVRFICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwNCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZQ0KKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKQ0KKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuDQorDQorRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUw0KKw0KKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwNCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4NCisjIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLg0KKw0KK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTw0KKw0KKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUNCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZA0KKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZQ0KKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0DQorIyBhbm9ueW1vdXMgbmFtZXNwYWNlcyBhcmUgaGlkZGVuLg0KKw0KK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTw0KKw0KKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlDQorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuDQorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuDQorDQorSElERV9VTkRPQ19NRU1CRVJTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMNCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLg0KKw0KK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbA0KKyMgZnJpZW5kIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbi4NCisNCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8NCisNCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYW55DQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQ0KKyMgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLg0KKw0KK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTw0KKw0KKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbg0KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldA0KKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuDQorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uDQorDQorSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUNCisjIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbw0KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcg0KKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzDQorIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4NCisNCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4NCisNCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgcHV0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyBvZiB0aGF0IGZpbGUuDQorDQorU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBsaXN0IGluY2x1ZGUgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLg0KKw0KK0ZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTw0KKw0KKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXQ0KKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLg0KKw0KK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzDQorIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluDQorIyBkZWNsYXJhdGlvbiBvcmRlci4NCisNCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlDQorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseQ0KKyMgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluDQorIyBkZWNsYXJhdGlvbiBvcmRlci4NCisNCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBzb3J0IHRoZSAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdA0KKyMgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKyMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQ0KKyMgU09SVF9NRU1CRVJfRE9DUyBhbmQgU09SVF9CUklFRl9ET0NTLg0KKyMgVGhpcyB0YWcgd2lsbCBiZSBpZ25vcmVkIGZvciBicmllZiBkb2NzIGlmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8NCisjIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLg0KKw0KK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUNCisjIGhpZXJhcmNoeSBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkNCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLg0KKw0KK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZQ0KKyMgc29ydGVkIGJ5IGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0bw0KKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLA0KKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuDQorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLg0KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlDQorIyBhbHBoYWJldGljYWwgbGlzdC4NCisNCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8NCisNCisjIElmIHRoZSBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIGRveHlnZW4gZmFpbHMgdG8NCisjIGRvIHByb3BlciB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhDQorIyBtYXRjaCBiZXR3ZWVuIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuDQorIyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjYW5kaWRhdGUgb3IgaXQgaXMgb2J2aW91cyB3aGljaCBjYW5kaWRhdGUgdG8gY2hvb3NlDQorIyBieSBkb2luZyBhIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbg0KKyMgd2lsbCBzdGlsbCBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4NCisNCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8NCisNCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbw0KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUw0KKw0KKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0DQorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTDQorDQorIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIGJ1ZyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcNCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMNCisNCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZw0KKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUw0KKw0KKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbA0KKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLg0KKw0KK0VOQUJMRURfU0VDVElPTlMgICAgICAgPQ0KKw0KKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMNCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gY29uc2lzdHMgb2YgZm9yIGl0IHRvIGFwcGVhciBpbg0KKyMgdGhlIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkDQorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuDQorIyBUaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyDQorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLg0KKw0KK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMA0KKw0KKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkDQorIyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlDQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uDQorDQorU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUw0KKw0KKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLg0KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlDQorIyBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuDQorDQorIyBXZSBwcm9iYWJseSB3aWxsIHdhbnQgdGhpcywgYnV0IHdlIGhhdmUgbm8gZmlsZSBkb2N1bWVudGF0aW9uIHlldCBzbyBpdCdzIHNpbXBsZXIgdG8gcmVtb3ZlDQorIyBpdCBmb3Igbm93Lg0KK1NIT1dfRklMRVMgICAgICAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlDQorIyBOYW1lc3BhY2VzIHBhZ2UuDQorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4DQorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLg0KKw0KK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMNCisNCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdA0KKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tDQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWENCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxjb21tYW5kPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxjb21tYW5kPiBpcyB0aGUgdmFsdWUgb2YNCisjIHRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlDQorIyBwcm92aWRlZCBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0DQorIyBpcyB1c2VkIGFzIHRoZSBmaWxlIHZlcnNpb24uIFNlZSB0aGUgbWFudWFsIGZvciBleGFtcGxlcy4NCisNCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0NCisNCisjIFRoZSBMQVlPVVRfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxheW91dCBmaWxlIHdoaWNoIHdpbGwgYmUgcGFyc2VkDQorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZA0KKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlDQorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uDQorIyBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkDQorIyBEb3h5Z2VuTGF5b3V0LnhtbCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLg0KKw0KK0xBWU9VVF9GSUxFICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcw0KKyMgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyBkYXRhLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZQ0KKyMgLmJpYiBleHRlbnNpb24gaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiBvbWl0dGVkLiBVc2luZyB0aGlzIGNvbW1hbmQNCisjIHJlcXVpcmVzIHRoZSBiaWJ0ZXggdG9vbCB0byBiZSBpbnN0YWxsZWQuIFNlZSBhbHNvDQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLiBGb3IgTGFUZVggdGhlIHN0eWxlDQorIyBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMNCisjIGZlYXR1cmUgeW91IG5lZWQgYmlidGV4IGFuZCBwZXJsIGF2YWlsYWJsZSBpbiB0aGUgc2VhcmNoIHBhdGguDQorDQorQ0lURV9CSUJfRklMRVMgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQNCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQ0KKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuaw0KKyMgTk8gaXMgdXNlZC4NCisNCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncw0KKyMgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnIHdpbGwNCisjIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuDQorDQorV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUw0KKw0KKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcg0KKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZQ0KKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdA0KKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuDQorDQorV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUw0KKw0KKyMgVGhlIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3INCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzDQorIyBvciByZXR1cm4gdmFsdWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQNCisjIHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YNCisjIGRvY3VtZW50YXRpb24uDQorDQorV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PDQorDQorIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0DQorIyBkb3h5Z2VuIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dA0KKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUNCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluDQorIyAkdmVyc2lvbiwgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQNCisjIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQ0KKw0KK1dBUk5fRk9STUFUICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZw0KKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbg0KKyMgdG8gc3RkZXJyLg0KKw0KK1dBUk5fTE9HRklMRSAgICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBJTlBVVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbg0KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvcg0KKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzDQorIyB3aXRoIHNwYWNlcy4NCisNCitJTlBVVCAgICAgICAgICAgICAgICAgID0gc3JjICBkb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmggDQorIyBUaGUgaXR0bm90aWZ5IGNvZGUgYWxzbyBoYXMgZG94eWdlbiBkb2N1bWVudGF0aW9uLCBidXQgaWYgd2UgaW5jbHVkZSBpdCBoZXJlDQorIyBpdCB0YWtlcyBvdmVyIGZyb20gdXMhDQorIyBzcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcw0KKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLCB3aGljaCBpcw0KKyMgYWxzbyB0aGUgZGVmYXVsdCBpbnB1dCBlbmNvZGluZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQNCisjIGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3INCisjIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4NCisNCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgNCisNCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcA0KKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdA0KKyMgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOg0KKyMgKi5jICouY2MgKi5jeHggKi5jcHAgKi5jKysgKi5kICouamF2YSAqLmlpICouaXh4ICouaXBwICouaSsrICouaW5sICouaCAqLmhoDQorIyAqLmh4eCAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLmRveCAqLnB5DQorIyAqLmY5MCAqLmYgKi5mb3IgKi52aGQgKi52aGRsDQorDQorRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmggKi5jcHAgDQorIyBXZSBtYXkgYWxzbyB3YW50IHRvIGluY2x1ZGUgdGhlIGFzbSBmaWxlcyB3aXRoIGFwcHJvcHJpYXRlIGlmZGVmIHRvIGVuc3VyZQ0KKyMgZG94eWdlbiBkb2Vzbid0IHNlZSB0aGUgY29udGVudCwganVzdCB0aGUgZG9jdW1lbnRhdGlvbi4uLg0KKw0KKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzDQorIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4NCisjIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4NCisNCisjIE9ubHkgbG9vayBpbiB0aGUgb25lIGRpcmVjdG9yeS4NCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQ0KKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGENCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLg0KKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcw0KKyMgcnVuLg0KKw0KK0VYQ0xVREUgICAgICAgICAgICAgICAgPSBzcmMvdGVzdC10b3VjaC5jDQorDQorIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yDQorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZA0KKyMgZnJvbSB0aGUgaW5wdXQuDQorDQorRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlDQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUNCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQNCisjIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0byBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzDQorIyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoNCisNCitFWENMVURFX1BBVFRFUk5TICAgICAgID0NCisNCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzDQorIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQ0KKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlDQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLA0KKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdA0KKw0KK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPQ0KKw0KKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcg0KKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQ0KKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLg0KKw0KK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcA0KKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdA0KKyMgYmxhbmsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZC4NCisNCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0NCisNCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUNCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZQ0KKyMgY29tbWFuZHMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4NCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTw0KKw0KKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3INCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlDQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLg0KKw0KK0lNQUdFX1BBVEggICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZA0KKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQ0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPg0KKyMgaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuDQorIyBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIgcHJvZ3JhbSB3cml0ZXMNCisjIHRvIHN0YW5kYXJkIG91dHB1dC4NCisjIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUNCisjIGlnbm9yZWQuDQorDQorSU5QVVRfRklMVEVSICAgICAgICAgICA9DQorDQorIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuDQorIyBiYXNpcy4NCisjIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQ0KKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guDQorIyBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOg0KKyMgcGF0dGVybj1maWx0ZXIgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXINCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSBvciBpZg0KKyMgbm9uIG9mIHRoZSBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4NCisNCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0NCisNCisjIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcNCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlDQorIyBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4NCisNCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8NCisNCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlDQorIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkNCisjIGFuZCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuDQorIyB1c2luZyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4gVGhpcyBvcHRpb24gb25seSBoYXMgZWZmZWN0IHdoZW4NCisjIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgZW5hYmxlZC4NCisNCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwNCisjIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLg0KKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSBhbHNvDQorIyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4NCisNCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gWUVTDQorDQorIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keQ0KKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTw0KKw0KKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBpbnN0cnVjdA0KKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlDQorIyBmcmFnbWVudHMuIE5vcm1hbCBDLCBDKysgYW5kIEZvcnRyYW4gY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuDQorDQorU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMNCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZA0KKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLg0KKw0KK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMNCisNCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTDQorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMNCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuDQorDQorUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PDQorDQorIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpDQorIyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbQ0KKyMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbA0KKyMgbGluayB0byB0aGUgc291cmNlIGNvZGUuDQorIyBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uDQorDQorUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUw0KKw0KKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlDQorIyB3aWxsIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4NCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UNCisjIHRhZ2dpbmcgc3lzdGVtIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdQ0KKyMgd2lsbCBuZWVkIHZlcnNpb24gNC44LjYgb3IgaGlnaGVyLg0KKw0KK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3INCisjIHdoaWNoIGFuIGluY2x1ZGUgaXMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLg0KKw0KK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4DQorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdA0KKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuDQorDQorQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIGFscGhhYmV0aWNhbCBpbmRleCBpcyBlbmFibGVkIChzZWUgQUxQSEFCRVRJQ0FMX0lOREVYKSB0aGVuDQorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMNCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pDQorDQorQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUNCisNCisjIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwNCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguDQorIyBUaGUgSUdOT1JFX1BSRUZJWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBwcmVmaXhlcyB0aGF0DQorIyBzaG91bGQgYmUgaWdub3JlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLg0KKw0KK0lHTk9SRV9QUkVGSVggICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4NCisNCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTDQorDQorIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitIVE1MX09VVFBVVCAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3INCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuaw0KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLg0KKw0KK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbA0KKw0KKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGhlYWRlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYSBjdXN0b20gaGVhZGVyIHlvdSBhcmUgcmVzcG9uc2libGUNCisjICBmb3IgdGhlIHByb3BlciBpbmNsdXNpb24gb2YgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cyB0aGF0IGRveHlnZW4NCisjIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkLg0KKyMgSXQgaXMgYWR2aXNlZCB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgaGVhZGVyIHVzaW5nICJkb3h5Z2VuIC13IGh0bWwNCisjIGhlYWRlci5odG1sIGZvb3Rlci5odG1sIHN0eWxlc2hlZXQuY3NzIFlvdXJDb25maWdGaWxlIiBhbmQgdGhlbiBtb2RpZnkNCisjIHRoYXQgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5DQorIyBoYXZlIHRvIHJlZG8gdGhpcyB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbiBvciB3aGVuDQorIyBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBzdWNoIGFzIEdFTkVSQVRFX1RSRUVWSUVXIQ0KKw0KK0hUTUxfSEVBREVSICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGZvb3Rlci4NCisNCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nDQorIyBzdHlsZSBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvDQorIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LiBOb3RlIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlDQorIyBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYXMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMNCisjIHRhZyB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lIG9ic29sZXRlLg0KKw0KK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsDQorIyB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRoYXQgaXMgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkDQorIyBzdHlsZSBzaGVldHMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlDQorIyBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUDQorIyBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3IgbW9yZQ0KKyMgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvDQorIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0NCisNCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcg0KKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQ0KKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUNCisjICRyZWxwYXRoJCBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlDQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdA0KKyMgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuDQorDQorSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9DQorDQorIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4NCisjIERveHlnZW4gd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzDQorIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsDQorIyBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorIyBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLA0KKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4NCisjIFRoZSBhbGxvd2VkIHJhbmdlIGlzIDAgdG8gMzU5Lg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjANCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZg0KKyMgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZQ0KKyMgZ3JheXNjYWxlcyBvbmx5LiBBIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDANCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8NCisjIHRoZSBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cNCisjIDEwMCBncmFkdWFsbHkgbWFrZSB0aGUgb3V0cHV0IGxpZ2h0ZXIsIHdoZXJlYXMgdmFsdWVzIGFib3ZlIDEwMCBtYWtlDQorIyB0aGUgb3V0cHV0IGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwNCisjIHNvIDgwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwNCisjIGFuZCAxMDAgZG9lcyBub3QgY2hhbmdlIHRoZSBnYW1tYS4NCisNCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODANCisNCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTA0KKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nDQorIyB0aGlzIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4NCisNCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MDQorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQ0KKyMgcGFnZSBoYXMgbG9hZGVkLg0KKw0KK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTw0KKw0KKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZg0KKyMgZW50cmllcyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyDQorIyBjYW4gZXhwYW5kIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kDQorIyB0aGUgdHJlZSB0byBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlDQorIyB2aXNpYmxlICh1bmxlc3MgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLg0KKyMgU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5DQorIyBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMNCisjIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQgdHJlZSBieSBkZWZhdWx0Lg0KKw0KK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDANCisNCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMNCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMw0KKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4NCisjIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBNYWtlZmlsZSBpbiB0aGUNCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQNCisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbg0KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kDQorIyBpdCBhdCBzdGFydHVwLg0KKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwNCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KKw0KK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTw0KKw0KKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlDQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQ0KKyMgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpDQorIyBjYW4gYmUgZ3JvdXBlZC4NCisNCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiDQorDQorIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQNCisjIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhDQorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuDQorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLg0KKw0KK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0DQorDQorIyBXaGVuIEdFTkVSQVRFX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5DQorIyBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZQ0KKyMgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4NCisNCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyDQorDQorIyBUaGUgR0VORVJBVEVfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLg0KKw0KK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXINCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUNCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21waWxlZCBIVE1MIGhlbHAgZmlsZSAoLmNobSkNCisjIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdQ0KKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlDQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuDQorDQorQ0hNX0ZJTEUgICAgICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZg0KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1bg0KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4NCisNCitISENfTE9DQVRJT04gICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnDQorIyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgdGhhdA0KKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuDQorDQorR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcNCisjIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpIGFuZCBwcm9qZWN0IGZpbGUNCisjIGNvbnRlbnQuDQorDQorQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcNCisjIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIGENCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuDQorDQorQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycw0KKyMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4NCisNCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQNCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQNCisjIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYQ0KKyMgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLg0KKyMgVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuDQorDQorUUNIX0ZJTEUgICAgICAgICAgICAgICA9DQorDQorIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZw0KKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UNCisNCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdA0KKw0KKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZw0KKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLWZvbGRlcnMNCisNCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jDQorDQorIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8NCisjIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycw0KKw0KK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPQ0KKw0KKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUNCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzIj4NCisjIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4NCisNCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0NCisNCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzDQorIyBwcm9qZWN0J3MNCisjIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuDQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzIj4NCisjIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzPC9hPi4NCisNCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzIHFoZWxwZ2VuZXJhdG9yLg0KKyMgSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZSBnZW5lcmF0ZWQNCisjIC5xaHAgZmlsZS4NCisNCitRSEdfTE9DQVRJT04gICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgIHdpbGwgYmUgZ2VuZXJhdGVkLCB3aGljaCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCBmb3JtIGFuIEVjbGlwc2UgaGVscA0KKyMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cw0KKyMgbWVudSBpbiBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwNCisjIGZpbGVzIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZg0KKyMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcw0KKyMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLiBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZQ0KKyMgdGhlIGhlbHAgYXBwZWFycy4NCisNCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8NCisNCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbg0KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlDQorIyB0aGlzIG5hbWUuDQorDQorRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QNCisNCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKQ0KKyMgYXQgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQNCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuIFNpbmNlIHRoZSB0YWJzIGhhdmUgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlDQorIyBuYXZpZ2F0aW9uIHRyZWUgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gTk8gaWYgeW91IGFscmVhZHkgc2V0DQorIyBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuDQorDQorRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PDQorDQorIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4DQorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4NCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkDQorIyBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdA0KKyMgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzDQorIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4NCisjIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLg0KKyMgU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4IHlvdQ0KKyMgY291bGQgY29uc2lkZXIgdG8gc2V0IERJU0FCTEVfSU5ERVggdG8gTk8gd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4NCisNCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8NCisNCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMNCisjIChyYW5nZSBbMCwxLi4yMF0pIHRoYXQgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTA0KKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0NCisjIHZhbHVlcyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4NCisNCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNA0KKw0KKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUNCisjIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZQ0KKyMgaXMgc2hvd24uDQorDQorVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MA0KKw0KKyMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3Blbg0KKyMgbGlua3MgdG8gZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93Lg0KKw0KK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTw0KKw0KKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkDQorIyBhcyBpbWFnZXMgaW4gdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gVGhlIGRlZmF1bHQgaXMgMTAuIE5vdGUgdGhhdA0KKyMgd2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRveHlnZW4gcnVuIHlvdSBuZWVkDQorIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQ0KKyMgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4NCisNCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTANCisNCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcw0KKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUNCisjIG5vdCBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4NCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcw0KKyMgaW4gdGhlIEhUTUwgb3V0cHV0IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4NCisNCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTDQorDQorIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheA0KKyMgKHNlZSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZQ0KKyMgcmVuZGVyaW5nIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdA0KKyMgaGF2ZSBMYVRlWCBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTA0KKyMgb3V0cHV0LiBXaGVuIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kDQorIyBjb25maWd1cmUgdGhlIHBhdGggdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uDQorDQorVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PDQorDQorIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUNCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uDQorIyBkaXJlY3Rvcnkgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4DQorIyBkaXJlY3RvcnkgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuDQorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0bw0KKyMgdGhlIE1hdGhKYXggQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0DQorIyBpbnN0YWxsaW5nIE1hdGhKYXguDQorIyBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwNCisjIGNvcHkgb2YgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuDQorDQorTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QNCisNCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIE1hdGhKYXggZXh0ZW5zaW9uDQorIyBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4NCisNCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0NCisNCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94DQorIyBmb3IgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdA0KKyMgYW5kIERIVE1MIGFuZCBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nDQorIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cw0KKyMgKEdFTkVSQVRFX0RPQ1NFVCkgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQNCisjIHR5cGljYWxseSBiZSBkaXNhYmxlZC4gRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUNCisjIGNhbiBiZSBzbG93LCB0aGVuIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uDQorDQorU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUw0KKw0KKyMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlDQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIFBIUCBlbmFibGVkIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhdCB0aGUgd2ViIGNsaWVudA0KKyMgdXNpbmcgSmF2YXNjcmlwdC4gRG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBzZWFyY2ggUEhQIHNjcmlwdCBhbmQgaW5kZXgNCisjIGZpbGUgdG8gcHV0IG9uIHRoZSB3ZWIgc2VydmVyLiBUaGUgYWR2YW50YWdlIG9mIHRoZSBzZXJ2ZXINCisjIGJhc2VkIGFwcHJvYWNoIGlzIHRoYXQgaXQgc2NhbGVzIGJldHRlciB0byBsYXJnZSBwcm9qZWN0cyBhbmQgYWxsb3dzDQorIyBmdWxsIHRleHQgc2VhcmNoLiBUaGUgZGlzYWR2YW50YWdlcyBhcmUgdGhhdCBpdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBzZXR1cA0KKyMgYW5kIGRvZXMgbm90IGhhdmUgbGl2ZSBzZWFyY2hpbmcgY2FwYWJpbGl0aWVzLg0KKw0KK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIExhdGV4IG91dHB1dC4NCisNCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gWUVTDQorDQorIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0NCisNCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlDQorIyBpbnZva2VkLiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZS4NCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yDQorIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUNCisjIE1ha2VmaWxlIHRoYXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgNCisNCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0bw0KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUNCisjIGRlZmF1bHQgY29tbWFuZCBuYW1lLg0KKw0KK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgNCisNCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdA0KKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bw0KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuDQorDQorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PDQorDQorIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZA0KKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBsZXR0ZXIsIGxlZ2FsIGFuZA0KKyMgZXhlY3V0aXZlLiBJZiBsZWZ0IGJsYW5rIGE0d2lkZSB3aWxsIGJlIHVzZWQuDQorDQorUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQ0KKw0KKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBuYW1lcyBvZiBMYVRlWA0KKyMgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4NCisNCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0NCisNCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yDQorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwNCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQ0KKw0KK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSBkb2MvZG94eWdlbi9oZWFkZXIudGV4DQorDQorIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvcg0KKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyDQorIyB0aGUgbGFzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBmb290ZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQ0KKw0KK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQNCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwNCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzDQorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIHBkZiB2aWV3ZXIuDQorDQorUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgcGRmbGF0ZXggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YNCisjIHBsYWluIGxhdGV4IGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGENCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLg0KKw0KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLg0KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcA0KKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLg0KKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLg0KKw0KK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTw0KKw0KKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90DQorIyBpbmNsdWRlIHRoZSBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikNCisjIGluIHRoZSBvdXRwdXQuDQorDQorTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PDQorDQorIyBJZiBMQVRFWF9TT1VSQ0VfQ09ERSBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUNCisjIHNvdXJjZSBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0Lg0KKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncw0KKyMgc3VjaCBhcyBTT1VSQ0VfQlJPV1NFUi4NCisNCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8NCisNCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlDQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gVGhlIGRlZmF1bHQgc3R5bGUgaXMgInBsYWluIi4gU2VlDQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLg0KKw0KK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbg0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dA0KKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aA0KKyMgb3RoZXIgUlRGIHJlYWRlcnMgb3IgZWRpdG9ycy4NCisNCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBydGYnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK1JURl9PVVRQVVQgICAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdA0KKyMgUlRGIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8NCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLg0KKw0KK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkDQorIyB3aWxsIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwNCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLg0KKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgV09SRCBvciBvdGhlcg0KKyMgcHJvZ3JhbXMgd2hpY2ggc3VwcG9ydCB0aG9zZSBmaWVsZHMuDQorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4NCisNCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8NCisNCisjIExvYWQgc3R5bGUgc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MNCisjIGNvbmZpZyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUNCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuDQorDQorUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9DQorDQorIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gcnRmIGRvY3VtZW50Lg0KKyMgU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLg0KKw0KK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBtYW4gcGFnZXMNCisNCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8NCisNCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitNQU5fT1VUUFVUICAgICAgICAgICAgID0NCisNCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0bw0KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQ0KKw0KK01BTl9FWFRFTlNJT04gICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgRG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwNCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkNCisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMNCisjIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dCB0aGVtIHRoZSBtYW4gY29tbWFuZA0KKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uDQorDQorTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mDQorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgWE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBYTUwgcGFnZXMgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbA0KKw0KKyMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIHNjaGVtYSwNCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQ0KKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuDQorDQorWE1MX1NDSEVNQSAgICAgICAgICAgICA9DQorDQorIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELA0KKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlDQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4NCisNCitYTUxfRFREICAgICAgICAgICAgICAgID0NCisNCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZw0KKyMgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0byB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0DQorIyBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgWE1MIG91dHB1dC4NCisNCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhbiBBdXRvR2VuIERlZmluaXRpb25zIChzZWUgYXV0b2dlbi5zZi5uZXQpIGZpbGUNCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsDQorIyBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbA0KKyMgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4NCisNCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mDQorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzDQorIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUNCisjIG1vbWVudC4NCisNCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8NCisNCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQ0KKyMgdGhlIG5lY2Vzc2FyeSBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUNCisjIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuDQorDQorUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlDQorIyBuaWNlbHkgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuDQorIyBUaGlzIGlzIHVzZWZ1bA0KKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLg0KKyMgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMNCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlcg0KKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLg0KKw0KK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMNCisNCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlDQorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLg0KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lDQorIyBNYWtlZmlsZSBkb24ndCBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4NCisNCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBldmFsdWF0ZSBhbGwgQy1wcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgc291cmNlcyBhbmQgaW5jbHVkZQ0KKyMgZmlsZXMuDQorDQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUw0KKw0KKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybw0KKyMgbmFtZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IGNvbmRpdGlvbmFsDQorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZA0KKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4NCisNCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTDQorIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQ0KKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4NCisNCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlIGluY2x1ZGVzIGZpbGVzDQorIyBwb2ludGVkIHRvIGJ5IElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIHdoZW4gYSAjaW5jbHVkZSBpcyBmb3VuZC4NCisNCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTDQorDQorIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkNCisjIHRoZSBwcmVwcm9jZXNzb3IuDQorDQorSU5DTFVERV9QQVRIICAgICAgICAgICA9DQorDQorIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkDQorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlDQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbA0KKyMgYmUgdXNlZC4NCisNCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0NCisNCisjIFRoZSBQUkVERUZJTkVEIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hY3JvIG5hbWVzIHRoYXQNCisjIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZg0KKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQ0KKyMgb3IgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlID0gYXJlDQorIyBvbWl0dGVkID0xIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcNCisjIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3INCisjIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuDQorDQorUFJFREVGSU5FRCAgICAgICAgICAgICA9IE9NUF8zMF9FTkFCTEVEPTEsIE9NUF80MF9FTkFCTEVEPTEsIEtNUF9TVEFUU19FTkFCTEVEPTENCisNCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLg0KKyMgVGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuDQorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQNCisjIG92ZXJydWxlcyB0aGUgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuDQorDQorRVhQQU5EX0FTX0RFRklORUQgICAgICA9DQorDQorIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuDQorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zDQorIyB0aGF0IGFyZSBhbG9uZSBvbiBhIGxpbmUsIGhhdmUgYW4gYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGENCisjIHNlbWljb2xvbiwgYmVjYXVzZSB0aGVzZSB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QgcmVtb3ZlZC4NCisNCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBUQUdGSUxFUyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWdmaWxlcy4gRm9yIGVhY2gNCisjIHRhZyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZQ0KKyMgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6DQorIw0KKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4NCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6DQorIw0KKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLg0KKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzDQorIyBvciBVUkxzLiBOb3RlIHRoYXQgZWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcw0KKyMgTk9UIGluY2x1ZGUgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2gNCisjIGRveHlnZW4gaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4NCisNCitUQUdGSUxFUyAgICAgICAgICAgICAgID0NCisNCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUNCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuDQorDQorR0VORVJBVEVfVEFHRklMRSAgICAgICA9DQorDQorIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkDQorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3Nlcw0KKyMgd2lsbCBiZSBsaXN0ZWQuDQorDQorQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQNCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsDQorIyBiZSBsaXN0ZWQuDQorDQorRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0DQorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuDQorDQorUEVSTF9QQVRIICAgICAgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZQ0KKyMgb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdA0KKyMgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8NCisjIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIHBvd2VyZnVsIGdyYXBocy4NCisNCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTDQorDQorIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYw0KKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlDQorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlDQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQ0KKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4NCisNCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0NCisNCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlDQorIyBpbmhlcml0YW5jZSBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkDQorIyBvciBpcyBub3QgYSBjbGFzcy4NCisNCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTDQorDQorIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMNCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiwgYSBncmFwaCB2aXN1YWxpemF0aW9uDQorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uDQorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKw0KK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcw0KKyMgYWxsb3dlZCB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwNCisjIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0DQorIyBleHBsaWNpdGx5IHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlDQorIyBiZXR3ZWVuIENQVSBsb2FkIGFuZCBwcm9jZXNzaW5nIHNwZWVkLg0KKw0KK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwDQorDQorIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB1c2UgdGhlIEhlbHZldGljYSBmb250IGZvciBhbGwgZG90IGZpbGVzIHRoYXQNCisjIGRveHlnZW4gZ2VuZXJhdGVzLiBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IHlvdSBjYW4gc3BlY2lmeQ0KKyMgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kDQorIyB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcNCisjIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUNCisjIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250Lg0KKw0KK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2ENCisNCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBvZiBkb3QgZ3JhcGhzLg0KKyMgVGhlIGRlZmF1bHQgc2l6ZSBpcyAxMHB0Lg0KKw0KK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMA0KKw0KKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBIZWx2ZXRpY2EgZm9udC4NCisjIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gdXNlIERPVF9GT05UUEFUSCB0bw0KKyMgc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdC4NCisNCitET1RfRk9OVFBBVEggICAgICAgICAgID0NCisNCisjIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQNCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUNCisjIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4NCisNCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQNCisjIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQNCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuDQorDQorQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcw0KKw0KK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kDQorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZw0KKyMgTGFuZ3VhZ2UuDQorDQorVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZQ0KKyMgdGhlIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZQ0KKyMgZ3JhcGggbWF5IGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTDQorIyB0aHJlc2hvbGQgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUNCisjIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUNCisjIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0IGlzIGVuZm9yY2VkLg0KKw0KK1VNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMA0KKw0KKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlDQorIyByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyIGluc3RhbmNlcy4NCisNCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERV9HUkFQSCwgYW5kIEhBVkVfRE9UDQorIyB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZA0KKyMgZmlsZSBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGgNCisjIG90aGVyIGRvY3VtZW50ZWQgZmlsZXMuDQorDQorSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQNCisjIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaA0KKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3INCisjIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGUuDQorDQorSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIENBTExfR1JBUEggYW5kIEhBVkVfRE9UIG9wdGlvbnMgYXJlIHNldCB0byBZRVMgdGhlbg0KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbCBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24NCisjIG9yIGNsYXNzIG1ldGhvZC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZQ0KKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzDQorIyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4NCisNCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBDQUxMRVJfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbg0KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbg0KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlDQorIyB0aGUgdGltZSBvZiBhIHJ1bi4gU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyDQorIyBncmFwaHMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4NCisNCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoaWNhbCBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLg0KKw0KK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMNCisNCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMNCisjIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMNCisjIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZQ0KKyMgcmVsYXRpb25zIGJldHdlZW4gdGhlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4NCisNCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTDQorDQorIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcw0KKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gUG9zc2libGUgdmFsdWVzIGFyZSBzdmcsIHBuZywganBnLCBvciBnaWYuDQorIyBJZiBsZWZ0IGJsYW5rIHBuZyB3aWxsIGJlIHVzZWQuIElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldA0KKyMgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMNCisjIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMgcmVxdWlyZW1lbnQpLg0KKw0KK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcNCisNCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bw0KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuDQorIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuDQorIyBUZXN0ZWQgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuIEZvciBJRSA5KyB5b3UNCisjIG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzDQorIyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4NCisNCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8NCisNCisjIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlDQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLg0KKw0KK0RPVF9QQVRIICAgICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIERPVEZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0DQorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQ0KKyMgXGRvdGZpbGUgY29tbWFuZCkuDQorDQorRE9URklMRV9ESVJTICAgICAgICAgICA9DQorDQorIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlDQorIyBcbXNjZmlsZSBjb21tYW5kKS4NCisNCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0NCisNCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mDQorIyBub2RlcyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGgNCisjIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMNCisjIHZpc3VhbGl6ZWQgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZQ0KKyMgbnVtYmVyIG9mIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbg0KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZQ0KKyMgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4NCisNCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTANCisNCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlDQorIyBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUNCisjIGZyb20gdGhlIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzDQorIyB0aGF0IGxheSBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMNCisjIG9wdGlvbiB0byAxIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UNCisjIGNvZGUgYmFzZXMuIEFsc28gbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQ0KKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLg0KKw0KK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAwDQorDQorIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQNCisjIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdA0KKyMgc2VlbSB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwNCisjIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mDQorIyBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8gcmVhZCkuDQorDQorRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PDQorDQorIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dA0KKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcw0KKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkNCisjIHN1cHBvcnQgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuDQorDQorRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kDQorIyBhcnJvd3MgaW4gdGhlIGRvdCBnZW5lcmF0ZWQgZ3JhcGhzLg0KKw0KK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90IGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUNCisjIHRoZSB2YXJpb3VzIGdyYXBocy4NCisNCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTDQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9oZWFkZXIudGV4IGIvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9oZWFkZXIudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzQwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKQEAgLTAsMCArMSw3NyBAQAorJSBMYXRleCBoZWFkZXIgZm9yIGRveHlnZW4gMS44LjMuMQorXGRvY3VtZW50Y2xhc3N7Ym9va30KK1x1c2VwYWNrYWdlW2E0cGFwZXIsdG9wPTIuNWNtLGJvdHRvbT0yLjVjbSxsZWZ0PTIuNWNtLHJpZ2h0PTIuNWNtXXtnZW9tZXRyeX0KK1x1c2VwYWNrYWdle21ha2VpZHh9CitcdXNlcGFja2FnZXtuYXRiaWJ9CitcdXNlcGFja2FnZXtncmFwaGljeH0KK1x1c2VwYWNrYWdle211bHRpY29sfQorXHVzZXBhY2thZ2V7ZmxvYXR9CitcdXNlcGFja2FnZXtsaXN0aW5nc30KK1x1c2VwYWNrYWdle2NvbG9yfQorXHVzZXBhY2thZ2V7aWZ0aGVufQorXHVzZXBhY2thZ2VbdGFibGVde3hjb2xvcn0KK1x1c2VwYWNrYWdle3RleHRjb21wfQorXHVzZXBhY2thZ2V7YWxsdHR9CitcdXNlcGFja2FnZXtpZnBkZn0KK1xpZnBkZgorXHVzZXBhY2thZ2VbcGRmdGV4LAorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwKKyAgICAgICAgICAgIGNvbG9ybGlua3M9dHJ1ZSwKKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLAorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICAgICBde2h5cGVycmVmfQorXGVsc2UKK1x1c2VwYWNrYWdlW3BzMnBkZiwKKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsCisgICAgICAgICAgICBsaW5rY29sb3I9Ymx1ZSwKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgICAgXXtoeXBlcnJlZn0KK1x1c2VwYWNrYWdle3BzcGljdHVyZX0KK1xmaQorXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9CitcdXNlcGFja2FnZXttYXRocHRteH0KK1x1c2VwYWNrYWdlW3NjYWxlZD0uOTBde2hlbHZldH0KK1x1c2VwYWNrYWdle2NvdXJpZXJ9CitcdXNlcGFja2FnZXtzZWN0c3R5fQorXHVzZXBhY2thZ2V7YW1zc3ltYn0KK1x1c2VwYWNrYWdlW3RpdGxlc117dG9jbG9mdH0KK1x1c2VwYWNrYWdle2RveHlnZW59CitcbHN0c2V0e2xhbmd1YWdlPUMrKyxpbnB1dGVuY29kaW5nPXV0ZjgsYmFzaWNzdHlsZT1cZm9vdG5vdGVzaXplLGJyZWFrbGluZXM9dHJ1ZSxicmVha2F0d2hpdGVzcGFjZT10cnVlLHRhYnNpemU9NCxudW1iZXJzPWxlZnQgfQorXG1ha2VpbmRleAorXHNldGNvdW50ZXJ7dG9jZGVwdGh9ezN9CitccmVuZXdjb21tYW5ke1xmb290cnVsZXdpZHRofXswLjRwdH0KK1xyZW5ld2NvbW1hbmR7XGZhbWlseWRlZmF1bHR9e1xzZmRlZmF1bHR9CitcaGZ1eno9MTVwdAorXHNldGxlbmd0aHtcZW1lcmdlbmN5c3RyZXRjaH17MTVwdH0KK1xoYmFkbmVzcz03NTAKK1x0b2xlcmFuY2U9NzUwCitcYmVnaW57ZG9jdW1lbnR9CitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPWZhbHNlLGNpdGVjb2xvcj1ibHVlfQorXGJlZ2lue3RpdGxlcGFnZX0KK1x2c3BhY2UqezdjbX0KK1xiZWdpbntjZW50ZXJ9Cit7XExhcmdlIExMVk0gT3Blbk1QXHRleHRzdXBlcnNjcmlwdHsqfSBSdW50aW1lIExpYnJhcnkgfVxcCitcdnNwYWNlKnsxY219Cit7XGxhcmdlIEdlbmVyYXRlZCBieSBEb3h5Z2VuICRkb3h5Z2VudmVyc2lvbiB9XFwKK1x2c3BhY2UqezAuNWNtfQore1xzbWFsbCAkZGF0ZXRpbWUgfVxcCitcZW5ke2NlbnRlcn0KK1xlbmR7dGl0bGVwYWdlfQorCit7XGJmIFRyYWRlbWFya3N9CitUaGUgT3Blbk1QIG5hbWUgYW5kIHRoZSBPcGVuTVAgbG9nbyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIHRoZSBPcGVuTVAgQXJjaGl0ZWN0dXJlIFJldmlldyBCb2FyZC4KKworSW50ZWwsIFhlb24sIGFuZCBJbnRlbCBYZW9uIFBoaSBhcmUgdHJhZGVtYXJrcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIgY291bnRyaWVzLgorCitUaGlzIGRvY3VtZW50IGlzIENvcHlyaWdodCBcdGV4dGNvcHlyaWdodH5cdGhlXHllYXIgdGhlIExMVk0gUHJvamVjdC4gSXQgaXMKK3N1YmplY3QgdG8gdGhlIHNhbWUgbGljZW5zZSB0ZXJtcyBhcyB0aGUgTExWTSBPcGVuTVAgcnVudGltZS4KKyAKK1x0ZXh0c3VwZXJzY3JpcHR7Kn0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgorCitcY2xlYXJlbXB0eWRvdWJsZXBhZ2UKK1xwYWdlbnVtYmVyaW5ne3JvbWFufQorXHRhYmxlb2Zjb250ZW50cworXGNsZWFyZW1wdHlkb3VibGVwYWdlCitccGFnZW51bWJlcmluZ3thcmFiaWN9CitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPXRydWUsY2l0ZWNvbG9yPWJsdWV9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaCBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWFlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDMzMyBAQAorLy8gVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGNvZGU7IGl0IGp1c3QgY29udGFpbnMgYWRkaXRpb25hbCB0ZXh0IGFuZCBmb3JtYXR0aW5nDQorLy8gZm9yIGRveHlnZW4uDQorDQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisNCisvKiEgQG1haW5wYWdlIExMVk0mbmJzcDsgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkgSW50ZXJmYWNlDQorQHNlY3Rpb24gc2VjX2ludHJvIEludHJvZHVjdGlvbg0KKw0KK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlDQorTExWTSAmbmJzcDtPcGVuTVBcb3RoZXIgcnVudGltZSBsaWJyYXJ5IHRvIHRoZSBjb21waWxlci4NCitSb3V0aW5lcyB0aGF0IGFyZSBkaXJlY3RseSBjYWxsZWQgYXMgc2ltcGxlIGZ1bmN0aW9ucyBieSB1c2VyIGNvZGUgYXJlDQorbm90IGN1cnJlbnRseSBkZXNjcmliZWQgaGVyZSwgc2luY2UgdGhlaXIgZGVmaW5pdGlvbiBpcyBpbiB0aGUgT3Blbk1QDQorc3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgZnJvbSBodHRwOi8vb3Blbm1wLm9yZw0KKw0KK1RoZSBhaW0gaGVyZSBpcyB0byBleHBsYWluIHRoZSBpbnRlcmZhY2UgZnJvbSB0aGUgY29tcGlsZXIgdG8gdGhlIHJ1bnRpbWUuDQorDQorVGhlIG92ZXJhbGwgZGVzaWduIGlzIGRlc2NyaWJlZCwgYW5kIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGludGVyZmFjZQ0KK2hhcyBpdHMgb3duIGRlc2NyaXB0aW9uLiAoQXQgbGVhc3QsIHRoYXQncyB0aGUgYW1iaXRpb24sIHdlIG1heSBub3QgYmUgdGhlcmUgeWV0KS4NCisNCitAc2VjdGlvbiBzZWNfYnVpbGRpbmcgUXVpY2tseSBCdWlsZGluZyB0aGUgUnVudGltZQ0KK0ZvciB0aGUgaW1wYXRpZW50LCB3ZSBjb3ZlciBidWlsZGluZyB0aGUgcnVudGltZSBhcyB0aGUgZmlyc3QgdG9waWMgaGVyZS4NCisNCitDTWFrZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBPcGVuTVAgcnVudGltZS4gIEZvciBkZXRhaWxzIGFuZCBhIGZ1bGwgbGlzdCBvZiBvcHRpb25zIGZvciB0aGUgQ01ha2UgYnVpbGQgc3lzdGVtLA0KK3NlZSA8dHQ+QnVpbGRfV2l0aF9DTWFrZS50eHQ8L3R0PiBpbnNpZGUgdGhlIDx0dD5ydW50aW1lLzwvdHQ+IHN1YmRpcmVjdG9yeS4gIFRoZXNlDQoraW5zdHJ1Y3Rpb25zIHdpbGwgcHJvdmlkZSB0aGUgbW9zdCB0eXBpY2FsIGJ1aWxkLg0KKw0KK0luLUxMVk0tdHJlZSBidWlsZDouDQorQGNvZGUNCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUNCitDaGVjayBvdXQgb3Blbm1wIGludG8gbGx2bS9wcm9qZWN0cw0KKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQNCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkDQorJCBjbWFrZSBwYXRoL3RvL2xsdm0gLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPg0KKyQgbWFrZSBvbXANCitAZW5kY29kZQ0KK091dC1vZi1MTFZNLXRyZWUgYnVpbGQ6DQorQGNvZGUNCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUNCitDaGVjayBvdXQgb3Blbm1wDQorJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lDQorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZA0KKyQgY21ha2UgcGF0aC90by9vcGVubXAgLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPg0KKyQgbWFrZQ0KK0BlbmRjb2RlDQorDQorQHNlY3Rpb24gc2VjX3N1cHBvcnRlZCBTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zDQorDQorVGhlIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGFyZSBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsJnJlZzsmbmJzcDsgNjQsIGFuZA0KK0ludGVsJnJlZzsmbmJzcDsgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLiAgVGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25zDQorc3VwcG9ydGVkIGFyZSBzaG93biBpbiB0aGUgdGFibGUgYmVsb3cuDQorDQorPHRhYmxlIGJvcmRlcj0xPg0KKzx0cj48dGg+IDx0aD5pY2MvaWNsPHRoPmdjYzx0aD5jbGFuZw0KKzx0cj48dGQ+TGludXhcb3RoZXIgT1M8dGQ+WWVzKDEsNSk8dGQ+WWVzKDIsNCk8dGQ+WWVzKDQsNiw3KQ0KKzx0cj48dGQ+RnJlZUJTRFxvdGhlcjx0ZD5ZZXMoMSw1KTx0ZD5ZZXMoMiw0KTx0ZD5ZZXMoNCw2LDcsOCkNCis8dHI+PHRkPk9TIFhcb3RoZXI8dGQ+WWVzKDEsMyw0KTx0ZD5Obzx0ZD5ZZXMoNCw2LDcpDQorPHRyPjx0ZD5XaW5kb3dzXG90aGVyIE9TPHRkPlllcygxLDQpPHRkPk5vPHRkPk5vDQorPC90YWJsZT4NCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbCZyZWc7Jm5ic3A7IDY0LCBpY2MvaWNsIHZlcnNpb25zIDEyLnggDQorICAgIGFyZSBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLjxicj4NCisoMikgZ2NjIHZlcnNpb24gNC43IGlzIHN1cHBvcnRlZC48YnI+DQorKDMpIEZvciBpY2Mgb24gT1MgWFxvdGhlciwgT1MgWFxvdGhlciB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuPGJyPg0KKyg0KSBJbnRlbCZyZWc7Jm5ic3A7IE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLjxicj4NCisoNSkgT24gSW50ZWwmcmVnOyZuYnNwOyBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUsIGljYy9pY2wgdmVyc2lvbnMgMTMuMCBvciBsYXRlciBhcmUgcmVxdWlyZWQuPGJyPg0KKyg2KSBDbGFuZ1xvdGhlciB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuPGJyPg0KKyg3KSBDbGFuZ1xvdGhlciBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkDQorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZA0KKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nDQorICAgIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZToNCitAY29kZQ0KKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfKg0KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKg0KKyAgICBfX2ttcGNfYXRvbWljXypfZnANCitAZW5kY29kZQ0KKyg4KSBDb21tdW5pdHkgY29udHJpYnV0aW9uIHByb3ZpZGVkIEFTIElTLCBub3QgdGVzdGVkIGJ5IEludGVsLg0KKw0KK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQk0oUikgUG93ZXIgNyBhbmQgUG93ZXIgOA0KKzx0YWJsZSBib3JkZXI9MT4NCis8dHI+PHRoPiA8dGg+Z2NjPHRoPmNsYW5nDQorPHRyPjx0ZD5MaW51eFxvdGhlciBPUzx0ZD5ZZXMoMSwyKTx0ZD5ZZXMoMyw0KQ0KKzwvdGFibGU+DQorKDEpIE9uIFBvd2VyIDcsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC48YnI+DQorKDIpIE9uIFBvd2VyIDgsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC48YnI+DQorKDMpIE9uIFBvd2VyIDcsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC48YnI+DQorKDQpIE9uIFBvd2VyIDgsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC48YnI+DQorDQorQHNlY3Rpb24gc2VjX2Zyb250ZW5kIEZyb250LWVuZCBDb21waWxlcnMgdGhhdCB3b3JrIHdpdGggdGhpcyBSVEwNCisNCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yDQordGhpcyBSVEw6IGljYy9pY2wsIGdjYy4gIENvZGUgZ2VuZXJhdGlvbiBpcyBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwNCitsYXRlciBpbiB0aGlzIGRvY3VtZW50Lg0KKw0KK0BzZWN0aW9uIHNlY19vdXRsaW5pbmcgT3V0bGluaW5nDQorDQorVGhlIHJ1bnRpbWUgaW50ZXJmYWNlIGlzIGJhc2VkIG9uIHRoZSBpZGVhIHRoYXQgdGhlIGNvbXBpbGVyDQorIm91dGxpbmVzIiBzZWN0aW9ucyBvZiBjb2RlIHRoYXQgYXJlIHRvIHJ1biBpbiBwYXJhbGxlbCBpbnRvIHNlcGFyYXRlDQorZnVuY3Rpb25zIHRoYXQgY2FuIHRoZW4gYmUgaW52b2tlZCBpbiBtdWx0aXBsZSB0aHJlYWRzLiAgRm9yIGluc3RhbmNlLA0KK3NpbXBsZSBjb2RlIGxpa2UgdGhpcw0KKw0KK0Bjb2RlDQordm9pZCBmb28oKQ0KK3sNCisjcHJhZ21hIG9tcCBwYXJhbGxlbA0KKyAgICB7DQorICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLg0KKyAgICB9DQorfQ0KK0BlbmRjb2RlDQoraXMgY29udmVydGVkIGludG8gc29tZXRoaW5nIHRoYXQgbG9va3MgY29uY2VwdHVhbGx5IGxpa2UgdGhpcyAod2hlcmUNCit0aGUgbmFtZXMgdXNlZCBhcmUgbWVyZWx5IGlsbHVzdHJhdGl2ZTsgdGhlIHJlYWwgbGlicmFyeSBmdW5jdGlvbg0KK25hbWVzIHdpbGwgYmUgdXNlZCBsYXRlciBhZnRlciB3ZSd2ZSBkaXNjdXNzZWQgc29tZSBtb3JlIGlzc3Vlcy4uLikNCisNCitAY29kZQ0KK3N0YXRpYyB2b2lkIG91dGxpbmVkRm9vQm9keSgpDQorew0KKyAgICAuLi4gZG8gc29tZXRoaW5nIC4uLg0KK30NCisNCit2b2lkIGZvbygpDQorew0KKyAgICBfX09NUF9ydW50aW1lX2Zvcmsob3V0bGluZWRGb29Cb2R5LCAodm9pZCopMCk7ICAgLy8gTm90IHRoZSByZWFsIGZ1bmN0aW9uIG5hbWUhDQorfQ0KK0BlbmRjb2RlDQorDQorQHN1YnNlY3Rpb24gU0VDX1NIQVJFRFZBUlMgQWRkcmVzc2luZyBzaGFyZWQgdmFyaWFibGVzDQorDQorSW4gcmVhbCB1c2VzIG9mIHRoZSBPcGVuTVBcb3RoZXIgQVBJIHRoZXJlIGFyZSBub3JtYWxseSByZWZlcmVuY2VzIA0KK2Zyb20gdGhlIG91dGxpbmVkIGNvZGUgIHRvIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmUgaW4gc2NvcGUgaW4gdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24uIA0KK1RoZXJlZm9yZSB0aGUgY29udGFpbmluZyBmdW5jdGlvbiBtdXN0IGJlIGFibGUgdG8gYWRkcmVzcyANCit0aGVzZSB2YXJpYWJsZXMuIFRoZSBydW50aW1lIHN1cHBvcnRzIHR3byBhbHRlcm5hdGUgd2F5cyBvZiBkb2luZw0KK3RoaXMuDQorDQorQHN1YnN1YnNlY3Rpb24gU0VDX1NFQ19PVCBDdXJyZW50IFRlY2huaXF1ZQ0KK1RoZSB0ZWNobmlxdWUgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgcnVudGltZSBsaWJyYXJ5IGlzIHRvIHJlY2VpdmUNCithIHNlcGFyYXRlIHBvaW50ZXIgdG8gZWFjaCBzaGFyZWQgdmFyaWFibGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZnJvbQ0KK3RoZSBvdXRsaW5lZCBmdW5jdGlvbi4gIFRoaXMgaXMgd2hhdCBpcyBzaG93biBpbiB0aGUgZXhhbXBsZSBiZWxvdy4NCisNCitXZSBob3BlIHNvb24gdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBpbnRlcmZhY2UgdG8gc3VwcG9ydCB0aGUNCithbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uIFRoZQ0KK2FsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIGhhcyBwZXJmb3JtYW5jZSBhZHZhbnRhZ2VzIGZvciBzbWFsbA0KK3BhcmFsbGVsIHJlZ2lvbnMgdGhhdCBoYXZlIG1hbnkgc2hhcmVkIHZhcmlhYmxlcy4NCisNCitAc3Vic3Vic2VjdGlvbiBTRUNfU0VDX1BUIEZ1dHVyZSBUZWNobmlxdWUNCitUaGUgaWRlYSBpcyB0byB0cmVhdCB0aGUgb3V0bGluZWQgZnVuY3Rpb24gYXMgdGhvdWdoIGl0DQord2VyZSBhIGxleGljYWxseSBuZXN0ZWQgZnVuY3Rpb24sIGFuZCBwYXNzIGl0IGEgc2luZ2xlIGFyZ3VtZW50IHdoaWNoDQoraXMgdGhlIHBvaW50ZXIgdG8gdGhlIHBhcmVudCdzIHN0YWNrIGZyYW1lLiBQcm92aWRlZCB0aGF0IHRoZSBjb21waWxlcg0KK2tub3dzIHRoZSBsYXlvdXQgb2YgdGhlIHBhcmVudCBmcmFtZSB3aGVuIGl0IGlzIGdlbmVyYXRpbmcgdGhlIG91dGxpbmVkDQorZnVuY3Rpb24gaXQgY2FuIHRoZW4gYWNjZXNzIHRoZSB1cC1sZXZlbCB2YXJpYWJsZXMgYXQgYXBwcm9wcmlhdGUNCitvZmZzZXRzIGZyb20gdGhlIHBhcmVudCBmcmFtZS4gIFRoaXMgaXMgYSBjbGFzc2ljYWwgY29tcGlsZXIgdGVjaG5pcXVlDQorZnJvbSB0aGUgMTk2MHMgdG8gc3VwcG9ydCBsYW5ndWFnZXMgbGlrZSBBbGdvbCAoYW5kIGl0cyBkZXNjZW5kYW50cykNCit0aGF0IHN1cHBvcnQgbGV4aWNhbGx5IG5lc3RlZCBmdW5jdGlvbnMuDQorDQorVGhlIG1haW4gYmVuZWZpdCBvZiB0aGlzIHRlY2huaXF1ZSBpcyB0aGF0IHRoZXJlIGlzIG5vIGNvZGUgcmVxdWlyZWQNCithdCB0aGUgZm9yayBwb2ludCB0byBtYXJzaGFsIHRoZSBhcmd1bWVudHMgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uLg0KK1NpbmNlIHRoZSBydW50aW1lIGtub3dzIHN0YXRpY2FsbHkgaG93IG1hbnkgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIHRvIHRoZQ0KK291dGxpbmVkIGZ1bmN0aW9uLCBpdCBjYW4gZWFzaWx5IGNvcHkgdGhlbSB0byB0aGUgdGhyZWFkJ3Mgc3RhY2sNCitmcmFtZS4gIFRoZXJlZm9yZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZvcmsgY29kZSBpcyBpbmRlcGVuZGVudCBvZg0KK3RoZSBudW1iZXIgb2Ygc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBhY2Nlc3NlZCBieSB0aGUgb3V0bGluZWQNCitmdW5jdGlvbi4NCisNCitJZiBpdCBpcyBoYXJkIHRvIGRldGVybWluZSB0aGUgc3RhY2sgbGF5b3V0IG9mIHRoZSBwYXJlbnQgd2hpbGUgZ2VuZXJhdGluZyB0aGUNCitvdXRsaW5lZCBjb2RlLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byB1c2UgdGhpcyBhcHByb2FjaCBieSBjb2xsZWN0aW5nIGFsbCBvZg0KK3RoZSB2YXJpYWJsZXMgaW4gdGhlIHBhcmVudCB0aGF0IGFyZSBhY2Nlc3NlZCBmcm9tIG91dGxpbmVkIGZ1bmN0aW9ucyBpbnRvDQorYSBzaW5nbGUgYHN0cnVjdGAgd2hpY2ggaXMgcGxhY2VkIG9uIHRoZSBzdGFjaywgYW5kIHdob3NlIGFkZHJlc3MgaXMgcGFzc2VkDQordG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9ucy4gSW4gdGhpcyB3YXkgdGhlIG9mZnNldHMgb2YgdGhlIHNoYXJlZCB2YXJpYWJsZXMNCithcmUga25vd24gKHNpbmNlIHRoZXkgYXJlIGluc2lkZSB0aGUgc3RydWN0KSB3aXRob3V0IG5lZWRpbmcgdG8ga25vdw0KK3RoZSBjb21wbGV0ZSBsYXlvdXQgb2YgdGhlIHBhcmVudCBzdGFjay1mcmFtZS4gRnJvbSB0aGUgcG9pbnQgb2Ygdmlldw0KK29mIHRoZSBydW50aW1lIGVpdGhlciBvZiB0aGVzZSB0ZWNobmlxdWVzIGlzIGVxdWl2YWxlbnQsIHNpbmNlIGluIGVpdGhlcg0KK2Nhc2UgaXQgb25seSBoYXMgdG8gcGFzcyBhIHNpbmdsZSBhcmd1bWVudCB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24gdG8gYWxsb3cgDQoraXQgdG8gYWNjZXNzIHNoYXJlZCB2YXJpYWJsZXMuDQorDQorQSBzY2hlbWUgbGlrZSB0aGlzIGlzIGhvdyBnY2Ncb3RoZXIgZ2VuZXJhdGVzIG91dGxpbmVkIGZ1bmN0aW9ucy4NCisNCitAc2VjdGlvbiBTRUNfSU5URVJGQUNFUyBMaWJyYXJ5IEludGVyZmFjZXMNCitUaGUgbGlicmFyeSBmdW5jdGlvbnMgdXNlZCBmb3Igc3BlY2lmaWMgcGFydHMgb2YgdGhlIE9wZW5NUFxvdGhlciBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbg0KK2FyZSBkb2N1bWVudGVkIGluIGRpZmZlcmVudCBtb2R1bGVzLg0KKw0KKyAtIEByZWYgQkFTSUNfVFlQRVMgZnVuZGFtZW50YWwgdHlwZXMgdXNlZCBieSB0aGUgcnVudGltZSBpbiBtYW55IHBsYWNlcw0KKyAtIEByZWYgREVQUkVDQVRFRCAgZnVuY3Rpb25zIHRoYXQgYXJlIGluIHRoZSBsaWJyYXJ5IGJ1dCBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkDQorIC0gQHJlZiBTVEFSVFVQX1NIVVRET1dOIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBmaW5hbGl6aW5nIHRoZSBydW50aW1lDQorIC0gQHJlZiBQQVJBTExFTCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBgb21wIHBhcmFsbGVsYA0KKyAtIEByZWYgVEhSRUFEX1NUQVRFUyBmdW5jdGlvbnMgZm9yIHN1cHBvcnRpbmcgdGhyZWFkIHN0YXRlIGlucXVpcmllcw0KKyAtIEByZWYgV09SS19TSEFSSU5HIGZ1bmN0aW9ucyBmb3Igd29yayBzaGFyaW5nIGNvbnN0cnVjdHMgc3VjaCBhcyBgb21wIGZvcmAsIGBvbXAgc2VjdGlvbnNgDQorIC0gQHJlZiBUSFJFQURQUklWQVRFIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHRocmVhZCBwcml2YXRlIGRhdGEsIGNvcHlpbiBldGMNCisgLSBAcmVmIFNZTkNIUk9OSVpBVElPTiBmdW5jdGlvbnMgdG8gc3VwcG9ydCBgb21wIGNyaXRpY2FsYCwgYG9tcCBiYXJyaWVyYCwgYG9tcCBtYXN0ZXJgLCByZWR1Y3Rpb25zIGV0Yw0KKyAtIEByZWYgQVRPTUlDX09QUyBmdW5jdGlvbnMgdG8gc3VwcG9ydCBhdG9taWMgb3BlcmF0aW9ucw0KKyAtIEByZWYgU1RBVFNfR0FUSEVSSU5HIG1hY3JvcyB0byBzdXBwb3J0IGRldmVsb3BlciBwcm9maWxpbmcgb2YgbGlib21wDQorIC0gRG9jdW1lbnRhdGlvbiBvbiB0YXNraW5nIGhhcyBzdGlsbCB0byBiZSB3cml0dGVuLi4uDQorDQorQHNlY3Rpb24gU0VDX0VYQU1QTEVTIEV4YW1wbGVzDQorQHN1YnNlY3Rpb24gU0VDX1dPUktTSEFSSU5HX0VYQU1QTEUgV29yayBTaGFyaW5nIEV4YW1wbGUNCitUaGlzIGV4YW1wbGUgc2hvd3MgdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBhIHBhcmFsbGVsIGZvciB3aXRoIHJlZHVjdGlvbiBhbmQgZHluYW1pYyBzY2hlZHVsaW5nLg0KKw0KK0Bjb2RlDQorZXh0ZXJuIGZsb2F0IGZvbyggdm9pZCApOw0KKw0KK2ludCBtYWluICgpIHsNCisgICAgaW50IGk7IA0KKyAgICBmbG9hdCByID0gMC4wOyANCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMpIHJlZHVjdGlvbigrOnIpIA0KKyAgICBmb3IgKCBpID0gMDsgaSA8IDEwOyBpICsrICkgew0KKyAgICAgICAgciArPSBmb28oKTsgDQorICAgIH0NCit9DQorQGVuZGNvZGUNCisNCitUaGUgdHJhbnNmb3JtZWQgY29kZSBsb29rcyBsaWtlIHRoaXMuDQorQGNvZGUNCitleHRlcm4gZmxvYXQgZm9vKCB2b2lkICk7IA0KKw0KK2ludCBtYWluICgpIHsNCisgICAgc3RhdGljIGludCB6ZXJvID0gMDsgDQorICAgIGF1dG8gaW50IGd0aWQ7IA0KKyAgICBhdXRvIGZsb2F0IHIgPSAwLjA7IA0KKyAgICBfX2ttcGNfYmVnaW4oICYgbG9jMywgMCApOyANCisgICAgLy8gVGhlIGd0aWQgaXMgbm90IGFjdHVhbGx5IHJlcXVpcmVkIGluIHRoaXMgZXhhbXBsZSBzbyBjb3VsZCBiZSBvbWl0dGVkOw0KKyAgICAvLyBXZSBzaG93IGl0cyBpbml0aWFsaXphdGlvbiBoZXJlIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gcmVxdWlyZWQgZm9yIGNhbGxzIGludG8NCisgICAgLy8gdGhlIHJ1bnRpbWUgYW5kIHNob3VsZCBiZSBsb2NhbGx5IGNhY2hlZCBsaWtlIHRoaXMuDQorICAgIGd0aWQgPSBfX2ttcGNfZ2xvYmFsIHRocmVhZCBudW0oICYgbG9jMyApOyANCisgICAgX19rbXBjX2ZvcmsgY2FsbCggJiBsb2M3LCAxLCBtYWluXzdfcGFyYWxsZWxfMywgJiByICk7IA0KKyAgICBfX2ttcGNfZW5kKCAmIGxvYzAgKTsgDQorICAgIHJldHVybiAwOyANCit9DQorDQorc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSB7IGZsb2F0IHJfMTBfcnByOyB9OyANCisNCitzdGF0aWMga21wX2NyaXRpY2FsX25hbWUgbGNrID0geyAwIH07DQorc3RhdGljIGlkZW50X3QgbG9jMTA7IC8vIGxvYzEwLmZsYWdzIHNob3VsZCBjb250YWluIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFIGJpdCBzZXQgDQorICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbXBpbGVyIGhhcyBnZW5lcmF0ZWQgYW4gYXRvbWljIHJlZHVjdGlvbi4NCisNCit2b2lkIG1haW5fN19wYXJhbGxlbF8zKCBpbnQgKmd0aWQsIGludCAqYnRpZCwgZmxvYXQgKnJfN19zaHAgKSB7DQorICAgIGF1dG8gaW50IGlfN19wcjsgDQorICAgIGF1dG8gaW50IGxvd2VyLCB1cHBlciwgbGl0ZXIsIGluY3I7IA0KKyAgICBhdXRvIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgcmVkdWNlOyANCisgICAgcmVkdWNlLnJfMTBfcnByID0gMC5GOyANCisgICAgbGl0ZXIgPSAwOyANCisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCggJiBsb2M3LCpndGlkLCAzNSwgMCwgOSwgMSwgMSApOyANCisgICAgd2hpbGUgKCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCAmIGxvYzcsICpndGlkLCAmIGxpdGVyLCAmIGxvd2VyLCAmIHVwcGVyLCAmIGluY3IgKSApIHsNCisgICAgICAgIGZvciggaV83X3ByID0gbG93ZXI7IHVwcGVyID49IGlfN19wcjsgaV83X3ByICsrICkgDQorICAgICAgICAgIHJlZHVjZS5yXzEwX3JwciArPSBmb28oKTsgDQorICAgIH0NCisgICAgc3dpdGNoKCBfX2ttcGNfcmVkdWNlX25vd2FpdCggJiBsb2MxMCwgKmd0aWQsIDEsIDQsICYgcmVkdWNlLCBtYWluXzEwX3JlZHVjZV81LCAmIGxjayApICkgew0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgKnJfN19zaHAgKz0gcmVkdWNlLnJfMTBfcnByOw0KKyAgICAgICAgICAgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCAmIGxvYzEwLCAqZ3RpZCwgJiBsY2sgKTsNCisgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkKCAmIGxvYzEwLCAqZ3RpZCwgcl83X3NocCwgcmVkdWNlLnJfMTBfcnByICk7DQorICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6Ow0KKyAgICB9DQorfSANCisNCit2b2lkIG1haW5fMTBfcmVkdWNlXzUoIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgKnJlZHVjZV9saHMsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSAqcmVkdWNlX3JocyApIA0KK3sgDQorICAgIHJlZHVjZV9saHMtPnJfMTBfcnByICs9IHJlZHVjZV9yaHMtPnJfMTBfcnByOyANCit9DQorQGVuZGNvZGUNCisNCitAZGVmZ3JvdXAgQkFTSUNfVFlQRVMgQmFzaWMgVHlwZXMNCitUeXBlcyB0aGF0IGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIHJ1bnRpbWUuDQorDQorQGRlZmdyb3VwIERFUFJFQ0FURUQgRGVwcmVjYXRlZCBGdW5jdGlvbnMNCitGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHksIGFuZA0KK3Nob3VsZCBub3QgYmUgdXNlZCBpbiBuZXcgY29kZS4NCisNCitAZGVmZ3JvdXAgU1RBUlRVUF9TSFVURE9XTiBTdGFydHVwIGFuZCBTaHV0ZG93bg0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duLg0KKw0KK0BkZWZncm91cCBQQVJBTExFTCBQYXJhbGxlbCAoZm9yay9qb2luKQ0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIDx0dD5cI3ByYWdtYSBvbXAgcGFyYWxsZWw8L3R0Pi4NCisNCitAZGVmZ3JvdXAgVEhSRUFEX1NUQVRFUyBUaHJlYWQgSW5mb3JtYXRpb24NCitUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZC4NCisNCitAZGVmZ3JvdXAgV09SS19TSEFSSU5HIFdvcmsgU2hhcmluZw0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIA0KKzx0dD5cI3ByYWdtYSBvbXAgZm9yPC90dD4sIDx0dD5cI3ByYWdtYSBvbXAgc2VjdGlvbnM8L3R0PiwgPHR0PlwjcHJhZ21hIG9tcCBzaW5nbGU8L3R0PiBhbmQgDQorPHR0PlwjcHJhZ21hIG9tcCBtYXN0ZXI8L3R0PiBjb25zdHJ1Y3RzLiANCisNCitXaGVuIGhhbmRsaW5nIGxvb3BzLCB0aGVyZSBhcmUgZGlmZmVyZW50IGZ1bmN0aW9ucyBmb3IgZWFjaCBvZiB0aGUgc2lnbmVkIGFuZCB1bnNpZ25lZCAzMiBhbmQgNjQgYml0IGludGVnZXIgdHlwZXMNCit3aGljaCBoYXZlIHRoZSBuYW1lIHN1ZmZpeGVzIGBfNGAsIGBfNHVgLCBgXzhgIGFuZCBgXzh1YC4gVGhlIHNlbWFudGljcyBvZiBlYWNoIG9mIHRoZSBmdW5jdGlvbnMgaXMgdGhlIHNhbWUsDQorc28gdGhleSBhcmUgb25seSBkZXNjcmliZWQgb25jZS4NCisNCitTdGF0aWMgbG9vcCBzY2hlZHVsaW5nIGlzIGhhbmRsZWQgYnkgIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80IGFuZCBmcmllbmRzLiBPbmx5IGEgc2luZ2xlIGNhbGwgaXMgbmVlZGVkLA0KK3NpbmNlIHRoZSBpdGVyYXRpb25zIHRvIGJlIGV4ZWN1dGVkIGJ5IGFueSBnaXZlIHRocmVhZCBjYW4gYmUgZGV0ZXJtaW5lZCBhcyBzb29uIGFzIHRoZSBsb29wIHBhcmFtZXRlcnMgYXJlIGtub3duLg0KKw0KK0R5bmFtaWMgc2NoZWR1bGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBAcmVmIF9fa21wY19kaXNwYXRjaF9pbml0XzQgYW5kIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNCBmdW5jdGlvbnMuIA0KK1RoZSBpbml0IGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGluIGVhY2ggdGhyZWFkIG91dHNpZGUgdGhlIGxvb3AsIHdoaWxlIHRoZSBuZXh0IGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoDQordGltZSB0aGF0IHRoZSBwcmV2aW91cyBjaHVuayBvZiB3b3JrIGhhcyBiZWVuIGV4aGF1c3RlZC4gDQorDQorQGRlZmdyb3VwIFNZTkNIUk9OSVpBVElPTiBTeW5jaHJvbml6YXRpb24NCitUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGltcGxlbWVudGluZyBiYXJyaWVycy4NCisNCitAZGVmZ3JvdXAgVEhSRUFEUFJJVkFURSBUaHJlYWQgcHJpdmF0ZSBkYXRhIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCBjb3B5aW4vb3V0IGFuZCB0aHJlYWQgcHJpdmF0ZSBkYXRhLg0KKw0KK0BkZWZncm91cCBTVEFUU19HQVRIRVJJTkcgU3RhdGlzdGljcyBHYXRoZXJpbmcgZnJvbSBPTVBUQg0KK1RoZXNlIG1hY3JvcyBzdXBwb3J0IHByb2ZpbGluZyB0aGUgbGlib21wIGxpYnJhcnkuICBVc2UgLS1zdGF0cz1vbiB3aGVuIGJ1aWxkaW5nIHdpdGggYnVpbGQucGwgdG8gZW5hYmxlDQorYW5kIHRoZW4gdXNlIHRoZSBLTVBfKiBtYWNyb3MgdG8gcHJvZmlsZSAodGhyb3VnaCBjb3VudHMgb3IgY2xvY2sgdGlja3MpIGxpYm9tcCBkdXJpbmcgZXhlY3V0aW9uIG9mIGFuIE9wZW5NUCBwcm9ncmFtLg0KKw0KK0BzZWN0aW9uIHNlY19zdGF0c19lbnZfdmFycyBFbnZpcm9ubWVudCBWYXJpYWJsZXMNCisNCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsZXZhbnQgdG8gc3RhdHMtZ2F0aGVyaW5nIGluIGxpYm9tcA0KKw0KK0Bjb2RlDQorS01QX1NUQVRTX0ZJTEUNCitAZW5kY29kZQ0KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIGFuIG91dHB1dCBmaWxlbmFtZSB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgKk5PVCBPVkVSV1JJVFRFTiogaWYgaXQgZXhpc3RzLiAgSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZSBzdGF0aXN0aWNzIHdpbGwgYmUgb3V0cHV0IHRvIHN0ZGVycg0KKw0KK0Bjb2RlDQorS01QX1NUQVRTX1RIUkVBRFMNCitAZW5kY29kZQ0KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaW5kaWNhdGVzIHRvIHByaW50IHRocmVhZC1zcGVjaWZpYyBzdGF0aXN0aWNzIGFzIHdlbGwgYXMgYWdncmVnYXRlIHN0YXRpc3RpY3MuICBFYWNoIHRocmVhZCdzIHN0YXRpc3RpY3Mgd2lsbCBiZSBzaG93biBhcyB3ZWxsIGFzIHRoZSBjb2xsZWN0aXZlIHN1bSBvZiBhbGwgdGhyZWFkcy4gIFRoZSB2YWx1ZXMgInRydWUiLCAib24iLCAiMSIsICJ5ZXMiIHdpbGwgYWxsIGluZGljYXRlIHRvIHByaW50IHBlciB0aHJlYWQgc3RhdGlzdGljcy4NCisNCitAZGVmZ3JvdXAgVEFTS0lORyBUYXNraW5nIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCB0YXNraW5nIGNvbnN0cnVjdHMuDQorDQorQGRlZmdyb3VwIFVTRVIgVXNlciB2aXNpYmxlIGZ1bmN0aW9ucw0KK1RoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSB1c2VyLCBidXQgYXJlIHJ1bnRpbWUgbGlicmFyeSBzcGVjaWZpYywgcmF0aGVyIHRoYW4gYmVpbmcgT3Blbk1QIGludGVyZmFjZXMuDQorDQorKi8NCisNCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZWU1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMyMyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIENvbmZpZ3VyZSBvbXAuaCwga21wX2NvbmZpZy5oIGFuZCBvbXB0LmggaWYgbmVjZXNzYXJ5Citjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXAuaC52YXIgb21wLmggQE9OTFkpCitjb25maWd1cmVfZmlsZShrbXBfY29uZmlnLmguY21ha2Uga21wX2NvbmZpZy5oIEBPTkxZKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgY29uZmlndXJlX2ZpbGUoJHtMSUJPTVBfSU5DX0RJUn0vb21wdC5oLnZhciBvbXB0LmggQE9OTFkpCitlbmRpZigpCisKKyMgR2VuZXJhdGUgbWVzc2FnZSBjYXRhbG9nIGZpbGVzOiBrbXBfaTE4bl9pZC5pbmMgYW5kIGttcF9pMThuX2RlZmF1bHQuaW5jCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAga21wX2kxOG5faWQuaW5jCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLWFyY2g9JHtMSUJPTVBfQVJDSH0gLS1wcmVmaXg9a21wX2kxOG4gLS1lbnVtPWttcF9pMThuX2lkLmluYyAke0xJQk9NUF9TUkNfRElSfS9pMThuL2VuX1VTLnR4dAorICBERVBFTkRTICR7TElCT01QX1NSQ19ESVJ9L2kxOG4vZW5fVVMudHh0ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwKKykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICBrbXBfaTE4bl9kZWZhdWx0LmluYworICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke0xJQk9NUF9UT09MU19ESVJ9L21lc3NhZ2UtY29udmVydGVyLnBsIC0tb3M9JHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9CisgICAgLS1hcmNoPSR7TElCT01QX0FSQ0h9IC0tcHJlZml4PWttcF9pMThuIC0tZGVmYXVsdD1rbXBfaTE4bl9kZWZhdWx0LmluYyAke0xJQk9NUF9TUkNfRElSfS9pMThuL2VuX1VTLnR4dAorICBERVBFTkRTICR7TElCT01QX1NSQ19ESVJ9L2kxOG4vZW5fVVMudHh0ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwKKykKKworIyBTZXQgdGhlIC1EIGRlZmluaXRpb25zIGZvciBhbGwgc291cmNlcworbGlib21wX2dldF9kZWZpbml0aW9uc19mbGFncyhMSUJPTVBfQ09ORklHVVJFRF9ERUZJTklUSU9OU19GTEFHUykKK2FkZF9kZWZpbml0aW9ucygke0xJQk9NUF9DT05GSUdVUkVEX0RFRklOSVRJT05TX0ZMQUdTfSkKKworIyBTZXQgdGhlIC1JIGluY2x1ZGVzIGZvciBhbGwgc291cmNlcworaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICR7TElCT01QX1NSQ19ESVJ9CisgICR7TElCT01QX1NSQ19ESVJ9L2kxOG4KKyAgJHtMSUJPTVBfSU5DX0RJUn0KKyAgJHtMSUJPTVBfU1JDX0RJUn0vdGhpcmRwYXJ0eS9pdHRub3RpZnkKKykKK2lmKCR7TElCT01QX1VTRV9IV0xPQ30pCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVJ9L2luY2x1ZGUpCitlbmRpZigpCisKKyMgR2V0dGluZyBjb3JyZWN0IHNvdXJjZSBmaWxlcyB0byBidWlsZCBsaWJyYXJ5CitzZXQoTElCT01QX0NGSUxFUykKK3NldChMSUJPTVBfQ1hYRklMRVMpCitzZXQoTElCT01QX0FTTUZJTEVTKQoraWYoJHtTVFVCU19MSUJSQVJZfSkKKyAgc2V0KExJQk9NUF9DRklMRVMga21wX3N0dWIuYykKK2Vsc2UoKQorICAjIEdldCBDIGZpbGVzCisgIHNldChMSUJPTVBfQ0ZJTEVTCisgICAga21wX2FsbG9jLmMKKyAgICBrbXBfYXRvbWljLmMKKyAgICBrbXBfY3N1cHBvcnQuYworICAgIGttcF9kZWJ1Zy5jCisgICAga21wX2l0dC5jCisgICAga21wX2Vudmlyb25tZW50LmMKKyAgICBrbXBfZXJyb3IuYworICAgIGttcF9nbG9iYWwuYworICAgIGttcF9pMThuLmMKKyAgICBrbXBfaW8uYworICAgIGttcF9ydW50aW1lLmMKKyAgICBrbXBfc2V0dGluZ3MuYworICAgIGttcF9zdHIuYworICAgIGttcF90YXNraW5nLmMKKyAgICBrbXBfdGFza3EuYworICAgIGttcF90aHJlYWRwcml2YXRlLmMKKyAgICBrbXBfdXRpbGl0eS5jCisgICkKKyAgaWYoV0lOMzIpCisgICAgIyBXaW5kb3dzIHNwZWNpZmljIGZpbGVzCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIHpfV2luZG93c19OVF91dGlsLmMpCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIHpfV2luZG93c19OVC01ODZfdXRpbC5jKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0FTTUZJTEVTIHpfV2luZG93c19OVC01ODZfYXNtLmFzbSkgIyBXaW5kb3dzIGFzc2VtYmx5IGZpbGUKKyAgZWxzZSgpCisgICAgIyBVbml4IHNwZWNpZmljIGZpbGVzCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIHpfTGludXhfdXRpbC5jKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyBrbXBfZ3N1cHBvcnQuYykKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9BU01GSUxFUyB6X0xpbnV4X2FzbS5zKSAjIFVuaXggYXNzZW1ibHkgZmlsZQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyB0aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMgTElCT01QX1VTRV9JVFRfTk9USUZZKQorICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMga21wX2RlYnVnZ2VyLmMgTElCT01QX1VTRV9ERUJVR0dFUikKKyAgIyBHZXQgQysrIGZpbGVzCisgIHNldChMSUJPTVBfQ1hYRklMRVMKKyAgICBrbXBfYmFycmllci5jcHAKKyAgICBrbXBfd2FpdF9yZWxlYXNlLmNwcAorICAgIGttcF9hZmZpbml0eS5jcHAKKyAgICBrbXBfZGlzcGF0Y2guY3BwCisgICAga21wX2xvY2suY3BwCisgICAga21wX3NjaGVkLmNwcAorICApCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9zdGF0cy5jcHAgTElCT01QX1NUQVRTKQorICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBrbXBfc3RhdHNfdGltaW5nLmNwcCBMSUJPTVBfU1RBVFMpCisgIGlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDQwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCA0MCkKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBrbXBfdGFza2RlcHMuY3BwKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9jYW5jZWwuY3BwKQorICBlbmRpZigpCitlbmRpZigpCisjIEZpbGVzIGNvbW1vbiB0byBzdHVicyBhbmQgbm9ybWFsIGxpYnJhcnkKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyBrbXBfZnRuX2NkZWNsLmMpCitsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMga21wX2Z0bl9leHRyYS5jKQorbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIGttcF92ZXJzaW9uLmMpCitsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMgb21wdC1nZW5lcmFsLmMgSUZfVFJVRSBMSUJPTVBfT01QVF9TVVBQT1JUKQorCitzZXQoTElCT01QX1NPVVJDRV9GSUxFUyAke0xJQk9NUF9DRklMRVN9ICR7TElCT01QX0NYWEZJTEVTfSAke0xJQk9NUF9BU01GSUxFU30pCisjIEZvciBXaW5kb3dzLCB0aGVyZSBpcyBhIHJlc291cmNlIGZpbGUgKC5yYyAtPiAucmVzKSB0aGF0IGlzIGFsc28gY29tcGlsZWQKK2xpYm9tcF9hcHBlbmQoTElCT01QX1NPVVJDRV9GSUxFUyBsaWJvbXAucmMgV0lOMzIpCisKKyMgR2V0IGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgZmxhZ3MKK2xpYm9tcF9nZXRfY2ZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0NGTEFHUykKK2xpYm9tcF9nZXRfY3h4ZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfQ1hYRkxBR1MpCitsaWJvbXBfZ2V0X2FzbWZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0FTTUZMQUdTKQorIyBTZXQgdGhlIGNvbXBpbGVyIGZsYWdzIGZvciBlYWNoIHR5cGUgb2Ygc291cmNlCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfQ0ZJTEVTfSBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfQ0ZMQUdTfSIpCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfQ1hYRklMRVN9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtMSUJPTVBfQ09ORklHVVJFRF9DWFhGTEFHU30iKQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7TElCT01QX0FTTUZJTEVTfSBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfQVNNRkxBR1N9IikKKyMgTGV0IHRoZSBjb21waWxlciBoYW5kbGUgdGhlIGFzc2VtYmx5IGZpbGVzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zCitpZihOT1QgV0lOMzIpCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9BU01GSUxFU30gUFJPUEVSVElFUyBMQU5HVUFHRSBDKQorZW5kaWYoKQorCisjIFJlbW92ZSBhbnkgY21ha2UtYXV0b21hdGljIGxpbmtpbmcgb2YgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5LgorIyBXZSBuZWl0aGVyIG5lZWQgKG5vciB3YW50KSB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkgZGVwZW5kZW5jeSBldmVuIHRob3VnaCB3ZSBjb21waWxlIGMrKyBmaWxlcy4KK2lmKE5PVCAke0xJQk9NUF9VU0VfU1REQ1BQTElCfSkKKyAgc2V0KExJQk9NUF9MSU5LRVJfTEFOR1VBR0UgQykKKyAgc2V0KENNQUtFX0NYWF9JTVBMSUNJVF9MSU5LX0xJQlJBUklFUykKK2Vsc2UoKQorICBzZXQoTElCT01QX0xJTktFUl9MQU5HVUFHRSBDWFgpCitlbmRpZigpCisKKyMgQWRkIHRoZSBPcGVuTVAgbGlicmFyeQorbGlib21wX2dldF9sZGZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0xERkxBR1MpCithZGRfbGlicmFyeShvbXAgU0hBUkVEICR7TElCT01QX1NPVVJDRV9GSUxFU30pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMob21wIFBST1BFUlRJRVMKKyAgUFJFRklYICIiIFNVRkZJWCAiIiBPVVRQVVRfTkFNRSAiJHtMSUJPTVBfTElCX0ZJTEV9IgorICBMSU5LX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0xERkxBR1N9IgorICBMSU5LRVJfTEFOR1VBR0UgJHtMSUJPTVBfTElOS0VSX0xBTkdVQUdFfQorKQorCisjIEdldCB0aGUgbGlicmFyeSdzIGxvY2F0aW9uIHdpdGhpbiB0aGUgYnVpbGQgdHJlZSBmb3IgdGhlIHVuaXQgdGVzdGVyCitpZihOT1QgV0lOMzIpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QX0xJQlJBUllfRElSIG9tcCBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCitlbHNlKCkKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfTElCUkFSWV9ESVIgb21wIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSkKK2VuZGlmKCkKK2lmKE5PVCBMSUJPTVBfTElCUkFSWV9ESVIpCisgIHNldChMSUJPTVBfTElCUkFSWV9ESVIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorICBzZXQoTElCT01QX0xJQlJBUllfRElSICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSBQQVJFTlRfU0NPUEUpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9MSUJSQVJZX0RJUiAke0xJQk9NUF9MSUJSQVJZX0RJUn0gUEFSRU5UX1NDT1BFKQorZW5kaWYoKQorCisjIEFkZCBzeW1ib2xpYyBsaW5rcyB0byBsaWJvbXAKK2lmKE5PVCBXSU4zMikKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjcmVhdGVfc3ltbGluayAke0xJQk9NUF9MSUJfRklMRX0KKyAgICAgIGxpYmdvbXAke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgJHtMSUJPTVBfTElCX0ZJTEV9CisgICAgICBsaWJpb21wNSR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfQorICAgIFdPUktJTkdfRElSRUNUT1JZICR7TElCT01QX0xJQlJBUllfRElSfQorICApCitlbmRpZigpCisKKyMgTGlua2luZyBjb21tYW5kIHdpbGwgaW5jbHVkZSBsaWJyYXJpZXMgaW4gTElCT01QX0NPTkZJR1VSRURfTElCRkxBR1MKK2xpYm9tcF9nZXRfbGliZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfTElCRkxBR1MpCit0YXJnZXRfbGlua19saWJyYXJpZXMob21wICR7TElCT01QX0NPTkZJR1VSRURfTElCRkxBR1N9ICR7Q01BS0VfRExfTElCU30pCisKKyMgQ3JlYXRlICouaW5jIGJlZm9yZSBjb21waWxpbmcgYW55IHNvdXJjZXMKKyMgb2JqZWN0cyBkZXBlbmQgb24gOiAuaW5jIGZpbGVzCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtbmVlZGVkLWhlYWRlcnMgREVQRU5EUyBrbXBfaTE4bl9pZC5pbmMga21wX2kxOG5fZGVmYXVsdC5pbmMpCithZGRfZGVwZW5kZW5jaWVzKG9tcCBsaWJvbXAtbmVlZGVkLWhlYWRlcnMpCisKKyMgV2luZG93cyBzcGVjaWZpYyBidWlsZCBydWxlcworaWYoV0lOMzIpCisgIGNvbmZpZ3VyZV9maWxlKGxpYm9tcC5yYy52YXIgbGlib21wLnJjIEBPTkxZKQorCisgICMgQ3JlYXRlIC5kZWYgYW5kIC5yYyBmaWxlIGJlZm9yZSBjb21waWxpbmcgYW55IHNvdXJjZXMKKyAgYWRkX2N1c3RvbV90YXJnZXQobGlib21wLW5lZWRlZC13aW5kb3dzLWZpbGVzIERFUEVORFMgJHtMSUJPTVBfTElCX05BTUV9LmRlZikKKyAgYWRkX2RlcGVuZGVuY2llcyhvbXAgbGlib21wLW5lZWRlZC13aW5kb3dzLWZpbGVzKQorICAjIHpfV2luZG93c19OVC01ODZfYXNtLmFzbSByZXF1aXJlcyBkZWZpbml0aW9ucyB0byBiZSBzZW50IHZpYSBjb21tYW5kIGxpbmUKKyAgIyBJdCBvbmx5IG5lZWRzIHRoZSBhcmNoaXRlY3V0cmUgbWFjcm8gYW5kIE9NUFRfU1VQUE9SVD0wfDEKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfTUFTTV9ERUZJTklUSU9OUyAiLURfTV9JQTMyIiBJRl9UUlVFIElBMzIpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX01BU01fREVGSU5JVElPTlMgIi1EX01fQU1ENjQiIElGX1RSVUUgSU5URUw2NCkKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfTUFTTV9ERUZJTklUSU9OUyAiLURPTVBUX1NVUFBPUlQiIElGX1RSVUVfMV8wIExJQk9NUF9PTVBUX1NVUFBPUlQpCisgIGxpYm9tcF9saXN0X3RvX3N0cmluZygiJHtMSUJPTVBfTUFTTV9ERUZJTklUSU9OU30iIExJQk9NUF9NQVNNX0RFRklOSVRJT05TKQorICBzZXRfcHJvcGVydHkoU09VUkNFIHpfV2luZG93c19OVC01ODZfYXNtLmFzbSBBUFBFTkRfU1RSSU5HIFBST1BFUlRZIENPTVBJTEVfRkxBR1MgIiAke0xJQk9NUF9NQVNNX0RFRklOSVRJT05TfSIpCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyh0aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICJVTklDT0RFIikKKworICAjIENyZWF0ZSBXaW5kb3dzIGltcG9ydCBsaWJyYXJ5CisgICMgdGhlIGltcG9ydCBsaWJyYXJ5IGlzICJyZS1saW5rZWQiIHRvIGluY2x1ZGUga21wX2ltcG9ydC5jIHdoaWNoIHByZXZlbnRzCisgICMgbGlua2luZyBvZiBib3RoIFZpc3VhbCBTdHVkaW8gT3Blbk1QIGFuZCBuZXdseSBidWlsdCBPcGVuTVAKKyAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKGttcF9pbXBvcnQuYyBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfQ0ZMQUdTfSIpCisgIHNldChMSUJPTVBfSU1QX0xJQl9GSUxFICR7TElCT01QX0xJQl9OQU1FfSR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfSkKKyAgc2V0KExJQk9NUF9HRU5FUkFURURfSU1QX0xJQl9GSUxFTkFNRSAke0xJQk9NUF9MSUJfRklMRX0ke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0pCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhvbXAgUFJPUEVSVElFUworICAgIFZFUlNJT04gJHtMSUJPTVBfVkVSU0lPTl9NQUpPUn0uJHtMSUJPTVBfVkVSU0lPTl9NSU5PUn0gIyB1c2VzIC92ZXJzaW9uIGZsYWcKKyAgICBJTVBPUlRfUFJFRklYICIiIElNUE9SVF9TVUZGSVggIiIgIyBjb250cm9sIGdlbmVyYXRlZCBpbXBvcnQgbGlicmFyeSBuYW1lIHdoZW4gYnVpbGRpbmcgb21wCisgICAgQVJDSElWRV9PVVRQVVRfTkFNRSAke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQl9GSUxFTkFNRX0KKyAgKQorICAjIEdldCBnZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkgZnJvbSBjcmVhdGluZyBvbXAKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfSU1QT1JUX0xJQl9ESVJFQ1RPUlkgb21wIEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSkKKyAgaWYoTElCT01QX0lNUE9SVF9MSUJfRElSRUNUT1JZKQorICAgIHNldChMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUIgJHtMSUJPTVBfSU1QT1JUX0xJQl9ESVJFQ1RPUll9LyR7TElCT01QX0dFTkVSQVRFRF9JTVBfTElCX0ZJTEVOQU1FfSkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9HRU5FUkFURURfSU1QX0xJQiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJfRklMRU5BTUV9KQorICBlbmRpZigpCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQn0gUFJPUEVSVElFUyBHRU5FUkFURUQgVFJVRSBFWFRFUk5BTF9PQkpFQ1QgVFJVRSkKKyAgIyBDcmVhdGUgbmV3IGltcG9ydCBsaWJyYXJ5IHRoYXQgaXMganVzdCB0aGUgcHJldmlvdXNseSBjcmVhdGVkIG9uZSArIGttcF9pbXBvcnQuYworICBhZGRfbGlicmFyeShvbXBpbXAgU1RBVElDICR7TElCT01QX0dFTkVSQVRFRF9JTVBfTElCfSBrbXBfaW1wb3J0LmMpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhvbXBpbXAgUFJPUEVSVElFUworICAgIFBSRUZJWCAiIiBTVUZGSVggIiIgT1VUUFVUX05BTUUgIiR7TElCT01QX0lNUF9MSUJfRklMRX0iCisgICAgTElOS0VSX0xBTkdVQUdFIEMKKyAgKQorICBhZGRfZGVwZW5kZW5jaWVzKG9tcGltcCBvbXApICMgZW5zdXJlIGdlbmVyYXRlZCBpbXBvcnQgbGlicmFyeSBpcyBjcmVhdGVkIGZpcnN0CisKKyAgIyBDcmVhdGUgZGVmIGZpbGUgdG8gZGVzaWduYXRlIGV4cG9ydGVkIGZ1bmN0aW9ucworICBsaWJvbXBfZ2V0X2dkZmxhZ3MoTElCT01QX0dERkxBR1MpICMgZ2VuZXJhdGUtZGVmLnBsIGZsYWdzIChXaW5kb3dzIG9ubHkpCisgIGxpYm9tcF9zdHJpbmdfdG9fbGlzdCgiJHtMSUJPTVBfR0RGTEFHU30iIExJQk9NUF9HREZMQUdTKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICAke0xJQk9NUF9MSUJfTkFNRX0uZGVmCisgICAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9nZW5lcmF0ZS1kZWYucGwgJHtMSUJPTVBfR0RGTEFHU30KKyAgICAgIC1vICR7TElCT01QX0xJQl9OQU1FfS5kZWYgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2RsbGV4cG9ydHMKKyAgICBERVBFTkRTICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kbGxleHBvcnRzICR7TElCT01QX1RPT0xTX0RJUn0vZ2VuZXJhdGUtZGVmLnBsCisgICkKK2VuZGlmKCkKKworIyBCdWlsZGluZyB0aGUgRm9ydHJhbiBtb2R1bGUgZmlsZXMKKyMgT25lIGNvbXBpbGF0aW9uIHN0ZXAgY3JlYXRlcyBib3RoIG9tcF9saWIubW9kIGFuZCBvbXBfbGliX2tpbmRzLm1vZAoraWYoJHtMSUJPTVBfRk9SVFJBTl9NT0RVTEVTfSkKKyAgY29uZmlndXJlX2ZpbGUoJHtMSUJPTVBfSU5DX0RJUn0vb21wX2xpYi5oLnZhciBvbXBfbGliLmggQE9OTFkpCisgIGNvbmZpZ3VyZV9maWxlKCR7TElCT01QX0lOQ19ESVJ9L29tcF9saWIuZi52YXIgb21wX2xpYi5mIEBPTkxZKQorICBjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXBfbGliLmY5MC52YXIgb21wX2xpYi5mOTAgQE9OTFkpCisgIGFkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC1tb2QgQUxMIERFUEVORFMgb21wX2xpYi5tb2Qgb21wX2xpYl9raW5kcy5tb2QpCisgIGxpYm9tcF9nZXRfZmZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0ZGTEFHUykKKyAgaWYoQ01BS0VfRm9ydHJhbl9DT01QSUxFUl9TVVBQT1JUU19GOTApCisgICAgc2V0KExJQk9NUF9GT1JUUkFOX1NPVVJDRV9GSUxFIG9tcF9saWIuZjkwKQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0ZPUlRSQU5fU09VUkNFX0ZJTEUgb21wX2xpYi5mKQorICBlbmRpZigpCisgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICBPVVRQVVQgb21wX2xpYi5tb2Qgb21wX2xpYl9raW5kcy5tb2QKKyAgICBDT01NQU5EICR7Q01BS0VfRm9ydHJhbl9DT01QSUxFUn0gLWMgJHtMSUJPTVBfQ09ORklHVVJFRF9GRkxBR1N9ICR7TElCT01QX0ZPUlRSQU5fU09VUkNFX0ZJTEV9CisgICAgREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtMSUJPTVBfRk9SVFJBTl9TT1VSQ0VfRklMRX0KKyAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXBfbGliLmgKKyAgKQorICBzZXRfZGlyZWN0b3J5X3Byb3BlcnRpZXMoUFJPUEVSVElFUyBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMgb21wX2xpYiR7Q01BS0VfQ19PVVRQVVRfRVhURU5TSU9OfSkKK2VuZGlmKCkKKworIyBNb3ZlIGZpbGVzIHRvIGV4cG9ydHMvIGRpcmVjdG9yeSBpZiByZXF1ZXN0ZWQKK2lmKCR7TElCT01QX0NPUFlfRVhQT1JUU30pCisgIGluY2x1ZGUoTGlib21wRXhwb3J0cykKK2VuZGlmKCkKKworIyBNaWNybyB0ZXN0IHJ1bGVzIGZvciBhZnRlciBsaWJyYXJ5IGhhcyBiZWVuIGJ1aWx0IChjbWFrZS9MaWJvbXBNaWNyb1Rlc3RzLmNtYWtlKQoraW5jbHVkZShMaWJvbXBNaWNyb1Rlc3RzKQorYWRkX2N1c3RvbV90YXJnZXQobGlib21wLW1pY3JvLXRlc3RzKQoraWYoTk9UICR7TUlDfSBBTkQgTk9UIENNQUtFX0NST1NTQ09NUElMSU5HKQorICBhZGRfZGVwZW5kZW5jaWVzKGxpYm9tcC1taWNyby10ZXN0cyBsaWJvbXAtdGVzdC10b3VjaCkKK2VuZGlmKCkKK2lmKE5PVCBXSU4zMiBBTkQgTk9UIEFQUExFKQorICBhZGRfZGVwZW5kZW5jaWVzKGxpYm9tcC1taWNyby10ZXN0cyBsaWJvbXAtdGVzdC1yZWxvKQorZW5kaWYoKQoraWYoTk9UIFdJTjMyIEFORCBOT1QgQVBQTEUpCisgIGFkZF9kZXBlbmRlbmNpZXMobGlib21wLW1pY3JvLXRlc3RzIGxpYm9tcC10ZXN0LWV4ZWNzdGFjaykKK2VuZGlmKCkKK2lmKCR7TUlDfSkKKyAgYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtaW5zdHIpCitlbmRpZigpCithZGRfZGVwZW5kZW5jaWVzKGxpYm9tcC1taWNyby10ZXN0cyBsaWJvbXAtdGVzdC1kZXBzKQorCisjIEluc3RhbGwgcnVsZXMKKyMgV2Ugd2FudCB0byBpbnN0YWxsIGxpYm9tcCBpbiBERVNURElSL0NNQUtFX0lOU1RBTExfUFJFRklYL2xpYgorIyBXZSB3YW50IHRvIGluc3RhbGwgaGVhZGVycyBpbiBERVNURElSL0NNQUtFX0lOU1RBTExfUFJFRklYL2luY2x1ZGUKK2lmKCR7TElCT01QX1NUQU5EQUxPTkVfQlVJTER9KQorICBzZXQoTElCT01QX0hFQURFUlNfSU5TVEFMTF9QQVRIIGluY2x1ZGUpCitlbHNlKCkKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJbMC05XStcXC5bMC05XSsoXFwuWzAtOV0rKT8iIENMQU5HX1ZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059KQorICBzZXQoTElCT01QX0hFQURFUlNfSU5TVEFMTF9QQVRIIGxpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9L2NsYW5nLyR7Q0xBTkdfVkVSU0lPTn0vaW5jbHVkZSkKK2VuZGlmKCkKK2lmKFdJTjMyKQorICBpbnN0YWxsKFRBUkdFVFMgb21wIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQorICBpbnN0YWxsKFRBUkdFVFMgb21waW1wIEFSQ0hJVkUgREVTVElOQVRJT04gbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pCisgICMgQ3JlYXRlIGFsaWFzZXMgKHJlZ3VsYXIgY29waWVzKSBvZiB0aGUgbGlicmFyeSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgc2V0KExJQk9NUF9BTElBU0VTICJsaWJpb21wNW1kIikKKyAgZm9yZWFjaChhbGlhcyBJTiBMSVNUUyBMSUJPTVBfQUxJQVNFUykKKyAgICBpbnN0YWxsKENPREUgImV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EIFwiXCR7Q01BS0VfQ09NTUFORH1cIiAtRSBjb3B5IFwiJHtMSUJPTVBfTElCX0ZJTEV9XCIKKyAgICAgIFwiJHthbGlhc30ke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH1cIiBXT1JLSU5HX0RJUkVDVE9SWSBcJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vYmluKSIpCisgICAgaW5zdGFsbChDT0RFICJleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBcIlwke0NNQUtFX0NPTU1BTkR9XCIgLUUgY29weSBcIiR7TElCT01QX0lNUF9MSUJfRklMRX1cIgorICAgICAgXCIke2FsaWFzfSR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfVwiIFdPUktJTkdfRElSRUNUT1JZIFwke0NNQUtFX0lOU1RBTExfUFJFRklYfS9saWIke0xJQk9NUF9MSUJESVJfU1VGRklYfSkiKQorICBlbmRmb3JlYWNoKCkKK2Vsc2UoKQorICBpbnN0YWxsKFRBUkdFVFMgb21wIExJQlJBUlkgREVTVElOQVRJT04gbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pCisgICMgQ3JlYXRlIGFsaWFzZXMgKHN5bWxpbmtzKSBvZiB0aGUgbGlicmFyeSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgc2V0KExJQk9NUF9BTElBU0VTICJsaWJnb21wO2xpYmlvbXA1IikKKyAgZm9yZWFjaChhbGlhcyBJTiBMSVNUUyBMSUJPTVBfQUxJQVNFUykKKyAgICBpbnN0YWxsKENPREUgImV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EIFwiXCR7Q01BS0VfQ09NTUFORH1cIiAtRSBjcmVhdGVfc3ltbGluayBcIiR7TElCT01QX0xJQl9GSUxFfVwiCisgICAgICBcIiR7YWxpYXN9JHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9XCIgV09SS0lOR19ESVJFQ1RPUlkKKyAgICAgIFwkRU5We0RFU1RESVJ9XCR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2xpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9KSIpCisgIGVuZGZvcmVhY2goKQorZW5kaWYoKQoraW5zdGFsbCgKKyAgRklMRVMKKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcC5oCisgIERFU1RJTkFUSU9OICR7TElCT01QX0hFQURFUlNfSU5TVEFMTF9QQVRIfQorKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wdC5oIERFU1RJTkFUSU9OICR7TElCT01QX0hFQURFUlNfSU5TVEFMTF9QQVRIfSkKK2VuZGlmKCkKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGluc3RhbGwoRklMRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wX2xpYi5oCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcF9saWIubW9kCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcF9saWJfa2luZHMubW9kCisgICAgREVTVElOQVRJT04gJHtMSUJPTVBfSEVBREVSU19JTlNUQUxMX1BBVEh9CisgICkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvZGxsZXhwb3J0cyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ZDczNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMKQEAgLTAsMCArMSw5ODIgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBEZXByZWNhdGVkIGVudHJ5IHBvaW50cyAobnVtYmVycyBhcmUgcmVzZXJ2ZWQpOgorLSBfX2ttcGNfYmFycmllcl9yZWR1Y2VfbWFzdGVyICAgICAgICAgICAgICAxMDkKKy0gX19rbXBjX2VuZF9iYXJyaWVyX3JlZHVjZV9tYXN0ZXIgICAgICAgICAgMTIyCistIF9fa21wY19mb3JfaW5pdF80ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMQorLSBfX2ttcGNfZm9yX2luaXRfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMzIKKy0gX19rbXBjX2Zvcl9uZXh0XzQgICAgICAgICAgICAgICAgICAgICAgICAgMTMzCistIF9fa21wY19mb3JfbmV4dF84ICAgICAgICAgICAgICAgICAgICAgICAgIDEzNAorLSBfX2ttcGNfZm9ya19jYWxsX2JvdW5kICAgICAgICAgICAgICAgICAgICAxMzkKKy0gX19rbXBjX3JlZHVjZV9tYXN0ZXJfbm93YWl0ICAgICAgICAgICAgICAgMTQ5CistIF9fa21wY19vbXBfdGFza19iZWdpbiAgICAgICAgICAgICAgICAgICAgIDE5NAorLSBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUgICAgICAgICAgICAgICAgICAxOTUKKy0ga21wY19zaGFyYWJsZV9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgMjE4CistIGttcGNfc2hhcmFibGVfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgIDIxOQorLSBrbXBjX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAyMjAKKy0ga21wY19zaGFyYWJsZV9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgMjIxCistIGttcGNfYWxpZ25lZF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgIDIyMworLSBtcGFpNGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAKKy0gbXBhaThhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAxCistIG1wYXI0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMgorLSBtcGFyOGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDMKKy0gbXBheDR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0CistIG1wYXg4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNQorLSBtcG9iYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDYKKy0gbXBvZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA3CistIG1wb2ZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwOAorLSBtcG9mcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDkKKy0gbXBvam9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEwCistIG1wb3hiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMQorLSBtcHBhZGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIKKy0gbXBwYWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEzCistIG1wcGJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNAorLSBtcHBiZWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTUKKy0gbXBwZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE2CistIG1wcGRueCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNworLSBtcHBkbnhkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTgKKy0gbXBwZG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE5CistIG1wcGR4byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMAorLSBtcHBlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjEKKy0gbXBwZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIyCistIG1wcGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMworLSBtcHBlbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjQKKy0gbXBwZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI1CistIG1wcGVwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNgorLSBtcHBlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjcKKy0gbXBwZmtkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI4CistIG1wcGZrdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyOQorLSBtcHBmb3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzAKKy0gbXBwZnJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMxCistIG1wcGlvYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMgorLSBtcHBpd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzMKKy0gbXBwam9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM0CistIG1wcG50aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNQorLSBtcHBwcWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzYKKy0gbXBwcHFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM3CistIG1wcHBxcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzOAorLSBtcHB0aWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzkKKy0gbXBwdHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQwCistIG1wcHRwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MQorLSBtcHB0cHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDIKKy0gbXBwdnN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQzCistIG1wcHhiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NAorLSBtcHB4Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDUKKy0gbXBweG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ2CistIG1wcHhuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NworLSBtcHB4cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDgKKy0gbXBweHByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ5CistIG1wcHhzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MAorLSBtcHB4dGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTEKKy0gbXBzYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUyCistIG1wc2NwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NworLSBtcHNlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTMKKy0gbXBzZXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU0CistIG1wc2ZkNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NQorLSBtcHNmZDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTYKKy0gbXBzaWQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU3CistIG1wc2lkOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1OAorLSBtcHNuZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTkKKy0gbXBzbmQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYwCistIG1wc29udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MQorLSBtcHNyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjIKKy0gbXBzdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYzCistIG1wc3hiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NAorLSBtcHN4cmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjUKKy0gbXB0YWRqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY2CistIG1wdGFmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NworLSBtcHRiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjgKKy0gbXB0ZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY5CistIG1wdGRpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MAorLSBtcHRkaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzEKKy0gbXB0ZG54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcyCistIG1wdGRueGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MworLSBtcHRkb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzQKKy0gbXB0ZHhvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc1CistIG1wdGViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NgorLSBtcHRlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcKKy0gbXB0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc4CistIG1wdGVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3OQorLSBtcHRlcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODAKKy0gbXB0ZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgxCistIG1wdGZrZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MgorLSBtcHRwcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODMKKy0gbXB0cHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg0CistIG1wdHBwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NQorLSBtcHR0cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODYKKy0gbXB0dHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg3CistIG1wdHRweiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4OAorLSBtcHR2c3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODkKKy0gbXB0eGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkwCistIG1wdHhjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MQorLSBtcHR4bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTIKKy0gbXB0eG5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkzCistIG1wdHhwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NAorLSBtcHR4c3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTUKKy0gbXBwY3ByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk2CistIGZ0bl9zZXRfbGlicmFyeV9nYW5nICAgICAgICAgICAgICAgICAgICAgIDczNgorLSBrbXBfc2V0X2xpYnJhcnlfZ2FuZworLSBrbXBfc2hhcmFibGVfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICA3NjAKKy0ga21wX3NoYXJhYmxlX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgNzYxCistIGttcF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgIDc2MgorLSBrbXBfc2hhcmFibGVfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICA3NjMKKy0ga21wX2FsaWduZWRfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAgNzY0CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX2k0ICAgICAgICAgICAgICAgIDc2NQorLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9pOCAgICAgICAgICAgICAgICA3NjYKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfcjQgICAgICAgICAgICAgICAgNzY3CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX3I4ICAgICAgICAgICAgICAgIDc2OAorLSBrbXBfbG9ja19jb25kX3dhaXQgICAgICAgICAgICAgICAgICAgICAgICA3NzAKKy0ga21wX2xvY2tfY29uZF9zaWduYWwgICAgICAgICAgICAgICAgICAgICAgNzcxCistIGttcF9sb2NrX2NvbmRfYnJvYWRjYXN0ICAgICAgICAgICAgICAgICAgIDc3MgorLSBrbXBfbmVzdF9sb2NrX2NvbmRfd2FpdCAgICAgICAgICAgICAgICAgICA3NzMKKy0ga21wX25lc3RfbG9ja19jb25kX3NpZ25hbCAgICAgICAgICAgICAgICAgNzc0CistIGttcF9uZXN0X2xvY2tfY29uZF9icm9hZGNhc3QgICAgICAgICAgICAgIDc3NQorLSBrbXBfZ2V0X3Byb2Nlc3NfbnVtICAgICAgICAgICAgICAgICAgICAgICA3ODEKKy0ga21wX2dldF9udW1fcHJvY2Vzc2VzICAgICAgICAgICAgICAgICAgICAgNzgyCistIGttcF9nZXRfcHJvY2Vzc190aHJlYWRfbnVtICAgICAgICAgICAgICAgIDc4MworLSBrbXBfcHJpdmF0ZV9tbWFwICAgICAgICAgICAgICAgICAgICAgICAgICA3ODQgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX3NoYXJhYmxlX21tYXAgICAgICAgICAgICAgICAgICAgICAgICAgNzg1ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9wcml2YXRlX211bm1hcCAgICAgICAgICAgICAgICAgICAgICAgIDc4NiAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfc2hhcmFibGVfbXVubWFwICAgICAgICAgICAgICAgICAgICAgICA3ODcgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX2lzX3NoYXJhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgNzg4ICAgIyBub3QgaW1wbGVtZW50ZWQ/CisKKyVpZm5kZWYgc3R1YgorCisKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGVudHJ5IHBvaW50cyBhcmUgYWRkZWQgc28gdGhhdCB0aGUgYmFja3RyYWNlcyBmcm9tCisgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgIyBhcHBlYXIgaW4gYSBiYWNrdHJhY2Ugb2YgYSB0aHJlYWQgd2hpY2ggaXMgYmxvY2tlZCBpbiB0aGUgUlRMLgorICAgICMKKworICAgICMgUmVndWxhciBlbnRyeSBwb2ludHMKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80CisgICAgICAgIF9fa21wX2ZvcmtfY2FsbAorICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisgICAgICAgIF9fa21wX2xhdW5jaF9tb25pdG9yCisgICAgICAgIF9fa21wX2xhdW5jaF93b3JrZXIKKyAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yCisgICAgICAgIF9fa21wX3JlYXBfd29ya2VyCisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2sKKworICAgICVpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgIyBhbGxvd3MgY29uc29sZSBvdXRwdXQgY2FwYWJpbGl0eSBmb3IgYXBwbGljYXRpb25zIHRob3NlIGRvbid0IGhhdmUgaXQKKyAgICAgICAgX19rbXBfcHJpbnRmCisgICAgJWVuZGlmCisKKworICAgICVpZmRlZiBVU0VfREVCVUdHRVIKKyAgICAgICAgX19rbXBfZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgIERBVEEKKyAgICAgICAgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvICAgICAgICAgICAgIERBVEEKKyAgICAlZW5kaWYgCisKKyAgICAgICAgIyBTeW1ib2xzIGZvciBNUyBtdXR1YWwgZGV0ZWN0aW9uOgorICAgICAgICBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ICAgIERBVEEKKyAgICAgICAgX1lvdV9tdXN0X2xpbmtfd2l0aF9JbnRlbF9PcGVuTVBfbGlicmFyeSAgICAgICAgICBEQVRBCisgICAgICAgICVpZmRlZiBtc3ZjX2NvbXBhdAorICAgICAgICAgICAgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnkgIERBVEEKKyAgICAgICAgJWVuZGlmCisKKyAgICAgICAgX19rbXBfd2FpdF8zMgorICAgICAgICBfX2ttcF93YWl0XzY0CisgICAgICAgIF9fa21wX3dhaXRfb25jb3JlCisgICAgICAgIF9fa21wX3JlbGVhc2VfMzIKKyAgICAgICAgX19rbXBfcmVsZWFzZV82NAorICAgICAgICBfX2ttcF9yZWxlYXNlX29uY29yZQorCisKKyMgICAgVlRfZ2V0dGhpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyMgICAgdnRndGhpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworICAgIF9fa21wY19hdG9taWNfNCAgICAgICAgICAgICAgICAgICAgICAgICAxMDAKKyAgICBfX2ttcGNfYXRvbWljXzggICAgICAgICAgICAgICAgICAgICAgICAgMTAxCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkICAgICAgICAgICAgICAgIDEwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZCAgICAgICAgICAgICAgICAxMDMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQgICAgICAgICAgICAgICAgMTA0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkICAgICAgICAgICAgICAgIDEwNQorICAgIF9fa21wY19iYXJyaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAxMDYKKyAgICBfX2ttcGNfYmFycmllcl9tYXN0ZXIgICAgICAgICAgICAgICAgICAgMTA3CisgICAgX19rbXBjX2JhcnJpZXJfbWFzdGVyX25vd2FpdCAgICAgICAgICAgIDEwOAorICAgIF9fa21wY19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAKKyAgICBfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgMTExCisgICAgX19rbXBjX2JvdW5kX3RocmVhZF9udW0gICAgICAgICAgICAgICAgIDExMgorICAgIF9fa21wY19jcml0aWNhbCAgICAgICAgICAgICAgICAgICAgICAgICAxMTMKKyAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV80ICAgICAgICAgICAgICAgICAgMTE0CisgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOCAgICAgICAgICAgICAgICAgIDExNQorICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzQgICAgICAgICAgICAgICAgICAxMTYKKyAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84ICAgICAgICAgICAgICAgICAgMTE3CisgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfNCAgICAgICAgICAgICAgICAgIDExOAorICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzggICAgICAgICAgICAgICAgICAxMTkKKyAgICBfX2ttcGNfZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwCisgICAgX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlciAgICAgICAgICAgICAgIDEyMQorICAgIF9fa21wY19lbmRfY3JpdGljYWwgICAgICAgICAgICAgICAgICAgICAxMjMKKyAgICBfX2ttcGNfZW5kX21hc3RlciAgICAgICAgICAgICAgICAgICAgICAgMTI0CisgICAgX19rbXBjX2VuZF9vcmRlcmVkICAgICAgICAgICAgICAgICAgICAgIDEyNQorICAgIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbCAgICAgICAgICAxMjYKKyAgICBfX2ttcGNfZW5kX3NpbmdsZSAgICAgICAgICAgICAgICAgICAgICAgMTI3CisgICAgX19rbXBjX2VuZF90YXNrcSAgICAgICAgICAgICAgICAgICAgICAgIDEyOAorICAgIF9fa21wY19lbmRfdGFza3FfdGFzayAgICAgICAgICAgICAgICAgICAxMjkKKyAgICBfX2ttcGNfZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwCisgICAgX19rbXBjX2Zvcl9zdGF0aWNfZmluaSAgICAgICAgICAgICAgICAgIDEzNQorICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNCAgICAgICAgICAgICAgICAxMzYKKyAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzggICAgICAgICAgICAgICAgMTM3CisgICAgX19rbXBjX2ZvcmtfY2FsbCAgICAgICAgICAgICAgICAgICAgICAgIDEzOAorICAgIF9fa21wY19nbG9iYWxfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAxNDAKKyAgICBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0gICAgICAgICAgICAgICAgMTQxCisgICAgX19rbXBjX2luX3BhcmFsbGVsICAgICAgICAgICAgICAgICAgICAgIDE0MgorICAgIF9fa21wY19pbnZva2VfdGFza19mdW5jICAgICAgICAgICAgICAgICAxNDMKKyAgICBfX2ttcGNfbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0CisgICAgX19rbXBjX29rX3RvX2ZvcmsgICAgICAgICAgICAgICAgICAgICAgIDE0NQorICAgIF9fa21wY19vcmRlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAxNDYKKyAgICBfX2ttcGNfcG9wX251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgMTQ3CisgICAgX19rbXBjX3B1c2hfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgIDE0OAorICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsICAgICAgICAgICAgICAxNTAKKyAgICBfX2ttcGNfc2luZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUxCisgICAgX19rbXBjX3Rhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MgorICAgIF9fa21wY190YXNrX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAxNTMKKyAgICBfX2ttcGNfdGFza3EgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU0CisgICAgX19rbXBjX3Rhc2txX3Rhc2sgICAgICAgICAgICAgICAgICAgICAgIDE1NQorICAgIF9fa21wY190aHJlYWRwcml2YXRlICAgICAgICAgICAgICAgICAgICAxNTYKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgICAgICAgICAgICAgMTU3CisgICAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIgICAgICAgICAgIDE1OAorICAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyAgICAgICAxNTkKKyMgICAgX19rbXBjX3NzcF9iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgIDE2MAorIyAgICBfX2ttcGNfc3NwX2ZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgMTYxCisjICAgIF9fa21wY19zc3BfZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAxNjIKKyMgICAgX19rbXBjX3NzcF9wb3N0XzQgICAgICAgICAgICAgICAgICAgICAgIDE2MworIyAgICBfX2ttcGNfc3NwX3Bvc3RfOCAgICAgICAgICAgICAgICAgICAgICAgMTY0CisjICAgIF9fa21wY19zc3Bfd2FpdF80ICAgICAgICAgICAgICAgICAgICAgICAxNjUKKyMgICAgX19rbXBjX3NzcF93YWl0XzggICAgICAgICAgICAgICAgICAgICAgIDE2NgorIyAgICBfX2ttcGNfc3NwX2Rpc3RhbmNlXzQgICAgICAgICAgICAgICAgICAgMTY3CisjICAgIF9fa21wY19zc3BfZGlzdGFuY2VfOCAgICAgICAgICAgICAgICAgICAxNjgKKyMgICAgX19rbXBjX2luX3NzcCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OQorIyAgICBfX2ttcGNfc3NwX3RocmVhZF9udW0gICAgICAgICAgICAgICAgICAgMTcwCisjICAgIF9fa21wY19zc3BfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAxNzEKKyAgICBfX2ttcGNfY29weXByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgMTcyCisjICAgIF9fa21wY19zc3BfZ2V0X21heF90aHJlYWRzICAgICAgICAgICAgICAxNzMKKyMgICAgX19rbXBjX3NzcF9zZXRfbWF4X3RocmVhZHMgICAgICAgICAgICAgIDE3NAorICAgIF9fa21wY19pbml0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAxNzUKKyAgICBfX2ttcGNfZGVzdHJveV9sb2NrICAgICAgICAgICAgICAgICAgICAgMTc2CisgICAgX19rbXBjX3NldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgIDE3NworICAgIF9fa21wY191bnNldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAxNzgKKyAgICBfX2ttcGNfdGVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgMTc5CisgICAgX19rbXBjX2luaXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgIDE4MAorICAgIF9fa21wY19kZXN0cm95X25lc3RfbG9jayAgICAgICAgICAgICAgICAxODEKKyAgICBfX2ttcGNfc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgMTgyCisgICAgX19rbXBjX3Vuc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgIDE4MworICAgIF9fa21wY190ZXN0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAxODQKKyMgICAgX19rbXBjX3NzcF9pbml0X3RocmVhZCAgICAgICAgICAgICAgICAgIDE4NQorIyAgICBfX2ttcGNfc3NwX3NldF9ldmVudCAgICAgICAgICAgICAgICAgICAgMTg2CisgICAgX19rbXBjX3JlZHVjZV9ub3dhaXQgICAgICAgICAgICAgICAgICAgIDE4NworICAgIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCAgICAgICAgICAgICAgICAxODgKKyAgICBfX2ttcGNfcmVkdWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg5CisgICAgX19rbXBjX2VuZF9yZWR1Y2UgICAgICAgICAgICAgICAgICAgICAgIDE5MAorCisjIE9wZW5NUCAzLjAKKworJWlmZGVmIE9NUF8zMAorICAgIF9fa21wY19vbXBfdGFza19hbGxvYyAgICAgICAgICAgICAgICAgICAxOTEKKyAgICBfX2ttcGNfb21wX3Rhc2sgICAgICAgICAgICAgICAgICAgICAgICAgMTkyCisgICAgX19rbXBjX29tcF90YXNrd2FpdCAgICAgICAgICAgICAgICAgICAgIDE5MworICAgIF9fa21wY19vbXBfdGFza19iZWdpbl9pZjAgICAgICAgICAgICAgICAxOTYKKyAgICBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwICAgICAgICAgICAgMTk3CisgICAgX19rbXBjX29tcF90YXNrX3BhcnRzICAgICAgICAgICAgICAgICAgIDE5OAorJWVuZGlmICMgT01QXzMwCisKKyMgICBfX29tcF9jb2xsZWN0b3JfYXBpICAgICAgICAgICAgICAgICAgMTk5CisKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIHRlc3RpbmcgcHVycG9zZXMuIFRoZXJlIGlzIG5vIG5lZWQgaW4gc3RhYmxlIG9yZGluYWwgbnVtYmVyOgorICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kCisKKyVlbmRpZiAgIyBub3QgZGVmaW5lZCBzdHViCisKK2ttcGNfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwCitrbXBjX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMQorJWlmbmRlZiBzdHViCisgICAgIyBUaGVzZSBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gbGliZ3VpZGUsIGJ1dCBkZWNsYXJlZCBuZWl0aGVyIGluIG9tcC5oIG5vdCBpbiBvbXBfbGliLmguCisjICAgIGttcGNfZ2V0X2Jhbm5lciAgICAgICAgICAgICAgICAgICAgICAgICAyMDIKKyMgICAga21wY19nZXRfcG9vbG1vZGUgICAgICAgICAgICAgICAgICAgICAgIDIwMworIyAgICBrbXBjX2dldF9wb29sc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgMjA0CisjICAgIGttcGNfZ2V0X3Bvb2xzdGF0ICAgICAgICAgICAgICAgICAgICAgICAyMDUKKyMgICAga21wY19wb29scHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNworIyAgICBrbXBjX3ByaW50X2Jhbm5lciAgICAgICAgICAgICAgICAgICAgICAgMjA4CisjICAgIGttcGNfc2V0X3Bvb2xtb2RlICAgICAgICAgICAgICAgICAgICAgICAyMTQKKyMgICAga21wY19zZXRfcG9vbHNpemUgICAgICAgICAgICAgICAgICAgICAgIDIxNQorJWVuZGlmCitrbXBjX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNgora21wY19yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDkKK2ttcGNfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgMjExCitrbXBjX3NldF9saWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMgorIyBrbXBjX3NldF9wYXJhbGxlbF9uYW1lICAgICAgICAgICAgICAgICAgICAgIDIxMwora21wY19zZXRfc3RhY2tzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAyMTYKK2ttcGNfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgICAgICAgICAgICAgICAgMjIyCisjIGttcGNfc2V0X3N0YXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE3CitrbXBjX3NldF9kZWZhdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNAorCisjIE9NUCAzLjAgZW50cnkgcG9pbnRzIGZvciB1bnNpZ25lZCBsb29wIGl0ZXJhdGlvbiB2YXJpYWJsZXMKKyVpZm5kZWYgc3R1YgorICAgICVpZmRlZiBPTVBfMzAKKyAgICAgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF84dSAgICAgICAgICAgMjI1CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9pbml0Xzh1ICAgICAgICAgICAgIDIyNgorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84dSAgICAgICAgICAgICAyMjcKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUgICAgICAgICAgICAgMjI4CisgICAgICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNHUgICAgICAgICAgIDIyOQorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80dSAgICAgICAgICAgICAyMzAKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfNHUgICAgICAgICAgICAgMjMxCisgICAgICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzR1ICAgICAgICAgICAgIDIzMgorICAgICVlbmRpZiAjIE9NUF8zMAorJWVuZGlmCisKKyVpZm5kZWYgc3R1YgorICAgIF9fa21wY19nZXRfdGFza2lkICAgICAgICAgICAgICAgICAgICAgICAyMzMKKyAgICBfX2ttcGNfZ2V0X3BhcmVudF90YXNraWQgICAgICAgICAgICAgICAgMjM0CislZW5kaWYKKworIyBPcGVuTVAgMy4xIGVudHJ5IHBvaW50cworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF8zMAorICAgICAgICBfX2ttcGNfb21wX3Rhc2t5aWVsZCAgICAgICAgICAgICAgICAyMzUKKyAgICAlZW5kaWYgIyBPTVBfMzAKKyAgICBfX2ttcGNfcGxhY2VfdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgMjM2CislZW5kaWYKKworIyBPcGVuTVAgNC4wIGVudHJ5IHBvaW50cworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF80MAorICAgICAgICBfX2ttcGNfcHVzaF9wcm9jX2JpbmQgICAgICAgICAgICAgICAyMzcKKyAgICAgICAgX19rbXBjX3Rhc2tncm91cCAgICAgICAgICAgICAgICAgICAgMjM4CisgICAgICAgIF9fa21wY19lbmRfdGFza2dyb3VwICAgICAgICAgICAgICAgIDIzOQorICAgICAgICBfX2ttcGNfcHVzaF9udW1fdGVhbXMgICAgICAgICAgICAgICAyNDAKKyAgICAgICAgX19rbXBjX2ZvcmtfdGVhbXMgICAgICAgICAgICAgICAgICAgMjQxCisgICAgICAgIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMgICAgICAgICAgIDI0MgorICAgICAgICBfX2ttcGNfb21wX3dhaXRfZGVwcyAgICAgICAgICAgICAgICAyNDMKKyAgICAgICAgX19rbXBjX2NhbmNlbCAgICAgICAgICAgICAgICAgICAgICAgMjQ0CisgICAgICAgIF9fa21wY19jYW5jZWxsYXRpb25wb2ludCAgICAgICAgICAgIDI0NQorICAgICAgICBfX2ttcGNfY2FuY2VsX2JhcnJpZXIgICAgICAgICAgICAgICAyNDYKKyAgICAgICAgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQgICAgICAgMjQ3CisgICAgICAgIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80dSAgICAgIDI0OAorICAgICAgICBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfOCAgICAgICAyNDkKKyAgICAgICAgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0Xzh1ICAgICAgMjUwCisgICAgICAgIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNCAgICAgICAgIDI1MQorICAgICAgICBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzR1ICAgICAgICAyNTIKKyAgICAgICAgX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF84ICAgICAgICAgMjUzCisgICAgICAgIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOHUgICAgICAgIDI1NAorICAgICAgICBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80ICAgICAgICAgICAyNTUKKyAgICAgICAgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNHUgICAgICAgICAgMjU2CisgICAgICAgIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzggICAgICAgICAgIDI1NworICAgICAgICBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84dSAgICAgICAgICAyNTgKKyAgICAlZW5kaWYgIyBPTVBfNDAKKyVlbmRpZgorCisjIE9wZW5NUCA0LjEgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzQxCisJX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkCSAgICAyNTkKKwlfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vCSAgICAyNjAKKyAgICAlZW5kaWYKKyVlbmRpZgorCisjIFVzZXIgQVBJIGVudHJ5IHBvaW50cyB0aGF0IGhhdmUgYm90aCBsb3dlci0gYW5kIHVwcGVyLSBjYXNlIHZlcnNpb25zIGZvciBGb3J0cmFuLgorIyBOdW1iZXIgZm9yIGxvd2VyY2FzZSB2ZXJzaW9uIGlzIGluZGljYXRlZC4gIE51bWJlciBmb3IgdXBwZXJjYXNlIGlzIG9idGFpbmVkIGJ5IGFkZGluZyAxMDAwLgorIyBVc2VyIEFQSSBlbnRyeSBwb2ludHMgYXJlIGVudHJ5IHBvaW50cyB0aGF0IHN0YXJ0IHdpdGggJ2ttcF8nIG9yICdvbXBfJy4KKworb21wX2Rlc3Ryb3lfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDAKK29tcF9kZXN0cm95X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgNzAxCitvbXBfZ2V0X2R5bmFtaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMgorb21wX2dldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICA3MDMKK29tcF9nZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA0CitvbXBfZ2V0X251bV9wcm9jcyAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwNQorb21wX2dldF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICA3MDYKK29tcF9nZXRfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgNzA3CitvbXBfZ2V0X3d0aWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwOAorb21wX2dldF93dGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDkKK29tcF9pbl9wYXJhbGxlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwCitvbXBfaW5pdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMQorb21wX2luaXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICA3MTIKK29tcF9zZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEzCitvbXBfc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNAorb21wX3NldF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTUKK29tcF9zZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE2CitvbXBfc2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcxNworb21wX3Rlc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTgKK29tcF90ZXN0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgNzE5CitvbXBfdW5zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMAorb21wX3Vuc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICA3MjEKKworb21wY19zZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjIKK29tcGNfc2V0X25lc3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIzCitvbXBjX3NldF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgIDcyNAorCitrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNQora21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjYKK2ttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI3CitrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOAora21wX2dldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjkKK2ttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMwCisja21wX3ByaW50X2Jhbm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzEKK2ttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMyCitrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDczNAora21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzUKK2ttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICAgICAgICAgICAgICAgICAgNzM3CitrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAgICAgICAgICAgICAgICAgIDczOAora21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgICAgICAgICAgICAgICAgICA3MzkKKyMga21wX3NldF9wYXJhbGxlbF9uYW1lICAgICAgICAgICAgICAgICAgICAgICA3NDAKK2ttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQxCisjIGttcF9zZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQyCitrbXBfZ2V0X251bV9rbm93bl90aHJlYWRzICAgICAgICAgICAgICAgICAgIDc0Mwora21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgICA3NDQKK2ttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICAgICAgICAgICAgICAgICAgNzQ1CitrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0Ngora21wX3NldF93YXJuaW5nc19vbiAgICAgICAgICAgICAgICAgICAgICAgICA3NzkKK2ttcF9zZXRfd2FybmluZ3Nfb2ZmICAgICAgICAgICAgICAgICAgICAgICAgNzgwCisKKyVpZmRlZiBPTVBfMzAKKyAgICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCAgICAgICAgICAgICAgICAgICAgNzg5CisgICAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5MAorICAgIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgICAgICAgICAgICA3OTEKKyAgICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgNzkyCisgICAgb21wX2dldF90aHJlYWRfbGltaXQgICAgICAgICAgICAgICAgICAgIDc5MworICAgIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgICAgICAgICA3OTQKKyAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgICAgICAgICAgICAgNzk1CisgICAgb21wX2dldF9zY2hlZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIDc5NgorICAgIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgICA3OTcKKyAgICBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICAgICAgICAgICAgNzk4CisgICAgb21wY19zZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgIDc5OQorICAgIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gICAgICAgICAgICA4MDAKKyAgICBvbXBjX2dldF90ZWFtX3NpemUgICAgICAgICAgICAgICAgICAgICAgODAxCisgICAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgIDg1MAorICAgIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgICAgICAgICAgICA4NTEKKyAgICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICAgICAgICAgICAgODUyCisgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAgICAgICAgICAgIDg1MworICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgICAgICAgICAgICA4NTQKKyAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICAgODU1CisgICAga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgIDg1NgorICAgIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICA4NTcKKyAgICBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgODU4CisgICAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgIDg1OQorICAgIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICA4NjAKKyVlbmRpZiAjIE9NUF8zMAorCisjIE9wZW5NUCAzLjEKKworJWlmZGVmIE9NUF8zMAorICAgIG9tcF9pbl9maW5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NjEKKyVlbmRpZiAjIE9NUF8zMAorCisjIE9wZW5NUCA0MAorCislaWZkZWYgT01QXzQwCisgICAgb21wX2dldF9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgIDg2MgorICAgI29tcF9zZXRfcHJvY19iaW5kICAgICAgICAgICAgICAgICAgICAgICA4NjMKKyAgICNvbXBfY3Vycl9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgODY0CisgICAgb21wX2dldF9udW1fdGVhbXMgICAgICAgICAgICAgICAgICAgICAgIDg2NQorICAgIG9tcF9nZXRfdGVhbV9udW0gICAgICAgICAgICAgICAgICAgICAgICA4NjYKKyAgICBvbXBfZ2V0X2NhbmNlbGxhdGlvbiAgICAgICAgICAgICAgICAgICAgODY3CisgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzICAgICAgICAgICAgIDg2OAorICAgIG9tcF9pc19pbml0aWFsX2RldmljZSAgICAgICAgICAgICAgICAgICA4NjkKKyVlbmRpZiAjIE9NUF80MAorCisjIE9wZW5NUCA0MQorCislaWZkZWYgT01QXzQxCisgICAgb21wX2luaXRfbG9ja193aXRoX2hpbnQgICAgICAgICAgICAgICAgIDg3MAorICAgIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQgICAgICAgICAgICA4NzEKKyVlbmRpZiAjIE9NUF80MQorCislaWZuZGVmIHN0dWIKKyAgICAjIE9yZGluYWxzIGJldHdlZW4gOTAwIGFuZCA5OTkgYXJlIHJlc2VydmVkCisKKyAgICAjIE9yZGluYWxzIGJldHdlZW4gMTAwMCBhbmQgMTk5OSBhcmUgcmVzZXJ2ZWQKKyAgICAjIGZvciB1c2VyLWNhbGxhYmxlIHVwcGVyY2FzZSBGb3J0cmFuIGVudHJpZXMuCisKKworICAgICMgQVRPTUlDIGVudHJpZXMKKworICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2ICAgICAgICAgICAgICAyMDAwCisgICAgJWVuZGlmCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGQgICAgICAgICAgICAgICAyMDAxCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYiAgICAgICAgICAgICAgMjAwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdiAgICAgICAgICAgICAgIDIwMDMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2ICAgICAgICAgICAgICAyMDA0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsICAgICAgICAgICAgICAgMjAwNQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29yYiAgICAgICAgICAgICAgIDIwMDYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGwgICAgICAgICAgICAgICAyMDA3CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyICAgICAgICAgICAgICAgMjAwOAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIgICAgICAgICAgICAgIDIwMDkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIgICAgICAgICAgICAgICAyMDEwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfeG9yICAgICAgICAgICAgICAgMjAxMQorCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkICAgICAgICAgICAgICAgMjAxMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIgICAgICAgICAgICAgIDIwMTMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXYgICAgICAgICAgICAgICAyMDE0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2RpdiAgICAgICAgICAgICAgMjAxNQorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bCAgICAgICAgICAgICAgIDIwMTYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIgICAgICAgICAgICAgICAyMDE3CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsICAgICAgICAgICAgICAgMjAxOAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NociAgICAgICAgICAgICAgIDIwMTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyICAgICAgICAgICAgICAyMDIwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViICAgICAgICAgICAgICAgMjAyMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvciAgICAgICAgICAgICAgIDIwMjIKKworICAgI19fa21wY19hdG9taWNfZml4ZWQ0X2FkZCAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAyCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViICAgICAgICAgICAgICAgMjAyNAorICAgI19fa21wY19hdG9taWNfZmxvYXQ0X2FkZCAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTA0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViICAgICAgICAgICAgICAgMjAyNgorICAgI19fa21wY19hdG9taWNfZml4ZWQ4X2FkZCAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAzCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViICAgICAgICAgICAgICAgMjAyOAorICAgI19fa21wY19hdG9taWNfZmxvYXQ4X2FkZCAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTA1CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViICAgICAgICAgICAgICAgMjAzMAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYiAgICAgICAgICAgICAgMjAzMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdiAgICAgICAgICAgICAgIDIwMzIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2ICAgICAgICAgICAgICAyMDMzCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsICAgICAgICAgICAgICAgMjAzNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYiAgICAgICAgICAgICAgIDIwMzUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGwgICAgICAgICAgICAgICAyMDM2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyICAgICAgICAgICAgICAgMjAzNworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIgICAgICAgICAgICAgIDIwMzgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3IgICAgICAgICAgICAgICAyMDM5CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYiAgICAgICAgICAgICAgMjA0MAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdiAgICAgICAgICAgICAgIDIwNDEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2ICAgICAgICAgICAgICAyMDQyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsICAgICAgICAgICAgICAgMjA0MworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYiAgICAgICAgICAgICAgIDIwNDQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGwgICAgICAgICAgICAgICAyMDQ1CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyICAgICAgICAgICAgICAgMjA0NgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIgICAgICAgICAgICAgIDIwNDcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IgICAgICAgICAgICAgICAyMDQ4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2ICAgICAgICAgICAgICAgMjA0OQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bCAgICAgICAgICAgICAgIDIwNTAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYgICAgICAgICAgICAgICAyMDUxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsICAgICAgICAgICAgICAgMjA1MgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbCAgICAgICAgICAgICAgMjA1MworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybCAgICAgICAgICAgICAgIDIwNTQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsICAgICAgICAgICAgICAyMDU1CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsICAgICAgICAgICAgICAgMjA1NgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGwgICAgICAgICAgICAgIDIwNTcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwgICAgICAgICAgICAgICAyMDU4CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbCAgICAgICAgICAgICAgMjA1OQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybCAgICAgICAgICAgICAgIDIwNjAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heCAgICAgICAgICAgICAgIDIwNjEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4gICAgICAgICAgICAgICAyMDYyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4ICAgICAgICAgICAgICAgMjA2MworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbiAgICAgICAgICAgICAgIDIwNjQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXggICAgICAgICAgICAgICAyMDY1CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluICAgICAgICAgICAgICAgMjA2NgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heCAgICAgICAgICAgICAgIDIwNjcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4gICAgICAgICAgICAgICAyMDY4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4ICAgICAgICAgICAgICAgMjA2OQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbiAgICAgICAgICAgICAgIDIwNzAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXggICAgICAgICAgICAgICAyMDcxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluICAgICAgICAgICAgICAgMjA3MgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdiAgICAgICAgICAgICAgMjA3MworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYgICAgICAgICAgICAgIDIwNzQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2ICAgICAgICAgICAgICAyMDc1CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdiAgICAgICAgICAgICAgMjA3NgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdiAgICAgICAgICAgICAgIDIwNzcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYgICAgICAgICAgICAgICAyMDc4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZXF2ICAgICAgICAgICAgICAgMjA3OQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdiAgICAgICAgICAgICAgIDIwODAKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGQgICAgICAgICAgICAgIDIwODEKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViICAgICAgICAgICAgICAyMDgyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bCAgICAgICAgICAgICAgMjA4MworICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXYgICAgICAgICAgICAgIDIwODQKKworICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZCAgICAgICAgICAgICAgIDIwODUKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIgICAgICAgICAgICAgICAyMDg2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsICAgICAgICAgICAgICAgMjA4NworICAgIF9fa21wY19hdG9taWNfY21wbHg0X2RpdiAgICAgICAgICAgICAgIDIwODgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQgICAgICAgICAgICAgICAyMDg5CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViICAgICAgICAgICAgICAgMjA5MAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X211bCAgICAgICAgICAgICAgIDIwOTEKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYgICAgICAgICAgICAgICAyMDkyCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZCAgICAgICAgICAgICAgMjA5MworICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIgICAgICAgICAgICAgIDIwOTQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsICAgICAgICAgICAgICAyMDk1CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2RpdiAgICAgICAgICAgICAgMjA5NgorICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkICAgICAgICAgICAgICAyMDk3CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YiAgICAgICAgICAgICAgMjA5OAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWwgICAgICAgICAgICAgIDIwOTkKKyAgICNfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2ICAgICAgICAgICAgICAyMDAwICMgbW92ZWQgdXAgYmVjYXVzZSBvZiBtaXN0YWtlIGluIG51bWJlciAoc3VwcG9zZWQgdG8gYmUgMjEwMCkKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQgICAgICAgICAgICAgIDIxMDEKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViICAgICAgICAgICAgICAyMTAyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bCAgICAgICAgICAgICAgMjEwMworICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYgICAgICAgICAgICAgIDIxMDQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4ICAgICAgICAgICAgICAyMTA1CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbiAgICAgICAgICAgICAgMjEwNgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwICAgICAgICAgICAgMjEwNworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcCAgICAgICAgICAgIDIxMDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAgICAgICAgICAgICAyMTA5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwICAgICAgICAgICAgMjExMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAgICAgICAgICAgIDIxMTEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcCAgICAgICAgICAgIDIxMTIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfZnAgICAgICAgICAgICAyMTEzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwICAgICAgICAgICAgMjExNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcCAgICAgICAgICAgIDIxMTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwICAgICAgICAgICAyMTE2CisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAgICAgICAgICAgICAyMTE3CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2ZwICAgICAgICAgICAgMjExOAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcCAgICAgICAgICAgIDIxMTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAgICAgICAgICAgICAyMTIwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9mcCAgICAgICAgICAgMjEyMQorCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2ZwICAgICAgICAgICAgMjEyMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcCAgICAgICAgICAgIDIxMjMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAgICAgICAgICAgICAyMTI0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwICAgICAgICAgICAgMjEyNQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAgICAgICAgICAgIDIxMjYKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcCAgICAgICAgICAgIDIxMjcKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAgICAgICAgICAgICAyMTI4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2ZwICAgICAgICAgICAgMjEyOQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mcCAgICAgICAgICAgIDIxMzAKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9mcCAgICAgICAgICAgIDIxMzEKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAgICAgICAgICAgICAyMTMyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwICAgICAgICAgICAgMjEzMworICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9mcCAgICAgICAgICAgIDIxMzQKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfZnAgICAgICAgICAgIDIxMzUKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2ZwICAgICAgICAgICAyMTM2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcCAgICAgICAgICAgMjEzNworICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAgICAgICAgICAgIDIxMzgKKyAgICAlZW5kaWYKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDggICAgICAgIDIxNjkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZmxvYXQ4ICAgICAgICAyMTcwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZmxvYXQ4ICAgICAgICAyMTc0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OCAgICAgICAgMjE3NQorCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OCAgICAgICAgMjE3OQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDggICAgICAgIDIxODAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDggICAgICAgIDIxODQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZmxvYXQ4ICAgICAgICAyMTg1CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4ICAgICAgICAyMTg3CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OCAgICAgICAgMjE4OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDggICAgICAgIDIxODkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4ICAgICAgICAyMTkwCisKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4ICAgICAgICAyMjMxCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OCAgICAgICAgMjIzMgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDggICAgICAgIDIyMzMKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4ICAgICAgICAyMjM0CisKKyAgICBfX2ttcGNfYXRvbWljXzEgICAgICAgICAgICAgICAgICAgICAgICAyMjQ3CisgICAgX19rbXBjX2F0b21pY18yICAgICAgICAgICAgICAgICAgICAgICAgMjI0OAorICAgI19fa21wY19hdG9taWNfNCAgICAgICAgICAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAwCisgICAjX19rbXBjX2F0b21pY184ICAgICAgICAgICAgICAgICAgICAjIGRlY2xhcmVkIGFib3ZlICMxMDEKKyAgICBfX2ttcGNfYXRvbWljXzEwICAgICAgICAgICAgICAgICAgICAgICAyMjUxCisgICAgX19rbXBjX2F0b21pY18xNiAgICAgICAgICAgICAgICAgICAgICAgMjI1MgorICAgIF9fa21wY19hdG9taWNfMjAgICAgICAgICAgICAgICAgICAgICAgIDIyNTMKKyAgICBfX2ttcGNfYXRvbWljXzMyICAgICAgICAgICAgICAgICAgICAgICAyMjU0CisKKyAgICAlaWZkZWYgYXJjaF8zMgorCisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTYgICAgICAyMjU1CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2ICAgICAgMjI1NgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNiAgICAgIDIyNTcKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTYgICAgICAyMjU4CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2ICAgICAgMjI1OQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNiAgICAgIDIyNjAKKworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNiAgICAgIDIyNjEKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTYgICAgICAyMjYyCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2ICAgICAgMjI2MworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNiAgICAgIDIyNjQKKyAgICAgICAgJWVuZGlmCisKKyAgICAlZW5kaWYKKworICAgICVpZm5kZWYgYXJjaF82NAorCisgICAgICAgICMgQVRPTUlDIGV4dGVuc2lvbnMgZm9yIE9wZW5NUCAzLjEgc3BlYyAoeDg2IGFuZCB4NjQgb25seSkKKworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9yZCAgICAgICAgICAgICAgICAyMjY1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3JkICAgICAgICAgICAgICAgIDIyNjYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQgICAgICAgICAgICAgICAgMjI2NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9yZCAgICAgICAgICAgICAgICAyMjY4CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkICAgICAgICAgICAgICAgIDIyNjkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQgICAgICAgICAgICAgICAgMjI3MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfcmQgICAgICAgICAgICAgICAyMjcxCisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3JkICAgICAgICAgICAgICAgMjI3MgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfcmQgICAgICAgICAgICAgICAgMjI3MworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZCAgICAgICAgICAgICAgICAyMjc0CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZCAgICAgICAgICAgICAgIDIyNzUKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQgICAgICAgICAgICAgICAyMjc2CisgICAgICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfcmQgICAgICAgMjI3NworICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfcmQgICAgICAgMjI3OAorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV93ciAgICAgICAgICAgICAgICAyMjc5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3dyICAgICAgICAgICAgICAgIDIyODAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfd3IgICAgICAgICAgICAgICAgMjI4MQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF93ciAgICAgICAgICAgICAgICAyMjgyCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyICAgICAgICAgICAgICAgIDIyODMKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfd3IgICAgICAgICAgICAgICAgMjI4NAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IgICAgICAgICAgICAgICAyMjg1CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3dyICAgICAgICAgICAgICAgMjI4NgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfd3IgICAgICAgICAgICAgICAgMjI4NworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF93ciAgICAgICAgICAgICAgICAyMjg4CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF93ciAgICAgICAgICAgICAgIDIyODkKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IgICAgICAgICAgICAgICAyMjkwCisgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3dyICAgICAgIDIyOTEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IgICAgICAgMjI5MgorICAgICAgICAlZW5kaWYKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9jcHQgICAgICAgICAgIDIyOTMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQgICAgICAgICAgMjI5NAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0ICAgICAgICAgICAyMjk1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0ICAgICAgICAgIDIyOTYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdCAgICAgICAgICAgMjI5NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0ICAgICAgICAgICAyMjk4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHQgICAgICAgICAgIDIyOTkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdCAgICAgICAgICAgMjMwMAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdCAgICAgICAgICAyMzAxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHQgICAgICAgICAgIDIzMDIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdCAgICAgICAgICAgMjMwMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0ICAgICAgICAgICAyMzA0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0ICAgICAgICAgIDIzMDUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdCAgICAgICAgICAgMjMwNgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdCAgICAgICAgICAyMzA3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9jcHQgICAgICAgICAgIDIzMDgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiX2NwdCAgICAgICAgICAgMjMwOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0ICAgICAgICAgICAyMzEwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHQgICAgICAgICAgIDIzMTEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQgICAgICAgICAgMjMxMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0ICAgICAgICAgICAyMzEzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQgICAgICAgICAgIDIzMTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdCAgICAgICAgICAgMjMxNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0ICAgICAgICAgICAyMzE2CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9jcHQgICAgICAgICAgIDIzMTcKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdCAgICAgICAgICAgMjMxOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0ICAgICAgICAgICAyMzE5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHQgICAgICAgICAgIDIzMjAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2NwdCAgICAgICAgICAgMjMyMQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0ICAgICAgICAgICAyMzIyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGJfY3B0ICAgICAgICAgIDIzMjMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdCAgICAgICAgICAgMjMyNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdCAgICAgICAgICAyMzI1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHQgICAgICAgICAgIDIzMjYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdCAgICAgICAgICAgMjMyNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0ICAgICAgICAgICAyMzI4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHQgICAgICAgICAgIDIzMjkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQgICAgICAgICAgMjMzMAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0ICAgICAgICAgICAyMzMxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGJfY3B0ICAgICAgICAgIDIzMzIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdCAgICAgICAgICAgMjMzMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdCAgICAgICAgICAyMzM0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQgICAgICAgICAgIDIzMzUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdCAgICAgICAgICAgMjMzNgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0ICAgICAgICAgICAyMzM3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQgICAgICAgICAgIDIzMzgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQgICAgICAgICAgMjMzOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0ICAgICAgICAgICAyMzQwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQgICAgICAgICAgIDIzNDEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdCAgICAgICAgICAgMjM0MgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0ICAgICAgICAgICAyMzQzCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9jcHQgICAgICAgICAgIDIzNDQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQgICAgICAgICAgMjM0NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0ICAgICAgICAgICAyMzQ2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGxfY3B0ICAgICAgICAgIDIzNDcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdCAgICAgICAgICAgMjM0OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdCAgICAgICAgICAyMzQ5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybF9jcHQgICAgICAgICAgIDIzNTAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQgICAgICAgICAgMjM1MQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0ICAgICAgICAgICAyMzUyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQgICAgICAgICAgIDIzNTMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdCAgICAgICAgICAgMjM1NAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXhfY3B0ICAgICAgICAgICAyMzU1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQgICAgICAgICAgIDIzNTYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdCAgICAgICAgICAgMjM1NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW5fY3B0ICAgICAgICAgICAyMzU4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQgICAgICAgICAgIDIzNTkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdCAgICAgICAgICAgMjM2MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXhfY3B0ICAgICAgICAgICAyMzYxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbl9jcHQgICAgICAgICAgIDIzNjIKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4X2NwdCAgICAgICAgICAgMjM2MworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW5fY3B0ICAgICAgICAgICAyMzY0CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQgICAgICAgICAgMjM2NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdCAgICAgICAgICAyMzY2CisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2X2NwdCAgICAgICAgICAyMzY3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXZfY3B0ICAgICAgICAgIDIzNjgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdl9jcHQgICAgICAgICAgMjM2OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2X2NwdCAgICAgICAgICAyMzcwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Vxdl9jcHQgICAgICAgICAgIDIzNzEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdCAgICAgICAgICAgMjM3MgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0ICAgICAgICAgICAyMzczCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Vxdl9jcHQgICAgICAgICAgIDIzNzQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQgICAgICAgICAgMjM3NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdCAgICAgICAgICAyMzc2CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0ICAgICAgICAgIDIzNzcKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQgICAgICAgICAgMjM3OAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0ICAgICAgICAgIDIzNzkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQgICAgICAgICAgMjM4MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdCAgICAgICAgICAyMzgxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0ICAgICAgICAgIDIzODIKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHQgICAgICAgICAgIDIzODMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdCAgICAgICAgICAgMjM4NAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0ICAgICAgICAgICAyMzg1CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHQgICAgICAgICAgIDIzODYKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdCAgICAgICAgICAgMjM4NworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0ICAgICAgICAgICAyMzg4CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X211bF9jcHQgICAgICAgICAgIDIzODkKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdCAgICAgICAgICAgMjM5MAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdCAgICAgICAgICAyMzkxCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0ICAgICAgICAgIDIzOTIKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQgICAgICAgICAgMjM5MworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdCAgICAgICAgICAyMzk0CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQgICAgICAgICAgMjM5NQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdCAgICAgICAgICAyMzk2CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0ICAgICAgICAgIDIzOTcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQgICAgICAgICAgMjM5OAorICAgICAgICAlZW5kaWYKKyAgICAgICAjX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdF90bXAgICAgICAgICAgICAyNDA5CisKKyAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTZfY3B0ICAyMzk5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHQgIDI0MDAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdCAgMjQwMQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0ICAyNDAyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNl9jcHQgIDI0MDMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2X2NwdCAgMjQwNAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTZfY3B0ICAyNDA1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQgIDI0MDYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2X2NwdCAgMjQwNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0ICAyNDA4CisgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYKKworICAgICAgICBfX2ttcGNfYXRvbWljX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAyNDEwCisgICAgICAgIF9fa21wY19hdG9taWNfZW5kICAgICAgICAgICAgICAgICAgICAgIDI0MTEKKworICAgICAgICAlaWZkZWYgT01QXzQwCisKKyAgICAgICAgICAgICMgQVRPTUlDIGV4dGVuc2lvbnMgZm9yIE9wZW5NUCA0LjAgc3BlYyAoeDg2IGFuZCB4NjQgb25seSkKKworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3dwICAgICAgICAgICAyNDEyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AgICAgICAgICAgIDI0MTMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cCAgICAgICAgICAgMjQxNAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3dwICAgICAgICAgICAyNDE1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AgICAgICAgICAgIDI0MTYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cCAgICAgICAgICAgMjQxNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N3cCAgICAgICAgICAyNDE4CisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AgICAgICAgIDI0MTkKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3dwICAgICAgICAgICAyNDIwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AgICAgICAgICAgIDI0MjEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AgICAgICAgICAgMjQyMgorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N3cCAgICAgICAgICAyNDIzCisKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AgIDI0MjQKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cCAgMjQyNQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlZW5kaWYKKworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYgICAyNDI2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldiAgIDI0MjcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3JldiAgMjQyOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdF9yZXYgICAyNDI5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldiAgIDI0MzAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldiAgMjQzMQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYgICAyNDMyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldiAgIDI0MzMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldiAgMjQzNAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYgICAyNDM1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldiAgIDI0MzYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0X3JldiAgMjQzNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9yZXYgICAyNDM4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldiAgIDI0MzkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldiAgMjQ0MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYgICAyNDQxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldiAgIDI0NDIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldiAgMjQ0MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYgICAyNDQ0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldiAgIDI0NDUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldiAgMjQ0NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYgICAyNDQ3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldiAgIDI0NDgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldiAgMjQ0OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXYgICAyNDUwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldiAgIDI0NTEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2ICAgMjQ1MgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYgICAyNDUzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYgIDI0NTQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldiAgMjQ1NQorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHRfcmV2ICAyNDU2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYgIDI0NTcKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYgICAyNDU4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldiAgIDI0NTkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2ICAgMjQ2MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYgICAyNDYxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdF9yZXYgIDI0NjIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldiAgMjQ2MworICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2ICAyNDY0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdF9yZXYgIDI0NjUKKworICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHRfcmV2ICAyNDY2CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0X3JldiAgMjQ2NworICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYgIDI0NjgKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2ICAyNDY5CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgICVlbmRpZgorCisgICAgICAgICVlbmRpZiAgICMgT01QXzQwCisKKworICAgICVlbmRpZiAgICMgYXJjaF82NAorCislZW5kaWYKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2V4cG9ydHNfc28udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjYyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dApAQCAtMCwwICsxLDEzMyBAQAorIyBleHBvcnRzX3NvLnR4dCAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBUaGlzIGlzIHZlcnNpb24gc2NyaXB0IGZvciBPTVAgUlRMIHNoYXJlZCBsaWJyYXJ5IChsaWJvbXAqLnNvKQorCitWRVJTSU9OIHsKKworICAgIGdsb2JhbDogIyBFeHBvcnRlZCBzeW1ib2xzLgorCisgICAgICAgICMKKyAgICAgICAgIyAiTm9ybWFsIiBzeW1ib2xzLgorICAgICAgICAjCisgICAgICAgIG9tcF8qOyAgICAgIyBTdGFuZGFyZCBPcGVuTVAgZnVuY3Rpb25zLgorCisgICAgICAgICMKKyAgICAgICAgIyBPTVBUIEFQSQorICAgICAgICAjCisgICAgICAgIG9tcHRfdG9vbDsgICAgICAgICAgICMgT01QVCBpbml0aWFsaXphdGlvbiBpbnRlcmZhY2UKKyAgICAgICAgb21wdF9jb250cm9sOyAgICAgICAgIyBPTVBUIGNvbnRyb2wgaW50ZXJmYWNlCisgICAgICAgIAorICAgICAgICAjCisgICAgICAgICMgT01QVCBzdGF0ZSBwbGFjZWhvbGRlcnMKKyAgICAgICAgIworICAgICAgICBvbXB0X2lkbGU7CisgICAgICAgIG9tcHRfb3ZlcmhlYWQ7CisgICAgICAgIG9tcHRfYmFycmllcl93YWl0OworICAgICAgICBvbXB0X3Rhc2tfd2FpdDsKKyAgICAgICAgb21wdF9tdXRleF93YWl0OworCisgICAgICAgIG9tcGNfKjsgICAgIyBvbXAuaCByZW5hbWVzIHNvbWUgc3RhbmRhcmQgZnVuY3Rpb25zIHRvIG9tcGNfKi4KKyAgICAgICAga21wXyo7ICAgICAjIEludGVsIGV4dGVuc2lvbnMuCisgICAgICAgIGttcGNfKjsgICAgIyBJbnRlbCBleHRlbnNpb25zLgorICAgICAgICBfX2ttcGNfKjsgICMgRnVuY3Rpb25zIGNhbGxlZCBieSBjb21waWxlci1nZW5lcmF0ZWQgY29kZS4KKyAgICAgICAgR09NUF8qOyAgICAjIEdOVSBDIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zLgorCisgICAgICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfKjsgICAgICMgTXV0dWFsIGRldGVjdGlvbi9NUyBjb21wYXRpYmlsaXR5IHN5bWJvbHMuCisKKworICAgICAgICAjCisgICAgICAgICMgRGVidWdnZXIgc3VwcG9ydC4KKyAgICAgICAgIworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICBfX2ttcF9kZWJ1Z2dpbmc7CisgICAgICAgIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbzsKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKworICAgICAgICAjCisgICAgICAgICMgSW50ZXJuYWwgZnVuY3Rpb25zIGV4cG9ydGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAgICAjCisgICAgICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kOworICAgICAgICBfX19rbXBfYWxsb2NhdGU7CisgICAgICAgIF9fX2ttcF9mcmVlOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworCisJX19rbXBfcmVzZXRfc3RhdHM7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICMKKyAgICAgICAgIyBJVFQgc3VwcG9ydC4KKyAgICAgICAgIworICAgICAgICAjIFRoZSBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIGFyZSBhZGRlZCBzbyB0aGF0IHRoZSBiYWNrdHJhY2VzIGZyb20KKyAgICAgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgICAgICMgYXBwZWFyIGluIGEgYmFja3RyYWNlIG9mIGEgdGhyZWFkIHdoaWNoIGlzIGJsb2NrZWQgaW4gdGhlIFJUTC4KKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2s7CisgICAgICAgIF9fa21wX2ZvcmtfY2FsbDsKKyAgICAgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2Q7CisgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2s7CisgICAgICAgIF9fa21wX2l0dF9maW5pX2l0dGxpYjsKKyAgICAgICAgX19rbXBfaXR0X2luaXRfaXR0bGliOworICAgICAgICBfX2ttcF9sYXVuY2hfbW9uaXRvcjsKKyAgICAgICAgX19rbXBfbGF1bmNoX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yOworICAgICAgICBfX2ttcF9yZWFwX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVsZWFzZV8zMjsKKyAgICAgICAgX19rbXBfcmVsZWFzZV82NDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9vbmNvcmU7CisgICAgICAgIF9fa21wX3dhaXRfMzI7CisgICAgICAgIF9fa21wX3dhaXRfNjQ7CisgICAgICAgIF9fa21wX3dhaXRfb25jb3JlOworICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQ7CisKKyAgICAgICAgIyBpdHRub3RpZnkgc3ltYm9scyB0byBiZSB1c2VkIGJ5IGRlYnVnZ2VyCisgICAgICAgIF9fa21wX2l0dF9maW5pX2l0dGxpYjsKKyAgICAgICAgX19rbXBfaXR0X2luaXRfaXR0bGliOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIGxvY2FsOiAjIE5vbi1leHBvcnRlZCBzeW1ib2xzLgorCisgICAgICAgICo7ICAgICAgICAgIyBBbGwgb3RoZXIgc3ltYm9scyBhcmUgbm90IGV4cG9ydGVkLgorCit9OyAjIFZFUlNJT04KKworIyBzZXRzIHVwIEdDQyBPTVBfIHZlcnNpb24gZGVwZW5kZW5jeSBjaGFpbgorT01QXzEuMCB7Cit9OworT01QXzIuMCB7Cit9IE9NUF8xLjA7CitPTVBfMy4wIHsKK30gT01QXzIuMDsKK09NUF8zLjEgeworfSBPTVBfMy4wOworT01QXzQuMCB7Cit9IE9NUF8zLjE7CisKKyMgc2V0cyB1cCBHQ0MgR09NUF8gdmVyc2lvbiBkZXBlbmRlbmN5IGNoYWluCitHT01QXzEuMCB7Cit9OworR09NUF8yLjAgeworfSBHT01QXzEuMDsKK0dPTVBfMy4wIHsKK30gR09NUF8yLjA7CitHT01QXzQuMCB7Cit9IEdPTVBfMy4wOworCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2V4dHJhY3RFeHRlcm5hbC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9leHRyYWN0RXh0ZXJuYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmZkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9leHRyYWN0RXh0ZXJuYWwuY3BwCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogZXh0cmFjdEV4dGVybmFsLmNwcAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3Ryc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisKKy8qIEdpdmVuIGEgc2V0IG9mIG4gb2JqZWN0IGZpbGVzIGggKCdleHRlcm5hbCcgb2JqZWN0IGZpbGVzKSBhbmQgYSBzZXQgb2YgbQorICAgb2JqZWN0IGZpbGVzIG8gKCdpbnRlcm5hbCcgb2JqZWN0IGZpbGVzKSwKKyAgIDEuIERldGVybWluZXMgciwgdGhlIHN1YnNldCBvZiBoIHRoYXQgbyBkZXBlbmRzIG9uLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5CisgICAyLiBSZW1vdmVzIHRoZSBmaWxlcyBpbiBoIC0gciBmcm9tIHRoZSBmaWxlIHN5c3RlbQorICAgMy4gRm9yIGVhY2ggZXh0ZXJuYWwgc3ltYm9sIGRlZmluZWQgaW4gc29tZSBmaWxlIGluIHIsIHJlbmFtZSBpdCBpbiByIFUgbworICAgICAgYnkgcHJlZml4aW5nIGl0IHdpdGggIl9fa21wX2V4dGVybmFsXyIKKyAgIFVzYWdlOgorICAgaGlkZS5leGUgPG4+IDxmaWxlbmFtZXMgZm9yIGg+IDxmaWxlbmFtZXMgZm9yIG8+CisKKyAgIFRodXMsIHRoZSBwcmVmaXhlZCBzeW1ib2xzIGJlY29tZSBoaWRkZW4gaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBub3cgaGF2ZSBhIHNwZWNpYWwKKyAgIHByZWZpeC4KKyovCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3ZvaWQgc3RvcChjaGFyKiBlcnJvck1zZykgeworICAgIHByaW50ZigiJXNcbiIsIGVycm9yTXNnKTsKKyAgICBleGl0KDEpOworfQorCisvLyBhbiBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIGEgLk9CSiBmaWxlCitjbGFzcyBTeW1ib2wgeworcHVibGljOgorICAgIF9faW50NjQgbmFtZTsKKyAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzZWN0aW9uTnVtLCB0eXBlOworICAgIGNoYXIgc3RvcmFnZUNsYXNzLCBuQXV4OworfTsKKworY2xhc3MgX3JzdHJlYW0gOiBwdWJsaWMgaXN0cnN0cmVhbSB7Citwcml2YXRlOgorICAgIGNvbnN0IGNoYXIgKmJ1ZjsKK3Byb3RlY3RlZDoKKyAgICBfcnN0cmVhbShwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPiBwKTppc3Ryc3RyZWFtKHAuZmlyc3QscC5zZWNvbmQpLGJ1ZihwLmZpcnN0KXt9CisgICAgfl9yc3RyZWFtKCkgeworCWRlbGV0ZVtdYnVmOworICAgIH0KK307CisKKy8qIEEgc3RyZWFtIGVuY2FwdXNsYXRpbmcgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIG9yIHRoZSBjb250ZW50IG9mIGEgc3RyaW5nLCBvdmVycmlkaW5nIHRoZQorICAgPj4gb3BlcmF0b3IgdG8gcmVhZCB2YXJpb3VzIGludGVnZXIgdHlwZXMgaW4gYmluYXJ5IGZvcm0sIGFzIHdlbGwgYXMgYSBzeW1ib2wgdGFibGUKKyAgIGVudHJ5LgorKi8KK2NsYXNzIHJzdHJlYW0gOiBwdWJsaWMgX3JzdHJlYW0geworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGlubGluZSByc3RyZWFtJiBkb1JlYWQoVCAmeCkgeworCXJlYWQoKGNoYXIqKSZ4LCBzaXplb2YoVCkpOworCXJldHVybiAqdGhpczsKKyAgICB9CisgICAgc3RhdGljIHBhaXI8Y29uc3QgY2hhciosIHN0cmVhbXNpemU+IGdldEJ1Zihjb25zdCBjaGFyICpmaWxlTmFtZSkgeworCWlmc3RyZWFtIHJhdyhmaWxlTmFtZSxpb3M6OmJpbmFyeSB8IGlvczo6aW4pOworCWlmKCFyYXcuaXNfb3BlbigpKQorCSAgICBzdG9wKCJyc3RyZWFtLmdldEJ1ZjogRXJyb3Igb3BlbmluZyBmaWxlIik7CisJcmF3LnNlZWtnKDAsaW9zOjplbmQpOworCXN0cmVhbXBvcyBmaWxlU2l6ZSA9IHJhdy50ZWxsZygpOworCWlmKGZpbGVTaXplIDwgMCkKKwkgICAgc3RvcCgicnN0cmVhbS5nZXRCdWY6IEVycm9yIHJlYWRpbmcgZmlsZSIpOworCWNoYXIgKmJ1ZiA9IG5ldyBjaGFyW2ZpbGVTaXplXTsKKwlyYXcuc2Vla2coMCxpb3M6OmJlZyk7CisJcmF3LnJlYWQoYnVmLCBmaWxlU2l6ZSk7CisJcmV0dXJuIHBhaXI8Y29uc3QgY2hhciosIHN0cmVhbXNpemU+KGJ1ZixmaWxlU2l6ZSk7CisgICAgfQorcHVibGljOgorICAgIC8vIGNvbnN0cnVjdCBmcm9tIGEgc3RyaW5nCisgICAgcnN0cmVhbShjb25zdCBjaGFyICpidWYsc3RyZWFtc2l6ZSBzaXplKTpfcnN0cmVhbShwYWlyPGNvbnN0IGNoYXIqLHN0cmVhbXNpemU+KGJ1Ziwgc2l6ZSkpe30KKyAgICAvKiBjb25zdHJ1Y3QgZnJvbSBhIGZpbGUgd2hvbGUgY29udGVudCBpcyBmdWxseSByZWFkIG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudCBvZgorICAgICAgIHRoaXMgc3RyZWFtCisgICAgKi8KKyAgICByc3RyZWFtKGNvbnN0IGNoYXIgKmZpbGVOYW1lKTpfcnN0cmVhbShnZXRCdWYoZmlsZU5hbWUpKXt9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+PihpbnQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+PihzaG9ydCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4odW5zaWduZWQgc2hvcnQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KFN5bWJvbCAmZSkgeworCXJlYWQoKGNoYXIqKSZlLCAxOCk7CisJcmV0dXJuICp0aGlzOworICAgIH0KK307CisKKy8vIHN0cmluZyB0YWJsZSBpbiBhIC5PQkogZmlsZQorY2xhc3MgU3RyaW5nVGFibGUgeworcHJpdmF0ZToKKyAgICBtYXA8c3RyaW5nLCB1bnNpZ25lZD4gZGlyZWN0b3J5OworICAgIHNpemVfdCBsZW5ndGg7CisgICAgY2hhciAqZGF0YTsKKworICAgIC8vIG1ha2UgPGRpcmVjdG9yeT4gZnJvbSA8bGVuZ3RoPiBieXRlcyBpbiA8ZGF0YT4KKyAgICB2b2lkIG1ha2VEaXJlY3Rvcnkodm9pZCkgeworCXVuc2lnbmVkIGkgPSA0OworCXdoaWxlKGkgPCBsZW5ndGgpIHsKKwkgICAgc3RyaW5nIHMgPSBzdHJpbmcoZGF0YSArIGkpOworCSAgICBkaXJlY3RvcnkuaW5zZXJ0KG1ha2VfcGFpcihzLCBpKSk7CisJICAgIGkgKz0gcy5zaXplKCkgKyAxOworCX0KKyAgICB9CisgICAgLy8gaW5pdGlhbGl6ZSA8bGVuZ3RoPiBhbmQgPGRhdGE+IHdpdGggY29udGVudHMgc3BlY2lmaWVkIGJ5IHRoZSBhcmd1bWVudHMKKyAgICB2b2lkIGluaXQoY29uc3QgY2hhciAqX2RhdGEpIHsKKwl1bnNpZ25lZCBfbGVuZ3RoID0gKih1bnNpZ25lZCopX2RhdGE7CisKKwlpZihfbGVuZ3RoIDwgc2l6ZW9mKHVuc2lnbmVkKSB8fCBfbGVuZ3RoICE9ICoodW5zaWduZWQqKV9kYXRhKQorCSAgICBzdG9wKCJTdHJpbmdUYWJsZS5pbml0OiBJbnZhbGlkIHN5bWJvbCB0YWJsZSIpOworCWlmKF9kYXRhW19sZW5ndGggLSAxXSkgeworCSAgICAvLyB0byBwcmV2ZW50IHJ1bmF3YXkgc3RyaW5ncywgbWFrZSBzdXJlIHRoZSBkYXRhIGVuZHMgd2l0aCBhIHplcm8KKwkgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aCA9IF9sZW5ndGggKyAxXTsKKwkgICAgZGF0YVtfbGVuZ3RoXSA9IDA7CisJfSBlbHNlIHsKKwkgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aCA9IF9sZW5ndGhdOworCX0KKwkqKHVuc2lnbmVkKilkYXRhID0gbGVuZ3RoOworCUtNUF9NRU1DUFkoZGF0YSArIHNpemVvZih1bnNpZ25lZCksIF9kYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwKKwkgICAgICAgICAgIGxlbmd0aCAtIHNpemVvZih1bnNpZ25lZCkpOworCW1ha2VEaXJlY3RvcnkoKTsKKyAgICB9CitwdWJsaWM6CisgICAgU3RyaW5nVGFibGUocnN0cmVhbSAmZikgeworCS8qIENvbnN0cnVjdCBzdHJpbmcgdGFibGUgYnkgcmVhZGluZyBmcm9tIGYuCisJICovCisJc3RyZWFtcG9zIHM7CisJdW5zaWduZWQgc3RyU2l6ZTsKKwljaGFyICpzdHJEYXRhOworCisJcyA9IGYudGVsbGcoKTsKKwlmPj5zdHJTaXplOworCWlmKHN0clNpemUgPCBzaXplb2YodW5zaWduZWQpKQorCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogSW52YWxpZCBzdHJpbmcgdGFibGUiKTsKKwlzdHJEYXRhID0gbmV3IGNoYXJbc3RyU2l6ZV07CisJKih1bnNpZ25lZCopc3RyRGF0YSA9IHN0clNpemU7CisJLy8gcmVhZCB0aGUgcmF3IGRhdGEgaW50byA8c3RyRGF0YT4KKwlmLnJlYWQoc3RyRGF0YSArIHNpemVvZih1bnNpZ25lZCksIHN0clNpemUgLSBzaXplb2YodW5zaWduZWQpKTsKKwlzID0gZi50ZWxsZygpIC0gczsKKwlpZihzIDwgc3RyU2l6ZSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGU6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW5pdChzdHJEYXRhKTsKKwlkZWxldGVbXXN0ckRhdGE7CisgICAgfQorICAgIFN0cmluZ1RhYmxlKGNvbnN0IHNldDxzdHJpbmc+ICZzdHJpbmdzKSB7CisJLyogQ29uc3RydWN0IHN0cmluZyB0YWJsZSBmcm9tIGdpdmVuIHN0cmluZ3MuCisJICovCisJY2hhciAqcDsKKwlzZXQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisJc2l6ZV90IHM7CisKKwkvLyBjb3VudCByZXF1aXJlZCBzaXplIGZvciBkYXRhCisJZm9yKGxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCksIGl0ID0gc3RyaW5ncy5iZWdpbigpOyBpdCAhPSBzdHJpbmdzLmVuZCgpOyArK2l0KSB7CisJICAgIHNpemVfdCBsID0gKCppdCkuc2l6ZSgpOworCisJICAgIGlmKGwgPiAodW5zaWduZWQpIDB4RkZGRkZGRkYpCisJCXN0b3AoIlN0cmluZ1RhYmxlOiBTdHJpbmcgdG9vIGxvbmciKTsKKwkgICAgaWYobCA+IDgpIHsKKwkJbGVuZ3RoICs9IGwgKyAxOworCQlpZihsZW5ndGggPiAodW5zaWduZWQpIDB4RkZGRkZGRkYpCisJCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogU3ltYm9sIHRhYmxlIHRvbyBsb25nIik7CisJICAgIH0KKwl9CisJZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwkvLyBwb3B1bGF0ZSBkYXRhIGFuZCBkaXJlY3RvcnkKKwlmb3IocCA9IGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgKytpdCkgeworCSAgICBjb25zdCBzdHJpbmcgJnN0ciA9ICppdDsKKwkgICAgc2l6ZV90IGwgPSBzdHIuc2l6ZSgpOworCSAgICBpZihsID4gOCkgeworCQlkaXJlY3RvcnkuaW5zZXJ0KG1ha2VfcGFpcihzdHIsIHAgLSBkYXRhKSk7CisJCUtNUF9NRU1DUFkocCwgc3RyLmNfc3RyKCksIGwpOworCQlwW2xdID0gMDsKKwkJcCArPSBsICsgMTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgflN0cmluZ1RhYmxlKCkgeworCWRlbGV0ZVtdIGRhdGE7CisgICAgfQorICAgIC8qIFJldHVybnMgZW5jb2RpbmcgZm9yIGdpdmVuIHN0cmluZyBiYXNlZCBvbiB0aGlzIHN0cmluZyB0YWJsZS4KKyAgICAgICBFcnJvciBpZiBzdHJpbmcgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA4IGJ1dCBzdHJpbmcgaXMgbm90IGluCisgICAgICAgdGhlIHN0cmluZyB0YWJsZS0tcmV0dXJucyAwLgorICAgICovCisgICAgX19pbnQ2NCBlbmNvZGUoY29uc3Qgc3RyaW5nICZzdHIpIHsKKwlfX2ludDY0IHI7CisKKwlpZihzdHIuc2l6ZSgpIDw9IDgpIHsKKwkgICAgLy8gZW5jb2RlZCBkaXJlY3RseQorCSAgICAoKGNoYXIqKSZyKVs3XSA9IDA7CisJICAgIEtNUF9TVFJOQ1BZX1MoKGNoYXIqKSZyLCBzaXplb2YociksIHN0ci5jX3N0cigpLCA4KTsKKwkgICAgcmV0dXJuIHI7CisJfSBlbHNlIHsKKwkgICAgLy8gcmVwcmVzZW50ZWQgYXMgaW5kZXggaW50byB0YWJsZQorCSAgICBtYXA8c3RyaW5nLHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkaXJlY3RvcnkuZmluZChzdHIpOworCSAgICBpZihpdCA9PSBkaXJlY3RvcnkuZW5kKCkpCisJCXN0b3AoIlN0cmluZ1RhYmxlOjplbmNvZGU6IFN0cmluZyBub3cgZm91bmQgaW4gc3RyaW5nIHRhYmxlIik7CisJICAgICgodW5zaWduZWQqKSZyKVswXSA9IDA7CisJICAgICgodW5zaWduZWQqKSZyKVsxXSA9ICgqaXQpLnNlY29uZDsKKwkgICAgcmV0dXJuIHI7CisJfQorICAgIH0KKyAgICAvKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRlZCBieSB4IGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLgorICAgICAgIEVycm9yIGlmIHggcmVmZXJlbmNlcyBhbiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSB0YWJsZS0tcmV0dXJucworICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgKi8KKyAgICBzdHJpbmcgZGVjb2RlKF9faW50NjQgeCkgY29uc3QgeworCWlmKCoodW5zaWduZWQqKSZ4ID09IDApIHsKKwkgICAgLy8gcmVwcmVzZW50ZWQgYXMgaW5kZXggaW50byB0YWJsZQorCSAgICB1bnNpZ25lZCAmcCA9ICgodW5zaWduZWQqKSZ4KVsxXTsKKwkgICAgaWYocCA+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+ICpyZXF1aXJlZEV4dGVybmFsID0gZmluZFJlcXVpcmVkRXh0ZXJuYWwobkV4dGVybmFsLCBhcmdjIC0gMiwgZGVmaW5lZCwgdW5kZWZpbmVkKTsKKyAgICBzZXQ8c3RyaW5nPiBoaWRlOworCisgICAgLyogZGV0ZXJtaW5lIHRoZSBzZXQgb2Ygc3ltYm9scyB0byBoaWRlLS1uYW1lbHkgZGVmaW5lZCBleHRlcm5hbCBzeW1ib2xzIG9mIHRoZQorICAgICAgIHJlcXVpcmVkIGV4dGVybmFsIGZpbGVzCisgICAgKi8KKyAgICBmb3IoaXQgPSByZXF1aXJlZEV4dGVybmFsLT5iZWdpbigpOyBpdCAhPSByZXF1aXJlZEV4dGVybmFsLT5lbmQoKTsgKytpdCkgeworCWludCBpZHggPSAqaXQ7CisJc2V0PHN0cmluZz46Oml0ZXJhdG9yIGl0MjsKKwkvKiBXZSBoYXZlIHRvIGluc2VydCBvbmUgZWxlbWVudCBhdCBhIHRpbWUgaW5zdGVhZCBvZiBpbnNlcnRpbmcgYSByYW5nZSBiZWNhdXNlCisJICAgdGhlIGluc2VydCBtZW1iZXIgZnVuY3Rpb24gdGFraW5nIGEgcmFuZ2UgZG9lc24ndCBleGlzdCBvbiBXaW5kb3dzKiBPUywgYXQgbGVhc3QKKwkgICBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCisJKi8KKwlmb3IoaXQyID0gZGVmaW5lZFtpZHhdLmJlZ2luKCk7IGl0MiAhPSBkZWZpbmVkW2lkeF0uZW5kKCk7ICsraXQyKQorCSAgICBoaWRlLmluc2VydCgqaXQyKTsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIHRoZSBleHRlcm5hbCBmaWxlcy0tcmVtb3ZpbmcgdGhvc2UgdGhhdCBhcmUgbm90IHJlcXVpcmVkIGFuZCBoaWRpbmcKKyAgICAgICB0aGUgYXBwcm9wcmlhdGUgc3ltYm9scyBpbiB0aGUgb3RoZXJzCisgICAgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBuRXh0ZXJuYWw7ICsraSkKKwlpZihyZXF1aXJlZEV4dGVybmFsLT5maW5kKGkpICE9IHJlcXVpcmVkRXh0ZXJuYWwtPmVuZCgpKQorCSAgICBoaWRlU3ltYm9scyhhcmd2WzIgKyBpXSwgaGlkZSk7CisJZWxzZQorCSAgICByZW1vdmUoYXJndlsyICsgaV0pOworICAgIC8vIGhpZGUgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbHMgaW4gdGhlIGludGVybmFsIGZpbGVzCisgICAgZm9yKGkgPSBuRXh0ZXJuYWwgKyAyOyBpIDwgYXJnYzsgKytpKQorCWhpZGVTeW1ib2xzKGFyZ3ZbaV0sIGhpZGUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaTE4bi9lbl9VUy50eHQgYi9maW5hbC9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ1N2ViCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaTE4bi9lbl9VUy50eHQKQEAgLTAsMCArMSw0NzUgQEAKKyMgZW5fVVMudHh0ICMKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIERlZmF1bHQgbWVzc2FnZXMsIGVtYmVkZGVkIGludG8gdGhlIE9wZW5NUCBSVEwsIGFuZCBzb3VyY2UgZm9yIEVuZ2xpc2ggY2F0YWxvZy4KKworCisjIENvbXBhdGlibGUgY2hhbmdlcyAod2hpY2ggZG9lcyBub3QgcmVxdWlyZSB2ZXJzaW9uIGJ1bXBpbmcpOgorIyAgICAgKiBFZGl0aW5nIG1lc3NhZ2UgKG51bWJlciBhbmQgdHlwZSBvZiBwbGFjZWhvbGRlcnMgbXVzdCByZW1haW4sIHJlbGF0aXZlIG9yZGVyIG9mCisjICAgICAgIHBsYWNlaG9sZGVycyBtYXkgYmUgY2hhbmdlZCwgZS5nLiAiRmlsZSAlMSRzIGxpbmUgJTIkZCIgbWF5IGJlIHNhZmVseSBlZGl0ZWQgdG8KKyMgICAgICAgIkxpbmUgJTIkZCBmaWxlICUxJHMiKS4KKyMgICAgICogQWRkaW5nIG5ldyBtZXNzYWdlIHRvIHRoZSBlbmQgb2Ygc2VjdGlvbi4KKyMgSW5jb21wYXRpYmxlIGNoYW5nZXMgKHZlcnNpb24gbXVzdCBiZSBidW1iZWQgYnkgMSk6CisjICAgICAqIEludHJvZHVjaW5nIG5ldyBwbGFjZWhvbGRlcnMgdG8gZXhpc3RpbmcgbWVzc2FnZXMuCisjICAgICAqIENoYW5naW5nIHR5cGUgb2YgcGxhY2Vob2xkZXJzIChlLmcuICJsaW5lICUxJGQiIC0+ICJsaW5lICUxJHMiKS4KKyMgICAgICogUmVhcnJhbmdpbmcgb3JkZXIgb2YgbWVzc2FnZXMuCisjICAgICAqIERlbGV0aW5nIG1lc3NhZ2VzLgorIyBVc2Ugc3BlY2lhbCAiT0JTT0xFVEUiIHBzZXVkb2lkZW50aWZpZXIgZm9yIG9ic29sZXRlIGVudHJpZXMsIHdoaWNoIGlzIGtlcHQgb25seSBmb3IgYmFja3dhcmQKKyMgY29tcGF0aWJpbGl0eS4gV2hlbiB2ZXJzaW9uIGlzIGJ1bXBlZCwgZG8gbm90IGZvcmdldCB0byBkZWxldGUgYWxsIG9ic29sZXRlIGVudHJpZXMuCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIE1FVEEgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTWV0YSBpbmZvcm1hdGlvbiBhYm91dCBtZXNzYWdlIGNhdGFsb2cuCisKK0xhbmd1YWdlICJFbmdsaXNoIgorQ291bnRyeSAgIlVTQSIKK0xhbmdJZCAgICIxMDMzIgorVmVyc2lvbiAgIjIiCitSZXZpc2lvbiAiMjAxNDA4MjciCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gU1RSSU5HUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBTdHJpbmdzIGFyZSBub3QgY29tcGxldGUgbWVzc2FnZXMsIGp1c3QgZnJhZ21lbnRzLiBXZSBuZWVkIHRvIHdvcmsgb24gaXQgYW5kIHJlZHVjZSBudW1iZXIgb2YKKyMgc3RyaW5ncyAodG8gemVybz8pLgorCitFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciIKK1Vua25vd25GaWxlICAgICAgICAgICAgICAgICAgIih1bmtub3duIGZpbGUpIgorTm90QU51bWJlciAgICAgICAgICAgICAgICAgICAibm90IGEgbnVtYmVyIgorQmFkVW5pdCAgICAgICAgICAgICAgICAgICAgICAiYmFkIHVuaXQiCitJbGxlZ2FsQ2hhcmFjdGVycyAgICAgICAgICAgICJpbGxlZ2FsIGNoYXJhY3RlcnMiCitWYWx1ZVRvb0xhcmdlICAgICAgICAgICAgICAgICJ2YWx1ZSB0b28gbGFyZ2UiCitWYWx1ZVRvb1NtYWxsICAgICAgICAgICAgICAgICJ2YWx1ZSB0b28gc21hbGwiCitOb3RNdWx0aXBsZTRLICAgICAgICAgICAgICAgICJ2YWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0ayIKK1Vua25vd25Ub3BvbG9neSAgICAgICAgICAgICAgIlVua25vd24gcHJvY2Vzc29yIHRvcG9sb2d5IgorQ2FudE9wZW5DcHVpbmZvICAgICAgICAgICAgICAiQ2Fubm90IG9wZW4gL3Byb2MvY3B1aW5mbyIKK1Byb2NDcHVpbmZvICAgICAgICAgICAgICAgICAgIi9wcm9jL2NwdWluZm8iCitOb1Byb2NSZWNvcmRzICAgICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAoTm8gcHJvY2Vzc29yIHJlY29yZHMpIgorVG9vTWFueVByb2NSZWNvcmRzICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKFRvbyBtYW55IHByb2Nlc3NvciByZWNvcmRzKSIKK0NhbnRSZXdpbmRDcHVpbmZvICAgICAgICAgICAgIkNhbm5vdCByZXdpbmQgY3B1aW5mbyBmaWxlIgorTG9uZ0xpbmVDcHVpbmZvICAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKGxvbmcgbGluZSkiCitUb29NYW55RW50cmllcyAgICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgZW50cmllcyIKK01pc3NpbmdQcm9jRmllbGQgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBtaXNzaW5nIHByb2Nlc3NvciBmaWVsZCIKK01pc3NpbmdQaHlzaWNhbElERmllbGQgICAgICAgImNwdWluZm8gZmlsZSBtaXNzaW5nIHBoeXNpY2FsIGlkIGZpZWxkIgorTWlzc2luZ1ZhbENwdWluZm8gICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKG1pc3NpbmcgdmFsKSIKK0R1cGxpY2F0ZUZpZWxkQ3B1aW5mbyAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChkdXBsaWNhdGUgZmllbGQpIgorUGh5c2ljYWxJRHNOb3RVbmlxdWUgICAgICAgICAiUGh5c2ljYWwgbm9kZS9wa2cvY29yZS90aHJlYWQgaWRzIG5vdCB1bmlxdWUiCitBcGljTm90UHJlc2VudCAgICAgICAgICAgICAgICJBUElDIG5vdCBwcmVzZW50IgorSW52YWxpZENwdWlkSW5mbyAgICAgICAgICAgICAiSW52YWxpZCBjcHVpZCBpbmZvIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQVBJQyBpZHMgbm90IHVuaXF1ZSIKK0luY29uc2lzdGVudENwdWlkSW5mbyAgICAgICAgIkluY29uc2lzdGVudCBjcHVpZCBpbmZvIgorT3V0T2ZIZWFwTWVtb3J5ICAgICAgICAgICAgICAiT3V0IG9mIGhlYXAgbWVtb3J5IgorTWVtb3J5QWxsb2NGYWlsZWQgICAgICAgICAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIgorQ29yZSAgICAgICAgICAgICAgICAgICAgICAgICAiY29yZSIKK1RocmVhZCAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCIKK1BhY2thZ2UgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UiCitOb2RlICAgICAgICAgICAgICAgICAgICAgICAgICJub2RlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiPHVuZGVmPiIKK0RlY29kaW5nTGVnYWN5QVBJQyAgICAgICAgICAgImRlY29kaW5nIGxlZ2FjeSBBUElDIGlkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcgL3Byb2MvY3B1aW5mbyIKK05vdERlZmluZWQgICAgICAgICAgICAgICAgICAgInZhbHVlIGlzIG5vdCBkZWZpbmVkIgorRWZmZWN0aXZlU2V0dGluZ3MgICAgICAgICAgICAiRWZmZWN0aXZlIHNldHRpbmdzOiIKK1VzZXJTZXR0aW5ncyAgICAgICAgICAgICAgICAgIlVzZXIgc2V0dGluZ3M6IgorU3RvcmFnZU1hcFdhcm5pbmcgICAgICAgICAgICAid2FybmluZzogcG9pbnRlcnMgb3Igc2l6ZSBkb24ndCBtYWtlIHNlbnNlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQ1BVIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiVFBVIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiVFBVcyBwZXIgcGFja2FnZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkhUIGVuYWJsZWQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJIVCBkaXNhYmxlZCIKK0RlY29kaW5neDJBUElDICAgICAgICAgICAgICAgImRlY29kaW5nIHgyQVBJQyBpZHMiCitOb0xlYWYxMVN1cHBvcnQgICAgICAgICAgICAgICJjcHVpZCBsZWFmIDExIG5vdCBzdXBwb3J0ZWQiCitOb0xlYWY0U3VwcG9ydCAgICAgICAgICAgICAgICJjcHVpZCBsZWFmIDQgbm90IHN1cHBvcnRlZCIKK1RocmVhZElEc05vdFVuaXF1ZSAgICAgICAgICAgInRocmVhZCBpZHMgbm90IHVuaXF1ZSIKK1VzaW5nUHRocmVhZCAgICAgICAgICAgICAgICAgInVzaW5nIHB0aHJlYWQgaW5mbyIKK0xlZ2FjeUFwaWNJRHNOb3RVbmlxdWUgICAgICAgImxlZ2FjeSBBUElDIGlkcyBub3QgdW5pcXVlIgoreDJBcGljSURzTm90VW5pcXVlICAgICAgICAgICAieDJBUElDIGlkcyBub3QgdW5pcXVlIgorRGlzcGxheUVudkJlZ2luCQkgICAgICJPUEVOTVAgRElTUExBWSBFTlZJUk9OTUVOVCBCRUdJTiIKK0Rpc3BsYXlFbnZFbmQJCSAgICAgIk9QRU5NUCBESVNQTEFZIEVOVklST05NRU5UIEVORCIKK0RldmljZQkJCSAgICAgIltkZXZpY2VdIgorSG9zdAkJCSAgICAgIltob3N0XSIKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBGT1JNQVRTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IEluZm8gIyUxJGQ6ICUyJHNcbiIKK1dhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgIk9NUDogV2FybmluZyAjJTEkZDogJTIkc1xuIgorRmF0YWwgICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBFcnJvciAjJTEkZDogJTIkc1xuIgorU3lzRXJyICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBTeXN0ZW0gZXJyb3IgIyUxJGQ6ICUyJHNcbiIKK0hpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogSGludDogJTIkc1xuIgorCitQcmFnbWEgICAgICAgICAgICAgICAgICAgICAgICIlMSRzIHByYWdtYSAoYXQgJTIkczolMyRzKCk6JTQkcykiCisgICAgIyAlMSBpcyBwcmFnbWEgbmFtZSAobGlrZSAicGFyYWxsZWwiIG9yICJtYXN0ZXIiLAorICAgICMgJTIgaXMgZmlsZSBuYW1lLAorICAgICMgJTMgaXMgZnVuY3Rpb24gKHJvdXRpbmUpIG5hbWUsCisgICAgIyAlNCBpcyB0aGUgbGluZSBudW1iZXIgKGFzIHN0cmluZywgc28gInMiIHR5cGUgc3BlY2lmaWVyIHNob3VsZCBiZSB1c2VkKS4KKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBNRVNTQUdFUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBNZXNzYWdlcyBvZiBhbnkgc2V2ZXJpdHk6IGluZm9ybWF0aW9uYWwsIHdhcm5pbmcsIG9yIGZhdGFsLgorIyBUbyBtYWludGFpbiBtZXNzYWdlIG51bWJlcnMgKHRoZXkgYXJlIHZpc2libGUgdG8gY3VzdG9tZXJzKSwgYWRkIG5ldyBtZXNzYWdlcyB0byB0aGUgZW5kLgorCisjIFVzZSBmb2xsb3dpbmcgcHJlZml4ZXMgZm9yIG1lc3NhZ2VzIGFuZCBoaW50cyB3aGVuIGFwcHJvcHJpYXRlOgorIyAgICBBZmYgLS0gQWZmaW5pdHkgbWVzc2FnZXMuCisjICAgIENucyAtLSBDb25zaXN0ZW5jeSBjaGVjayBmYWlsdXJlcyAoS01QX0NPTlNJU1RFTkNZX0NIRUNLKS4KKyMgICAgSXR0IC0tIElUVCBOb3RpZnktcmVsYXRlZCBtZXNzYWdlcy4KKworTGlicmFyeUlzU2VyaWFsICAgICAgICAgICAgICAiTGlicmFyeSBpcyBcInNlcmlhbFwiLiIKK0NhbnRPcGVuTWVzc2FnZUNhdGFsb2cgICAgICAgIkNhbm5vdCBvcGVuIG1lc3NhZ2UgY2F0YWxvZyBcIiUxJHNcIjoiCitXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICAgICAgICJEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4iCitMb2NrSXNVbmluaXRpYWxpemVkICAgICAgICAgICIlMSRzOiBMb2NrIGlzIHVuaW5pdGlhbGl6ZWQiCitMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUgICAgICIlMSRzOiBMb2NrIHdhcyBpbml0aWFsaXplZCBhcyBzaW1wbGUsIGJ1dCB1c2VkIGFzIG5lc3RhYmxlIgorTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlICAgICAiJTEkczogTG9jayB3YXMgaW5pdGlhbGl6ZWQgYXMgbmVzdGFibGUsIGJ1dCB1c2VkIGFzIHNpbXBsZSIKK0xvY2tJc0FscmVhZHlPd25lZCAgICAgICAgICAgIiUxJHM6IExvY2sgaXMgYWxyZWFkeSBvd25lZCBieSByZXF1ZXN0aW5nIHRocmVhZCIKK0xvY2tTdGlsbE93bmVkICAgICAgICAgICAgICAgIiUxJHM6IExvY2sgaXMgc3RpbGwgb3duZWQgYnkgYSB0aHJlYWQiCitMb2NrVW5zZXR0aW5nRnJlZSAgICAgICAgICAgICIlMSRzOiBBdHRlbXB0IHRvIHJlbGVhc2UgYSBsb2NrIG5vdCBvd25lZCBieSBhbnkgdGhyZWFkIgorTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciAgICAiJTEkczogQXR0ZW1wdCB0byByZWxlYXNlIGEgbG9jayBvd25lZCBieSBhbm90aGVyIHRocmVhZCIKK1N0YWNrT3ZlcmZsb3cgICAgICAgICAgICAgICAgIlN0YWNrIG92ZXJmbG93IGRldGVjdGVkIGZvciBPcGVuTVAgdGhyZWFkICMlMSRkIgorU3RhY2tPdmVybGFwICAgICAgICAgICAgICAgICAiU3RhY2sgb3ZlcmxhcCBkZXRlY3RlZC4gIgorQXNzZXJ0aW9uRmFpbHVyZSAgICAgICAgICAgICAiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJTEkcyglMiRkKS4iCitDYW50UmVnaXN0ZXJOZXdUaHJlYWQgICAgICAgICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBuZXcgdXNlciB0aHJlYWQuIgorRHVwbGljYXRlTGlicmFyeSAgICAgICAgICAgICAiSW5pdGlhbGl6aW5nICUxJHMsIGJ1dCBmb3VuZCAlMiRzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIgorQ2FudE9wZW5GaWxlRm9yUmVhZGluZyAgICAgICAiQ2Fubm90IG9wZW4gZmlsZSBcIiUxJHNcIiBmb3IgcmVhZGluZzoiCitDYW50R2V0RW52VmFyICAgICAgICAgICAgICAgICJHZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiIGZhaWxlZDoiCitDYW50U2V0RW52VmFyICAgICAgICAgICAgICAgICJTZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiIGZhaWxlZDoiCitDYW50R2V0RW52aXJvbm1lbnQgICAgICAgICAgICJHZXR0aW5nIGVudmlyb25tZW50IGZhaWxlZDoiCitCYWRCb29sVmFsdWUgICAgICAgICAgICAgICAgICIlMSRzPVwiJTIkc1wiOiBXcm9uZyB2YWx1ZSwgYm9vbGVhbiBleHBlY3RlZC4iCitTU1BOb3RCdWlsdEluICAgICAgICAgICAgICAgICJObyBIZWxwZXIgVGhyZWFkIHN1cHBvcnQgYnVpbHQgaW4gdGhpcyBPTVAgbGlicmFyeS4iCitTUFBTb3RmVGVybWluYXRlRmFpbGVkICAgICAgICJIZWxwZXIgdGhyZWFkIGZhaWxlZCB0byBzb2Z0IHRlcm1pbmF0ZS4iCitCdWZmZXJPdmVyZmxvdyAgICAgICAgICAgICAgICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQuIgorUmVhbFRpbWVTY2hlZE5vdFN1cHBvcnRlZCAgICAiUmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5IGlzIG5vdCBzdXBwb3J0ZWQuIgorUnVubmluZ0F0TWF4UHJpb3JpdHkgICAgICAgICAiT01QIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgYXQgbWF4aW11bSBwcmlvcml0eSB3aXRoIHJlYWwtdGltZSBzY2hlZHVsaW5nIHBvbGljeS4gIgorQ2FudENoYW5nZU1vbml0b3JQcmlvcml0eSAgICAiQ2hhbmdpbmcgcHJpb3JpdHkgb2YgdGhlIG1vbml0b3IgdGhyZWFkIGZhaWxlZDoiCitNb25pdG9yV2lsbFN0YXJ2ZSAgICAgICAgICAgICJEZWFkbG9ja3MgYXJlIGhpZ2hseSBwb3NzaWJsZSBkdWUgdG8gbW9uaXRvciB0aHJlYWQgc3RhcnZhdGlvbi4iCitDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSAgICAgICJVbmFibGUgdG8gc2V0IG1vbml0b3IgdGhyZWFkIHN0YWNrIHNpemUgdG8gJTEkbHUgYnl0ZXM6IgorQ2FudFNldFdvcmtlclN0YWNrU2l6ZSAgICAgICAiVW5hYmxlIHRvIHNldCBPTVAgdGhyZWFkIHN0YWNrIHNpemUgdG8gJTEkbHUgYnl0ZXM6IgorQ2FudEluaXRUaHJlYWRBdHRycyAgICAgICAgICAiVGhyZWFkIGF0dHJpYnV0ZSBpbml0aWFsaXphdGlvbiBmYWlsZWQ6IgorQ2FudERlc3Ryb3lUaHJlYWRBdHRycyAgICAgICAiVGhyZWFkIGF0dHJpYnV0ZSBkZXN0cm95aW5nIGZhaWxlZDoiCitDYW50U2V0V29ya2VyU3RhdGUgICAgICAgICAgICJPTVAgdGhyZWFkIGpvaW5hYmxlIHN0YXRlIHNldHRpbmcgZmFpbGVkOiIKK0NhbnRTZXRNb25pdG9yU3RhdGUgICAgICAgICAgIk1vbml0b3IgdGhyZWFkIGpvaW5hYmxlIHN0YXRlIHNldHRpbmcgZmFpbGVkOiIKK05vUmVzb3VyY2VzRm9yV29ya2VyVGhyZWFkICAgIlN5c3RlbSB1bmFibGUgdG8gYWxsb2NhdGUgbmVjZXNzYXJ5IHJlc291cmNlcyBmb3IgT01QIHRocmVhZDoiCitOb1Jlc291cmNlc0Zvck1vbml0b3JUaHJlYWQgICJTeXN0ZW0gdW5hYmxlIHRvIGFsbG9jYXRlIG5lY2Vzc2FyeSByZXNvdXJjZXMgZm9yIHRoZSBtb25pdG9yIHRocmVhZDoiCitDYW50VGVybWluYXRlV29ya2VyVGhyZWFkICAgICJVbmFibGUgdG8gdGVybWluYXRlIE9NUCB0aHJlYWQ6IgorU2NoZWR1bGVLaW5kT3V0T2ZSYW5nZSAgICAgICAiV3Jvbmcgc2NoZWR1bGUgdHlwZSAlMSRkLCBzZWUgPG9tcC5oPiBvciA8b21wX2xpYi5oPiBmaWxlIGZvciB0aGUgbGlzdCBvZiB2YWx1ZXMgc3VwcG9ydGVkLiIKK1Vua25vd25TY2hlZHVsaW5nVHlwZSAgICAgICAgIlVua25vd24gc2NoZWR1bGluZyB0eXBlIFwiJTEkZFwiLiIKK0ludmFsaWRWYWx1ZSAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iCitTbWFsbFZhbHVlICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIHRvbyBzbWFsbC4iCitMYXJnZVZhbHVlICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIHRvbyBsYXJnZS4iCitTdGdJbnZhbGlkVmFsdWUgICAgICAgICAgICAgICIlMSRzOiBcIiUyJHNcIiBpcyBhbiBpbnZhbGlkIHZhbHVlOyBpZ25vcmVkLiIKK0JhcnJSZWxlYXNlVmFsdWVJbnZhbGlkICAgICAgIiUxJHMgcmVsZWFzZSB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkLiIKK0JhcnJHYXRoZXJWYWx1ZUludmFsaWQgICAgICAgIiUxJHMgZ2F0aGVyIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkcyBzdXBwb3J0ZWQgb25seSBvbiBkZWJ1ZyBidWlsZHM7IGlnbm9yZWQuIgorUGFyUmFuZ2VTeW50YXggICAgICAgICAgICAgICAiU3ludGF4IGVycm9yOiBVc2FnZTogJTEkcz1bIHJvdXRpbmU9PGZ1bmM+IHwgZmlsZW5hbWU9PGZpbGU+IHwgcmFuZ2U9PGxiPjo8dWI+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInwgZXhjbF9yYW5nZT08bGI+Ojx1Yj4gXSwuLi4iCitVbmJhbGFuY2VkUXVvdGVzICAgICAgICAgICAgICJVbmJhbGFuY2VkIHF1b3RlcyBpbiAlMSRzLiIKK0VtcHR5U3RyaW5nICAgICAgICAgICAgICAgICAgIkVtcHR5IHN0cmluZyBzcGVjaWZpZWQgZm9yICUxJHM7IGlnbm9yZWQuIgorTG9uZ1ZhbHVlICAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBpcyB0b28gbG9uZzsgaWdub3JlZC4iCitJbnZhbGlkQ2xhdXNlICAgICAgICAgICAgICAgICIlMSRzOiBJbnZhbGlkIGNsYXVzZSBpbiBcIiUyJHNcIi4iCitFbXB0eUNsYXVzZSAgICAgICAgICAgICAgICAgICJFbXB0eSBjbGF1c2UgaW4gJTEkcy4iCitJbnZhbGlkQ2h1bmsgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQgY2h1bmsgc2l6ZS4iCitMYXJnZUNodW5rICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIHRvIGxhcmdlIGNodW5rIHNpemUuIgorSWdub3JlQ2h1bmsgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyBpZ25vcmVkLiIKK0NhbnRHZXRQcm9jRnJlcSAgICAgICAgICAgICAgIkNhbm5vdCBnZXQgcHJvY2Vzc29yIGZyZXF1ZW5jeSwgdXNpbmcgemVybyBLTVBfSVRUX1BSRVBBUkVfREVMQVkuIgorRW52UGFyYWxsZWxXYXJuICAgICAgICAgICAgICAiJTEkcyBtdXN0IGJlIHNldCBwcmlvciB0byBmaXJzdCBwYXJhbGxlbCByZWdpb247IGlnbm9yZWQuIgorQWZmUGFyYW1EZWZpbmVkICAgICAgICAgICAgICAiJTEkczogcGFyYW1ldGVyIGhhcyBiZWVuIHNwZWNpZmllZCBhbHJlYWR5LCBpZ25vcmluZyBcIiUyJHNcIi4iCitBZmZJbnZhbGlkUGFyYW0gICAgICAgICAgICAgICIlMSRzOiBwYXJhbWV0ZXIgaW52YWxpZCwgaWdub3JpbmcgXCIlMiRzXCIuIgorQWZmTWFueVBhcmFtcyAgICAgICAgICAgICAgICAiJTEkczogdG9vIG1hbnkgaW50ZWdlciBwYXJhbWV0ZXJzIHNwZWNpZmllZCwgaWdub3JpbmcgXCIlMiRzXCIuIgorQWZmTWFueVBhcmFtc0ZvckxvZ2ljICAgICAgICAiJTEkczogdG9vIG1hbnkgaW50ZWdlciBwYXJhbWV0ZXJzIHNwZWNpZmllZCBmb3IgbG9naWNhbCBvciBwaHlzaWNhbCB0eXBlLCBpZ25vcmluZyBcIiUyJGRcIi4iCitBZmZOb1BhcmFtICAgICAgICAgICAgICAgICAgICIlMSRzOiAnJTIkcycgdHlwZSBkb2VzIG5vdCB0YWtlIGFueSBpbnRlZ2VyIHBhcmFtZXRlcnMsIGlnbm9yaW5nIHRoZW0uIgorQWZmTm9Qcm9jTGlzdCAgICAgICAgICAgICAgICAiJTEkczogcHJvY2xpc3Qgbm90IHNwZWNpZmllZCB3aXRoIGV4cGxpY2l0IGFmZmluaXR5IHR5cGUsIHVzaW5nIFwibm9uZVwiLiIKK0FmZlByb2NMaXN0Tm9UeXBlICAgICAgICAgICAgIiUxJHM6IHByb2NsaXN0IHNwZWNpZmllZCwgc2V0dGluZyBhZmZpbml0eSB0eXBlIHRvIFwiZXhwbGljaXRcIi4iCitBZmZQcm9jTGlzdE5vdEV4cGxpY2l0ICAgICAgICIlMSRzOiBwcm9jbGlzdCBzcGVjaWZpZWQgd2l0aG91dCBcImV4cGxpY2l0XCIgYWZmaW5pdHkgdHlwZSwgcHJvY2xpc3QgaWdub3JlZC4iCitBZmZTeW50YXhFcnJvciAgICAgICAgICAgICAgICIlMSRzOiBzeW50YXggZXJyb3IsIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZaZXJvU3RyaWRlICAgICAgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoemVybyBzdHJpZGUpLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmU3RhcnRHcmVhdGVyRW5kICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKCUyJGQgPiAlMyRkKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlN0cmlkZUxlc3NaZXJvICAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICglMiRkIDwgJTMkZCAmIHN0cmlkZSA8IDApLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmUmFuZ2VUb29CaWcgICAgICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKCglMiRkLSUzJGQpLyU0JGQgdG9vIGJpZyksIG5vdCB1c2luZyBhZmZpbml0eS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIGlzIGRlZmluZWQuICUzJHMgd2lsbCBiZSBpZ25vcmVkLiIKK0FmZk5vdFN1cHBvcnRlZCAgICAgICAgICAgICAgIiUxJHM6IGFmZmluaXR5IG5vdCBzdXBwb3J0ZWQsIHVzaW5nIFwiZGlzYWJsZWRcIi4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBhZmZpbml0eSBvbmx5IHN1cHBvcnRlZCBmb3IgSW50ZWwoUikgcHJvY2Vzc29ycy4iCitHZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkICAgICIlMSRzOiBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkLiIKK1NldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQgICAgIiUxJHM6IHNldGFmZmluaXR5IHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogcHRocmVhZF9hZmZfc2V0X25wIGNhbGwgbm90IGZvdW5kLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHB0aHJlYWRfZ2V0X251bV9yZXNvdXJjZXNfbnAgY2FsbCBub3QgZm91bmQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogdGhlIE9TIGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IGFmZmluaXR5LiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHB0aHJlYWRfZ2V0X251bV9yZXNvdXJjZXNfbnAgcmV0dXJuZWQgJTIkZC4iCitBZmZDYW50R2V0TWFza1NpemUgICAgICAgICAgICIlMSRzOiBjYW5ub3QgZGV0ZXJtaW5lIHByb3BlciBhZmZpbml0eSBtYXNrIHNpemUuIgorUGFyc2VTaXplSW50V2FybiAgICAgICAgICAgICAiJTEkcz1cIiUyJHNcIjogJTMkcy4iCitQYXJzZUV4dHJhQ2hhcnNXYXJuICAgICAgICAgICIlMSRzOiBleHRyYSB0cmFpbGluZyBjaGFyYWN0ZXJzIGlnbm9yZWQ6IFwiJTIkc1wiLiIKK1Vua25vd25Gb3JjZVJlZHVjdGlvbiAgICAgICAgIiUxJHM6IHVua25vd24gbWV0aG9kIFwiJTIkc1wiLiIKK1RpbWVyVXNlR2V0dGltZW9mZGF5ICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2tfZ2V0dGltZSBpcyB1bmRlZmluZWQsIHVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lck5lZWRNb3JlUGFyYW0gICAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IFwiJTEkc1wiIG5lZWRzIGFkZGl0aW9uYWwgcGFyYW1ldGVyLCBlLmcuICdjbG9ja19nZXR0aW1lLDInLiBVc2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJJbnZhbGlkUGFyYW0gICAgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9ja19nZXR0aW1lIHBhcmFtZXRlciBcIiUxJHNcIiBpcyBpbnZhbGlkLCB1c2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJHZXR0aW1lRmFpbGVkICAgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9ja19nZXR0aW1lIGZhaWxlZCwgdXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVyVW5rbm93bkZ1bmN0aW9uICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2sgZnVuY3Rpb24gdW5rbm93biAoaWdub3JpbmcgdmFsdWUgXCIlMSRzXCIpLiIKK1Vua25vd25TY2hlZFR5cGVEZXRlY3RlZCAgICAgIlVua25vd24gc2NoZWR1bGluZyB0eXBlIGRldGVjdGVkLiIKK0Rpc3BhdGNoTWFueVRocmVhZHMgICAgICAgICAgIlRvbyBtYW55IHRocmVhZHMgdG8gdXNlIGFuYWx5dGljYWwgZ3VpZGVkIHNjaGVkdWxpbmcgLSBzd2l0Y2hpbmcgdG8gaXRlcmF0aXZlIGd1aWRlZCBzY2hlZHVsaW5nLiIKK0l0dExvb2t1cEZhaWxlZCAgICAgICAgICAgICAgIml0dG5vdGlmeTogTG9va3VwIG9mIFwiJTEkc1wiIGZ1bmN0aW9uIGluIFwiJTIkc1wiIGxpYnJhcnkgZmFpbGVkLiIKK0l0dExvYWRMaWJGYWlsZWQgICAgICAgICAgICAgIml0dG5vdGlmeTogTG9hZGluZyBcIiUxJHNcIiBsaWJyYXJ5IGZhaWxlZC4iCitJdHRBbGxOb3RpZkRpc2FibGVkICAgICAgICAgICJpdHRub3RpZnk6IEFsbCBpdHQgbm90aWZpY2F0aW9ucyBkaXNhYmxlZC4iCitJdHRPYmpOb3RpZkRpc2FibGVkICAgICAgICAgICJpdHRub3RpZnk6IE9iamVjdCBzdGF0ZSBpdHQgbm90aWZpY2F0aW9ucyBkaXNhYmxlZC4iCitJdHRNYXJrTm90aWZEaXNhYmxlZCAgICAgICAgICJpdHRub3RpZnk6IE1hcmsgaXR0IG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQuIgorSXR0VW5sb2FkTGliRmFpbGVkICAgICAgICAgICAiaXR0bm90aWZ5OiBVbmxvYWRpbmcgXCIlMSRzXCIgbGlicmFyeSBmYWlsZWQuIgorQ2FudEZvcm1UaHJUZWFtICAgICAgICAgICAgICAiQ2Fubm90IGZvcm0gYSB0ZWFtIHdpdGggJTEkZCB0aHJlYWRzLCB1c2luZyAlMiRkIGluc3RlYWQuIgorQWN0aXZlTGV2ZWxzTmVnYXRpdmUgICAgICAgICAiUmVxdWVzdGVkIG51bWJlciBvZiBhY3RpdmUgcGFyYWxsZWwgbGV2ZWxzIFwiJTEkZFwiIGlzIG5lZ2F0aXZlOyBpZ25vcmVkLiIKK0FjdGl2ZUxldmVsc0V4Y2VlZExpbWl0ICAgICAgIlJlcXVlc3RlZCBudW1iZXIgb2YgYWN0aXZlIHBhcmFsbGVsIGxldmVscyBcIiUxJGRcIiBleGNlZWRzIHN1cHBvcnRlZCBsaW1pdDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGZvbGxvd2luZyBsaW1pdCB2YWx1ZSB3aWxsIGJlIHVzZWQ6IFwiJTEkZFwiLiIKK1NldExpYnJhcnlJbmNvcnJlY3RDYWxsICAgICAgImttcF9zZXRfbGlicmFyeSBtdXN0IG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIHRvcCBsZXZlbCBzZXJpYWwgdGhyZWFkOyBpZ25vcmVkLiIKK0ZhdGFsU3lzRXJyb3IgICAgICAgICAgICAgICAgIkZhdGFsIHN5c3RlbSBlcnJvciBkZXRlY3RlZC4iCitPdXRPZkhlYXBNZW1vcnkgICAgICAgICAgICAgICJPdXQgb2YgaGVhcCBtZW1vcnkuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQ2xlYXJpbmcgX19LTVBfUkVHSVNURVJFRF9MSUIgZW52IHZhciBmYWlsZWQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiUmVnaXN0ZXJpbmcgbGlicmFyeSB3aXRoIGVudiB2YXIgZmFpbGVkLiIKK1VzaW5nX2ludF9WYWx1ZSAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRkXCIgd2lsbCBiZSB1c2VkLiIKK1VzaW5nX3VpbnRfVmFsdWUgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiR1XCIgd2lsbCBiZSB1c2VkLiIKK1VzaW5nX3VpbnQ2NF9WYWx1ZSAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgd2lsbCBiZSB1c2VkLiIKK1VzaW5nX3N0cl9WYWx1ZSAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgd2lsbCBiZSB1c2VkLiIKK01heFZhbHVlVXNpbmcgICAgICAgICAgICAgICAgIiUxJHMgbWF4aW11bSB2YWx1ZSBcIiUyJGRcIiB3aWxsIGJlIHVzZWQuIgorTWluVmFsdWVVc2luZyAgICAgICAgICAgICAgICAiJTEkcyBtaW5pbXVtIHZhbHVlIFwiJTIkZFwiIHdpbGwgYmUgdXNlZC4iCitNZW1vcnlBbGxvY0ZhaWxlZCAgICAgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIgorRmlsZU5hbWVUb29Mb25nICAgICAgICAgICAgICAiRmlsZSBuYW1lIHRvbyBsb25nLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkxvY2sgdGFibGUgb3ZlcmZsb3cuIgorTWFueVRocmVhZHNGb3JUUERpcmVjdGl2ZSAgICAiVG9vIG1hbnkgdGhyZWFkcyB0byB1c2UgdGhyZWFkcHJpdmF0ZSBkaXJlY3RpdmUuIgorQWZmaW5pdHlJbnZhbGlkTWFzayAgICAgICAgICAiJTEkczogaW52YWxpZCBtYXNrLiIKK1dyb25nRGVmaW5pdGlvbiAgICAgICAgICAgICAgIldyb25nIGRlZmluaXRpb24uIgorVExTU2V0VmFsdWVGYWlsZWQgICAgICAgICAgICAiV2luZG93cyogT1M6IFRMUyBTZXQgVmFsdWUgZmFpbGVkLiIKK1RMU091dE9mSW5kZXhlcyAgICAgICAgICAgICAgIldpbmRvd3MqIE9TOiBUTFMgb3V0IG9mIGluZGV4ZXMuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiUERPTkUgZGlyZWN0aXZlIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIERPIGRpcmVjdGl2ZS4iCitDYW50R2V0TnVtQXZhaWxDUFUgICAgICAgICAgICJDYW5ub3QgZ2V0IG51bWJlciBvZiBhdmFpbGFibGUgQ1BVcy4iCitBc3N1bWVkTnVtQ1BVICAgICAgICAgICAgICAgICJBc3N1bWVkIG51bWJlciBvZiBDUFVzIGlzIDIuIgorRXJyb3JJbml0aWFsaXplQWZmaW5pdHkgICAgICAiRXJyb3IgaW5pdGlhbGl6aW5nIGFmZmluaXR5IC0gbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlRocmVhZHNNYXlNaWdyYXRlICAgICAgICAgIlRocmVhZHMgbWF5IG1pZ3JhdGUgYWNyb3NzIGFsbCBhdmFpbGFibGUgT1MgcHJvY3MgKGdyYW51bGFyaXR5IHNldHRpbmcgdG9vIGNvYXJzZSkuIgorQWZmSWdub3JlSW52YWxpZFByb2NJRCAgICAgICAiSWdub3JpbmcgaW52YWxpZCBPUyBwcm9jIElEICUxJGQuIgorQWZmTm9WYWxpZFByb2NJRCAgICAgICAgICAgICAiTm8gdmFsaWQgT1MgcHJvYyBJRHMgc3BlY2lmaWVkIC0gbm90IHVzaW5nIGFmZmluaXR5LiIKK1VzaW5nRmxhdE9TICAgICAgICAgICAgICAgICAgIiUxJHMgLSB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK1VzaW5nRmxhdE9TRmlsZSAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgLSB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK1VzaW5nRmxhdE9TRmlsZUxpbmUgICAgICAgICAgIiUxJHMsIGxpbmUgJTIkZDogJTMkcyAtIHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorRmlsZU1zZ0V4aXRpbmcgICAgICAgICAgICAgICAiJTEkczogJTIkcyAtIGV4aXRpbmcuIgorRmlsZUxpbmVNc2dFeGl0aW5nICAgICAgICAgICAiJTEkcywgbGluZSAlMiRkOiAlMyRzIC0gZXhpdGluZy4iCitDb25zdHJ1Y3RJZGVudEludmFsaWQgICAgICAgICJDb25zdHJ1Y3QgaWRlbnRpZmllciBpbnZhbGlkLiIKK1RocmVhZElkZW50SW52YWxpZCAgICAgICAgICAgIlRocmVhZCBpZGVudGlmaWVyIGludmFsaWQuIgorUlRMTm90SW5pdGlhbGl6ZWQgICAgICAgICAgICAicnVudGltZSBsaWJyYXJ5IG5vdCBpbml0aWFsaXplZC4iCitUUENvbW1vbkJsb2Nrc0luY29uc2lzdCAgICAgICJJbmNvbnNpc3RlbnQgVEhSRUFEUFJJVkFURSBjb21tb24gYmxvY2sgZGVjbGFyYXRpb25zIGFyZSBub24tY29uZm9ybWluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgYXJlIHVuc3VwcG9ydGVkLiBFaXRoZXIgYWxsIHRocmVhZHByaXZhdGUgY29tbW9uIGJsb2NrcyBtdXN0IGJlIGRlY2xhcmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkZW50aWNhbGx5LCBvciB0aGUgbGFyZ2VzdCBpbnN0YW5jZSBvZiBlYWNoIHRocmVhZHByaXZhdGUgY29tbW9uIGJsb2NrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgcmVmZXJlbmNlZCBmaXJzdCBkdXJpbmcgdGhlIHJ1bi4iCitDYW50U2V0VGhyZWFkQWZmTWFzayAgICAgICAgICJDYW5ub3Qgc2V0IHRocmVhZCBhZmZpbml0eSBtYXNrLiIKK0NhbnRTZXRUaHJlYWRQcmlvcml0eSAgICAgICAgIkNhbm5vdCBzZXQgdGhyZWFkIHByaW9yaXR5LiIKK0NhbnRDcmVhdGVUaHJlYWQgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgdGhyZWFkLiIKK0NhbnRDcmVhdGVFdmVudCAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgZXZlbnQuIgorQ2FudFNldEV2ZW50ICAgICAgICAgICAgICAgICAiQ2Fubm90IHNldCBldmVudC4iCitDYW50Q2xvc2VIYW5kbGUgICAgICAgICAgICAgICJDYW5ub3QgY2xvc2UgaGFuZGxlLiIKK1Vua25vd25MaWJyYXJ5VHlwZSAgICAgICAgICAgIlVua25vd24gbGlicmFyeSB0eXBlOiAlMSRkLiIKK1JlYXBNb25pdG9yRXJyb3IgICAgICAgICAgICAgIk1vbml0b3IgZGlkIG5vdCByZWFwIHByb3Blcmx5LiIKK1JlYXBXb3JrZXJFcnJvciAgICAgICAgICAgICAgIldvcmtlciB0aHJlYWQgZmFpbGVkIHRvIGpvaW4uIgorQ2hhbmdlVGhyZWFkQWZmTWFza0Vycm9yICAgICAiQ2Fubm90IGNoYW5nZSB0aHJlYWQgYWZmaW5pdHkgbWFzay4iCitUaHJlYWRzTWlncmF0ZSAgICAgICAgICAgICAgICIlMSRzOiBUaHJlYWRzIG1heSBtaWdyYXRlIGFjcm9zcyAlMiRkIGlubmVybW9zdCBsZXZlbHMgb2YgbWFjaGluZSIKK0RlY3JlYXNlVG9UaHJlYWRzICAgICAgICAgICAgIiUxJHM6IGRlY3JlYXNlIHRvICUyJGQgdGhyZWFkcyIKK0luY3JlYXNlVG9UaHJlYWRzICAgICAgICAgICAgIiUxJHM6IGluY3JlYXNlIHRvICUyJGQgdGhyZWFkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEludGVybmFsIHRocmVhZCAlMiRkIGJvdW5kIHRvIE9TIHByb2Mgc2V0ICUzJHMiCitBZmZDYXBhYmxlVXNlQ3B1aW5mbyAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBjcHVpbmZvIGZpbGUiCitBZmZVc2VHbG9iQ3B1aWQgICAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBnbG9iYWwgY3B1aWQgaW5mbyIKK0FmZkNhcGFibGVVc2VGbGF0ICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGRlZmF1bHQgXCJmbGF0XCIgdG9wb2xvZ3kiCitBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWQgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgbG9jYWwgY3B1aWQgaW5mbyIKK0FmZk5vdENhcGFibGVVc2VDcHVpbmZvICAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBjcHVpbmZvIGZpbGUiCitBZmZGbGF0VG9wb2xvZ3kgICAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgYXNzdW1taW5nIFwiZmxhdFwiIHRvcG9sb2d5IgorSW5pdE9TUHJvY1NldFJlc3BlY3QgICAgICAgICAiJTEkczogSW5pdGlhbCBPUyBwcm9jIHNldCByZXNwZWN0ZWQ6ICUyJHMiCitJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCAgICAgICIlMSRzOiBJbml0aWFsIE9TIHByb2Mgc2V0IG5vdCByZXNwZWN0ZWQ6ICUyJHMiCitBdmFpbGFibGVPU1Byb2MgICAgICAgICAgICAgICIlMSRzOiAlMiRkIGF2YWlsYWJsZSBPUyBwcm9jcyIKK1VuaWZvcm0gICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IFVuaWZvcm0gdG9wb2xvZ3kiCitOb25Vbmlmb3JtICAgICAgICAgICAgICAgICAgICIlMSRzOiBOb251bmlmb3JtIHRvcG9sb2d5IgorVG9wb2xvZ3kgICAgICAgICAgICAgICAgICAgICAiJTEkczogJTIkZCBwYWNrYWdlcyB4ICUzJGQgY29yZXMvcGtnIHggJTQkZCB0aHJlYWRzL2NvcmUgKCU1JGQgdG90YWwgY29yZXMpIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyB0byBwaHlzaWNhbCB0aHJlYWQgbWFwIChbXSA9PiBsZXZlbCBub3QgaW4gbWFwKToiCitPU1Byb2NUb1BhY2thZ2UgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jIDxuPiBtYXBzIHRvIDxuPnRoIHBhY2thZ2UgY29yZSAwIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIFtjb3JlICU0JGRdIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBbY29yZSAlNCRkXSBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gW2NvcmUgJTQkZF0gdGhyZWFkICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBjb3JlICU0JGQgW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBbY29yZSAlNCRkXSBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gY29yZSAlNCRkIHRocmVhZCAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIGNvcmUgJTQkZCBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIFtjb3JlICU0JGRdIHRocmVhZCAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIGNvcmUgJTQkZCB0aHJlYWQgJTUkZCIKK09TUHJvY01hcFRvUGFjayAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvICUzJHMiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBJbnRlcm5hbCB0aHJlYWQgJTIkZCBjaGFuZ2VkIGFmZmluaXR5IG1hc2sgZnJvbSAlMyRzIHRvICU0JHMiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQsIENQVSAlNCRkLCBUUFUgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCwgQ1BVICU0JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBIVCBlbmFibGVkOyAlMiRkIHBhY2thZ2VzOyAlMyRkIFRQVTsgJTQkZCBUUFVzIHBlciBwYWNrYWdlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSFQgZGlzYWJsZWQ7ICUyJGQgcGFja2FnZXMiCitCYXJyaWVyc0luRGlmZmVyZW50T3JkZXIgICAgICJUaHJlYWRzIGVuY291bnRlcmVkIGJhcnJpZXJzIGluIGRpZmZlcmVudCBvcmRlci4gIgorRnVuY3Rpb25FcnJvciAgICAgICAgICAgICAgICAiRnVuY3Rpb24gJTEkcyBmYWlsZWQ6IgorVG9wb2xvZ3lFeHRyYSAgICAgICAgICAgICAgICAiJTEkczogJTIkcyBwYWNrYWdlcyB4ICUzJGQgY29yZXMvcGtnIHggJTQkZCB0aHJlYWRzL2NvcmUgKCU1JGQgdG90YWwgY29yZXMpIgorV3JvbmdNZXNzYWdlQ2F0YWxvZyAgICAgICAgICAiSW5jb21wYXRpYmxlIG1lc3NhZ2UgY2F0YWxvZyBcIiUxJHNcIjogVmVyc2lvbiBcIiUyJHNcIiBmb3VuZCwgdmVyc2lvbiBcIiUzJHNcIiBleHBlY3RlZC4iCitTdGdJZ25vcmVkICAgICAgICAgICAgICAgICAgICIlMSRzOiBpZ25vcmVkIGJlY2F1c2UgJTIkcyBoYXMgYmVlbiBkZWZpbmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlMSwgLS0gbmFtZSBvZiBpZ25vcmVkIHZhcmlhYmxlLCAlMiAtLSBuYW1lIG9mIHZhcmlhYmxlIHdpdGggaGlnaGVyIHByaW9yaXR5LgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogb3ZlcnJpZGVzICUzJHMgc3BlY2lmaWVkIGJlZm9yZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJTEsICUyIC0tIG5hbWUgYW5kIHZhbHVlIG9mIHRoZSBvdmVycmlkaW5nIHZhcmlhYmxlLCAlMyAtLSBuYW1lIG9mIG92ZXJyaWRlbiB2YXJpYWJsZS4KKworIyAtLS0gT3Blbk1QIGVycm9ycyBkZXRlY3RlZCBhdCBydW50aW1lIC0tLQorIworIyAgICAlMSBpcyB0aGUgbmFtZSBvZiBPcGVuTVAgY29uc3RydWN0IChmb3JtYXR0ZWQgd2l0aCAiUHJhZ21hIiBmb3JtYXQpLgorIworQ25zQm91bmRUb1dvcmtzaGFyaW5nICAgICAgICAiJTEkcyBtdXN0IGJlIGJvdW5kIHRvIGEgd29yay1zaGFyaW5nIG9yIHdvcmstcXVldWluZyBjb25zdHJ1Y3Qgd2l0aCBhbiBcIm9yZGVyZWRcIiBjbGF1c2UiCitDbnNEZXRlY3RlZEVuZCAgICAgICAgICAgICAgICJEZXRlY3RlZCBlbmQgb2YgJTEkcyB3aXRob3V0IGZpcnN0IGV4ZWN1dGluZyBhIGNvcnJlc3BvbmRpbmcgYmVnaW5uaW5nLiIKK0Nuc0l0ZXJhdGlvblJhbmdlVG9vTGFyZ2UgICAgIkl0ZXJhdGlvbiByYW5nZSB0b28gbGFyZ2UgaW4gJTEkcy4iCitDbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkICAgICIlMSRzIG11c3Qgbm90IGhhdmUgYSBsb29wIGluY3JlbWVudCB0aGF0IGV2YWx1YXRlcyB0byB6ZXJvLiIKKyMKKyMgICAgJTEgaXMgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IE9wZW5NUCBjb25zdHJ1Y3QsICUyIC0tIHRoZSBuYW1lIG9mIHRoZSBzZWNvbmQgb25lIChib3RoIGZvcm1hdHRlZCB3aXRoICJQcmFnbWEiIGZvcm1hdCkuCisjCitDbnNFeHBlY3RlZEVuZCAgICAgICAgICAgICAgICJFeHBlY3RlZCBlbmQgb2YgJTEkczsgJTIkcywgaG93ZXZlciwgaGFzIG1vc3QgcmVjZW50bHkgYmVndW4gZXhlY3V0aW9uLiIKK0Nuc0ludmFsaWROZXN0aW5nICAgICAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIgorQ25zTXVsdGlwbGVOZXN0aW5nICAgICAgICAgICAiJTEkcyBjYW5ub3QgYmUgZXhlY3V0ZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGV4ZWN1dGlvbiBvZiBvbmUgcGFyYWxsZWwgaXRlcmF0aW9uL3NlY3Rpb24gb2YgJTIkcyIKK0Nuc05lc3RpbmdTYW1lTmFtZSAgICAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIG9mIHRoZSBzYW1lIG5hbWUiCitDbnNOb09yZGVyZWRDbGF1c2UgICAgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyB0aGF0IGRvZXMgbm90IGhhdmUgYW4gXCJvcmRlcmVkXCIgY2xhdXNlIgorQ25zTm90SW5UYXNrQ29uc3RydWN0ICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMgYnV0IG5vdCB3aXRoaW4gYW55IG9mIGl0cyBcInRhc2tcIiBjb25zdHJ1Y3RzIgorQ25zVGhyZWFkc0F0QmFycmllciAgICAgICAgICAiT25lIHRocmVhZCBhdCAlMSRzIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0ICUyJHMuIgorCisjIE5ldyBlcnJvcnMKK0NhbnRDb25uZWN0ICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb25uZWN0IHRvICUxJHMiCitDYW50Q29ubmVjdFVzaW5nICAgICAgICAgICAgICJDYW5ub3QgY29ubmVjdCB0byAlMSRzIC0gVXNpbmcgJTIkcyIKK0xpYk5vdFN1cHBvcnQgICAgICAgICAgICAgICAgIiUxJHMgZG9lcyBub3Qgc3VwcG9ydCAlMiRzLiBDb250aW51aW5nIHdpdGhvdXQgdXNpbmcgJTIkcy4iCitMaWJOb3RTdXBwb3J0Rm9yICAgICAgICAgICAgICIlMSRzIGRvZXMgbm90IHN1cHBvcnQgJTIkcyBmb3IgJTMkcy4gQ29udGludWluZyB3aXRob3V0IHVzaW5nICUyJHMuIgorU3RhdGljTGliTm90U3VwcG9ydCAgICAgICAgICAiU3RhdGljICUxJHMgZG9lcyBub3Qgc3VwcG9ydCAlMiRzLiBDb250aW51aW5nIHdpdGhvdXQgdXNpbmcgJTIkcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJLTVBfRFlOQU1JQ19NT0RFPWlybWwgY2Fubm90IGJlIHVzZWQgd2l0aCBLTVBfVVNFX0lSTUw9MCIKK0l0dFVua25vd25Hcm91cCAgICAgICAgICAgICAgIml0dG5vdGlmeTogVW5rbm93biBncm91cCBcIiUyJHNcIiBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIuIgorSXR0RW52VmFyVG9vTG9uZyAgICAgICAgICAgICAiaXR0bm90aWZ5OiBFbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIiB0b28gbG9uZzogQWN0dWFsIGxlbmd0aHMgaXMgJTIkbHUsIG1heCBhbGxvd2VkIGxlbmd0aCBpcyAlMyRsdS4iCitBZmZVc2VHbG9iQ3B1aWRMMTEgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBnbG9iYWwgY3B1aWQgbGVhZiAxMSBpbmZvIgorQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkTDExICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIGxvY2FsIGNwdWlkIGxlYWYgMTEgaW5mbyIKK0FmZkluZm9TdHIgICAgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMuIgorQWZmSW5mb1N0clN0ciAgICAgICAgICAgICAgICAiJTEkczogJTIkcyAtICUzJHMuIgorT1NQcm9jVG9QaHlzaWNhbFRocmVhZE1hcCAgICAiJTEkczogT1MgcHJvYyB0byBwaHlzaWNhbCB0aHJlYWQgbWFwOiIKK0FmZlVzaW5nRmxhdE9TICAgICAgICAgICAgICAgIiUxJHM6IHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorQWZmUGFyc2VGaWxlbmFtZSAgICAgICAgICAgICAiJTEkczogcGFyc2luZyAlMiRzLiIKK01zZ0V4aXRpbmcgICAgICAgICAgICAgICAgICAgIiUxJHMgLSBleGl0aW5nLiIKK0luY29tcGF0aWJsZUxpYnJhcnkgICAgICAgICAgIkluY29tcGF0aWJsZSAlMSRzIGxpYnJhcnkgd2l0aCB2ZXJzaW9uICUyJHMgZm91bmQuIgorSXR0RnVuY3Rpb25FcnJvciAgICAgICAgICAgICAiaXR0bm90aWZ5OiBGdW5jdGlvbiAlMSRzIGZhaWxlZDoiCitJdHRVbmtub3duRXJyb3IgICAgICAgICAgICAgICJpdHRub2ZpZnk6IEVycm9yICMlMSRkLiIKK0Vudk1pZGRsZVdhcm4gICAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gZmlyc3QgcGFyYWxsZWwgcmVnaW9uIG9yIGNlcnRhaW4gQVBJIGNhbGxzOyBpZ25vcmVkLiIKK0Nuc0xvY2tOb3REZXN0cm95ZWQgICAgICAgICAgIkxvY2sgaW5pdGlhbGl6ZWQgYXQgJTEkcyglMiRkKSB3YXMgbm90IGRlc3Ryb3llZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJTEsICUyLCAlMywgJTQgLS0gZmlsZSwgbGluZSwgZnVuYywgY29sCitDYW50TG9hZEJhbFVzaW5nICAgICAgICAgICAgICJDYW5ub3QgZGV0ZXJtaW5lIG1hY2hpbmUgbG9hZCBiYWxhbmNlIC0gVXNpbmcgJTEkcyIKK0FmZk5vdENhcGFibGVVc2VQdGhyZWFkICAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBwdGhyZWFkIGluZm8iCitBZmZVc2VQdGhyZWFkICAgICAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBwdGhyZWFkIGluZm8iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJMb2FkaW5nIFwiJTEkc1wiIGxpYnJhcnkgZmFpbGVkOiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkxvb2t1cCBvZiBcIiUxJHNcIiBmdW5jdGlvbiBmYWlsZWQ6IgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQnVmZmVyIHRvbyBzbWFsbC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJFcnJvciAjJTEkZC4iCitOdGhTeW50YXhFcnJvciAgICAgICAgICAgICAgICIlMSRzOiBJbnZhbGlkIHN5bWJvbHMgZm91bmQuIENoZWNrIHRoZSB2YWx1ZSBcIiUyJHNcIi4iCitOdGhTcGFjZXNOb3RBbGxvd2VkICAgICAgICAgICIlMSRzOiBTcGFjZXMgYmV0d2VlbiBkaWdpdHMgYXJlIG5vdCBhbGxvd2VkIFwiJTIkc1wiLiIKK0FmZlN0clBhcnNlRmlsZW5hbWUgICAgICAgICAgIiUxJHM6ICUyJHMgLSBwYXJzaW5nICUzJHMuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkcyBjYW5ub3QgYmUgc3BlY2lmaWVkIHZpYSBrbXBfc2V0X2RlZmF1bHRzKCkgb24gdGhpcyBtYWNoaW5lIGJlY2F1c2UgaXQgaGFzIG1vcmUgdGhhbiBvbmUgcHJvY2Vzc29yIGdyb3VwLiIKK0FmZlR5cGVDYW50VXNlTXVsdEdyb3VwcyAgICAgIkNhbm5vdCB1c2UgYWZmaW5pdHkgdHlwZSBcIiUxJHNcIiB3aXRoIG11bHRpcGxlIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cHMsIHVzaW5nIFwiJTIkc1wiLiIKK0FmZkdyYW5DYW50VXNlTXVsdEdyb3VwcyAgICAgIkNhbm5vdCB1c2UgYWZmaW5pdHkgZ3JhbnVsYXJpdHkgXCIlMSRzXCIgd2l0aCBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzLCB1c2luZyBcIiUyJHNcIi4iCitBZmZXaW5kb3dzUHJvY0dyb3VwTWFwICAgICAgICIlMSRzOiBNYXBwaW5nIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cCA8aT4gcHJvYyA8aj4gdG8gT1MgcHJvYyA2NCo8aT4rPGo+LiIKK0FmZk9TUHJvY1RvR3JvdXAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cCAlMyRkIHByb2MgJTQkZCIKK0FmZkJhbGFuY2VkTm90QXZhaWwgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGJhbGFuY2VkIGlzIG5vdCBhdmFpbGFibGUuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogZ3JhbnVsYXJpdHk9Y29yZSB3aWxsIGJlIHVzZWQuIgorRW52TG9ja1dhcm4gICAgICAgICAgICAgICAgICAiJTEkcyBtdXN0IGJlIHNldCBwcmlvciB0byBmaXJzdCBPTVAgbG9jayBjYWxsIG9yIGNyaXRpY2FsIHNlY3Rpb247IGlnbm9yZWQuIgorRnV0ZXhOb3RTdXBwb3J0ZWQgICAgICAgICAgICAiZnV0ZXggc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZDsgJTEkcz0lMiRzIGlnbm9yZWQuIgorQWZmR3JhblVzaW5nICAgICAgICAgICAgICAgICAiJTEkczogZ3JhbnVsYXJpdHk9JTIkcyB3aWxsIGJlIHVzZWQuIgorQWZmVGhyUGxhY2VJbnZhbGlkICAgICAgICAgICAiJTEkczogaW52YWxpZCB2YWx1ZSBcIiUyJHNcIiwgdmFsaWQgZm9ybWF0IGlzIFwiTnNbQE5dLE5jW0BOXSxOdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoblNvY2tldHNAb2Zmc2V0LCBuQ29yZXNAb2Zmc2V0LCBuVHRocmVhZHMgcGVyIGNvcmUpXCIuIgorQWZmVGhyUGxhY2VVbnN1cHBvcnRlZCAgICAgICAiS01QX1BMQUNFX1RIUkVBRFMgaWdub3JlZDogdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLiIKK0FmZlRoclBsYWNlTWFueUNvcmVzICAgICAgICAgIktNUF9QTEFDRV9USFJFQURTIGlnbm9yZWQ6IHRvbyBtYW55IGNvcmVzIHJlcXVlc3RlZC4iCitTeW50YXhFcnJvclVzaW5nICAgICAgICAgICAgICIlMSRzOiBzeW50YXggZXJyb3IsIHVzaW5nICUyJHMuIgorQWRhcHRpdmVOb3RTdXBwb3J0ZWQgICAgICAgICAiJTEkczogQWRhcHRpdmUgbG9ja3MgYXJlIG5vdCBzdXBwb3J0ZWQ7IHVzaW5nIHF1ZXVpbmcuIgorRW52U3ludGF4RXJyb3IgICAgICAgICAgICAgICAiJTEkczogSW52YWxpZCBzeW1ib2xzIGZvdW5kLiBDaGVjayB0aGUgdmFsdWUgXCIlMiRzXCIuIgorRW52U3BhY2VzTm90QWxsb3dlZCAgICAgICAgICAiJTEkczogU3BhY2VzIGJldHdlZW4gZGlnaXRzIGFyZSBub3QgYWxsb3dlZCBcIiUyJHNcIi4iCitCb3VuZFRvT1NQcm9jU2V0ICAgICAgICAgICAgICIlMSRzOiBwaWQgJTIkZCB0aHJlYWQgJTMkZCBib3VuZCB0byBPUyBwcm9jIHNldCAlNCRzIgorQ25zTG9vcEluY3JJbGxlZ2FsICAgICAgICAgICAiJTEkcyBlcnJvcjogcGFyYWxsZWwgbG9vcCBpbmNyZW1lbnQgYW5kIGNvbmRpdGlvbiBhcmUgaW5jb25zaXN0ZW50LiIKK05vR29tcENhbmNlbGxhdGlvbiAgICAgICAgICAgImxpYmdvbXAgY2FuY2VsbGF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiIKK0FmZlRoclBsYWNlTm9uVW5pZm9ybSAgICAgICAgIktNUF9QTEFDRV9USFJFQURTIGlnbm9yZWQ6IG5vbi11bmlmb3JtIHRvcG9sb2d5LiIKK0FmZlRoclBsYWNlTm9uVGhyZWVMZXZlbCAgICAgIktNUF9QTEFDRV9USFJFQURTIGlnbm9yZWQ6IG9ubHkgdGhyZWUtbGV2ZWwgdG9wb2xvZ3kgaXMgc3VwcG9ydGVkLiIKK0FmZkdyYW5Ub3BHcm91cCAgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PSUyJHMgaXMgbm90IHN1cHBvcnRlZCB3aXRoIEtNUF9UT1BPTE9HWV9NRVRIT0Q9Z3JvdXAuIFVzaW5nIFwiZ3JhbnVsYXJpdHk9ZmluZVwiLiIKK0FmZkdyYW5Hcm91cFR5cGUgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PWdyb3VwIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBLTVBfQUZGSU5JVFk9JTIkcy4gVXNpbmcgXCJncmFudWxhcml0eT1jb3JlXCIuIgorQWZmVGhyUGxhY2VNYW55U29ja2V0cyAgICAgICAiS01QX1BMQUNFX1RIUkVBRFMgaWdub3JlZDogdG9vIG1hbnkgc29ja2V0cyByZXF1ZXN0ZWQuIgorQWZmVGhyUGxhY2VEZXByZWNhdGVkICAgICAgICAiS01QX1BMQUNFX1RIUkVBRFMgXCJvXCIgb2Zmc2V0IGRlc2lnbmF0b3IgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBAIHByZWZpeCBmb3Igb2Zmc2V0IHZhbHVlLiIKK0FmZlVzaW5nSHdsb2MgICAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGh3bG9jLiIKK0FmZklnbm9yaW5nSHdsb2MgICAgICAgICAgICAgIiUxJHM6IElnbm9yaW5nIGh3bG9jIG1lY2hhbmlzbS4iCitBZmZId2xvY0Vycm9yT2NjdXJyZWQgICAgICAgICIlMSRzOiBId2xvYyBmYWlsZWQgaW4gJTIkcy4gUmVseWluZyBvbiBpbnRlcm5hbCBhZmZpbml0eSBtZWNoYW5pc21zLiIKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gSElOVFMgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSGludHMuIEhpbnQgbWF5IGJlIHByaW50ZWQgYWZ0ZXIgYSBtZXNzYWdlLiBVc3VhbGx5IGl0IGlzIGxvbmdlciBleHBsYW5hdGlvbiB0ZXh0IG9yIHN1Z2dlc3Rpb24uCisjIFRvIG1haW50YWluIGhpbnQgbnVtYmVycyAodGhleSBhcmUgdmlzaWJsZSB0byBjdXN0b21lcnMpLCBhZGQgbmV3IGhpbnRzIHRvIHRoZSBlbmQuCisKK1N1Ym1pdEJ1Z1JlcG9ydCAgICAgICAgICAgICAgIlBsZWFzZSBzdWJtaXQgYSBidWcgcmVwb3J0IHdpdGggdGhpcyBtZXNzYWdlLCBjb21waWxlIGFuZCBydW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZHMgdXNlZCwgYW5kIG1hY2hpbmUgY29uZmlndXJhdGlvbiBpbmZvIGluY2x1ZGluZyBuYXRpdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZXIgYW5kIG9wZXJhdGluZyBzeXN0ZW0gdmVyc2lvbnMuIEZhc3RlciByZXNwb25zZSB3aWxsIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9idGFpbmVkIGJ5IGluY2x1ZGluZyBhbGwgcHJvZ3JhbSBzb3VyY2VzLiBGb3IgaW5mb3JtYXRpb24gb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0dGluZyB0aGlzIGlzc3VlLCBwbGVhc2Ugc2VlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cuaW50ZWwuY29tL3NvZnR3YXJlL3Byb2R1Y3RzL3N1cHBvcnQvLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkNoZWNrIE5MU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGl0cyB2YWx1ZSBpcyBcIiUxJHNcIi4iCitDaGFuZ2VTdGFja0xpbWl0ICAgICAgICAgICAgICJQbGVhc2UgdHJ5IGNoYW5naW5nIHRoZSBzaGVsbCBzdGFjayBsaW1pdCBvciBhZGp1c3RpbmcgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9NUF9TVEFDS1NJWkUgZW52aXJvbm1lbnQgdmFyaWFibGUuIgorVW5zZXRfQUxMX1RIUkVBRFMgICAgICAgICAgICAiQ29uc2lkZXIgdW5zZXR0aW5nIEtNUF9BTExfVEhSRUFEUyBhbmQgT01QX1RIUkVBRF9MSU1JVCAoaWYgZWl0aGVyIGlzIHNldCkuIgorU2V0X0FMTF9USFJFQURQUklWQVRFICAgICAgICAiQ29uc2lkZXIgc2V0dGluZyBLTVBfQUxMX1RIUkVBRFBSSVZBVEUgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiAlMSRkLiIKK1Bvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgIlRoaXMgY291bGQgYWxzbyBiZSBkdWUgdG8gYSBzeXN0ZW0tcmVsYXRlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIgorRHVwbGljYXRlTGlicmFyeSAgICAgICAgICAgICAiVGhpcyBtZWFucyB0aGF0IG11bHRpcGxlIGNvcGllcyBvZiB0aGUgT3Blbk1QIHJ1bnRpbWUgaGF2ZSBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtlZCBpbnRvIHRoZSBwcm9ncmFtLiBUaGF0IGlzIGRhbmdlcm91cywgc2luY2UgaXQgY2FuIGRlZ3JhZGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVyZm9ybWFuY2Ugb3IgY2F1c2UgaW5jb3JyZWN0IHJlc3VsdHMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBiZXN0IHRoaW5nIHRvIGRvIGlzIHRvIGVuc3VyZSB0aGF0IG9ubHkgYSBzaW5nbGUgT3Blbk1QIHJ1bnRpbWUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlua2VkIGludG8gdGhlIHByb2Nlc3MsIGUuZy4gYnkgYXZvaWRpbmcgc3RhdGljIGxpbmtpbmcgb2YgdGhlIE9wZW5NUCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydW50aW1lIGluIGFueSBsaWJyYXJ5LiBBcyBhbiB1bnNhZmUsIHVuc3VwcG9ydGVkLCB1bmRvY3VtZW50ZWQgd29ya2Fyb3VuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgS01QX0RVUExJQ0FURV9MSUJfT0s9VFJVRSB0byBhbGxvdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcHJvZ3JhbSB0byBjb250aW51ZSB0byBleGVjdXRlLCBidXQgdGhhdCBtYXkgY2F1c2UgY3Jhc2hlcyBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWxlbnRseSBwcm9kdWNlIGluY29ycmVjdCByZXN1bHRzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBodHRwOi8vd3d3LmludGVsLmNvbS9zb2Z0d2FyZS9wcm9kdWN0cy9zdXBwb3J0Ly4iCitOYW1lQ29tZXNGcm9tX0NQVUlORk9fRklMRSAgICJUaGlzIG5hbWUgaXMgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IHZhcmlhYmxlIEtNUF9DUFVJTkZPX0ZJTEUuIgorTm90RW5vdWdoTWVtb3J5ICAgICAgICAgICAgICAiU2VlbXMgYXBwbGljYXRpb24gcmVxdWlyZWQgdG9vIG11Y2ggbWVtb3J5LiIKK1ZhbGlkQm9vbFZhbHVlcyAgICAgICAgICAgICAgIlVzZSBcIjBcIiwgXCJGQUxTRVwiLiBcIi5GLlwiLCBcIm9mZlwiLCBcIm5vXCIgYXMgZmFsc2UgdmFsdWVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjFcIiwgXCJUUlVFXCIsIFwiLlQuXCIsIFwib25cIiwgXCJ5ZXNcIiBhcyB0cnVlIHZhbHVlcy4iCitCdWZmZXJPdmVyZmxvdyAgICAgICAgICAgICAgICJQZXJoYXBzIHRvbyBtYW55IHRocmVhZHMuIgorUnVubmluZ0F0TWF4UHJpb3JpdHkgICAgICAgICAiRGVjcmVhc2UgcHJpb3JpdHkgb2YgYXBwbGljYXRpb24uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgd2lsbCBhbGxvdyB0aGUgbW9uaXRvciB0aHJlYWQgcnVuIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIG90aGVyIHRocmVhZHMuIgorQ2hhbmdlTW9uaXRvclN0YWNrU2l6ZSAgICAgICAiVHJ5IGNoYW5naW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRSBvciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorQ2hhbmdlV29ya2VyU3RhY2tTaXplICAgICAgICAiVHJ5IGNoYW5naW5nIE9NUF9TVEFDS1NJWkUgYW5kL29yIHRoZSBzaGVsbCBzdGFjayBsaW1pdC4iCitJbmNyZWFzZVdvcmtlclN0YWNrU2l6ZSAgICAgICJUcnkgaW5jcmVhc2luZyBPTVBfU1RBQ0tTSVpFIG9yIHRoZSBzaGVsbCBzdGFjayBsaW1pdC4iCitEZWNyZWFzZVdvcmtlclN0YWNrU2l6ZSAgICAgICJUcnkgZGVjcmVhc2luZyBPTVBfU1RBQ0tTSVpFLiIKK0RlY3JlYXNlX05VTV9USFJFQURTICAgICAgICAgIlRyeSBkZWNyZWFzaW5nIHRoZSB2YWx1ZSBvZiBPTVBfTlVNX1RIUkVBRFMuIgorSW5jcmVhc2VNb25pdG9yU3RhY2tTaXplICAgICAiVHJ5IGluY3JlYXNpbmcgS01QX01PTklUT1JfU1RBQ0tTSVpFLiIKK0RlY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSAgICAgIlRyeSBkZWNyZWFzaW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRS4iCitEZWNyZWFzZU51bWJlck9mVGhyZWFkc0luVXNlICJUcnkgZGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdXNlIHNpbXVsdGFuZW91c2x5LiIKK0RlZmF1bHRTY2hlZHVsZUtpbmRVc2VkICAgICAgIldpbGwgdXNlIGRlZmF1bHQgc2NoZWR1bGUgdHlwZSAoJTEkcykuIgorR2V0TmV3ZXJMaWJyYXJ5ICAgICAgICAgICAgICAiSXQgY291bGQgYmUgYSByZXN1bHQgb2YgdXNpbmcgYW4gb2xkZXIgT01QIGxpYnJhcnkgd2l0aCBhIG5ld2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGVyIG9yIG1lbW9yeSBjb3JydXB0aW9uLiBZb3UgbWF5IGNoZWNrIHRoZSBwcm9wZXIgT01QIGxpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbGlua2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4iCitDaGVja0VudlZhciAgICAgICAgICAgICAgICAgICJDaGVjayAlMSRzIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgXCIlMiRzXCIuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiWW91IG1heSB3YW50IHRvIHVzZSBhbiAlMSRzIGxpYnJhcnkgdGhhdCBzdXBwb3J0cyAlMiRzIGludGVyZmFjZSB3aXRoIHZlcnNpb24gJTMkcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJZb3UgbWF5IHdhbnQgdG8gdXNlIGFuICUxJHMgbGlicmFyeSB3aXRoIHZlcnNpb24gJTIkcy4iCitCYWRFeGVGb3JtYXQgICAgICAgICAgICAgICAgICJTeXN0ZW0gZXJyb3IgIzE5MyBpcyBcIkJhZCBmb3JtYXQgb2YgRVhFIG9yIERMTCBmaWxlXCIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzdWFsbHkgaXQgbWVhbnMgdGhlIGZpbGUgaXMgZm91bmQsIGJ1dCBpdCBpcyBjb3JydXB0ZWQgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBmaWxlIGZvciBhbm90aGVyIGFyY2hpdGVjdHVyZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgd2hldGhlciBcIiUxJHNcIiBpcyBhIGZpbGUgZm9yICUyJHMgYXJjaGl0ZWN0dXJlLiIKK1N5c3RlbUxpbWl0T25UaHJlYWRzICAgICAgICAgIlN5c3RlbS1yZWxhdGVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGVuZCBvZiBmaWxlICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmZjZmIyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBpbmNsdWRlLzMwL29tcC5oLnZhcgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgQExJQk9NUF9WRVJTSU9OX01JTk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICBATElCT01QX1ZFUlNJT05fQlVJTERACisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICJATElCT01QX0JVSUxEX0RBVEVAIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgICAgIGRlZmluZSBvbXBfc2V0X251bV90aHJlYWRzICAgICAgICAgIG9tcGNfc2V0X251bV90aHJlYWRzCisjICAgICAgIGRlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbmVzdGVkICAgICAgICAgICAgICAgb21wY19zZXRfbmVzdGVkCisjICAgICAgIGRlZmluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisjICAgICAgIGRlZmluZSBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgICAgIG9tcGNfc2V0X3NjaGVkdWxlCisjICAgICAgIGRlZmluZSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyMgICAgICAgZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgb21wY19nZXRfdGVhbV9zaXplCisKKworIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplX3MKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgICAga21wY19zZXRfYmxvY2t0aW1lCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAga21wY19zZXRfZGVmYXVsdHMKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjICAgICAgIGRlZmluZSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjICAgICAgIGRlZmluZSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisjICAgICAgIGRlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfY2FsbG9jCisjICAgICAgIGRlZmluZSBrbXBfcmVhbGxvYyAgICAgICAgICAgICAgICAgIGttcGNfcmVhbGxvYworIyAgICAgICBkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzY2hlZHVsZSBraW5kIGNvbnN0YW50cyAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisJb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorCW9tcF9zY2hlZF9keW5hbWljID0gMiwKKwlvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisJb21wX3NjaGVkX2F1dG8gICAgPSA0CisgICAgfSBvbXBfc2NoZWRfdDsKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgKG9tcF9zY2hlZF90LCBpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9maW5hbCAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBhZmZpbml0eSBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTIyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIKQEAgLTAsMCArMSw2MzMgQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKiksIHBhcmFtZXRlciA6OiBrbXBfYnVpbGRfZGF0ZSAgICA9ICdATElCT01QX0JVSUxEX0RBVEVAJworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmY5MC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyNTQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsMzU4IEBACishIGluY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gY19zaXplX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBjX2ludHB0cl90CisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpICAgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisgICAgICAgICAgICBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBzdHJpbmcoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZWQzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuaC52YXIKQEAgLTAsMCArMSw2MzggQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorCisgICAgICBpbnRlcmZhY2UKKworISAgICAgICAqKioKKyEgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX0ZJTkFMJzo6b21wX2luX2ZpbmFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX0xJTUlUJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9MRVZFTCc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX1NJWkUnOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRSc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jayc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9ERUZBVUxUUyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX0ZJTkFMJzo6b21wX2luX2ZpbmFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9TQ0hFRFVMRSc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfREVGQVVMVFMnOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX2ZpbmFsXyc6Om9tcF9pbl9maW5hbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfZGVmYXVsdHNfJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX2ZpbmFsXyc6Om9tcF9pbl9maW5hbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcHQuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcHQuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiNGYxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wdC5oLnZhcgpAQCAtMCwwICsxLDQ4NyBAQAorLyoKKyAqIGluY2x1ZGUvMzAvb21wdC5oLnZhcgorICovCisKKyNpZm5kZWYgX19PTVBUX18KKyNkZWZpbmUgX19PTVBUX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzeXN0ZW0gaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGl0ZXJhdGlvbiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGT1JFQUNIX09NUFRfSU5RVUlSWV9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9lbnVtZXJhdGVfc3RhdGUpICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3NldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfY2FsbGJhY2spICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9pZGxlX2ZyYW1lKSAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGFza19mcmFtZSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9zdGF0ZSkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX2lkKSAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUpIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGFza19pZCkgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3RocmVhZF9pZCkKKworI2RlZmluZSBGT1JFQUNIX09NUFRfUExBQ0VIT0xERVJfRk4obWFjcm8pICBcCisgICAgbWFjcm8gKG9tcHRfaWRsZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9vdmVyaGVhZCkgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2JhcnJpZXJfd2FpdCkgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfdGFza193YWl0KSAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9tdXRleF93YWl0KQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9TVEFURShtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogZmlyc3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfZmlyc3QsIDB4NzEpICAgICAgICAgIC8qIGluaXRpYWwgZW51bWVyYXRpb24gc3RhdGUgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogd29yayBzdGF0ZXMgKDAuLjE1KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19zZXJpYWwsIDB4MDApICAgIC8qIHdvcmtpbmcgb3V0c2lkZSBwYXJhbGxlbCAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbCwgMHgwMSkgIC8qIHdvcmtpbmcgd2l0aGluIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19yZWR1Y3Rpb24sIDB4MDIpIC8qIHBlcmZvcm1pbmcgYSByZWR1Y3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogaWRsZSAoMTYuLjMxKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfaWRsZSwgMHgxMCkgICAgICAgICAgICAvKiB3YWl0aW5nIGZvciB3b3JrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogb3ZlcmhlYWQgc3RhdGVzICgzMi4uNjMpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfb3ZlcmhlYWQsIDB4MjApICAgICAgICAvKiBvdmVyaGVhZCBleGNsdWRpbmcgd2FpdCBzdGF0ZXMgKi8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogYmFycmllciB3YWl0IHN0YXRlcyAoNjQuLjc5KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyLCAweDQwKSAgICAvKiB3YWl0aW5nIGF0IGEgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2ltcGxpY2l0LCAweDQxKSAgICAvKiBpbXBsaWNpdCBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2V4cGxpY2l0LCAweDQyKSAgICAvKiBleHBsaWNpdCBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogdGFzayB3YWl0IHN0YXRlcyAoODAuLjk1KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF90YXNrd2FpdCwgMHg1MCkgICAvKiB3YWl0aW5nIGF0IGEgdGFza3dhaXQgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF90YXNrZ3JvdXAsIDB4NTEpICAvKiB3YWl0aW5nIGF0IGEgdGFza2dyb3VwICovICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbXV0ZXggd2FpdCBzdGF0ZXMgKDk2Li4xMTEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9sb2NrLCAweDYwKSAgICAgICAvKiB3YWl0aW5nIGZvciBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9uZXN0X2xvY2ssIDB4NjEpICAvKiB3YWl0aW5nIGZvciBuZXN0IGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9jcml0aWNhbCwgMHg2MikgICAvKiB3YWl0aW5nIGZvciBjcml0aWNhbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9hdG9taWMsIDB4NjMpICAgICAvKiB3YWl0aW5nIGZvciBhdG9taWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9vcmRlcmVkLCAweDY0KSAgICAvKiB3YWl0aW5nIGZvciBvcmRlcmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9zaW5nbGUsIDB4NkYpICAgICAvKiB3YWl0aW5nIGZvciBzaW5nbGUgcmVnaW9uIChub24tc3RhbmRhcmQhKSAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbWlzYyAoMTEyLi4xMjcpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfdW5kZWZpbmVkLCAweDcwKSAgICAgICAvKiB1bmRlZmluZWQgdGhyZWFkIHN0YXRlICovCisKKworI2RlZmluZSBGT1JFQUNIX09NUFRfRVZFTlQobWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gTWFuZGF0b3J5IEV2ZW50cyAtLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAxKSAvKiBwYXJhbGxlbCBiZWdpbiAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9wYXJhbGxlbF9lbmQsICAgICAgICAgICAgIG9tcHRfZW5kX3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgMikgLyogcGFyYWxsZWwgZW5kICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfdGFza19jYWxsYmFja190LCAgICAgICAzKSAvKiB0YXNrIGJlZ2luICovICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfdGFza19jYWxsYmFja190LCAgICAgICAgICAgNCkgLyogdGFzayBkZXN0cm95ICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9iZWdpbiwgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA1KSAvKiB0aHJlYWQgYmVnaW4gKi8gICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90aHJlYWRfZW5kLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCwgICAgNikgLyogdGhyZWFkIGVuZCAqLyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2NvbnRyb2wsICAgICAgICAgICAgICAgICAgb21wdF9jb250cm9sX2NhbGxiYWNrX3QsICAgICAgICA3KSAvKiBzdXBwb3J0IGNvbnRyb2wgY2FsbHMgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcnVudGltZV9zaHV0ZG93biwgICAgICAgICBvbXB0X2NhbGxiYWNrX3QsICAgICAgICAgICAgICAgIDgpIC8qIHJ1bnRpbWUgc2h1dGRvd24gKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBPcHRpb25hbCBFdmVudHMgKGJsYW1lIHNoaWZ0aW5nLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9iZWdpbiwgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgIDkpIC8qIGJlZ2luIGlkbGUgc3RhdGUgKi8gICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2lkbGVfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90aHJlYWRfY2FsbGJhY2tfdCwgICAgICAgIDEwKSAvKiBlbmQgaWRsZSBzdGF0ZSAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTEpIC8qIGJlZ2luIHdhaXQgYXQgYmFycmllciAqLyAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmQsICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDEyKSAvKiBlbmQgd2FpdCBhdCBiYXJyaWVyICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTMpIC8qIGJlZ2luIHdhaXQgYXQgdGFza3dhaXQgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE0KSAvKiBlbmQgd2FpdCBhdCB0YXNrd2FpdCAqLyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfYmVnaW4sICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTUpIC8qIGJlZ2luIHdhaXQgYXQgdGFza2dyb3VwICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2VuZCwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE2KSAvKiBlbmQgd2FpdCBhdCB0YXNrZ3JvdXAgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9sb2NrLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTcpIC8qIGxvY2sgcmVsZWFzZSAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX2xhc3QsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE4KSAvKiBsYXN0IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2NyaXRpY2FsLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxOSkgLyogY3JpdGljYWwgcmVsZWFzZSAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfYXRvbWljLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDIwKSAvKiBhdG9taWMgcmVsZWFzZSAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkLCAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjEpIC8qIG9yZGVyZWQgcmVsZWFzZSAqLyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBPcHRpb25hbCBFdmVudHMgKHN5bmNocm9ub3VzIGV2ZW50cywgb21wdF9ldmVudF91bmltcGxlbWVudGVkKSAtLS0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjIpIC8qIGltcGxpY2l0IHRhc2sgYmVnaW4gICAqLyAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDIzKSAvKiBpbXBsaWNpdCB0YXNrIGVuZCAgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2JlZ2luLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjQpIC8qIGluaXRpYWwgdGFzayBiZWdpbiAgICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRpYWxfdGFza19lbmQsICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI1KSAvKiBpbml0aWFsIHRhc2sgZW5kICAqLyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19zd2l0Y2gsICAgICAgICAgICAgICBvbXB0X3Rhc2tfcGFpcl9jYWxsYmFja190LCAgICAgMjYpIC8qIHRhc2sgc3dpdGNoICovICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAyNykgLyogdGFzayBhdCBsb29wIGJlZ2luICovICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbG9vcF9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjgpIC8qIHRhc2sgYXQgbG9vcCBlbmQgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19iZWdpbiwgICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAyOSkgLyogdGFzayBhdCBzZWN0aW9ucyBiZWdpbiAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2VjdGlvbnNfZW5kLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzApIC8qIHRhc2sgYXQgc2VjdGlvbnMgZW5kICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4sICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAzMSkgLyogdGFzayBhdCBzaW5nbGUgYmVnaW4qLyAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzIpIC8qIHRhc2sgYXQgc2luZ2xlIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMykgLyogdGFzayBhdCBzaW5nbGUgYmVnaW4gKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzQpIC8qIHRhc2sgYXQgc2luZ2xlIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfYmVnaW4sICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAzNSkgLyogdGFzayBhdCB3b3Jrc2hhcmUgYmVnaW4gKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd29ya3NoYXJlX2VuZCwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzYpIC8qIHRhc2sgYXQgd29ya3NoYXJlIGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfYmVnaW4sICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNykgLyogdGFzayBhdCBtYXN0ZXIgYmVnaW4gKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbWFzdGVyX2VuZCwgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzgpIC8qIHRhc2sgYXQgbWFzdGVyIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOSkgLyogdGFzayBhdCBiYXJyaWVyIGJlZ2luICAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYmFycmllcl9lbmQsICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDApIC8qIHRhc2sgYXQgYmFycmllciBlbmQgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9iZWdpbiwgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MSkgLyogdGFzayBhdCB0YXNrd2FpdCBiZWdpbiAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDIpIC8qIHRhc2sgYXQgdGFzayB3YWl0IGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfYmVnaW4sICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MykgLyogdGFzayBhdCB0YXNrZ3JvdXAgYmVnaW4gKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza2dyb3VwX2VuZCwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDQpIC8qIHRhc2sgYXQgdGFza2dyb3VwIGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2LCAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NSkgLyogcHJldiBuZXN0IGxvY2sgcmVsZWFzZSAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ2KSAvKiBsb2NrIHdhaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NykgLyogbmVzdCBsb2NrIHdhaXQgKi8gICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9jcml0aWNhbCwgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDgpIC8qIGNyaXRpY2FsIHdhaXQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYXRvbWljLCAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ5KSAvKiBhdG9taWMgd2FpdCAqLyAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X29yZGVyZWQsICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MCkgLyogb3JkZXJlZCB3YWl0ICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2ssICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUxKSAvKiBsb2NrIGFjcXVpcmVkICovICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfZmlyc3QsIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MikgLyogMXN0IG5lc3QgbG9jayBhY3F1aXJlZCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQsICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTMpIC8qIG5leHQgbmVzdCBsb2NrIGFjcXVpcmVkKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2NyaXRpY2FsLCAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU0KSAvKiBjcml0aWNhbCBhY3F1aXJlZCAqLyAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9hdG9taWMsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NSkgLyogYXRvbWljIGFjcXVpcmVkICovICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZCwgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTYpIC8qIG9yZGVyZWQgYWNxdWlyZWQgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X2xvY2ssICAgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NykgLyogbG9jayBpbml0ICovICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdF9uZXN0X2xvY2ssICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTgpIC8qIG5lc3QgbG9jayBpbml0ICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OSkgLyogbG9jayBkZXN0cnVjdGlvbiAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZGVzdHJveV9uZXN0X2xvY2ssICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNjApIC8qIG5lc3QgbG9jayBkZXN0cnVjdGlvbiAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9mbHVzaCwgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICA2MSkgLyogYWZ0ZXIgZXhlY3V0aW5nIGZsdXNoICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRhdGEgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlkZW50aWZpZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90aHJlYWRfaWRfdDsKKyNkZWZpbmUgb21wdF90aHJlYWRfaWRfbm9uZSAoKG9tcHRfdGhyZWFkX2lkX3QpIDApICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3Rhc2tfaWRfdDsKKyNkZWZpbmUgb21wdF90YXNrX2lkX25vbmUgKChvbXB0X3Rhc2tfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3BhcmFsbGVsX2lkX3Q7CisjZGVmaW5lIG9tcHRfcGFyYWxsZWxfaWRfbm9uZSAoKG9tcHRfcGFyYWxsZWxfaWRfdCkgMCkgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF93YWl0X2lkX3Q7CisjZGVmaW5lIG9tcHRfd2FpdF9pZF9ub25lICgob21wdF93YWl0X2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9tcHRfZnJhbWVfdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2ZyYW1lX3MgeworICAgIHZvaWQgKmV4aXRfcnVudGltZV9mcmFtZTsgICAgLyogbmV4dCBmcmFtZSBpcyB1c2VyIGNvZGUgICAgICovCisgICAgdm9pZCAqcmVlbnRlcl9ydW50aW1lX2ZyYW1lOyAvKiBwcmV2aW91cyBmcmFtZSBpcyB1c2VyIGNvZGUgKi8KK30gb21wdF9mcmFtZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW51bWVyYXRpb25zIGZvciB0aHJlYWQgc3RhdGVzIGFuZCBydW50aW1lIGV2ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBzdGF0ZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgc3RhdGUgPSBjb2RlLAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK30gb21wdF9zdGF0ZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIGV2ZW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgZXZlbnQgPSBldmVudGlkLAorICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9ldmVudF90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgY2FsbGJhY2sgcmVzdWx0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yICAgICAgICAgICAgICA9IDAsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9ub19jYWxsYmFjayAgICAgPSAxLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMgICAgICAgICAgICAgID0gMiwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUgICA9IDMsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMgPSA0LAorfSBvbXB0X3NldF9yZXN1bHRfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2sgc2lnbmF0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbml0aWFsaXphdGlvbiAqLwordHlwZWRlZiB2b2lkICgqb21wdF9pbnRlcmZhY2VfZm5fdCkodm9pZCk7CisKK3R5cGVkZWYgb21wdF9pbnRlcmZhY2VfZm5fdCAoKm9tcHRfZnVuY3Rpb25fbG9va3VwX3QpKAorICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBwb2ludCB0byBsb29rIHVwICAgICAgICovCispOworCisvKiB0aHJlYWRzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF90aHJlYWRfaW5pdGlhbCA9IDEsIC8vIHN0YXJ0IHRoZSBlbnVtZXJhdGlvbiBhdCAxCisgICAgb21wdF90aHJlYWRfd29ya2VyICA9IDIsCisgICAgb21wdF90aHJlYWRfb3RoZXIgICA9IDMKK30gb21wdF90aHJlYWRfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfaW52b2tlcl9wcm9ncmFtID0gMCwgICAgICAgICAvKiBwcm9ncmFtIGludm9rZXMgbWFzdGVyIHRhc2sgICovCisgICAgb21wdF9pbnZva2VyX3J1bnRpbWUgPSAxICAgICAgICAgIC8qIHJ1bnRpbWUgaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KK30gb21wdF9pbnZva2VyX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgICAvKiB0eXBlIG9mIHRocmVhZCAgICAgICAgICAgICAgICovCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfd2FpdF9jYWxsYmFja190KSAoCisgICAgb21wdF93YWl0X2lkX3Qgd2FpdF9pZCAgICAgICAgICAgIC8qIHdhaXQgaWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKKy8qIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmVzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24gICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IHJlcXVlc3RlZF90ZWFtX3NpemUsICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLyAKKyk7CisKKy8qIHRhc2tzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3Rhc2tfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3Rhc2tfcGFpcl9jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgZmlyc3RfdGFza19pZCwKKyAgICBvbXB0X3Rhc2tfaWRfdCBzZWNvbmRfdGFza19pZAorKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lLCAgLyogZnJhbWUgZGF0YSBmb3IgcGFyZW50IHRhc2sgICAqLworICAgIG9tcHRfdGFza19pZF90ICBuZXdfdGFza19pZCwgICAgICAvKiBpZCBvZiBjcmVhdGVkIHRhc2sgICAgICAgICAgICovCisgICAgdm9pZCAqdGFza19mdW5jdGlvbiAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyk7CisKKy8qIHByb2dyYW0gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfY29udHJvbF9jYWxsYmFja190KSAoCisgICAgdWludDY0X3QgY29tbWFuZCwgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgb2YgY29udHJvbCBjYWxsICAgICAgKi8KKyAgICB1aW50NjRfdCBtb2RpZmllciAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIgb2YgY29udHJvbCBjYWxsICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9jYWxsYmFja190KSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgT01QVF9BUElfRk5UWVBFKGZuKSBmbiMjX3QKKworI2RlZmluZSBPTVBUX0FQSV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZm4sIGFyZ3MpICBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoKk9NUFRfQVBJX0ZOVFlQRShmbikpIGFyZ3MKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlFVSVJZIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3RhdGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfc3RhdGVfdCwgb21wdF9nZXRfc3RhdGUsICgKKyAgICBvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkCispKTsKKworLyogdGhyZWFkICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3RocmVhZF9pZF90LCBvbXB0X2dldF90aHJlYWRfaWQsICh2b2lkKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQgKiwgb21wdF9nZXRfaWRsZV9mcmFtZSwgKHZvaWQpKTsKKworLyogcGFyYWxsZWwgcmVnaW9uICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3BhcmFsbGVsX2lkX3QsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCisvKiB0YXNrICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3Rhc2tfaWRfdCwgb21wdF9nZXRfdGFza19pZCwgKAorICAgIGludCBkZXB0aAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfZnJhbWVfdCAqLCBvbXB0X2dldF90YXNrX2ZyYW1lLCAoCisgICAgaW50IGRlcHRoCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQTEFDRUhPTERFUlMgRk9SIFBFUkZPUk1BTkNFIFJFUE9SVElORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWRsZSAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pZGxlLCAoCisgICAgdm9pZAorKSk7CisKKy8qIG92ZXJoZWFkICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X292ZXJoZWFkLCAoCisgICAgdm9pZAorKSk7CisKKy8qIGJhcnJpZXIgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9iYXJyaWVyX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogdGFzayB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X3Rhc2tfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiBtdXRleCB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X211dGV4X3dhaXQsICgKKyAgICB2b2lkCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUSUFMSVpBVElPTiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaW5pdGlhbGl6ZSwgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKykpOworCisKKy8qIGluaXRpYWxpemF0aW9uIGludGVyZmFjZSB0byBiZSBkZWZpbmVkIGJ5IHRvb2wgKi8KK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCh2b2lkKTsKKwordHlwZWRlZiBlbnVtIG9wdF9pbml0X21vZGVfZSB7CisgICAgb21wdF9pbml0X21vZGVfbmV2ZXIgID0gMCwKKyAgICBvbXB0X2luaXRfbW9kZV9mYWxzZSAgPSAxLAorICAgIG9tcHRfaW5pdF9tb2RlX3RydWUgICA9IDIsCisgICAgb21wdF9pbml0X21vZGVfYWx3YXlzID0gMworfSBvbXB0X2luaXRfbW9kZV90OworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfc2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCBjYWxsYmFjaworKSk7CisKK3R5cGVkZWYgZW51bSBvbXB0X3NldF9jYWxsYmFja19yY19lIHsgIC8qIG5vbi1zdGFuZGFyZCAqLworICAgIG9tcHRfc2V0X2NhbGxiYWNrX2Vycm9yICAgICAgPSAwLAorICAgIG9tcHRfaGFzX2V2ZW50X25vX2NhbGxiYWNrICAgPSAxLAorICAgIG9tcHRfbm9fZXZlbnRfbm9fY2FsbGJhY2sgICAgPSAyLAorICAgIG9tcHRfaGFzX2V2ZW50X21heV9jYWxsYmFjayAgPSAzLAorICAgIG9tcHRfaGFzX2V2ZW50X211c3RfY2FsbGJhY2sgPSA0LAorfSBvbXB0X3NldF9jYWxsYmFja19yY190OworCisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190ICpjYWxsYmFjaworKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQ0VMTEFORU9VUyBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnRyb2wgKi8KKyNpZiBkZWZpbmVkKF9PUEVOTVApICYmIChfT1BFTk1QID49IDIwMTMwNykKKyNwcmFnbWEgb21wIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKK3ZvaWQgb21wdF9jb250cm9sKAorICAgIHVpbnQ2NF90IGNvbW1hbmQsCisgICAgdWludDY0X3QgbW9kaWZpZXIKKyk7CisjaWYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBlbmQgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgorCisvKiBzdGF0ZSBlbnVtZXJhdGlvbiAqLworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2VudW1lcmF0ZV9zdGF0ZSwgKAorICAgIGludCBjdXJyZW50X3N0YXRlLAorICAgIGludCAqbmV4dF9zdGF0ZSwKKyAgICBjb25zdCBjaGFyICoqbmV4dF9zdGF0ZV9uYW1lCispKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzUxOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBpbmNsdWRlLzQwL29tcC5oLnZhcgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgQExJQk9NUF9WRVJTSU9OX01JTk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICBATElCT01QX1ZFUlNJT05fQlVJTERACisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICJATElCT01QX0JVSUxEX0RBVEVAIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzY2hlZHVsZSBraW5kIGNvbnN0YW50cyAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisJb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorCW9tcF9zY2hlZF9keW5hbWljID0gMiwKKwlvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisJb21wX3NjaGVkX2F1dG8gICAgPSA0CisgICAgfSBvbXBfc2NoZWRfdDsKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgKG9tcF9zY2hlZF90LCBpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9maW5hbCAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisgICAgLyogT3Blbk1QIDQuMCAqLworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9kZWZhdWx0X2RldmljZSAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlIChpbnQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2lzX2luaXRpYWxfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX2RldmljZXMgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGVhbXMgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX251bSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2NhbmNlbGxhdGlvbiAodm9pZCk7CisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIC8qIEludGVsIGFmZmluaXR5IEFQSSAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICAvKiBPcGVuTVAgNC4wIGFmZmluaXR5IEFQSSAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfcHJvY19iaW5kX3QgeworICAgICAgICBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMCwKKyAgICAgICAgb21wX3Byb2NfYmluZF90cnVlID0gMSwKKyAgICAgICAgb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyLAorICAgICAgICBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMywKKyAgICAgICAgb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisgICAgfSBvbXBfcHJvY19iaW5kX3Q7CisKKyAgICBleHRlcm4gb21wX3Byb2NfYmluZF90IF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3Byb2NfYmluZCAodm9pZCk7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU5MTYyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsNzU4IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKiksIHBhcmFtZXRlciA6OiBrbXBfYnVpbGRfZGF0ZSAgICA9ICdATElCT01QX0JVSUxEX0RBVEVAJworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgZGZsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpIGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1BST0NfQklORCcgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fREVWSUNFUycgOjogb21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RFQU1TJyA6OiBvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0NBTkNFTExBVElPTicgOjogb21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSVNfSU5JVElBTF9ERVZJQ0UnIDo6IG9tcF9pc19pbml0aWFsX2RldmljZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTJyA6OiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfcHJvY19iaW5kXycgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXyc6Om9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fZGV2aWNlc18nOjpvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90ZWFtc18nOjpvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2NhbmNlbGxhdGlvbl8nOjpvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2lzX2luaXRpYWxfZGV2aWNlXyc6Om9tcF9pc19pbml0aWFsX2RldmljZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2NhbmNlbGxhdGlvbl8nOjpvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pc19pbml0aWFsX2RldmljZV8nOjpvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmY5MC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlODAyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsNDQ4IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGZsdF9kZXZpY2UpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBkZmx0X2RldmljZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgdmFsdWUgOjogY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzEzNGZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNTU4IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishRElSJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgIGludGVyZmFjZQorCishICAgICAgICoqKgorISAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGZsdF9kZXZpY2UKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgY2hhcmFjdGVyIHN0cmluZygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIURJUiQgSUYgREVGSU5FRCAoX19JTlRFTF9PRkZMT0FEKQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbl9wYXJhbGxlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fZmluYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9wcm9jX2JpbmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aWNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fZGV2aWNlcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90ZWFtcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfc3RhY2tzaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfc3RhY2tzaXplX3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9ibG9ja3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3NlcmlhbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9kZWZhdWx0cworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfbGlicmFyeQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9tYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2NhbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfcmVhbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZnJlZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29uCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fcHJvY3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX3BhcmFsbGVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9maW5hbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbGltaXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hY3RpdmVfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9zaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3Byb2NfYmluZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pc19pbml0aWFsX2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9kZXZpY2VzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RlYW1zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2RlZmF1bHRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfc3RhY2tzaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfc3RhY2tzaXplX3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9ibG9ja3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY2FsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9yZWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9mcmVlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb24gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF93YXJuaW5nc19vZmYgKQorIURJUiQgRU5ESUYKKyFESVIkIEVORElGCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wdC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wdC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYThjMzBjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXB0LmgudmFyCkBAIC0wLDAgKzEsNDg3IEBACisvKgorICogaW5jbHVkZS80MC9vbXB0LmgudmFyCisgKi8KKworI2lmbmRlZiBfX09NUFRfXworI2RlZmluZSBfX09NUFRfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c3RlbSBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaXRlcmF0aW9uIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2VudW1lcmF0ZV9zdGF0ZSkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2lkbGVfZnJhbWUpICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2ZyYW1lKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3N0YXRlKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfaWQpICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSkgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2lkKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGhyZWFkX2lkKQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9pZGxlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X292ZXJoZWFkKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfYmFycmllcl93YWl0KSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF90YXNrX3dhaXQpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X211dGV4X3dhaXQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1NUQVRFKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaXJzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9maXJzdCwgMHg3MSkgICAgICAgICAgLyogaW5pdGlhbCBlbnVtZXJhdGlvbiBzdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB3b3JrIHN0YXRlcyAoMC4uMTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3NlcmlhbCwgMHgwMCkgICAgLyogd29ya2luZyBvdXRzaWRlIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsLCAweDAxKSAgLyogd29ya2luZyB3aXRoaW4gcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3JlZHVjdGlvbiwgMHgwMikgLyogcGVyZm9ybWluZyBhIHJlZHVjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZGxlICgxNi4uMzEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9pZGxlLCAweDEwKSAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yIHdvcmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBvdmVyaGVhZCBzdGF0ZXMgKDMyLi42MykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9vdmVyaGVhZCwgMHgyMCkgICAgICAgIC8qIG92ZXJoZWFkIGV4Y2x1ZGluZyB3YWl0IHN0YXRlcyAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBiYXJyaWVyIHdhaXQgc3RhdGVzICg2NC4uNzkpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXIsIDB4NDApICAgIC8qIHdhaXRpbmcgYXQgYSBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQsIDB4NDEpICAgIC8qIGltcGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQsIDB4NDIpICAgIC8qIGV4cGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0YXNrIHdhaXQgc3RhdGVzICg4MC4uOTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2t3YWl0LCAweDUwKSAgIC8qIHdhaXRpbmcgYXQgYSB0YXNrd2FpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2tncm91cCwgMHg1MSkgIC8qIHdhaXRpbmcgYXQgYSB0YXNrZ3JvdXAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtdXRleCB3YWl0IHN0YXRlcyAoOTYuLjExMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2xvY2ssIDB4NjApICAgICAgIC8qIHdhaXRpbmcgZm9yIGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X25lc3RfbG9jaywgMHg2MSkgIC8qIHdhaXRpbmcgZm9yIG5lc3QgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2NyaXRpY2FsLCAweDYyKSAgIC8qIHdhaXRpbmcgZm9yIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2F0b21pYywgMHg2MykgICAgIC8qIHdhaXRpbmcgZm9yIGF0b21pYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X29yZGVyZWQsIDB4NjQpICAgIC8qIHdhaXRpbmcgZm9yIG9yZGVyZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3NpbmdsZSwgMHg2RikgICAgIC8qIHdhaXRpbmcgZm9yIHNpbmdsZSByZWdpb24gKG5vbi1zdGFuZGFyZCEpICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtaXNjICgxMTIuLjEyNykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV91bmRlZmluZWQsIDB4NzApICAgICAgIC8qIHVuZGVmaW5lZCB0aHJlYWQgc3RhdGUgKi8KKworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9FVkVOVChtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBNYW5kYXRvcnkgRXZlbnRzIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sICAgICAgICAgICBvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190LCAgIDEpIC8qIHBhcmFsbGVsIGJlZ2luICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCwgICAgICAgICAgICAgb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAyKSAvKiBwYXJhbGxlbCBlbmQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld190YXNrX2NhbGxiYWNrX3QsICAgICAgIDMpIC8qIHRhc2sgYmVnaW4gKi8gICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90YXNrX2NhbGxiYWNrX3QsICAgICAgICAgICA0KSAvKiB0YXNrIGRlc3Ryb3kgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDUpIC8qIHRocmVhZCBiZWdpbiAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9lbmQsICAgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA2KSAvKiB0aHJlYWQgZW5kICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfY29udHJvbCwgICAgICAgICAgICAgICAgICBvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCwgICAgICAgIDcpIC8qIHN1cHBvcnQgY29udHJvbCBjYWxscyAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duLCAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICAgOCkgLyogcnVudGltZSBzaHV0ZG93biAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAgOSkgLyogYmVnaW4gaWRsZSBzdGF0ZSAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgMTApIC8qIGVuZCBpZGxlIHN0YXRlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMSkgLyogYmVnaW4gd2FpdCBhdCBiYXJyaWVyICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTIpIC8qIGVuZCB3YWl0IGF0IGJhcnJpZXIgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMykgLyogYmVnaW4gd2FpdCBhdCB0YXNrd2FpdCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTQpIC8qIGVuZCB3YWl0IGF0IHRhc2t3YWl0ICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbiwgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNSkgLyogYmVnaW4gd2FpdCBhdCB0YXNrZ3JvdXAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTYpIC8qIGVuZCB3YWl0IGF0IHRhc2tncm91cCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxNykgLyogbG9jayByZWxlYXNlICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTgpIC8qIGxhc3QgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE5KSAvKiBjcml0aWNhbCByZWxlYXNlICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMsICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjApIC8qIGF0b21pYyByZWxlYXNlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMSkgLyogb3JkZXJlZCByZWxlYXNlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMikgLyogaW1wbGljaXQgdGFzayBiZWdpbiAgICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjMpIC8qIGltcGxpY2l0IHRhc2sgZW5kICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNCkgLyogaW5pdGlhbCB0YXNrIGJlZ2luICAgKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjUpIC8qIGluaXRpYWwgdGFzayBlbmQgICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX3N3aXRjaCwgICAgICAgICAgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICAyNikgLyogdGFzayBzd2l0Y2ggKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI3KSAvKiB0YXNrIGF0IGxvb3AgYmVnaW4gKi8gICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyOCkgLyogdGFzayBhdCBsb29wIGVuZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI5KSAvKiB0YXNrIGF0IHNlY3Rpb25zIGJlZ2luICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMCkgLyogdGFzayBhdCBzZWN0aW9ucyBlbmQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbiwgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDMxKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiovICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMikgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMzKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNCkgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbiwgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDM1KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNikgLyogdGFzayBhdCB3b3Jrc2hhcmUgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbiwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM3KSAvKiB0YXNrIGF0IG1hc3RlciBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfZW5kLCAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOCkgLyogdGFzayBhdCBtYXN0ZXIgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM5KSAvKiB0YXNrIGF0IGJhcnJpZXIgYmVnaW4gICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2VuZCwgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MCkgLyogdGFzayBhdCBiYXJyaWVyIGVuZCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luLCAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQxKSAvKiB0YXNrIGF0IHRhc2t3YWl0IGJlZ2luICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MikgLyogdGFzayBhdCB0YXNrIHdhaXQgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbiwgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQzKSAvKiB0YXNrIGF0IHRhc2tncm91cCBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0NCkgLyogdGFzayBhdCB0YXNrZ3JvdXAgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ1KSAvKiBwcmV2IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDYpIC8qIGxvY2sgd2FpdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ3KSAvKiBuZXN0IGxvY2sgd2FpdCAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2NyaXRpY2FsLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OCkgLyogY3JpdGljYWwgd2FpdCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMsICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDkpIC8qIGF0b21pYyB3YWl0ICovICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCwgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUwKSAvKiBvcmRlcmVkIHdhaXQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaywgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTEpIC8qIGxvY2sgYWNxdWlyZWQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCwgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUyKSAvKiAxc3QgbmVzdCBsb2NrIGFjcXVpcmVkICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dCwgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MykgLyogbmV4dCBuZXN0IGxvY2sgYWNxdWlyZWQqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWwsICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTQpIC8qIGNyaXRpY2FsIGFjcXVpcmVkICovICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYywgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU1KSAvKiBhdG9taWMgYWNxdWlyZWQgKi8gICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NikgLyogb3JkZXJlZCBhY3F1aXJlZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU3KSAvKiBsb2NrIGluaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OCkgLyogbmVzdCBsb2NrIGluaXQgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU5KSAvKiBsb2NrIGRlc3RydWN0aW9uICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaywgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA2MCkgLyogbmVzdCBsb2NrIGRlc3RydWN0aW9uICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgIDYxKSAvKiBhZnRlciBleGVjdXRpbmcgZmx1c2ggKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZGF0YSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaWRlbnRpZmllcnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3RocmVhZF9pZF90OworI2RlZmluZSBvbXB0X3RocmVhZF9pZF9ub25lICgob21wdF90aHJlYWRfaWRfdCkgMCkgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfdGFza19pZF90OworI2RlZmluZSBvbXB0X3Rhc2tfaWRfbm9uZSAoKG9tcHRfdGFza19pZF90KSAwKSAgICAgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfcGFyYWxsZWxfaWRfdDsKKyNkZWZpbmUgb21wdF9wYXJhbGxlbF9pZF9ub25lICgob21wdF9wYXJhbGxlbF9pZF90KSAwKSAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3dhaXRfaWRfdDsKKyNkZWZpbmUgb21wdF93YWl0X2lkX25vbmUgKChvbXB0X3dhaXRfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb21wdF9mcmFtZV90CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfZnJhbWVfcyB7CisgICAgdm9pZCAqZXhpdF9ydW50aW1lX2ZyYW1lOyAgICAvKiBuZXh0IGZyYW1lIGlzIHVzZXIgY29kZSAgICAgKi8KKyAgICB2b2lkICpyZWVudGVyX3J1bnRpbWVfZnJhbWU7IC8qIHByZXZpb3VzIGZyYW1lIGlzIHVzZXIgY29kZSAqLworfSBvbXB0X2ZyYW1lX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBlbnVtZXJhdGlvbnMgZm9yIHRocmVhZCBzdGF0ZXMgYW5kIHJ1bnRpbWUgZXZlbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIHN0YXRlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X3N0YXRlX21hY3JvKHN0YXRlLCBjb2RlKSBzdGF0ZSA9IGNvZGUsCisgICAgRk9SRUFDSF9PTVBUX1NUQVRFKG9tcHRfc3RhdGVfbWFjcm8pCisjdW5kZWYgb21wdF9zdGF0ZV9tYWNybworfSBvbXB0X3N0YXRlX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJ1bnRpbWUgZXZlbnRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnQsIGNhbGxiYWNrLCBldmVudGlkKSBldmVudCA9IGV2ZW50aWQsCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworfSBvbXB0X2V2ZW50X3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldCBjYWxsYmFjayByZXN1bHRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfc2V0X3Jlc3VsdF9yZWdpc3RyYXRpb25fZXJyb3IgICAgICAgICAgICAgID0gMCwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX25vX2NhbGxiYWNrICAgICA9IDEsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X25ldmVyX29jY3VycyAgICAgICAgICAgICAgPSAyLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfc29tZSAgID0gMywKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX2Fsd2F5cyA9IDQsCit9IG9tcHRfc2V0X3Jlc3VsdF90OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxsYmFjayBzaWduYXR1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGluaXRpYWxpemF0aW9uICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X2ludGVyZmFjZV9mbl90KSh2b2lkKTsKKwordHlwZWRlZiBvbXB0X2ludGVyZmFjZV9mbl90ICgqb21wdF9mdW5jdGlvbl9sb29rdXBfdCkoCisgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIC8qIGVudHJ5IHBvaW50IHRvIGxvb2sgdXAgICAgICAgKi8KKyk7CisKKy8qIHRocmVhZHMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3RocmVhZF9pbml0aWFsID0gMSwgLy8gc3RhcnQgdGhlIGVudW1lcmF0aW9uIGF0IDEKKyAgICBvbXB0X3RocmVhZF93b3JrZXIgID0gMiwKKyAgICBvbXB0X3RocmVhZF9vdGhlciAgID0gMworfSBvbXB0X3RocmVhZF90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF9pbnZva2VyX3Byb2dyYW0gPSAwLCAgICAgICAgIC8qIHByb2dyYW0gaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KKyAgICBvbXB0X2ludm9rZXJfcnVudGltZSA9IDEgICAgICAgICAgLyogcnVudGltZSBpbnZva2VzIG1hc3RlciB0YXNrICAqLworfSBvbXB0X2ludm9rZXJfdDsKKwordHlwZWRlZiB2b2lkICgqb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCAgIC8qIHR5cGUgb2YgdGhyZWFkICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF93YWl0X2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3dhaXRfaWRfdCB3YWl0X2lkICAgICAgICAgICAgLyogd2FpdCBpZCAgICAgICAgICAgICAgICAgICAgICAqLworKTsKKworLyogcGFyYWxsZWwgYW5kIHdvcmtzaGFyZXMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIHZvaWQgKndvcmtzaGFyZV9mdW5jdGlvbiAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lLCAgLyogZnJhbWUgZGF0YSBvZiBwYXJlbnQgdGFzayAgICAqLworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgdWludDMyX3QgcmVxdWVzdGVkX3RlYW1fc2l6ZSwgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0gICAgKi8KKyAgICB2b2lkICpwYXJhbGxlbF9mdW5jdGlvbiwgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworICAgIG9tcHRfaW52b2tlcl90IGludm9rZXIgICAgICAgICAgICAvKiB3aG8gaW52b2tlcyBtYXN0ZXIgdGFzaz8gICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQsICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICovIAorKTsKKworLyogdGFza3MgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBmaXJzdF90YXNrX2lkLAorICAgIG9tcHRfdGFza19pZF90IHNlY29uZF90YXNrX2lkCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld190YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIGZvciBwYXJlbnQgdGFzayAgICovCisgICAgb21wdF90YXNrX2lkX3QgIG5ld190YXNrX2lkLCAgICAgIC8qIGlkIG9mIGNyZWF0ZWQgdGFzayAgICAgICAgICAgKi8KKyAgICB2b2lkICp0YXNrX2Z1bmN0aW9uICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKworLyogcHJvZ3JhbSAqLwordHlwZWRlZiB2b2lkICgqb21wdF9jb250cm9sX2NhbGxiYWNrX3QpICgKKyAgICB1aW50NjRfdCBjb21tYW5kLCAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBvZiBjb250cm9sIGNhbGwgICAgICAqLworICAgIHVpbnQ2NF90IG1vZGlmaWVyICAgICAgICAgICAgICAgICAvKiBtb2RpZmllciBvZiBjb250cm9sIGNhbGwgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2NhbGxiYWNrX3QpKHZvaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvbXB0IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBPTVBUX0FQSV9GTlRZUEUoZm4pIGZuIyNfdAorCisjZGVmaW5lIE9NUFRfQVBJX0ZVTkNUSU9OKHJldHVybl90eXBlLCBmbiwgYXJncykgIFwKKyAgICB0eXBlZGVmIHJldHVybl90eXBlICgqT01QVF9BUElfRk5UWVBFKGZuKSkgYXJncworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOUVVJUlkgRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdGF0ZSAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF9zdGF0ZV90LCBvbXB0X2dldF9zdGF0ZSwgKAorICAgIG9tcHRfd2FpdF9pZF90ICpvbXB0X3dhaXRfaWQKKykpOworCisvKiB0aHJlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGhyZWFkX2lkX3QsIG9tcHRfZ2V0X3RocmVhZF9pZCwgKHZvaWQpKTsKKworT01QVF9BUElfRlVOQ1RJT04odm9pZCAqLCBvbXB0X2dldF9pZGxlX2ZyYW1lLCAodm9pZCkpOworCisvKiBwYXJhbGxlbCByZWdpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfcGFyYWxsZWxfaWRfdCwgb21wdF9nZXRfcGFyYWxsZWxfaWQsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSwgKAorICAgIGludCBhbmNlc3Rvcl9sZXZlbAorKSk7CisKKy8qIHRhc2sgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGFza19pZF90LCBvbXB0X2dldF90YXNrX2lkLCAoCisgICAgaW50IGRlcHRoCispKTsKKworT01QVF9BUElfRlVOQ1RJT04ob21wdF9mcmFtZV90ICosIG9tcHRfZ2V0X3Rhc2tfZnJhbWUsICgKKyAgICBpbnQgZGVwdGgKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBMQUNFSE9MREVSUyBGT1IgUEVSRk9STUFOQ0UgUkVQT1JUSU5HCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpZGxlICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2lkbGUsICgKKyAgICB2b2lkCispKTsKKworLyogb3ZlcmhlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfb3ZlcmhlYWQsICgKKyAgICB2b2lkCispKTsKKworLyogYmFycmllciB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2JhcnJpZXJfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiB0YXNrIHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfdGFza193YWl0LCAoCisgICAgdm9pZAorKSk7CisKKy8qIG11dGV4IHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfbXV0ZXhfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRJQUxJWkFUSU9OIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pbml0aWFsaXplLCAoCisgICAgb21wdF9mdW5jdGlvbl9sb29rdXBfdCBvbXB0X2ZuX2xvb2t1cCwKKyAgICBjb25zdCBjaGFyICpydW50aW1lX3ZlcnNpb24sCisgICAgdW5zaWduZWQgaW50IG9tcHRfdmVyc2lvbgorKSk7CisKKworLyogaW5pdGlhbGl6YXRpb24gaW50ZXJmYWNlIHRvIGJlIGRlZmluZWQgYnkgdG9vbCAqLworb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sKHZvaWQpOworCit0eXBlZGVmIGVudW0gb3B0X2luaXRfbW9kZV9lIHsKKyAgICBvbXB0X2luaXRfbW9kZV9uZXZlciAgPSAwLAorICAgIG9tcHRfaW5pdF9tb2RlX2ZhbHNlICA9IDEsCisgICAgb21wdF9pbml0X21vZGVfdHJ1ZSAgID0gMiwKKyAgICBvbXB0X2luaXRfbW9kZV9hbHdheXMgPSAzCit9IG9tcHRfaW5pdF9tb2RlX3Q7CisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9zZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190IGNhbGxiYWNrCispKTsKKwordHlwZWRlZiBlbnVtIG9tcHRfc2V0X2NhbGxiYWNrX3JjX2UgeyAgLyogbm9uLXN0YW5kYXJkICovCisgICAgb21wdF9zZXRfY2FsbGJhY2tfZXJyb3IgICAgICA9IDAsCisgICAgb21wdF9oYXNfZXZlbnRfbm9fY2FsbGJhY2sgICA9IDEsCisgICAgb21wdF9ub19ldmVudF9ub19jYWxsYmFjayAgICA9IDIsCisgICAgb21wdF9oYXNfZXZlbnRfbWF5X2NhbGxiYWNrICA9IDMsCisgICAgb21wdF9oYXNfZXZlbnRfbXVzdF9jYWxsYmFjayA9IDQsCit9IG9tcHRfc2V0X2NhbGxiYWNrX3JjX3Q7CisKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9jYWxsYmFjaywgKAorICAgIG9tcHRfZXZlbnRfdCBldmVudCwKKyAgICBvbXB0X2NhbGxiYWNrX3QgKmNhbGxiYWNrCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNSVNDRUxMQU5FT1VTIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY29udHJvbCAqLworI2lmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgordm9pZCBvbXB0X2NvbnRyb2woCisgICAgdWludDY0X3QgY29tbWFuZCwKKyAgICB1aW50NjRfdCBtb2RpZmllcgorKTsKKyNpZiBkZWZpbmVkKF9PUEVOTVApICYmIChfT1BFTk1QID49IDIwMTMwNykKKyNwcmFnbWEgb21wIGVuZCBkZWNsYXJlIHRhcmdldAorI2VuZGlmCisKKy8qIHN0YXRlIGVudW1lcmF0aW9uICovCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZW51bWVyYXRlX3N0YXRlLCAoCisgICAgaW50IGN1cnJlbnRfc3RhdGUsCisgICAgaW50ICpuZXh0X3N0YXRlLAorICAgIGNvbnN0IGNoYXIgKipuZXh0X3N0YXRlX25hbWUKKykpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOWZhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcC5oLnZhcgpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIGluY2x1ZGUvNDEvb21wLmgudmFyCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX19PTVBfSAorIyAgIGRlZmluZSBfX09NUF9ICisKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgICAgQExJQk9NUF9WRVJTSU9OX01BSk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICBATElCT01QX1ZFUlNJT05fTUlOT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgIEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyMgICBkZWZpbmUgS01QX0JVSUxEX0RBVEUgICAgICAgIkBMSUJPTVBfQlVJTERfREFURUAiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworICAgIC8qIHNjaGVkdWxlIGtpbmQgY29uc3RhbnRzICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9zY2hlZF90IHsKKwlvbXBfc2NoZWRfc3RhdGljICA9IDEsCisJb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorCW9tcF9zY2hlZF9ndWlkZWQgID0gMywKKwlvbXBfc2NoZWRfYXV0byAgICA9IDQKKyAgICB9IG9tcF9zY2hlZF90OworCisgICAgLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9udW1fdGhyZWFkcyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9keW5hbWljICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0ZWQgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAob21wX3NjaGVkX3QsIGludCk7CisKKyAgICAvKiBxdWVyeSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9keW5hbWljICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X25lc3RlZCAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbnVtICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9wcm9jcyAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9wYXJhbGxlbCAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX2ZpbmFsICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2xldmVsICAgICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbGltaXQgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscyAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9zY2hlZHVsZSAgICAgICAgICAgIChvbXBfc2NoZWRfdCAqLCBpbnQgKik7CisKKyAgICAvKiBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9sb2NrICAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X2xvY2sgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbG9jayAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKworICAgIC8qIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbmVzdF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX25lc3RfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RfbG9jayAgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X25lc3RfbG9jayAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X25lc3RfbG9jayAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKworICAgIC8qIGxvY2sgaGludCB0eXBlIGZvciBkeW5hbWljIHVzZXIgbG9jayAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfbG9ja19oaW50X3QgeworICAgICAgICBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMCwKKyAgICAgICAgb21wX2xvY2tfaGludF91bmNvbnRlbmRlZCAgICA9IDEsCisgICAgICAgIG9tcF9sb2NrX2hpbnRfY29udGVuZGVkICAgICAgPSAoMTw8MSApLAorICAgICAgICBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gKDE8PDIgKSwKKyAgICAgICAgb21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSAgICA9ICgxPDwzICksCisgICAgICAgIGttcF9sb2NrX2hpbnRfaGxlICAgICAgICAgICAgPSAoMTw8MTYpLAorICAgICAgICBrbXBfbG9ja19oaW50X3J0bSAgICAgICAgICAgID0gKDE8PDE3KSwKKyAgICAgICAga21wX2xvY2tfaGludF9hZGFwdGl2ZSAgICAgICA9ICgxPDwxOCkKKyAgICB9IG9tcF9sb2NrX2hpbnRfdDsKKworICAgIC8qIGhpbnRlZCBsb2NrIGluaXRpYWxpemVycyAqLworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfaW5pdF9sb2NrX3dpdGhfaGludChvbXBfbG9ja190ICosIG9tcF9sb2NrX2hpbnRfdCk7CisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQob21wX25lc3RfbG9ja190ICosIG9tcF9sb2NrX2hpbnRfdCk7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisgICAgLyogT3Blbk1QIDQuMCAqLworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9kZWZhdWx0X2RldmljZSAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlIChpbnQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2lzX2luaXRpYWxfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX2RldmljZXMgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGVhbXMgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX251bSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2NhbmNlbGxhdGlvbiAodm9pZCk7CisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIC8qIEludGVsIGFmZmluaXR5IEFQSSAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICAvKiBPcGVuTVAgNC4wIGFmZmluaXR5IEFQSSAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfcHJvY19iaW5kX3QgeworICAgICAgICBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMCwKKyAgICAgICAgb21wX3Byb2NfYmluZF90cnVlID0gMSwKKyAgICAgICAgb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyLAorICAgICAgICBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMywKKyAgICAgICAgb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisgICAgfSBvbXBfcHJvY19iaW5kX3Q7CisKKyAgICBleHRlcm4gb21wX3Byb2NfYmluZF90IF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3Byb2NfYmluZCAodm9pZCk7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODAxOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsNzg4IEBACishIGluY2x1ZGUvNDEvb21wX2xpYi5mLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGZsdF9kZXZpY2UpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBkZmx0X2RldmljZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2lzX2luaXRpYWxfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCkgY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9pbml0X2xvY2tfd2l0aF9oaW50KGxvY2t2YXIsIGxvY2toaW50KQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpIGxvY2toaW50CisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2luaXRfbG9ja193aXRoX2hpbnQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChsb2NrdmFyLCBsb2NraGludCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpIGxvY2toaW50CisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja193aXRoX2hpbnQnIDo6IG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTJyA6OiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfUFJPQ19CSU5EJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEVBTVMnIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX05VTScgOjogb21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JU19JTklUSUFMX0RFVklDRScgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja193aXRoX2hpbnQnIDo6IG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTJyA6OiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfcHJvY19iaW5kXycgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXyc6Om9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fZGV2aWNlc18nOjpvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90ZWFtc18nOjpvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2NhbmNlbGxhdGlvbl8nOjpvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2lzX2luaXRpYWxfZGV2aWNlXyc6Om9tcF9pc19pbml0aWFsX2RldmljZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnRfJzo6b21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2NhbmNlbGxhdGlvbl8nOjpvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pc19pbml0aWFsX2RldmljZV8nOjpvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnRfJzo6b21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXyc6OmttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCBlbmRpZgorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXBfbGliLmY5MC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcF9saWIuZjkwLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDIzNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXBfbGliLmY5MC52YXIKQEAgLTAsMCArMSw0NzAgQEAKKyEgaW5jbHVkZS80MS9vbXBfbGliLmY5MC52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gY19zaXplX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2tpbmQgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfbm9uZSAgICAgICAgICAgPSAwCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfY29udGVuZGVkICAgICAgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUgPSA0CisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSA4CisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfaGxlICAgICAgICAgICAgPSA2NTUzNgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X3J0bSAgICAgICAgICAgID0gMTMxMDcyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAyNjIxNDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGZsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHZhbHVlIDo6IGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludChsb2NrdmFyLCBsb2NraGludCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCB2YWx1ZSA6OiBsb2NraGludAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobG9ja3ZhciwgbG9ja2hpbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogbG9ja2hpbnQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdiY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNTg0IEBACishIGluY2x1ZGUvNDEvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishRElSJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25lICAgICAgICAgICA9IDAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSA9IDQKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSA4CisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfcnRtICAgICAgICAgICAgPSAxMzEwNzIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAyNjIxNDQKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGZsdF9kZXZpY2UpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBkZmx0X2RldmljZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2lzX2luaXRpYWxfZGV2aWNlCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAqKioKKyEgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICBjaGFyYWN0ZXIgc3RyaW5nKCopCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KGxvY2t2YXIsIGxvY2toaW50KSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCB2YWx1ZSA6OiBsb2NraGludAorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChsb2NrdmFyLCBsb2NraGludCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogbG9ja2hpbnQKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorCisgICAgICBlbmQgaW50ZXJmYWNlCisKKyFESVIkIElGIERFRklORUQgKF9fSU5URUxfT0ZGTE9BRCkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9uZXN0ZWQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV9wcm9jcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luX2ZpbmFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9zY2hlZHVsZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfcHJvY19iaW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfd3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGljaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGVhbXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGVmYXVsdHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3JlYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2ZyZWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vbgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29mZgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fcHJvY3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX3BhcmFsbGVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9maW5hbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbGltaXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hY3RpdmVfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9zaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3Byb2NfYmluZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pc19pbml0aWFsX2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9kZXZpY2VzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RlYW1zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2RlZmF1bHRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfc3RhY2tzaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfc3RhY2tzaXplX3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9ibG9ja3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY2FsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9yZWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9mcmVlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb24gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF93YXJuaW5nc19vZmYgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbG9ja193aXRoX2hpbnQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCApCishRElSJCBFTkRJRgorIURJUiQgRU5ESUYKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXB0LmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXB0LmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDk1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcHQuaC52YXIKQEAgLTAsMCArMSw0ODcgQEAKKy8qCisgKiBpbmNsdWRlLzQxL29tcHQuaC52YXIKKyAqLworCisjaWZuZGVmIF9fT01QVF9fCisjZGVmaW5lIF9fT01QVF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzdGVtIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpdGVyYXRpb24gbWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0lOUVVJUllfRk4obWFjcm8pICBcCisgICAgbWFjcm8gKG9tcHRfZW51bWVyYXRlX3N0YXRlKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zZXRfY2FsbGJhY2spICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfaWRsZV9mcmFtZSkgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfZnJhbWUpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfc3RhdGUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9wYXJhbGxlbF9pZCkgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplKSBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfaWQpICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90aHJlYWRfaWQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1BMQUNFSE9MREVSX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2lkbGUpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfb3ZlcmhlYWQpICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9iYXJyaWVyX3dhaXQpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3Rhc2tfd2FpdCkgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfbXV0ZXhfd2FpdCkKKworI2RlZmluZSBGT1JFQUNIX09NUFRfU1RBVEUobWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGZpcnN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2ZpcnN0LCAweDcxKSAgICAgICAgICAvKiBpbml0aWFsIGVudW1lcmF0aW9uIHN0YXRlICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHdvcmsgc3RhdGVzICgwLi4xNSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfc2VyaWFsLCAweDAwKSAgICAvKiB3b3JraW5nIG91dHNpZGUgcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwsIDB4MDEpICAvKiB3b3JraW5nIHdpdGhpbiBwYXJhbGxlbCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcmVkdWN0aW9uLCAweDAyKSAvKiBwZXJmb3JtaW5nIGEgcmVkdWN0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGlkbGUgKDE2Li4zMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2lkbGUsIDB4MTApICAgICAgICAgICAgLyogd2FpdGluZyBmb3Igd29yayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG92ZXJoZWFkIHN0YXRlcyAoMzIuLjYzKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX292ZXJoZWFkLCAweDIwKSAgICAgICAgLyogb3ZlcmhlYWQgZXhjbHVkaW5nIHdhaXQgc3RhdGVzICovICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGJhcnJpZXIgd2FpdCBzdGF0ZXMgKDY0Li43OSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllciwgMHg0MCkgICAgLyogd2FpdGluZyBhdCBhIGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCwgMHg0MSkgICAgLyogaW1wbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9leHBsaWNpdCwgMHg0MikgICAgLyogZXhwbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRhc2sgd2FpdCBzdGF0ZXMgKDgwLi45NSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza3dhaXQsIDB4NTApICAgLyogd2FpdGluZyBhdCBhIHRhc2t3YWl0ICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza2dyb3VwLCAweDUxKSAgLyogd2FpdGluZyBhdCBhIHRhc2tncm91cCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG11dGV4IHdhaXQgc3RhdGVzICg5Ni4uMTExKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbG9jaywgMHg2MCkgICAgICAgLyogd2FpdGluZyBmb3IgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbmVzdF9sb2NrLCAweDYxKSAgLyogd2FpdGluZyBmb3IgbmVzdCBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfY3JpdGljYWwsIDB4NjIpICAgLyogd2FpdGluZyBmb3IgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYXRvbWljLCAweDYzKSAgICAgLyogd2FpdGluZyBmb3IgYXRvbWljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfb3JkZXJlZCwgMHg2NCkgICAgLyogd2FpdGluZyBmb3Igb3JkZXJlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfc2luZ2xlLCAweDZGKSAgICAgLyogd2FpdGluZyBmb3Igc2luZ2xlIHJlZ2lvbiAobm9uLXN0YW5kYXJkISkgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG1pc2MgKDExMi4uMTI3KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3VuZGVmaW5lZCwgMHg3MCkgICAgICAgLyogdW5kZWZpbmVkIHRocmVhZCBzdGF0ZSAqLworCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0VWRU5UKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE1hbmRhdG9yeSBFdmVudHMgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbiwgICAgICAgICAgIG9tcHRfbmV3X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgMSkgLyogcGFyYWxsZWwgYmVnaW4gKi8gICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kLCAgICAgICAgICAgICBvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190LCAgIDIpIC8qIHBhcmFsbGVsIGVuZCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgMykgLyogdGFzayBiZWdpbiAqLyAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19lbmQsICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgICAgIDQpIC8qIHRhc2sgZGVzdHJveSAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90aHJlYWRfYmVnaW4sICAgICAgICAgICAgIG9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCwgICAgNSkgLyogdGhyZWFkIGJlZ2luICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCwgICAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDYpIC8qIHRocmVhZCBlbmQgKi8gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9jb250cm9sLCAgICAgICAgICAgICAgICAgIG9tcHRfY29udHJvbF9jYWxsYmFja190LCAgICAgICAgNykgLyogc3VwcG9ydCBjb250cm9sIGNhbGxzICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd24sICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgICA4KSAvKiBydW50aW1lIHNodXRkb3duICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChibGFtZSBzaGlmdGluZywgb21wdF9ldmVudF91bmltcGxlbWVudGVkKSAtLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2lkbGVfYmVnaW4sICAgICAgICAgICAgICAgb21wdF90aHJlYWRfY2FsbGJhY2tfdCwgICAgICAgICA5KSAvKiBiZWdpbiBpZGxlIHN0YXRlICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAxMCkgLyogZW5kIGlkbGUgc3RhdGUgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDExKSAvKiBiZWdpbiB3YWl0IGF0IGJhcnJpZXIgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMikgLyogZW5kIHdhaXQgYXQgYmFycmllciAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDEzKSAvKiBiZWdpbiB3YWl0IGF0IHRhc2t3YWl0ICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNCkgLyogZW5kIHdhaXQgYXQgdGFza3dhaXQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2JlZ2luLCAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE1KSAvKiBiZWdpbiB3YWl0IGF0IHRhc2tncm91cCAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9lbmQsICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNikgLyogZW5kIHdhaXQgYXQgdGFza2dyb3VwICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE3KSAvKiBsb2NrIHJlbGVhc2UgKi8gICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0LCAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxOCkgLyogbGFzdCBuZXN0IGxvY2sgcmVsZWFzZSAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCwgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTkpIC8qIGNyaXRpY2FsIHJlbGVhc2UgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMCkgLyogYXRvbWljIHJlbGVhc2UgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZCwgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDIxKSAvKiBvcmRlcmVkIHJlbGVhc2UgKi8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChzeW5jaHJvbm91cyBldmVudHMsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDIyKSAvKiBpbXBsaWNpdCB0YXNrIGJlZ2luICAgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMykgLyogaW1wbGljaXQgdGFzayBlbmQgICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRpYWxfdGFza19iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI0KSAvKiBpbml0aWFsIHRhc2sgYmVnaW4gICAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNSkgLyogaW5pdGlhbCB0YXNrIGVuZCAgKi8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoLCAgICAgICAgICAgICAgb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCwgICAgIDI2KSAvKiB0YXNrIHN3aXRjaCAqLyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbG9vcF9iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjcpIC8qIHRhc2sgYXQgbG9vcCBiZWdpbiAqLyAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfZW5kLCAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI4KSAvKiB0YXNrIGF0IGxvb3AgZW5kICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2VjdGlvbnNfYmVnaW4sICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjkpIC8qIHRhc2sgYXQgc2VjdGlvbnMgYmVnaW4gICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMwKSAvKiB0YXNrIGF0IHNlY3Rpb25zIGVuZCAqLyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luLCAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzEpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luKi8gICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmQsICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMyKSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzMpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM0KSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd29ya3NoYXJlX2JlZ2luLCAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzUpIC8qIHRhc2sgYXQgd29ya3NoYXJlIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM2KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbWFzdGVyX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzcpIC8qIHRhc2sgYXQgbWFzdGVyIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9lbmQsICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM4KSAvKiB0YXNrIGF0IG1hc3RlciBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbiwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzkpIC8qIHRhc2sgYXQgYmFycmllciBiZWdpbiAgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfZW5kLCAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQwKSAvKiB0YXNrIGF0IGJhcnJpZXIgZW5kICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW4sICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDEpIC8qIHRhc2sgYXQgdGFza3dhaXQgYmVnaW4gKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQyKSAvKiB0YXNrIGF0IHRhc2sgd2FpdCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza2dyb3VwX2JlZ2luLCAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDMpIC8qIHRhc2sgYXQgdGFza2dyb3VwIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQ0KSAvKiB0YXNrIGF0IHRhc2tncm91cCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfcHJldiwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDUpIC8qIHByZXYgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2xvY2ssICAgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NikgLyogbG9jayB3YWl0ICovICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9uZXN0X2xvY2ssICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDcpIC8qIG5lc3QgbG9jayB3YWl0ICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfY3JpdGljYWwsICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ4KSAvKiBjcml0aWNhbCB3YWl0ICovICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2F0b21pYywgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OSkgLyogYXRvbWljIHdhaXQgKi8gICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTApIC8qIG9yZGVyZWQgd2FpdCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MSkgLyogbG9jayBhY3F1aXJlZCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0LCBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTIpIC8qIDFzdCBuZXN0IGxvY2sgYWNxdWlyZWQgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19uZXh0LCAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUzKSAvKiBuZXh0IG5lc3QgbG9jayBhY3F1aXJlZCovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9jcml0aWNhbCwgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NCkgLyogY3JpdGljYWwgYWNxdWlyZWQgKi8gICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfYXRvbWljLCAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTUpIC8qIGF0b21pYyBhY3F1aXJlZCAqLyAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX29yZGVyZWQsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU2KSAvKiBvcmRlcmVkIGFjcXVpcmVkICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTcpIC8qIGxvY2sgaW5pdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU4KSAvKiBuZXN0IGxvY2sgaW5pdCAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTkpIC8qIGxvY2sgZGVzdHJ1Y3Rpb24gKi8gICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrLCAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDYwKSAvKiBuZXN0IGxvY2sgZGVzdHJ1Y3Rpb24gKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZmx1c2gsICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrX3QsICAgICAgICAgICAgICAgNjEpIC8qIGFmdGVyIGV4ZWN1dGluZyBmbHVzaCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkYXRhIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpZGVudGlmaWVycworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfdGhyZWFkX2lkX3Q7CisjZGVmaW5lIG9tcHRfdGhyZWFkX2lkX25vbmUgKChvbXB0X3RocmVhZF9pZF90KSAwKSAgICAgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90YXNrX2lkX3Q7CisjZGVmaW5lIG9tcHRfdGFza19pZF9ub25lICgob21wdF90YXNrX2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF9wYXJhbGxlbF9pZF90OworI2RlZmluZSBvbXB0X3BhcmFsbGVsX2lkX25vbmUgKChvbXB0X3BhcmFsbGVsX2lkX3QpIDApIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfd2FpdF9pZF90OworI2RlZmluZSBvbXB0X3dhaXRfaWRfbm9uZSAoKG9tcHRfd2FpdF9pZF90KSAwKSAgICAgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvbXB0X2ZyYW1lX3QKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3Qgb21wdF9mcmFtZV9zIHsKKyAgICB2b2lkICpleGl0X3J1bnRpbWVfZnJhbWU7ICAgIC8qIG5leHQgZnJhbWUgaXMgdXNlciBjb2RlICAgICAqLworICAgIHZvaWQgKnJlZW50ZXJfcnVudGltZV9mcmFtZTsgLyogcHJldmlvdXMgZnJhbWUgaXMgdXNlciBjb2RlICovCit9IG9tcHRfZnJhbWVfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGVudW1lcmF0aW9ucyBmb3IgdGhyZWFkIHN0YXRlcyBhbmQgcnVudGltZSBldmVudHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJ1bnRpbWUgc3RhdGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIG9tcHRfc3RhdGVfbWFjcm8oc3RhdGUsIGNvZGUpIHN0YXRlID0gY29kZSwKKyAgICBGT1JFQUNIX09NUFRfU1RBVEUob21wdF9zdGF0ZV9tYWNybykKKyN1bmRlZiBvbXB0X3N0YXRlX21hY3JvCit9IG9tcHRfc3RhdGVfdDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBldmVudHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9ldmVudF9tYWNybyhldmVudCwgY2FsbGJhY2ssIGV2ZW50aWQpIGV2ZW50ID0gZXZlbnRpZCwKKyAgICBGT1JFQUNIX09NUFRfRVZFTlQob21wdF9ldmVudF9tYWNybykKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCit9IG9tcHRfZXZlbnRfdDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc2V0IGNhbGxiYWNrIHJlc3VsdHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF9zZXRfcmVzdWx0X3JlZ2lzdHJhdGlvbl9lcnJvciAgICAgICAgICAgICAgPSAwLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfbm9fY2FsbGJhY2sgICAgID0gMSwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbmV2ZXJfb2NjdXJzICAgICAgICAgICAgICA9IDIsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19zb21lICAgPSAzLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfYWx3YXlzID0gNCwKK30gb21wdF9zZXRfcmVzdWx0X3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNhbGxiYWNrIHNpZ25hdHVyZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaW5pdGlhbGl6YXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfaW50ZXJmYWNlX2ZuX3QpKHZvaWQpOworCit0eXBlZGVmIG9tcHRfaW50ZXJmYWNlX2ZuX3QgKCpvbXB0X2Z1bmN0aW9uX2xvb2t1cF90KSgKKyAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgICAgLyogZW50cnkgcG9pbnQgdG8gbG9vayB1cCAgICAgICAqLworKTsKKworLyogdGhyZWFkcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90aHJlYWRfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX2lkX3QgdGhyZWFkX2lkICAgICAgICAvKiBJRCBvZiB0aHJlYWQgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfdGhyZWFkX2luaXRpYWwgPSAxLCAvLyBzdGFydCB0aGUgZW51bWVyYXRpb24gYXQgMQorICAgIG9tcHRfdGhyZWFkX3dvcmtlciAgPSAyLAorICAgIG9tcHRfdGhyZWFkX290aGVyICAgPSAzCit9IG9tcHRfdGhyZWFkX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X2ludm9rZXJfcHJvZ3JhbSA9IDAsICAgICAgICAgLyogcHJvZ3JhbSBpbnZva2VzIG1hc3RlciB0YXNrICAqLworICAgIG9tcHRfaW52b2tlcl9ydW50aW1lID0gMSAgICAgICAgICAvKiBydW50aW1lIGludm9rZXMgbWFzdGVyIHRhc2sgICovCit9IG9tcHRfaW52b2tlcl90OworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3RocmVhZF90eXBlX3QgdGhyZWFkX3R5cGUsICAgLyogdHlwZSBvZiB0aHJlYWQgICAgICAgICAgICAgICAqLworICAgIG9tcHRfdGhyZWFkX2lkX3QgdGhyZWFkX2lkICAgICAgICAvKiBJRCBvZiB0aHJlYWQgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3dhaXRfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfd2FpdF9pZF90IHdhaXRfaWQgICAgICAgICAgICAvKiB3YWl0IGlkICAgICAgICAgICAgICAgICAgICAgICovCispOworCisvKiBwYXJhbGxlbCBhbmQgd29ya3NoYXJlcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF9wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkICAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgdm9pZCAqd29ya3NoYXJlX2Z1bmN0aW9uICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIG9mIHBhcmVudCB0YXNrICAgICovCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICB1aW50MzJfdCByZXF1ZXN0ZWRfdGVhbV9zaXplLCAgICAgLyogbnVtYmVyIG9mIHRocmVhZHMgaW4gdGVhbSAgICAqLworICAgIHZvaWQgKnBhcmFsbGVsX2Z1bmN0aW9uLCAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLyAKKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfZW5kX3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCwgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAqLworICAgIG9tcHRfaW52b2tlcl90IGludm9rZXIgICAgICAgICAgICAvKiB3aG8gaW52b2tlcyBtYXN0ZXIgdGFzaz8gICAgKi8gCispOworCisvKiB0YXNrcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IGZpcnN0X3Rhc2tfaWQsCisgICAgb21wdF90YXNrX2lkX3Qgc2Vjb25kX3Rhc2tfaWQKKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgZm9yIHBhcmVudCB0YXNrICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCAgbmV3X3Rhc2tfaWQsICAgICAgLyogaWQgb2YgY3JlYXRlZCB0YXNrICAgICAgICAgICAqLworICAgIHZvaWQgKnRhc2tfZnVuY3Rpb24gICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCisvKiBwcm9ncmFtICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCkgKAorICAgIHVpbnQ2NF90IGNvbW1hbmQsICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIG9mIGNvbnRyb2wgY2FsbCAgICAgICovCisgICAgdWludDY0X3QgbW9kaWZpZXIgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVyIG9mIGNvbnRyb2wgY2FsbCAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfY2FsbGJhY2tfdCkodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG9tcHQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIE9NUFRfQVBJX0ZOVFlQRShmbikgZm4jI190CisKKyNkZWZpbmUgT01QVF9BUElfRlVOQ1RJT04ocmV0dXJuX3R5cGUsIGZuLCBhcmdzKSAgXAorICAgIHR5cGVkZWYgcmV0dXJuX3R5cGUgKCpPTVBUX0FQSV9GTlRZUEUoZm4pKSBhcmdzCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5RVUlSWSBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHN0YXRlICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3N0YXRlX3QsIG9tcHRfZ2V0X3N0YXRlLCAoCisgICAgb21wdF93YWl0X2lkX3QgKm9tcHRfd2FpdF9pZAorKSk7CisKKy8qIHRocmVhZCAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF90aHJlYWRfaWRfdCwgb21wdF9nZXRfdGhyZWFkX2lkLCAodm9pZCkpOworCitPTVBUX0FQSV9GVU5DVElPTih2b2lkICosIG9tcHRfZ2V0X2lkbGVfZnJhbWUsICh2b2lkKSk7CisKKy8qIHBhcmFsbGVsIHJlZ2lvbiAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF9wYXJhbGxlbF9pZF90LCBvbXB0X2dldF9wYXJhbGxlbF9pZCwgKAorICAgIGludCBhbmNlc3Rvcl9sZXZlbAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworLyogdGFzayAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF90YXNrX2lkX3QsIG9tcHRfZ2V0X3Rhc2tfaWQsICgKKyAgICBpbnQgZGVwdGgKKykpOworCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X2ZyYW1lX3QgKiwgb21wdF9nZXRfdGFza19mcmFtZSwgKAorICAgIGludCBkZXB0aAorKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUExBQ0VIT0xERVJTIEZPUiBQRVJGT1JNQU5DRSBSRVBPUlRJTkcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGlkbGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaWRsZSwgKAorICAgIHZvaWQKKykpOworCisvKiBvdmVyaGVhZCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9vdmVyaGVhZCwgKAorICAgIHZvaWQKKykpOworCisvKiBiYXJyaWVyIHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfYmFycmllcl93YWl0LCAoCisgICAgdm9pZAorKSk7CisKKy8qIHRhc2sgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF90YXNrX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogbXV0ZXggd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9tdXRleF93YWl0LCAoCisgICAgdm9pZAorKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVElBTElaQVRJT04gRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2luaXRpYWxpemUsICgKKyAgICBvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IG9tcHRfZm5fbG9va3VwLAorICAgIGNvbnN0IGNoYXIgKnJ1bnRpbWVfdmVyc2lvbiwKKyAgICB1bnNpZ25lZCBpbnQgb21wdF92ZXJzaW9uCispKTsKKworCisvKiBpbml0aWFsaXphdGlvbiBpbnRlcmZhY2UgdG8gYmUgZGVmaW5lZCBieSB0b29sICovCitvbXB0X2luaXRpYWxpemVfdCBvbXB0X3Rvb2wodm9pZCk7CisKK3R5cGVkZWYgZW51bSBvcHRfaW5pdF9tb2RlX2UgeworICAgIG9tcHRfaW5pdF9tb2RlX25ldmVyICA9IDAsCisgICAgb21wdF9pbml0X21vZGVfZmFsc2UgID0gMSwKKyAgICBvbXB0X2luaXRfbW9kZV90cnVlICAgPSAyLAorICAgIG9tcHRfaW5pdF9tb2RlX2Fsd2F5cyA9IDMKK30gb21wdF9pbml0X21vZGVfdDsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X3NldF9jYWxsYmFjaywgKAorICAgIG9tcHRfZXZlbnRfdCBldmVudCwKKyAgICBvbXB0X2NhbGxiYWNrX3QgY2FsbGJhY2sKKykpOworCit0eXBlZGVmIGVudW0gb21wdF9zZXRfY2FsbGJhY2tfcmNfZSB7ICAvKiBub24tc3RhbmRhcmQgKi8KKyAgICBvbXB0X3NldF9jYWxsYmFja19lcnJvciAgICAgID0gMCwKKyAgICBvbXB0X2hhc19ldmVudF9ub19jYWxsYmFjayAgID0gMSwKKyAgICBvbXB0X25vX2V2ZW50X25vX2NhbGxiYWNrICAgID0gMiwKKyAgICBvbXB0X2hhc19ldmVudF9tYXlfY2FsbGJhY2sgID0gMywKKyAgICBvbXB0X2hhc19ldmVudF9tdXN0X2NhbGxiYWNrID0gNCwKK30gb21wdF9zZXRfY2FsbGJhY2tfcmNfdDsKKworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZ2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCAqY2FsbGJhY2sKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1JU0NFTExBTkVPVVMgRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjb250cm9sICovCisjaWYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldAorI2VuZGlmCit2b2lkIG9tcHRfY29udHJvbCgKKyAgICB1aW50NjRfdCBjb21tYW5kLAorICAgIHVpbnQ2NF90IG1vZGlmaWVyCispOworI2lmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKKworLyogc3RhdGUgZW51bWVyYXRpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9lbnVtZXJhdGVfc3RhdGUsICgKKyAgICBpbnQgY3VycmVudF9zdGF0ZSwKKyAgICBpbnQgKm5leHRfc3RhdGUsCisgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZQorKSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcC5oIGIvZmluYWwvcnVudGltZS9zcmMva21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MmVmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcC5oCkBAIC0wLDAgKzEsMzU1MCBAQAorLyohIFxmaWxlICovCisvKgorICoga21wLmggLS0gS1BUUyBydW50aW1lIGhlYWRlciBmaWxlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9ICisjZGVmaW5lIEtNUF9ICisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKKy8qICNkZWZpbmUgQlVJTERfUEFSQUxMRUxfT1JERVJFRCAxICovCisKKy8qIFRoaXMgZml4IHJlcGxhY2VzIGdldHRpbWVvZmRheSB3aXRoIGNsb2NrX2dldHRpbWUgZm9yIGJldHRlciBzY2FsYWJpbGl0eSBvbgorICAgdGhlIEFsdGl4LiAgUmVxdWlyZXMgdXNlciBjb2RlIHRvIGJlIGxpbmtlZCB3aXRoIC1scnQuCisqLworLy8jZGVmaW5lIEZJWF9TR0lfQ0xPQ0sKKworLyogRGVmaW5lcyBmb3IgT3Blbk1QIDMuMCB0YXNraW5nIGFuZCBhdXRvIHNjaGVkdWxpbmcgKi8KKworIyBpZm5kZWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisjICBkZWZpbmUgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEIDEKKyMgZW5kaWYKKworI2RlZmluZSBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAgMAorI2RlZmluZSBUQVNLX0NVUlJFTlRfUVVFVUVEICAgICAgMQorCisjZGVmaW5lIFRBU0tfREVRVUVfQklUUyAgICAgICAgICA4ICAvLyBVc2VkIHNvbGVseSB0byBkZWZpbmUgVEFTS19ERVFVRV9TSVpFIGFuZCBUQVNLX0RFUVVFX01BU0suCisjZGVmaW5lIFRBU0tfREVRVUVfU0laRSAgICAgICAgICAoIDEgPDwgVEFTS19ERVFVRV9CSVRTICkKKyNkZWZpbmUgVEFTS19ERVFVRV9NQVNLICAgICAgICAgICggVEFTS19ERVFVRV9TSVpFIC0gMSApCisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyNkZWZpbmUgVEFTS19TVEFDS19FTVBUWSAgICAgICAgIDAgIC8vIGVudHJpZXMgd2hlbiB0aGUgc3RhY2sgaXMgZW1wdHkKKworI2RlZmluZSBUQVNLX1NUQUNLX0JMT0NLX0JJVFMgICAgNSAgLy8gVXNlZCB0byBkZWZpbmUgVEFTS19TVEFDS19TSVpFIGFuZCBUQVNLX1NUQUNLX01BU0sKKyNkZWZpbmUgVEFTS19TVEFDS19CTE9DS19TSVpFICAgICggMSA8PCBUQVNLX1NUQUNLX0JMT0NLX0JJVFMgKSAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiBlYWNoIHRhc2sgc3RhY2sgYXJyYXkKKyNkZWZpbmUgVEFTS19TVEFDS19JTkRFWF9NQVNLICAgICggVEFTS19TVEFDS19CTE9DS19TSVpFIC0gMSApICAvLyBNYXNrIGZvciBkZXRlcm1pbmluZyBpbmRleCBpbnRvIHN0YWNrIGJsb2NrCisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKyNkZWZpbmUgVEFTS19OT1RfUFVTSEVEICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEIDAKKyNkZWZpbmUgVEFTS19USUVEICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19VTlRJRUQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVEFTS19FWFBMSUNJVCAgICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19JTVBMSUNJVCAgICAgICAgICAgIDAKKyNkZWZpbmUgVEFTS19QUk9YWSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19GVUxMICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyNkZWZpbmUgS01QX1RIUkVBRF9BVFRSCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorLyogIGluY2x1ZGUgPGN0eXBlLmg+IGRvbid0IHVzZTsgcHJvYmxlbXMgd2l0aCAvTUQgb24gV2luZG93cyogT1MgTlQgZHVlIHRvIGJhZCBNaWNyb3NvZnQgbGlicmFyeSAgKi8KKy8qICBzb21lIG1hY3JvcyBwcm92aWRlZCBiZWxvdyB0byByZXBsYWNlIHNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zICAqLworI2lmbmRlZiBfX0FCU09GVF9XSU4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2luY2x1ZGUgImttcF9zYWZlX2NfYXBpLmgiCisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorY2xhc3Mga21wX3N0YXRzX2xpc3Q7CisjZW5kaWYKKworI2lmIEtNUF9VU0VfSFdMT0MKKyNpbmNsdWRlICJod2xvYy5oIgorZXh0ZXJuIGh3bG9jX3RvcG9sb2d5X3QgX19rbXBfaHdsb2NfdG9wb2xvZ3k7CitleHRlcm4gaW50IF9fa21wX2h3bG9jX2Vycm9yOworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjaW5jbHVkZSA8eG1taW50cmluLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImttcF92ZXJzaW9uLmgiCisjaW5jbHVkZSAia21wX2RlYnVnLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpZiBVU0VfREVCVUdHRVIKKyNpbmNsdWRlICJrbXBfZGVidWdnZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKyNkZWZpbmUgS01QX0hBTkRMRV9TSUdOQUxTIChLTVBfT1NfVU5JWCB8fCBLTVBfT1NfV0lORE9XUykKKworI2luY2x1ZGUgImttcF93cmFwcGVyX21hbGxvYy5oIgorI2lmIEtNUF9PU19VTklYCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpZiAhZGVmaW5lZCBOU0lHICYmIGRlZmluZWQgX05TSUcKKyMgIGRlZmluZSBOU0lHIF9OU0lHCisjIGVuZGlmCisjZW5kaWYKKworI2lmIEtNUF9PU19MSU5VWAorIyBwcmFnbWEgd2VhayBjbG9ja19nZXR0aW1lCisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtaW50ZXJuYWwuaCIKKyNlbmRpZgorCisvKlNlbGVjdCBkYXRhIHBsYWNlbWVudCBpbiBOVU1BIG1lbW9yeSAqLworI2RlZmluZSBOT19GSVJTVF9UT1VDSCAwCisjZGVmaW5lIEZJUlNUX1RPVUNIIDEgICAgICAgLyogRXhwbG9pdCBTR0kncyBmaXJzdCB0b3VjaCBwYWdlIHBsYWNlbWVudCBhbGdvICovCisKKy8qIElmIG5vdCBzcGVjaWZpZWQgb24gY29tcGlsZSBjb21tYW5kIGxpbmUsIGFzc3VtZSBubyBmaXJzdCB0b3VjaCAqLworI2lmbmRlZiBCVUlMRF9NRU1PUlkKKyNkZWZpbmUgQlVJTERfTUVNT1JZIE5PX0ZJUlNUX1RPVUNICisjZW5kaWYKKworLy8gMCAtIG5vIGZhc3QgbWVtb3J5IGFsbG9jYXRpb24sIGFsaWdubWVudDogOC1ieXRlIG9uIHg4NiwgMTYtYnl0ZSBvbiB4NjQuCisvLyAzIC0gZmFzdCBhbGxvY2F0aW9uIHVzaW5nIHN5bmMsIG5vbi1zeW5jIGZyZWUgbGlzdHMgb2YgYW55IHNpemUsIG5vbi1zZWxmIGZyZWUgbGlzdHMgb2YgbGltaXRlZCBzaXplLgorI2lmbmRlZiBVU0VfRkFTVF9NRU1PUlkKKyNkZWZpbmUgVVNFX0ZBU1RfTUVNT1JZIDMKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9ORVNURURfSE9UX1RFQU1TCisjIGRlZmluZSBLTVBfTkVTVEVEX0hPVF9URUFNUyAwCisjIGRlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkKKyNlbHNlCisjIGlmIEtNUF9ORVNURURfSE9UX1RFQU1TCisjICBpZiBPTVBfNDBfRU5BQkxFRAorIyAgIGRlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkgLHgKKyMgIGVsc2UKKy8vIE5lc3RlZCBob3QgdGVhbXMgZmVhdHVyZSBkZXBlbmRzIG9uIG9tcCA0LjAsIGRpc2FibGUgaXQgZm9yIGVhcmxpZXIgdmVyc2lvbnMKKyMgICB1bmRlZiBLTVBfTkVTVEVEX0hPVF9URUFNUworIyAgIGRlZmluZSBLTVBfTkVTVEVEX0hPVF9URUFNUyAwCisjICAgZGVmaW5lIFVTRV9ORVNURURfSE9UX0FSRyh4KQorIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIFVTRV9ORVNURURfSE9UX0FSRyh4KQorIyBlbmRpZgorI2VuZGlmCisKKy8vIEFzc3VtZSB1c2luZyBCR0VUIGNvbXBhcmVfZXhjaGFuZ2UgaW5zdHJ1Y3Rpb24gaW5zdGVhZCBvZiBsb2NrIGJ5IGRlZmF1bHQuCisjaWZuZGVmIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2RlZmluZSBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgMQorI2VuZGlmCisKKy8vIFRlc3QgdG8gc2VlIGlmIHF1ZXVpbmcgbG9jayBpcyBiZXR0ZXIgdGhhbiBib290c3RyYXAgbG9jayBmb3IgYmdldAorLy8gI2lmbmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisvLyAjZGVmaW5lIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKy8vICNlbmRpZgorCisjZGVmaW5lIEtNUF9OU0VDX1BFUl9TRUMgMTAwMDAwMDAwMEwKKyNkZWZpbmUgS01QX1VTRUNfUEVSX1NFQyAxMDAwMDAwTAorCisvKiEKK0Bpbmdyb3VwIEJBU0lDX1RZUEVTCitAeworKi8KKworLy8gRklYTUUgRE9YWUdFTi4uLiBuZWVkIHRvIGdyb3VwIHRoZXNlIGZsYWdzIHNvbWVob3cgKE1ha2luZyB0aGVtIGFuIGFub255bW91cyBlbnVtIHdvdWxkIGRvIGl0Li4uKQorLyohCitWYWx1ZXMgZm9yIGJpdCBmbGFncyB1c2VkIGluIHRoZSBpZGVudF90IHRvIGRlc2NyaWJlIHRoZSBmaWVsZHMuCisqLworLyohIFVzZSB0cmFtcG9saW5lIGZvciBpbnRlcm5hbCBtaWNyb3Rhc2tzICovCisjZGVmaW5lIEtNUF9JREVOVF9JTUIgICAgICAgICAgICAgMHgwMQorLyohIFVzZSBjLXN0eWxlIGlkZW50IHN0cnVjdHVyZSAqLworI2RlZmluZSBLTVBfSURFTlRfS01QQyAgICAgICAgICAgIDB4MDIKKy8qIDB4MDQgaXMgbm8gbG9uZ2VyIHVzZWQgKi8KKy8qISBFbnRyeSBwb2ludCBnZW5lcmF0ZWQgYnkgYXV0by1wYXJhbGxlbGl6YXRpb24gKi8KKyNkZWZpbmUgS01QX0lERU5UX0FVVE9QQVIgICAgICAgICAweDA4CisvKiEgQ29tcGlsZXIgZ2VuZXJhdGVzIGF0b21pYyByZWR1Y3Rpb24gb3B0aW9uIGZvciBrbXBjX3JlZHVjZSogKi8KKyNkZWZpbmUgS01QX0lERU5UX0FUT01JQ19SRURVQ0UgICAweDEwCisvKiEgVG8gbWFyayBhICdiYXJyaWVyJyBkaXJlY3RpdmUgaW4gdXNlciBjb2RlICovCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0VYUEwgICAgMHgyMAorLyohIFRvIE1hcmsgaW1wbGljaXQgYmFycmllcnMuICovCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUEwgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX01BU0sgICAgICAweDAxQzAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9GT1IgICAgICAgMHgwMDQwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0VDVElPTlMgIDB4MDBDMAorCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0lOR0xFICAgIDB4MDE0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1dPUktTSEFSRSAweDAxQzAKKworLyohCisgKiBUaGUgaWRlbnQgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGEgc291cmNlIGxvY2F0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBpZGVudCB7CisgICAga21wX2ludDMyIHJlc2VydmVkXzE7ICAgLyoqPCAgbWlnaHQgYmUgdXNlZCBpbiBGb3J0cmFuOyBzZWUgYWJvdmUgICovCisgICAga21wX2ludDMyIGZsYWdzOyAgICAgICAgLyoqPCAgYWxzbyBmLmZsYWdzOyBLTVBfSURFTlRfeHh4IGZsYWdzOyBLTVBfSURFTlRfS01QQyBpZGVudGlmaWVzIHRoaXMgdW5pb24gbWVtYmVyICAqLworICAgIGttcF9pbnQzMiByZXNlcnZlZF8yOyAgIC8qKjwgIG5vdCByZWFsbHkgdXNlZCBpbiBGb3J0cmFuIGFueSBtb3JlOyBzZWUgYWJvdmUgKi8KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJ1dCBjdXJyZW50bHkgdXNlZCBmb3Igc3RvcmluZyByZWdpb24tc3BlY2lmaWMgSVRUICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uICovCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGttcF9pbnQzMiByZXNlcnZlZF8zOyAgIC8qKjwgc291cmNlWzRdIGluIEZvcnRyYW4sIGRvIG5vdCB1c2UgZm9yIEMrKyAgKi8KKyAgICBjaGFyIGNvbnN0ICpwc291cmNlOyAgICAvKio8IFN0cmluZyBkZXNjcmliaW5nIHRoZSBzb3VyY2UgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN0cmluZyBpcyBjb21wb3NlZCBvZiBzZW1pLWNvbG9uIHNlcGFyYXRlZCBmaWVsZHMgd2hpY2ggZGVzY3JpYmUgdGhlIHNvdXJjZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBhbmQgYSBwYWlyIG9mIGxpbmUgbnVtYmVycyB0aGF0IGRlbGltaXQgdGhlIGNvbnN0cnVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gaWRlbnRfdDsKKy8qIQorQH0KKyovCisKKy8vIFNvbWUgZm9yd2FyZCBkZWNsYXJhdGlvbnMuCisKK3R5cGVkZWYgdW5pb24gIGttcF90ZWFtICAgICAga21wX3RlYW1fdDsKK3R5cGVkZWYgc3RydWN0IGttcF90YXNrZGF0YSAga21wX3Rhc2tkYXRhX3Q7Cit0eXBlZGVmIHVuaW9uICBrbXBfdGFza190ZWFtIGttcF90YXNrX3RlYW1fdDsKK3R5cGVkZWYgdW5pb24gIGttcF90ZWFtICAgICAga21wX3RlYW1fcDsKK3R5cGVkZWYgdW5pb24gIGttcF9pbmZvICAgICAga21wX2luZm9fcDsKK3R5cGVkZWYgdW5pb24gIGttcF9yb290ICAgICAga21wX3Jvb3RfcDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFBhY2sgdHdvIDMyLWJpdCBzaWduZWQgaW50ZWdlcnMgaW50byBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciAqLworLyogVG9EbzogRml4IHdvcmQgb3JkZXJpbmcgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXMuICovCisjZGVmaW5lIEtNUF9QQUNLXzY0KEhJR0hfMzIsTE9XXzMyKSBcCisgICAgKCAoa21wX2ludDY0KSAoKCgoa21wX3VpbnQ2NCkoSElHSF8zMikpPDwzMikgfCAoa21wX3VpbnQ2NCkoTE9XXzMyKSkgKQorCisKKy8qCisgKiBHZW5lcmljIHN0cmluZyBtYW5pcHVsYXRpb24gbWFjcm9zLgorICogQXNzdW1lIHRoYXQgX3ggaXMgb2YgdHlwZSBjaGFyICoKKyAqLworI2RlZmluZSBTS0lQX1dTKF94KSAgICAgeyB3aGlsZSAoKihfeCkgPT0gJyAnIHx8ICooX3gpID09ICdcdCcpIChfeCkrKzsgfQorI2RlZmluZSBTS0lQX0RJR0lUUyhfeCkgeyB3aGlsZSAoKihfeCkgPj0gJzAnICYmICooX3gpIDw9ICc5JykgKF94KSsrOyB9CisjZGVmaW5lIFNLSVBfVE8oX3gsX2MpICB7IHdoaWxlICgqKF94KSAhPSAnXDAnICYmICooX3gpICE9IChfYykpIChfeCkrKzsgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9NQVgoIHgsIHkgKSAoICh4KSA+ICh5KSA/ICh4KSA6ICh5KSApCisjZGVmaW5lIEtNUF9NSU4oIHgsIHkgKSAoICh4KSA8ICh5KSA/ICh4KSA6ICh5KSApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogRW51bWVyYXRpb24gdHlwZXMgKi8KKworZW51bSBrbXBfc3RhdGVfdGltZXIgeworICAgIHRzX3N0b3AsCisgICAgdHNfc3RhcnQsCisgICAgdHNfcGF1c2UsCisKKyAgICB0c19sYXN0X3N0YXRlCit9OworCitlbnVtIGR5bmFtaWNfbW9kZSB7CisgICAgZHluYW1pY19kZWZhdWx0LAorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBkeW5hbWljX2xvYWRfYmFsYW5jZSwKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgICAgZHluYW1pY19yYW5kb20sCisgICAgZHluYW1pY190aHJlYWRfbGltaXQsCisgICAgZHluYW1pY19tYXgKK307CisKKy8qIGV4dGVybmFsIHNjaGVkdWxlIGNvbnN0YW50cywgZHVwbGljYXRlIGVudW0gb21wX3NjaGVkIGluIG9tcC5oIGluIG9yZGVyIHRvIG5vdCBpbmNsdWRlIGl0IGhlcmUgKi8KKyNpZm5kZWYgS01QX1NDSEVEX1RZUEVfREVGSU5FRAorI2RlZmluZSBLTVBfU0NIRURfVFlQRV9ERUZJTkVECit0eXBlZGVmIGVudW0ga21wX3NjaGVkIHsKKyAgICBrbXBfc2NoZWRfbG93ZXIgICAgICAgICAgICAgPSAwLCAgICAgLy8gbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBhcmUgZm9yIHJvdXRpbmUgcGFyYW1ldGVyIGNoZWNrCisgICAgLy8gTm90ZTogbmVlZCB0byBhZGp1c3QgX19rbXBfc2NoX21hcCBnbG9iYWwgYXJyYXkgaW4gY2FzZSB0aGlzIGVudW0gaXMgY2hhbmdlZAorICAgIGttcF9zY2hlZF9zdGF0aWMgICAgICAgICAgICA9IDEsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICAgIGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9keW5hbWljX2NodW5rZWQgICAgICAgICAgKDM1KQorICAgIGttcF9zY2hlZF9ndWlkZWQgICAgICAgICAgICA9IDMsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgKDM2KQorICAgIGttcF9zY2hlZF9hdXRvICAgICAgICAgICAgICA9IDQsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgKDM4KQorICAgIGttcF9zY2hlZF91cHBlcl9zdGQgICAgICAgICA9IDUsICAgICAvLyB1cHBlciBib3VuZCBmb3Igc3RhbmRhcmQgc2NoZWR1bGVzCisgICAga21wX3NjaGVkX2xvd2VyX2V4dCAgICAgICAgID0gMTAwLCAgIC8vIGxvd2VyIGJvdW5kIG9mIEludGVsIGV4dGVuc2lvbiBzY2hlZHVsZXMKKyAgICBrbXBfc2NoZWRfdHJhcGV6b2lkYWwgICAgICAgPSAxMDEsICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfdHJhcGV6b2lkYWwgICAgICAgICAgICAgICgzOSkKKy8vICBrbXBfc2NoZWRfc3RhdGljX3N0ZWFsICAgICAgPSAxMDIsICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfc3RhdGljX3N0ZWFsICAgICAgICAgICAgICg0NCkKKyAgICBrbXBfc2NoZWRfdXBwZXIgICAgICAgICAgICAgPSAxMDIsCisgICAga21wX3NjaGVkX2RlZmF1bHQgPSBrbXBfc2NoZWRfc3RhdGljIC8vIGRlZmF1bHQgc2NoZWR1bGluZworfSBrbXBfc2NoZWRfdDsKKyNlbmRpZgorCisvKiEKKyBAaW5ncm91cCBXT1JLX1NIQVJJTkcKKyAqIERlc2NyaWJlcyB0aGUgbG9vcCBzY2hlZHVsZSB0byBiZSB1c2VkIGZvciBhIHBhcmFsbGVsIGZvciBsb29wLgorICovCitlbnVtIHNjaGVkX3R5cGUgeworICAgIGttcF9zY2hfbG93ZXIgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgbG93ZXIgYm91bmQgZm9yIHVub3JkZXJlZCB2YWx1ZXMgKi8KKyAgICBrbXBfc2NoX3N0YXRpY19jaHVua2VkICAgICAgICAgICAgPSAzMywKKyAgICBrbXBfc2NoX3N0YXRpYyAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAvKio8IHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX3NjaF9keW5hbWljX2NodW5rZWQgICAgICAgICAgID0gMzUsCisgICAga21wX3NjaF9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgID0gMzYsICAgLyoqPCBndWlkZWQgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9zY2hfcnVudGltZSAgICAgICAgICAgICAgICAgICA9IDM3LAorICAgIGttcF9zY2hfYXV0byAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qKjwgYXV0byAqLworICAgIGttcF9zY2hfdHJhcGV6b2lkYWwgICAgICAgICAgICAgICA9IDM5LAorCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICAgICAgICAgICAgID0gNDAsCisgICAga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgICAgICAgICAgID0gNDEsCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgID0gNDIsCisgICAga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkID0gNDMsCisKKyAgICBrbXBfc2NoX3N0YXRpY19zdGVhbCAgICAgICAgICAgICAgPSA0NCwgICAvKio8IGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX3NjaF91cHBlciAgICAgICAgICAgICAgICAgICAgID0gNDUsICAgLyoqPCB1cHBlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworCisgICAga21wX29yZF9sb3dlciAgICAgICAgICAgICAgICAgICAgID0gNjQsICAgLyoqPCBsb3dlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMsIG11c3QgYmUgcG93ZXIgb2YgMiAqLworICAgIGttcF9vcmRfc3RhdGljX2NodW5rZWQgICAgICAgICAgICA9IDY1LAorICAgIGttcF9vcmRfc3RhdGljICAgICAgICAgICAgICAgICAgICA9IDY2LCAgIC8qKjwgb3JkZXJlZCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9vcmRfZHluYW1pY19jaHVua2VkICAgICAgICAgICA9IDY3LAorICAgIGttcF9vcmRfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICA9IDY4LAorICAgIGttcF9vcmRfcnVudGltZSAgICAgICAgICAgICAgICAgICA9IDY5LAorICAgIGttcF9vcmRfYXV0byAgICAgICAgICAgICAgICAgICAgICA9IDcwLCAgIC8qKjwgb3JkZXJlZCBhdXRvICovCisgICAga21wX29yZF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgID0gNzEsCisgICAga21wX29yZF91cHBlciAgICAgICAgICAgICAgICAgICAgID0gNzIsICAgLyoqPCB1cHBlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLyogU2NoZWR1bGVzIGZvciBEaXN0cmlidXRlIGNvbnN0cnVjdCAqLworICAgIGttcF9kaXN0cmlidXRlX3N0YXRpY19jaHVua2VkICAgICA9IDkxLCAgIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgY2h1bmtlZCAqLworICAgIGttcF9kaXN0cmlidXRlX3N0YXRpYyAgICAgICAgICAgICA9IDkyLCAgIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZvciB0aGUgIm5vbWVyZ2UiIHZlcnNpb25zLCBrbXBfZGlzcGF0Y2hfbmV4dCooKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgKiBhIHNpbmdsZSBpdGVyYXRpb24vY2h1bmssIGV2ZW4gaWYgdGhlIGxvb3AgaXMgc2VyaWFsaXplZC4gIEZvciB0aGUKKyAgICAgKiBzY2hlZHVsZSB0eXBlcyBsaXN0ZWQgYWJvdmUsIHRoZSBlbnRpcmUgaXRlcmF0aW9uIHZlY3RvciBpcyByZXR1cm5lZAorICAgICAqIGlmIHRoZSBsb29wIGlzIHNlcmlhbGl6ZWQuICBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgZ2NjL2djb21wIHNlY3Rpb25zLgorICAgICAqLworICAgIGttcF9ubV9sb3dlciAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgIC8qKjwgbG93ZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyAgICBrbXBfbm1fc3RhdGljX2NodW5rZWQgICAgICAgICAgICAgPSAoa21wX3NjaF9zdGF0aWNfY2h1bmtlZCAtIGttcF9zY2hfbG93ZXIgKyBrbXBfbm1fbG93ZXIpLAorICAgIGttcF9ubV9zdGF0aWMgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgIC8qKjwgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfbm1fZHluYW1pY19jaHVua2VkICAgICAgICAgICAgPSAxNjMsCisgICAga21wX25tX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgID0gMTY0LCAgLyoqPCBndWlkZWQgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9ubV9ydW50aW1lICAgICAgICAgICAgICAgICAgICA9IDE2NSwKKyAgICBrbXBfbm1fYXV0byAgICAgICAgICAgICAgICAgICAgICAgPSAxNjYsICAvKio8IGF1dG8gKi8KKyAgICBrbXBfbm1fdHJhcGV6b2lkYWwgICAgICAgICAgICAgICAgPSAxNjcsCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfbm1fc3RhdGljX2dyZWVkeSAgICAgICAgICAgICAgPSAxNjgsCisgICAga21wX25tX3N0YXRpY19iYWxhbmNlZCAgICAgICAgICAgID0gMTY5LAorICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9ubV9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgICA9IDE3MCwKKyAgICBrbXBfbm1fZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCAgPSAxNzEsCisgICAga21wX25tX3N0YXRpY19zdGVhbCAgICAgICAgICAgICAgID0gMTcyLCAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggT01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyAgICBrbXBfbm1fb3JkX3N0YXRpY19jaHVua2VkICAgICAgICAgPSAxOTMsCisgICAga21wX25tX29yZF9zdGF0aWMgICAgICAgICAgICAgICAgID0gMTk0LCAgLyoqPCBvcmRlcmVkIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX25tX29yZF9keW5hbWljX2NodW5rZWQgICAgICAgID0gMTk1LAorICAgIGttcF9ubV9vcmRfZ3VpZGVkX2NodW5rZWQgICAgICAgICA9IDE5NiwKKyAgICBrbXBfbm1fb3JkX3J1bnRpbWUgICAgICAgICAgICAgICAgPSAxOTcsCisgICAga21wX25tX29yZF9hdXRvICAgICAgICAgICAgICAgICAgID0gMTk4LCAgLyoqPCBhdXRvICovCisgICAga21wX25tX29yZF90cmFwZXpvaWRhbCAgICAgICAgICAgID0gMTk5LAorICAgIGttcF9ubV91cHBlciAgICAgICAgICAgICAgICAgICAgICA9IDIwMCwgIC8qKjwgdXBwZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyAgICBrbXBfc2NoX2RlZmF1bHQgPSBrbXBfc2NoX3N0YXRpYyAgLyoqPCBkZWZhdWx0IHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCit9OworCisvKiBUeXBlIHRvIGtlZXAgcnVudGltZSBzY2hlZHVsZSBzZXQgdmlhIE9NUF9TQ0hFRFVMRSBvciBvbXBfc2V0X3NjaGVkdWxlKCkgKi8KK3R5cGVkZWYgc3RydWN0IGttcF9yX3NjaGVkIHsKKyAgICBlbnVtIHNjaGVkX3R5cGUgcl9zY2hlZF90eXBlOworICAgIGludCAgICAgICAgICAgICBjaHVuazsKK30ga21wX3Jfc2NoZWRfdDsKKworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSBfX2ttcF9zY2hfbWFwW107IC8vIG1hcCBPTVAgMy4wIHNjaGVkdWxlIHR5cGVzIHdpdGggb3VyIGludGVybmFsIHNjaGVkdWxlIHR5cGVzCisKK2VudW0gbGlicmFyeV90eXBlIHsKKyAgICBsaWJyYXJ5X25vbmUsCisgICAgbGlicmFyeV9zZXJpYWwsCisgICAgbGlicmFyeV90dXJuYXJvdW5kLAorICAgIGxpYnJhcnlfdGhyb3VnaHB1dAorfTsKKworI2lmIEtNUF9PU19MSU5VWAorZW51bSBjbG9ja19mdW5jdGlvbl90eXBlIHsKKyAgICBjbG9ja19mdW5jdGlvbl9nZXR0aW1lb2ZkYXksCisgICAgY2xvY2tfZnVuY3Rpb25fY2xvY2tfZ2V0dGltZQorfTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorZW51bSBtaWNfdHlwZSB7CisgICAgbm9uX21pYywKKyAgICBtaWMxLAorICAgIG1pYzIsCisgICAgbWljMywKKyAgICBkdW1teQorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tIGZhc3QgcmVkdWN0aW9uIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyNkZWZpbmUgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIgMQorCisjdW5kZWYgS01QX0ZBU1RfUkVEVUNUSU9OX0NPUkVfRFVPCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICNkZWZpbmUgS01QX0ZBU1RfUkVEVUNUSU9OX0NPUkVfRFVPIDEKKyNlbmRpZgorCitlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kIHsKKyAgICByZWR1Y3Rpb25fbWV0aG9kX25vdF9kZWZpbmVkID0gMCwKKyAgICBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgICAgICAgID0gKCAxIDw8IDggKSwKKyAgICBhdG9taWNfcmVkdWNlX2Jsb2NrICAgICAgICAgID0gKCAyIDw8IDggKSwKKyAgICB0cmVlX3JlZHVjZV9ibG9jayAgICAgICAgICAgID0gKCAzIDw8IDggKSwKKyAgICBlbXB0eV9yZWR1Y2VfYmxvY2sgICAgICAgICAgID0gKCA0IDw8IDggKQorfTsKKworLy8gZGVzY3JpcHRpb24gb2YgdGhlIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhcmlhYmxlCisvLyB0aGUgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFyaWFibGUgY29uc2lzdHMgb2YgdHdvIGVudW0gdHlwZXMgdmFyaWFibGVzIHRoYXQgYXJlIHBhY2tlZCB0b2dldGhlciBpbnRvIDAtdGggYnl0ZSBhbmQgMS1zdCBieXRlOgorLy8gMDogKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCAmIDB4MDAwMDAwRkYgKSBpcyBhICdlbnVtIGJhcnJpZXJfdHlwZScgdmFsdWUgb2YgYmFycmllciB0aGF0IHdpbGwgYmUgdXNlZCBpbiBmYXN0IHJlZHVjdGlvbjogYnNfcGxhaW5fYmFycmllciBvciBic19yZWR1Y3Rpb25fYmFycmllcgorLy8gMTogKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCAmIDB4MDAwMEZGMDAgKSBpcyBhIHJlZHVjdGlvbiBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgaW4gZmFzdCByZWR1Y3Rpb247CisvLyByZWR1Y3Rpb24gbWV0aG9kIGlzIG9mICdlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kJyB0eXBlIGFuZCBpdCdzIGRlZmluZWQgdGhlIHdheSBzbyB0aGF0IHRoZSBiaXRzIG9mIDAtdGggYnl0ZSBhcmUgZW1wdHksCisvLyBzbyBubyBuZWVkIHRvIGV4ZWN1dGUgYSBzaGlmdCBpbnN0cnVjdGlvbiB3aGlsZSBwYWNraW5nL3VucGFja2luZworCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUihyZWR1Y3Rpb25fbWV0aG9kLGJhcnJpZXJfdHlwZSkgXAorICAgICAgICAgICAgKCAoIHJlZHVjdGlvbl9tZXRob2QgKSB8ICggYmFycmllcl90eXBlICkgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCAoIGVudW0gX3JlZHVjdGlvbl9tZXRob2QgKSggKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICYgKCAweDAwMDBGRjAwICkgKSApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUihwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCAoIGVudW0gYmFycmllcl90eXBlICkoICAgICAgKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICYgKCAweDAwMDAwMEZGICkgKSApCisjZWxzZQorICAgICNkZWZpbmUgUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKHJlZHVjdGlvbl9tZXRob2QsYmFycmllcl90eXBlKSBcCisgICAgICAgICAgICAoIHJlZHVjdGlvbl9tZXRob2QgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUihwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCBic19wbGFpbl9iYXJyaWVyICkKKyNlbmRpZgorCisjZGVmaW5lIFRFU1RfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCx3aGljaF9yZWR1Y3Rpb25fYmxvY2spIFwKKyAgICAgICAgICAgICggKCBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSApID09ICggd2hpY2hfcmVkdWN0aW9uX2Jsb2NrICkgKQorCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUkVEVUNUSU9OX0JBUlJJRVIgXAorICAgICAgICAgICAgKCBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIoIHRyZWVfcmVkdWNlX2Jsb2NrLCBic19yZWR1Y3Rpb25fYmFycmllciApICkKKworICAgICNkZWZpbmUgVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9QTEFJTl9CQVJSSUVSIFwKKyAgICAgICAgICAgICggUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKCB0cmVlX3JlZHVjZV9ibG9jaywgYnNfcGxhaW5fYmFycmllciApICkKKyNlbmRpZgorCit0eXBlZGVmIGludCBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UOworCisvKiAtLSBlbmQgb2YgZmFzdCByZWR1Y3Rpb24gc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBVU0VfQ0JMS0RBVEEKKyMgcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorIyBwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMjcxIDMxMCApCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisjIGluY2x1ZGUgPHB0aHJlYWQuaD4KKyMgaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogT25seSBMaW51eCogT1MgYW5kIFdpbmRvd3MqIE9TIHN1cHBvcnQgdGhyZWFkIGFmZmluaXR5LgorICovCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCitleHRlcm4gc2l6ZV90IF9fa21wX2FmZmluX21hc2tfc2l6ZTsKKyMgZGVmaW5lIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKF9fa21wX2FmZmluX21hc2tfc2l6ZSA+IDApCisjIGRlZmluZSBLTVBfQUZGSU5JVFlfRElTQUJMRSgpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwKQorIyBkZWZpbmUgS01QX0FGRklOSVRZX0VOQUJMRShtYXNrX3NpemUpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSBtYXNrX3NpemUpCisjIGRlZmluZSBLTVBfQ1BVX1NFVFNJWkUgICAgICAgIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgKiBDSEFSX0JJVCkKKworI2lmIEtNUF9VU0VfSFdMT0MKKwordHlwZWRlZiBod2xvY19jcHVzZXRfdCBrbXBfYWZmaW5fbWFza190OworIyBkZWZpbmUgS01QX0NQVV9TRVQoaSxtYXNrKSAgICAgICBod2xvY19iaXRtYXBfc2V0KChod2xvY19jcHVzZXRfdCltYXNrLCAodW5zaWduZWQpaSkKKyMgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSAgICAgaHdsb2NfYml0bWFwX2lzc2V0KChod2xvY19jcHVzZXRfdCltYXNrLCAodW5zaWduZWQpaSkKKyMgZGVmaW5lIEtNUF9DUFVfQ0xSKGksbWFzaykgICAgICAgaHdsb2NfYml0bWFwX2NscigoaHdsb2NfY3B1c2V0X3QpbWFzaywgKHVuc2lnbmVkKWkpCisjIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgICAgICAgIGh3bG9jX2JpdG1hcF96ZXJvKChod2xvY19jcHVzZXRfdCltYXNrKQorIyBkZWZpbmUgS01QX0NQVV9DT1BZKGRlc3QsIHNyYykgICBod2xvY19iaXRtYXBfY29weSgoaHdsb2NfY3B1c2V0X3QpZGVzdCwgKGh3bG9jX2NwdXNldF90KXNyYykKKyMgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXhfYml0X251bWJlciwgbWFzaykgXAorICAgIHsgXAorICAgICAgICB1bnNpZ25lZCBpOyBcCisgICAgICAgIGZvcihpPTA7aTwodW5zaWduZWQpbWF4X2JpdF9udW1iZXIrMTtpKyspIHsgXAorICAgICAgICAgICAgaWYoaHdsb2NfYml0bWFwX2lzc2V0KChod2xvY19jcHVzZXRfdCltYXNrLCBpKSkgeyBcCisgICAgICAgICAgICAgICAgaHdsb2NfYml0bWFwX2NscigoaHdsb2NfY3B1c2V0X3QpbWFzaywgaSk7IFwKKyAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBod2xvY19iaXRtYXBfc2V0KChod2xvY19jcHVzZXRfdCltYXNrLCBpKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gXAorCisjIGRlZmluZSBLTVBfQ1BVX1VOSU9OKGRlc3QsIHNyYykgIGh3bG9jX2JpdG1hcF9vcigoaHdsb2NfY3B1c2V0X3QpZGVzdCwgKGh3bG9jX2NwdXNldF90KWRlc3QsIChod2xvY19jcHVzZXRfdClzcmMpCisjIGRlZmluZSBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksbWFzaykgXAorICAgIGZvcihpID0gaHdsb2NfYml0bWFwX2ZpcnN0KChod2xvY19jcHVzZXRfdCltYXNrKTsgKGludClpICE9IC0xOyBpID0gaHdsb2NfYml0bWFwX25leHQoKGh3bG9jX2NwdXNldF90KW1hc2ssIGkpKQorCisjIGRlZmluZSBLTVBfQ1BVX0FMTE9DKHB0cikgcHRyID0gKGttcF9hZmZpbl9tYXNrX3QqKWh3bG9jX2JpdG1hcF9hbGxvYygpCisjIGRlZmluZSBLTVBfQ1BVX0ZSRUUocHRyKSBod2xvY19iaXRtYXBfZnJlZSgoaHdsb2NfYml0bWFwX3QpcHRyKTsKKyMgZGVmaW5lIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0socHRyKSBLTVBfQ1BVX0FMTE9DKHB0cikKKyMgZGVmaW5lIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKHB0cikgS01QX0NQVV9GUkVFKHB0cikKKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfQUxMT0MocHRyKSBLTVBfQ1BVX0FMTE9DKHB0cikKKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfRlJFRShwdHIpIEtNUF9DUFVfRlJFRShwdHIpCisKKy8vCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGluZGV4IGFuIGFycmF5IG9mIG1hc2tzLgorLy8gVGhlIGFycmF5IHNob3VsZCBiZSBkZWNsYXJlZCBhcyAia21wX2FmZmluaXR5X3QgKiIgYW5kIGFsbG9jYXRlZCB3aXRoCisvLyBzaXplICJfX2ttcF9hZmZpbml0eV9tYXNrX3NpemUgKiBsZW4iLiAgVGhlIG1hY3JvIHRha2VzIGNhcmUgb2YgdGhlIGZhY3QKKy8vIHRoYXQgb24gV2luZG93cyogT1MsIHNpemVvZihrbXBfYWZmaW5fdCkgaXMgcmVhbGx5IHRoZSBzaXplIG9mIHRoZSBtYXNrLCBidXQKKy8vIG9uIExpbnV4KiBPUywgc2l6ZW9mKGttcF9hZmZpbl90KSBpcyAxLgorLy8KKyMgZGVmaW5lIEtNUF9DUFVfSU5ERVgoYXJyYXksaSkgKChrbXBfYWZmaW5fbWFza190KikoYXJyYXlbaV0pKQorIyBkZWZpbmUgS01QX0NQVV9BTExPQ19BUlJBWShhcnIsIG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnIgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKG4qc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKTsgXAorICAgIHVuc2lnbmVkIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKGk9MDtpPCh1bnNpZ25lZCluO2krKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJyW2ldID0gaHdsb2NfYml0bWFwX2FsbG9jKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisjIGRlZmluZSBLTVBfQ1BVX0ZSRUVfQVJSQVkoYXJyLCBuKSB7IFwKKyAgICB1bnNpZ25lZCBpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoaT0wO2k8KHVuc2lnbmVkKW47aSsrKSB7ICAgICAgIFwKKyAgICAgICAgaHdsb2NfYml0bWFwX2ZyZWUoYXJyW2ldKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9mcmVlKGFycik7ICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfQUxMT0NfQVJSQVkoYXJyLCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnIgPSAoa21wX2FmZmluX21hc2tfdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MobipzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpOyBcCisgICAgdW5zaWduZWQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvcihpPTA7aTwodW5zaWduZWQpbjtpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJyW2ldID0gaHdsb2NfYml0bWFwX2FsbG9jKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorIyBkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9GUkVFX0FSUkFZKGFyciwgbikgeyBcCisgICAgdW5zaWduZWQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKGk9MDtpPCh1bnNpZ25lZCluO2krKykgeyAgICAgICAgICAgICAgICBcCisgICAgICAgIGh3bG9jX2JpdG1hcF9mcmVlKGFycltpXSk7ICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoYXJyKTsgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKyNlbHNlIC8qIEtNUF9VU0VfSFdMT0MgKi8KKyMgIGRlZmluZSBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksbWFzaykgXAorICAgIGZvcihpID0gMDsgKHNpemVfdClpIDwgS01QX0NQVV9TRVRTSVpFOyArK2kpCisKKyMgaWYgS01QX09TX0xJTlVYCisvLworLy8gT24gTGludXgqIE9TLCB0aGUgbWFzayBpcyBhY3R1YWxseSBhIHZlY3RvciBvZiBsZW5ndGggX19rbXBfYWZmaW5fbWFza19zaXplCisvLyAoaW4gYnl0ZXMpLiAgSXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBvbiBhIHdvcmQgYm91bmRhcnkuCisvLworLy8gV0FSTklORyEhISAgV2UgaGF2ZSBtYWRlIHRoZSBiYXNlIHR5cGUgb2YgdGhlIGFmZmluaXR5IG1hc2sgdW5zaWduZWQgY2hhciwKKy8vIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSBhIGxvdCBvZiBjaGVja3MgdGhhdCB0aGUgdHJ1ZSBzeXN0ZW0gbWFzayBzaXplIGlzCisvLyByZWFsbHkgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIChvbiBMaW51eCogT1MpLgorLy8KKy8vIFRIRVNFIE1BQ1JPUyBXT04nVCBXT1JLIFBST1BFUkxZIE9OIEJJRyBFTkRJQU4gTUFDSElORVMhISEKKy8vCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBrbXBfYWZmaW5fbWFza190OworCisjICBkZWZpbmUgX0tNUF9DUFVfU0VUKGksbWFzaykgICAobWFza1tpL0NIQVJfQklUXSB8PSAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgQ0hBUl9CSVQpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX1NFVChpLG1hc2spICAgIF9LTVBfQ1BVX1NFVCgoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisjICBkZWZpbmUgX0tNUF9DUFVfSVNTRVQoaSxtYXNrKSAoISEobWFza1tpL0NIQVJfQklUXSAmICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSBDSEFSX0JJVCkpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX0lTU0VUKGksbWFzaykgIF9LTVBfQ1BVX0lTU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKyMgIGRlZmluZSBfS01QX0NQVV9DTFIoaSxtYXNrKSAgIChtYXNrW2kvQ0hBUl9CSVRdICY9IH4oKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgQ0hBUl9CSVQpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX0NMUihpLG1hc2spICAgIF9LTVBfQ1BVX0NMUigoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3QgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICBkZWZpbmUgS01QX0NQVV9DT1BZKGRlc3QsIHNyYykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3QgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShkZXN0KSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA9ICgoa21wX2FmZmluX21hc2tfdCAqKShzcmMpKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgIGRlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWF4X2JpdF9udW1iZXIsIG1hc2spIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2l6ZV90IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX2FmZmluX21hc2tfc2l6ZTsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgPSB+KChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICBkZWZpbmUgS01QX0NQVV9VTklPTihkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2l6ZV90IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX2FmZmluX21hc2tfc2l6ZTsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfD0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjIGVuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjIGlmIEtNUF9PU19XSU5ET1dTCisvLworLy8gT24gV2luZG93cyogT1MsIHRoZSBtYXNrIHNpemUgaXMgNCBieXRlcyBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbmQgb24KKy8vIEludGVsKFIpIDY0IGl0IGlzIDggYnl0ZXMgdGltZXMgdGhlIG51bWJlciBvZiBwcm9jZXNzb3IgZ3JvdXBzLgorLy8KKworIyAgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKy8vIEdST1VQX0FGRklOSVRZIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgX01TQ19WRVI+PTE2MDAgKFZTMjAxMCBhbmQgbGF0ZXIpLgorIyAgIGlmIF9NU0NfVkVSIDwgMTYwMAordHlwZWRlZiBzdHJ1Y3QgR1JPVVBfQUZGSU5JVFkgeworICAgIEtBRkZJTklUWSBNYXNrOworICAgIFdPUkQgR3JvdXA7CisgICAgV09SRCBSZXNlcnZlZFszXTsKK30gR1JPVVBfQUZGSU5JVFk7CisjICAgZW5kaWYKKwordHlwZWRlZiBEV09SRF9QVFIga21wX2FmZmluX21hc2tfdDsKKworZXh0ZXJuIGludCBfX2ttcF9udW1fcHJvY19ncm91cHM7CisKKyMgICBkZWZpbmUgX0tNUF9DUFVfU0VUKGksbWFzaykgXAorICAgICAgICAobWFza1tpLyhDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSldIHw9ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9TRVQoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX1NFVCgoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgICBkZWZpbmUgX0tNUF9DUFVfSVNTRVQoaSxtYXNrKSBcCisgICAgICAgICghIShtYXNrW2kvKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKV0gJiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSAlIChDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSkpKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9JU1NFVChpLG1hc2spIFwKKyAgICAgICAgX0tNUF9DUFVfSVNTRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorCisjICAgZGVmaW5lIF9LTVBfQ1BVX0NMUihpLG1hc2spIFwKKyAgICAgICAgKG1hc2tbaS8oQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpXSAmPSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB+KCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSAlIChDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSkpKSkKKworIyAgIGRlZmluZSBLTVBfQ1BVX0NMUihpLG1hc2spIFwKKyAgICAgICAgX0tNUF9DUFVfQ0xSKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKworIyAgIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICAgZGVmaW5lIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgPSAoKGttcF9hZmZpbl9tYXNrX3QgKikoc3JjKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICAgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXhfYml0X251bWJlciwgbWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA9IH4oKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgICBkZWZpbmUgS01QX0NQVV9VTklPTihkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfD0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCit0eXBlZGVmIERXT1JEICgqa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QpKFdPUkQpOworZXh0ZXJuIGttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50OworCit0eXBlZGVmIFdPUkQgKCprbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90KSh2b2lkKTsKK2V4dGVybiBrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQ7CisKK3R5cGVkZWYgQk9PTCAoKmttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpKEhBTkRMRSwgR1JPVVBfQUZGSU5JVFkgKik7CitleHRlcm4ga21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5OworCit0eXBlZGVmIEJPT0wgKCprbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KShIQU5ETEUsIGNvbnN0IEdST1VQX0FGRklOSVRZICosIEdST1VQX0FGRklOSVRZICopOworZXh0ZXJuIGttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eTsKKworZXh0ZXJuIGludCBfX2ttcF9nZXRfcHJvY19ncm91cChrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrKTsKKworIyAgZWxzZSAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKwordHlwZWRlZiBEV09SRCBrbXBfYWZmaW5fbWFza190OyAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHdpbmJhc2UuaCAqLworCisjICAgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgICAgICAoKihtYXNrKSB8PSAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpKSkpCisjICAgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSAgICAoISEoKihtYXNrKSAmICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkpKSkpCisjICAgZGVmaW5lIEtNUF9DUFVfQ0xSKGksbWFzaykgICAgICAoKihtYXNrKSAmPSB+KCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSkpKQorIyAgIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgICAgICAgKCoobWFzaykgPSAwKQorIyAgIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSAgKCooZGVzdCkgPSAqKHNyYykpCisjICAgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXhfYml0X251bWJlciwgbWFzaykgKCoobWFzaykgPSB+KihtYXNrKSkKKyMgICBkZWZpbmUgS01QX0NQVV9VTklPTihkZXN0LCBzcmMpICgqKGRlc3QpIHw9ICooc3JjKSkKKworIyAgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworLy8KKy8vIF9fa21wX2FsbG9jYXRlKCkgd2lsbCByZXR1cm4gbWVtb3J5IGFsbG9jYXRlZCBvbiBhIDQtYnl0ZXMgYm91bmRhcnkuCisvLyBhZnRlciB6ZXJvaW5nIGl0IC0gaXQgdGFrZXMgY2FyZSBvZiB0aG9zZSBhc3N1bXB0aW9ucyBzdGF0ZWQgYWJvdmUuCisvLworIyBkZWZpbmUgS01QX0NQVV9BTExPQyhwdHIpIFwKKyAgICAgICAgKHB0ciA9ICgoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKF9fa21wX2FmZmluX21hc2tfc2l6ZSkpKQorIyBkZWZpbmUgS01QX0NQVV9GUkVFKHB0cikgX19rbXBfZnJlZShwdHIpCisjIGRlZmluZSBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKHB0cikgKHB0ciA9ICgoa21wX2FmZmluX21hc2tfdCAqKUtNUF9BTExPQ0EoX19rbXBfYWZmaW5fbWFza19zaXplKSkpCisjIGRlZmluZSBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhwdHIpIC8qIE5vdGhpbmcgKi8KKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfQUxMT0MocHRyKSAocHRyID0gKChrbXBfYWZmaW5fbWFza190ICopS01QX0lOVEVSTkFMX01BTExPQyhfX2ttcF9hZmZpbl9tYXNrX3NpemUpKSkKKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfRlJFRShwdHIpICBLTVBfSU5URVJOQUxfRlJFRShwdHIpCisKKy8vCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGluZGV4IGFuIGFycmF5IG9mIG1hc2tzLgorLy8gVGhlIGFycmF5IHNob3VsZCBiZSBkZWNsYXJlZCBhcyAia21wX2FmZmluaXR5X3QgKiIgYW5kIGFsbG9jYXRlZCB3aXRoCisvLyBzaXplICJfX2ttcF9hZmZpbml0eV9tYXNrX3NpemUgKiBsZW4iLiAgVGhlIG1hY3JvIHRha2VzIGNhcmUgb2YgdGhlIGZhY3QKKy8vIHRoYXQgb24gV2luZG93cyogT1MsIHNpemVvZihrbXBfYWZmaW5fdCkgaXMgcmVhbGx5IHRoZSBzaXplIG9mIHRoZSBtYXNrLCBidXQKKy8vIG9uIExpbnV4KiBPUywgc2l6ZW9mKGttcF9hZmZpbl90KSBpcyAxLgorLy8KKyMgZGVmaW5lIEtNUF9DUFVfSU5ERVgoYXJyYXksaSkgXAorICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoKChjaGFyICopKGFycmF5KSkgKyAoaSkgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpKQorIyBkZWZpbmUgS01QX0NQVV9BTExPQ19BUlJBWShhcnIsIG4pICBhcnIgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKG4gKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpCisjIGRlZmluZSBLTVBfQ1BVX0ZSRUVfQVJSQVkoYXJyLCBuKSBfX2ttcF9mcmVlKGFycik7CisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKGFyciwgbikgIGFyciA9IChrbXBfYWZmaW5fbWFza190ICopS01QX0lOVEVSTkFMX01BTExPQyhuICogX19rbXBfYWZmaW5fbWFza19zaXplKQorIyBkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9GUkVFX0FSUkFZKGFyciwgbikgS01QX0lOVEVSTkFMX0ZSRUUoYXJyKTsKKworI2VuZGlmIC8qIEtNUF9VU0VfSFdMT0MgKi8KKworLy8KKy8vIERlY2xhcmUgbG9jYWwgY2hhciBidWZmZXJzIHdpdGggdGhpcyBzaXplIGZvciBwcmludGluZyBkZWJ1ZyBhbmQgaW5mbworLy8gbWVzc2FnZXMsIHVzaW5nIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soKS4KKy8vCisjZGVmaW5lIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiAgICAgICAgMTAyNAorCitlbnVtIGFmZmluaXR5X3R5cGUgeworICAgIGFmZmluaXR5X25vbmUgPSAwLAorICAgIGFmZmluaXR5X3BoeXNpY2FsLAorICAgIGFmZmluaXR5X2xvZ2ljYWwsCisgICAgYWZmaW5pdHlfY29tcGFjdCwKKyAgICBhZmZpbml0eV9zY2F0dGVyLAorICAgIGFmZmluaXR5X2V4cGxpY2l0LAorICAgIGFmZmluaXR5X2JhbGFuY2VkLAorICAgIGFmZmluaXR5X2Rpc2FibGVkLCAgLy8gbm90IHVzZWQgb3V0c2l6ZSB0aGUgZW52IHZhciBwYXJzZXIKKyAgICBhZmZpbml0eV9kZWZhdWx0Cit9OworCitlbnVtIGFmZmluaXR5X2dyYW4geworICAgIGFmZmluaXR5X2dyYW5fZmluZSA9IDAsCisgICAgYWZmaW5pdHlfZ3Jhbl90aHJlYWQsCisgICAgYWZmaW5pdHlfZ3Jhbl9jb3JlLAorICAgIGFmZmluaXR5X2dyYW5fcGFja2FnZSwKKyAgICBhZmZpbml0eV9ncmFuX25vZGUsCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgLy8KKyAgICAvLyBUaGUgImdyb3VwIiBncmFudWxhcml0eSBpc24ndCBuZWNlc3NzYXJpbHkgY29hcnNlciB0aGFuIGFsbCBvZiB0aGUKKyAgICAvLyBvdGhlciBsZXZlbHMsIGJ1dCB3ZSBwdXQgaXQgbGFzdCBpbiB0aGUgZW51bS4KKyAgICAvLworICAgIGFmZmluaXR5X2dyYW5fZ3JvdXAsCisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0Cit9OworCitlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgeworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfYWxsID0gMCwgLy8gdHJ5IGFsbCAoc3VwcG9ydGVkKSBtZXRob2RzLCBpbiBvcmRlcgorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2FwaWNpZCwKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkLAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm8sIC8vIEtNUF9DUFVJTkZPX0ZJTEUgaXMgdXNhYmxlIG9uIFdpbmRvd3MqIE9TLCB0b28KKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwLAorI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdCwKKyNpZiBLTVBfVVNFX0hXTE9DCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9od2xvYywKKyNlbmRpZgorICAgIGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdAorfTsKKworI2RlZmluZSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdCAgICgtMSkKKworZXh0ZXJuIGVudW0gYWZmaW5pdHlfdHlwZSBfX2ttcF9hZmZpbml0eV90eXBlOyAvKiBBZmZpbml0eSB0eXBlICovCitleHRlcm4gZW51bSBhZmZpbml0eV9ncmFuIF9fa21wX2FmZmluaXR5X2dyYW47IC8qIEFmZmluaXR5IGdyYW51bGFyaXR5ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzOyAvKiBjb3JyZXNwb25kaW5nIGludCB2YWx1ZSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9kdXBzOyAvKiBBZmZpbml0eSBkdXBsaWNhdGUgbWFza3MgKi8KK2V4dGVybiBlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZDsKK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfY29tcGFjdDsgLyogQWZmaW5pdHkgJ2NvbXBhY3QnIHZhbHVlICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X29mZnNldDsgLyogQWZmaW5pdHkgb2Zmc2V0IHZhbHVlICAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV92ZXJib3NlOyAvKiBXYXMgdmVyYm9zZSBzcGVjaWZpZWQgZm9yIEtNUF9BRkZJTklUWT8gKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfd2FybmluZ3M7IC8qIEtNUF9BRkZJTklUWSB3YXJuaW5ncyBlbmFibGVkID8gKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrOyAvKiBSZXNwZWN0IHByb2Nlc3MnIGluaXRpYWwgYWZmaW5pdHkgbWFzaz8gKi8KK2V4dGVybiBjaGFyICogX19rbXBfYWZmaW5pdHlfcHJvY2xpc3Q7IC8qIHByb2MgSUQgbGlzdCAqLworZXh0ZXJuIGttcF9hZmZpbl9tYXNrX3QgKl9fa21wX2FmZmluaXR5X21hc2tzOworZXh0ZXJuIHVuc2lnbmVkIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKK2V4dGVybiBpbnQgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShrbXBfYWZmaW5fbWFza190ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IpOworZXh0ZXJuIGludCBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvcik7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZChpbnQgd2hpY2gpOworCisjIGlmIEtNUF9PU19MSU5VWAorZXh0ZXJuIGttcF9hZmZpbl9tYXNrX3QgKl9fa21wX2FmZmluaXR5X2dldF9mdWxsTWFzaygpOworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KK2V4dGVybiBjaGFyIGNvbnN0ICogX19rbXBfY3B1aW5mb19maWxlOworCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8KKy8vIFRoaXMgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHZhbHVlcyBpbiBvbXAuaCAhISEKKy8vCit0eXBlZGVmIGVudW0ga21wX3Byb2NfYmluZF90IHsKKyAgICBwcm9jX2JpbmRfZmFsc2UgPSAwLAorICAgIHByb2NfYmluZF90cnVlLAorICAgIHByb2NfYmluZF9tYXN0ZXIsCisgICAgcHJvY19iaW5kX2Nsb3NlLAorICAgIHByb2NfYmluZF9zcHJlYWQsCisgICAgcHJvY19iaW5kX2ludGVsLCAgICAvLyB1c2UgS01QX0FGRklOSVRZIGludGVyZmFjZQorICAgIHByb2NfYmluZF9kZWZhdWx0Cit9IGttcF9wcm9jX2JpbmRfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX25lc3RlZF9wcm9jX2JpbmRfdCB7CisgICAga21wX3Byb2NfYmluZF90ICpiaW5kX3R5cGVzOworICAgIGludCBzaXplOworICAgIGludCB1c2VkOworfSBrbXBfbmVzdGVkX3Byb2NfYmluZF90OworCitleHRlcm4ga21wX25lc3RlZF9wcm9jX2JpbmRfdCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kOworCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisjICBkZWZpbmUgS01QX1BMQUNFX0FMTCAgICAgICAoLTEpCisjICBkZWZpbmUgS01QX1BMQUNFX1VOREVGSU5FRCAoLTIpCisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzOworCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBlbnVtIGttcF9jYW5jZWxfa2luZF90IHsKKyAgICBjYW5jZWxfbm9yZXEgPSAwLAorICAgIGNhbmNlbF9wYXJhbGxlbCA9IDEsCisgICAgY2FuY2VsX2xvb3AgPSAyLAorICAgIGNhbmNlbF9zZWN0aW9ucyA9IDMsCisgICAgY2FuY2VsX3Rhc2tncm91cCA9IDQKK30ga21wX2NhbmNlbF9raW5kX3Q7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworZXh0ZXJuIGludCBfX2ttcF9wbGFjZV9udW1fc29ja2V0czsKK2V4dGVybiBpbnQgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldDsKK2V4dGVybiBpbnQgX19rbXBfcGxhY2VfbnVtX2NvcmVzOworZXh0ZXJuIGludCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldDsKK2V4dGVybiBpbnQgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX1BBRCh0eXBlLCBzeikgICAgIChzaXplb2YodHlwZSkgKyAoc3ogLSAoKHNpemVvZih0eXBlKSAtIDEpICUgKHN6KSkgLSAxKSkKKworLy8KKy8vIFdlIG5lZWQgdG8gYXZvaWQgdXNpbmcgLTEgYXMgYSBHVElEIGFzICsxIGlzIGFkZGVkIHRvIHRoZSBndGlkCisvLyB3aGVuIHN0b3JpbmcgaXQgaW4gYSBsb2NrLCBhbmQgdGhlIHZhbHVlIDAgaXMgcmVzZXJ2ZWQuCisvLworI2RlZmluZSBLTVBfR1RJRF9ETkUgICAgICAgICAgICAoLTIpICAgIC8qIERvZXMgbm90IGV4aXN0ICovCisjZGVmaW5lIEtNUF9HVElEX1NIVVRET1dOICAgICAgICgtMykgICAgLyogTGlicmFyeSBpcyBzaHV0dGluZyBkb3duICovCisjZGVmaW5lIEtNUF9HVElEX01PTklUT1IgICAgICAgICgtNCkgICAgLyogTW9uaXRvciB0aHJlYWQgSUQgKi8KKyNkZWZpbmUgS01QX0dUSURfVU5LTk9XTiAgICAgICAgKC01KSAgICAvKiBJcyBub3Qga25vd24gKi8KKyNkZWZpbmUgS01QX0dUSURfTUlOICAgICAgICAgICAgKC02KSAgICAvKiBNaW5pbWFsIGd0aWQgZm9yIGxvdyBib3VuZCBjaGVjayBpbiBERUJVRyAqLworCisjZGVmaW5lIF9fa21wX2dldF9ndGlkKCkgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpCisjZGVmaW5lIF9fa21wX2VudHJ5X2d0aWQoKSAgICAgICAgICAgICBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcoKQorCisjZGVmaW5lIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkgICAgICggS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpID49IDAgKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbIChndGlkKSBdLT50aC50aF9pbmZvLmRzLmRzX3RpZCApCisKKyNkZWZpbmUgX19rbXBfZ2V0X3RpZCgpICAgICAgICAgICAgICAgKCBfX2ttcF90aWRfZnJvbV9ndGlkKCBfX2ttcF9nZXRfZ3RpZCgpICkgKQorI2RlZmluZSBfX2ttcF9ndGlkX2Zyb21fdGlkKHRpZCx0ZWFtKSAoIEtNUF9ERUJVR19BU1NFUlQoICh0aWQpID49IDAgJiYgKHRlYW0pICE9IE5VTEwgKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0gLT4gdC50X3RocmVhZHNbICh0aWQpIF0gLT4gdGgudGhfaW5mbyAuZHMuZHNfZ3RpZCApCisKKyNkZWZpbmUgX19rbXBfZ2V0X3RlYW0oKSAgICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRzWyAoX19rbXBfZ2V0X2d0aWQoKSkgXS0+IHRoLnRoX3RlYW0gKQorI2RlZmluZSBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKSAgICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzWyAoZ3RpZCkgXS0+IHRoLnRoX3RlYW0gKQorCisjZGVmaW5lIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCkgICggS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpID49IDAgKSwgX19rbXBfdGhyZWFkc1sgKGd0aWQpIF0gKQorI2RlZmluZSBfX2ttcF9nZXRfdGhyZWFkKCkgICAgICAgICAgICAoIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIF9fa21wX2dldF9ndGlkKCkgKSApCisKKyAgICAvLyBSZXR1cm5zIGN1cnJlbnQgdGhyZWFkIChwb2ludGVyIHRvIGttcF9pbmZvX3QpLiBJbiBjb250cmFzdCB0byBfX2ttcF9nZXRfdGhyZWFkKCksIGl0IHdvcmtzCisgICAgLy8gd2l0aCByZWdpc3RlcmVkIGFuZCBub3QteWV0LXJlZ2lzdGVyZWQgdGhyZWFkcy4KKyNkZWZpbmUgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHIpICAgKCBLTVBfREVCVUdfQVNTRVJUKCAodGhyKSAhPSBOVUxMICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyKS0+dGgudGhfaW5mby5kcy5kc19ndGlkICkKKworLy8gQVQ6IFdoaWNoIHdheSBpcyBjb3JyZWN0PworLy8gQVQ6IDEuIG5wcm9jID0gX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKy8vIEFUOiAyLiBucHJvYyA9IF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfdGVhbV9ucHJvYzsKKyNkZWZpbmUgX19rbXBfZ2V0X3RlYW1fbnVtX3RocmVhZHMoZ3RpZCkgKCBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jICkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9VSU5UNjRfTUFYICAgICAgICAgKH4oKGttcF91aW50NjQpMTw8KChzaXplb2Yoa21wX3VpbnQ2NCkqKDE8PDMpKS0xKSkpCisKKyNkZWZpbmUgS01QX01JTl9OVEggICAgICAgICAgIDEKKworI2lmbmRlZiBLTVBfTUFYX05USAorIyAgaWYgZGVmaW5lZChQVEhSRUFEX1RIUkVBRFNfTUFYKSAmJiBQVEhSRUFEX1RIUkVBRFNfTUFYIDwgSU5UX01BWAorIyAgICBkZWZpbmUgS01QX01BWF9OVEggICAgICAgICAgUFRIUkVBRF9USFJFQURTX01BWAorIyAgZWxzZQorIyAgICBkZWZpbmUgS01QX01BWF9OVEggICAgICAgICAgSU5UX01BWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBLTVBfTUFYX05USCAqLworCisjaWZkZWYgUFRIUkVBRF9TVEFDS19NSU4KKyMgZGVmaW5lIEtNUF9NSU5fU1RLU0laRSAgICAgICAgIFBUSFJFQURfU1RBQ0tfTUlOCisjZWxzZQorIyBkZWZpbmUgS01QX01JTl9TVEtTSVpFICAgICAgICAgKChzaXplX3QpKDMyICogMTAyNCkpCisjZW5kaWYKKworI2RlZmluZSBLTVBfTUFYX1NUS1NJWkUgICAgICAgICAgKH4oKHNpemVfdCkxPDwoKHNpemVvZihzaXplX3QpKigxPDwzKSktMSkpKQorCisjaWYgS01QX0FSQ0hfWDg2CisjIGRlZmluZSBLTVBfREVGQVVMVF9TVEtTSVpFICAgICAoKHNpemVfdCkoMiAqIDEwMjQgKiAxMDI0KSkKKyNlbGlmIEtNUF9BUkNIX1g4Nl82NAorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAgICAgKChzaXplX3QpKDQgKiAxMDI0ICogMTAyNCkpCisjIGRlZmluZSBLTVBfQkFDS1VQX1NUS1NJWkUgICAgICAoKHNpemVfdCkoMiAqIDEwMjQgKiAxMDI0KSkKKyNlbHNlCisjIGRlZmluZSBLTVBfREVGQVVMVF9TVEtTSVpFICAgICAoKHNpemVfdCkoMTAyNCAqIDEwMjQpKQorI2VuZGlmCisKKyNkZWZpbmUgS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFICAgICAoKHNpemVfdCkoNjQgKiAxMDI0KSkKKworI2RlZmluZSBLTVBfREVGQVVMVF9NQUxMT0NfUE9PTF9JTkNSICAgICgoc2l6ZV90KSAoMTAyNCAqIDEwMjQpKQorI2RlZmluZSBLTVBfTUlOX01BTExPQ19QT09MX0lOQ1IgICAgICAgICgoc2l6ZV90KSAoNCAqIDEwMjQpKQorI2RlZmluZSBLTVBfTUFYX01BTExPQ19QT09MX0lOQ1IgICAgICAgICh+KChzaXplX3QpMTw8KChzaXplb2Yoc2l6ZV90KSooMTw8MykpLTEpKSkKKworI2RlZmluZSBLTVBfTUlOX1NUS09GRlNFVCAgICAgICAoMCkKKyNkZWZpbmUgS01QX01BWF9TVEtPRkZTRVQgICAgICAgS01QX01BWF9TVEtTSVpFCisjaWYgS01QX09TX0RBUldJTgorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLT0ZGU0VUICBLTVBfTUlOX1NUS09GRlNFVAorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS09GRlNFVCAgQ0FDSEVfTElORQorI2VuZGlmCisKKyNkZWZpbmUgS01QX01JTl9TVEtQQURESU5HICAgICAgKDApCisjZGVmaW5lIEtNUF9NQVhfU1RLUEFERElORyAgICAgICgyICogMTAyNCAqIDEwMjQpCisKKyNkZWZpbmUgS01QX01JTl9NT05JVE9SX1dBS0VVUFMgICAgICAoMSkgICAgICAgLyogbWluIG51bWJlciBvZiB0aW1lcyBtb25pdG9yIHdha2VzIHVwIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX01BWF9NT05JVE9SX1dBS0VVUFMgICAgICAoMTAwMCkgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGltZXMgbW9uaXRvciBjYW4gd2FrZSB1cCBwZXIgc2Vjb25kICovCisjZGVmaW5lIEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUiAgICAgKDEwMDApICAgIC8qIG51bWJlciBvZiBibG9ja3RpbWUgdW5pdHMgcGVyIHNlY29uZCAqLworI2RlZmluZSBLTVBfTUlOX0JMT0NLVElNRSAgICAgICAgICAgICgwKQorI2RlZmluZSBLTVBfTUFYX0JMT0NLVElNRSAgICAgICAgICAgIChJTlRfTUFYKSAvKiBNdXN0IGJlIHRoaXMgZm9yICJpbmZpbml0ZSIgc2V0dGluZyB0aGUgd29yayAqLworI2RlZmluZSBLTVBfREVGQVVMVF9CTE9DS1RJTUUgICAgICAgICgyMDApICAgICAvKiAgX19rbXBfYmxvY2t0aW1lIGlzIGluIG1pbGxpc2Vjb25kcyAgKi8KKy8qIENhbGN1bGF0ZSBuZXcgbnVtYmVyIG9mIG1vbml0b3Igd2FrZXVwcyBmb3IgYSBzcGVjaWZpYyBibG9jayB0aW1lIGJhc2VkIG9uIHByZXZpb3VzIG1vbml0b3Jfd2FrZXVwcyAqLworLyogT25seSBhbGxvdyBpbmNyZWFzaW5nIG51bWJlciBvZiB3YWtldXBzICovCisjZGVmaW5lIEtNUF9XQUtFVVBTX0ZST01fQkxPQ0tUSU1FKGJsb2NrdGltZSwgbW9uaXRvcl93YWtldXBzKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoYmxvY2t0aW1lKSA9PSBLTVBfTUFYX0JMT0NLVElNRSkgPyAobW9uaXRvcl93YWtldXBzKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibG9ja3RpbWUpID09IEtNUF9NSU5fQkxPQ0tUSU1FKSA/IEtNUF9NQVhfTU9OSVRPUl9XQUtFVVBTIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1vbml0b3Jfd2FrZXVwcykgPiAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSIC8gKGJsb2NrdGltZSkpKSA/IChtb25pdG9yX3dha2V1cHMpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUikgLyAoYmxvY2t0aW1lKSApCisKKy8qIENhbGN1bGF0ZSBudW1iZXIgb2YgaW50ZXJ2YWxzIGZvciBhIHNwZWNpZmljIGJsb2NrIHRpbWUgYmFzZWQgb24gbW9uaXRvcl93YWtldXBzICovCisjZGVmaW5lIEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoYmxvY2t0aW1lLCBtb25pdG9yX3dha2V1cHMpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggKGJsb2NrdGltZSkgKyAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSIC8gKG1vbml0b3Jfd2FrZXVwcykpIC0gMSApIC8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUiAvIChtb25pdG9yX3dha2V1cHMpKSApCisKKyNkZWZpbmUgS01QX01JTl9TVEFUU0NPTFMgICAgICAgNDAKKyNkZWZpbmUgS01QX01BWF9TVEFUU0NPTFMgICAgICAgNDA5NgorI2RlZmluZSBLTVBfREVGQVVMVF9TVEFUU0NPTFMgICA4MAorCisjZGVmaW5lIEtNUF9NSU5fSU5URVJWQUwgICAgICAgIDAKKyNkZWZpbmUgS01QX01BWF9JTlRFUlZBTCAgICAgICAgKElOVF9NQVgtMSkKKyNkZWZpbmUgS01QX0RFRkFVTFRfSU5URVJWQUwgICAgMAorCisjZGVmaW5lIEtNUF9NSU5fQ0hVTksgICAgICAgICAgIDEKKyNkZWZpbmUgS01QX01BWF9DSFVOSyAgICAgICAgICAgKElOVF9NQVgtMSkKKyNkZWZpbmUgS01QX0RFRkFVTFRfQ0hVTksgICAgICAgMQorCisjZGVmaW5lIEtNUF9NSU5fSU5JVF9XQUlUICAgICAgIDEKKyNkZWZpbmUgS01QX01BWF9JTklUX1dBSVQgICAgICAgKElOVF9NQVgvMikKKyNkZWZpbmUgS01QX0RFRkFVTFRfSU5JVF9XQUlUICAgMjA0OFUKKworI2RlZmluZSBLTVBfTUlOX05FWFRfV0FJVCAgICAgICAxCisjZGVmaW5lIEtNUF9NQVhfTkVYVF9XQUlUICAgICAgIChJTlRfTUFYLzIpCisjZGVmaW5lIEtNUF9ERUZBVUxUX05FWFRfV0FJVCAgIDEwMjRVCisKKy8vIG1heCBwb3NzaWJsZSBkeW5hbWljIGxvb3BzIGluIGNvbmN1cnJlbnQgZXhlY3V0aW9uIHBlciB0ZWFtCisjZGVmaW5lIEtNUF9NQVhfRElTUF9CVUYgICAgICAgIDcKKyNkZWZpbmUgS01QX01BWF9PUkRFUkVEICAgICAgICAgOAorCisjZGVmaW5lIEtNUF9NQVhfRklFTERTICAgICAgICAgIDMyCisKKyNkZWZpbmUgS01QX01BWF9CUkFOQ0hfQklUUyAgICAgMzEKKworI2RlZmluZSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgSU5UX01BWAorCisvKiBNaW5pbXVtIG51bWJlciBvZiB0aHJlYWRzIGJlZm9yZSBzd2l0Y2ggdG8gVExTIGd0aWQgKGV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQpICovCisvKiBqb3NoIFRPRE86IHdoYXQgYWJvdXQgT1MgWCogdHVuaW5nPyAqLworI2lmICAgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorIyBkZWZpbmUgS01QX1RMU19HVElEX01JTiAgICAgNQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9UTFNfR1RJRF9NSU4gICAgIElOVF9NQVgKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9NQVNURVJfVElEKHRpZCkgICAgICAoICh0aWQpID09IDAgKQorI2RlZmluZSBLTVBfV09SS0VSX1RJRCh0aWQpICAgICAgKCAodGlkKSAhPSAwICkKKworI2RlZmluZSBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgICAgKCBfX2ttcF90aWRfZnJvbV9ndGlkKChndGlkKSkgPT0gMCApCisjZGVmaW5lIEtNUF9XT1JLRVJfR1RJRChndGlkKSAgICAoIF9fa21wX3RpZF9mcm9tX2d0aWQoKGd0aWQpKSAhPSAwICkKKyNkZWZpbmUgS01QX1VCRVJfR1RJRChndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gS01QX0dUSURfTUlOICksICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApLCAgICAgICAgICBcCisgICAgICAgIChndGlkKSA+PSAwICYmIF9fa21wX3Jvb3RbKGd0aWQpXSAmJiBfX2ttcF90aHJlYWRzWyhndGlkKV0gJiYgXAorICAgICAgICAoX19rbXBfdGhyZWFkc1soZ3RpZCldID09IF9fa21wX3Jvb3RbKGd0aWQpXS0+ci5yX3ViZXJfdGhyZWFkKVwKKyAgICApCisjZGVmaW5lIEtNUF9JTklUSUFMX0dUSUQoZ3RpZCkgICAoIChndGlkKSA9PSAwICkKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIEZBTFNFICAgMAorI2RlZmluZSBUUlVFICAgICghIEZBTFNFKQorI2VuZGlmCisKKy8qIE5PVEU6IGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBtdXN0IGJlIGV2ZW4gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgICA2NFUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgICAzMlUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfQ05LCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgICAxNlUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgICAgOFUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfTElOVVgKKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19EQVJXSU4KKy8qIFRPRE86IHR1bmUgZm9yIEtNUF9PU19EQVJXSU4gKi8KKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19GUkVFQlNECisvKiBUT0RPOiB0dW5lIGZvciBLTVBfT1NfRlJFRUJTRCAqLworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgIDEwMjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICA1MTJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX05FVEJTRAorLyogVE9ETzogdHVuZSBmb3IgS01QX09TX05FVEJTRCAqLworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgIDEwMjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICA1MTJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0Cit0eXBlZGVmIHN0cnVjdCBrbXBfY3B1aWQgeworICAgIGttcF91aW50MzIgIGVheDsKKyAgICBrbXBfdWludDMyICBlYng7CisgICAga21wX3VpbnQzMiAgZWN4OworICAgIGttcF91aW50MzIgIGVkeDsKK30ga21wX2NwdWlkX3Q7CitleHRlcm4gdm9pZCBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHN0cnVjdCBrbXBfY3B1aWQgKnAgKTsKKyMgaWYgS01QX0FSQ0hfWDg2CisgIGV4dGVybiB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApOworIyBlbGlmIEtNUF9NSUMKKyAgc3RhdGljIHZvaWQgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkgeyBfbW1fZGVsYXlfMzIoIDEwMCApOyB9OworIyBlbHNlCisgIHN0YXRpYyB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApIHsgX21tX3BhdXNlKCk7IH07CisjIGVuZGlmCisjIGRlZmluZSBLTVBfQ1BVX1BBVVNFKCkgX19rbXBfeDg2X3BhdXNlKCkKKyNlbGlmIEtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBLTVBfUFBDNjRfUFJJX0xPVygpIF9fYXNtX18gdm9sYXRpbGUgKCJvciAxLCAxLCAxIikKKyMgZGVmaW5lIEtNUF9QUEM2NF9QUklfTUVEKCkgX19hc21fXyB2b2xhdGlsZSAoIm9yIDIsIDIsIDIiKQorIyBkZWZpbmUgS01QX1BQQzY0X1BSSV9MT0NfTUIoKSBfX2FzbV9fIHZvbGF0aWxlICgiIiA6IDogOiAibWVtb3J5IikKKyMgZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSBkbyB7IEtNUF9QUEM2NF9QUklfTE9XKCk7IEtNUF9QUEM2NF9QUklfTUVEKCk7IEtNUF9QUEM2NF9QUklfTE9DX01CKCk7IH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgS01QX0NQVV9QQVVTRSgpICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2RlZmluZSBLTVBfSU5JVF9ZSUVMRChjb3VudCkgICAgICAgICAgIHsgKGNvdW50KSA9IF9fa21wX3lpZWxkX2luaXQ7IH0KKworI2RlZmluZSBLTVBfWUlFTEQoY29uZCkgICAgICAgICAgICAgICAgIHsgS01QX0NQVV9QQVVTRSgpOyBfX2ttcF95aWVsZCggKGNvbmQpICk7IH0KKworLy8gTm90ZSB0aGUgZGVjcmVtZW50IG9mIDIgaW4gdGhlIGZvbGxvd2luZyBNYWNyb3MuICBXaXRoIEtNUF9MSUJSQVJZPXR1cm5hcm91bmQsCisvLyB0aGVyZSBzaG91bGQgYmUgbm8geWllbGRpbmcgc2luY2UgdGhlIHN0YXJ0aW5nIHZhbHVlIGZyb20gS01QX0lOSVRfWUlFTEQoKSBpcyBvZGQuCisKKyNkZWZpbmUgS01QX1lJRUxEX1dIRU4oY29uZCxjb3VudCkgICAgICB7IEtNUF9DUFVfUEFVU0UoKTsgKGNvdW50KSAtPSAyOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjb3VudCkpIHsgS01QX1lJRUxEKGNvbmQpOyAoY291bnQpID0gX19rbXBfeWllbGRfbmV4dDsgfSB9CisjZGVmaW5lIEtNUF9ZSUVMRF9TUElOKGNvdW50KSAgICAgICAgICAgeyBLTVBfQ1BVX1BBVVNFKCk7IChjb3VudCkgLT0yOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjb3VudCkpIHsgS01QX1lJRUxEKDEpOyAoY291bnQpID0gX19rbXBfeWllbGRfbmV4dDsgfSB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU3VwcG9ydCBkYXRhdHlwZXMgZm9yIHRoZSBvcnBoYW5lZCBjb25zdHJ1Y3QgbmVzdGluZyBjaGVja3MuICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSBjb25zX3R5cGUgeworICAgIGN0X25vbmUsCisgICAgY3RfcGFyYWxsZWwsCisgICAgY3RfcGRvLAorICAgIGN0X3Bkb19vcmRlcmVkLAorICAgIGN0X3BzZWN0aW9ucywKKyAgICBjdF9wc2luZ2xlLAorCisgICAgLyogdGhlIGZvbGxvd2luZyBtdXN0IGJlIGxlZnQgaW4gb3JkZXIgYW5kIG5vdCBzcGxpdCB1cCAqLworICAgIGN0X3Rhc2txLAorICAgIGN0X3Rhc2ssICAgICAgICAgICAgICAgICAgICAvKiByZWFsbHkgdGFzayBpbnNpZGUgbm9uLW9yZGVyZWQgdGFza3EsIGNvbnNpZGVyZWQgYSB3b3Jrc2hhcmluZyB0eXBlICovCisgICAgY3RfdGFza19vcmRlcmVkLCAgICAgICAgICAgIC8qIHJlYWxseSB0YXNrIGluc2lkZSBvcmRlcmVkIHRhc2txLCBjb25zaWRlcmVkIGEgd29ya3NoYXJpbmcgdHlwZSAqLworICAgIC8qIHRoZSBwcmVjZWRpbmcgbXVzdCBiZSBsZWZ0IGluIG9yZGVyIGFuZCBub3Qgc3BsaXQgdXAgKi8KKworICAgIGN0X2NyaXRpY2FsLAorICAgIGN0X29yZGVyZWRfaW5fcGFyYWxsZWwsCisgICAgY3Rfb3JkZXJlZF9pbl9wZG8sCisgICAgY3Rfb3JkZXJlZF9pbl90YXNrcSwKKyAgICBjdF9tYXN0ZXIsCisgICAgY3RfcmVkdWNlLAorICAgIGN0X2JhcnJpZXIKK307CisKKy8qIHRlc3QgdG8gc2VlIGlmIHdlIGFyZSBpbiBhIHRhc2txIGNvbnN0cnVjdCAqLworIyBkZWZpbmUgSVNfQ09OU19UWVBFX1RBU0tRKCBjdCApICAgICAgICggKChpbnQpKGN0KSkgPj0gKChpbnQpY3RfdGFza3EpICYmICgoaW50KShjdCkpIDw9ICgoaW50KWN0X3Rhc2tfb3JkZXJlZCkgKQorIyBkZWZpbmUgSVNfQ09OU19UWVBFX09SREVSRUQoIGN0ICkgICAgICgoY3QpID09IGN0X3Bkb19vcmRlcmVkIHx8IChjdCkgPT0gY3RfdGFza19vcmRlcmVkKQorCitzdHJ1Y3QgY29uc19kYXRhIHsKKyAgICBpZGVudF90IGNvbnN0ICAgICAqaWRlbnQ7CisgICAgZW51bSBjb25zX3R5cGUgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgICAgIHByZXY7CisgICAga21wX3VzZXJfbG9ja19wICAgIG5hbWU7ICAgIC8qIGFkZHJlc3MgZXhjbHVzaXZlbHkgZm9yIGNyaXRpY2FsIHNlY3Rpb24gbmFtZSBjb21wYXJpc29uICovCit9OworCitzdHJ1Y3QgY29uc19oZWFkZXIgeworICAgIGludCAgICAgICAgICAgICAgICAgcF90b3AsIHdfdG9wLCBzX3RvcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YWNrX3NpemUsIHN0YWNrX3RvcDsKKyAgICBzdHJ1Y3QgY29uc19kYXRhICAgKnN0YWNrX2RhdGE7Cit9OworCitzdHJ1Y3Qga21wX3JlZ2lvbl9pbmZvIHsKKyAgICBjaGFyICAgICAgICAgICAgICAgICp0ZXh0OworICAgIGludCAgICAgICAgICAgICAgICAgb2Zmc2V0W0tNUF9NQVhfRklFTERTXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGxlbmd0aFtLTVBfTUFYX0ZJRUxEU107Cit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgdHlwZWRlZiBIQU5ETEUgICAgICAgICAgICAgIGttcF90aHJlYWRfdDsKKyAgICB0eXBlZGVmIERXT1JEICAgICAgICAgICAgICAga21wX2tleV90OworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZiBLTVBfT1NfVU5JWAorICAgIHR5cGVkZWYgcHRocmVhZF90ICAgICAgICAgICBrbXBfdGhyZWFkX3Q7CisgICAgdHlwZWRlZiBwdGhyZWFkX2tleV90ICAgICAgIGttcF9rZXlfdDsKKyNlbmRpZgorCitleHRlcm4ga21wX2tleV90ICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5OworCit0eXBlZGVmIHN0cnVjdCBrbXBfc3lzX2luZm8geworICAgIGxvbmcgbWF4cnNzOyAgICAgICAgICAvKiB0aGUgbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSB1dGlsaXplZCAoaW4ga2lsb2J5dGVzKSAgICAgKi8KKyAgICBsb25nIG1pbmZsdDsgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB3aXRob3V0IGFueSBJL08gICAgICAgICovCisgICAgbG9uZyBtYWpmbHQ7ICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gICAgICAqLworICAgIGxvbmcgbnN3YXA7ICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkgKi8KKyAgICBsb25nIGluYmxvY2s7ICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gaW5wdXQgICovCisgICAgbG9uZyBvdWJsb2NrOyAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIG91dHB1dCAqLworICAgIGxvbmcgbnZjc3c7ICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIHZvbHVudGFyaWx5ICAgICAgKi8KKyAgICBsb25nIG5pdmNzdzsgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyBmb3JjZWQgICAgICAgICAgICovCit9IGttcF9zeXNfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfY3B1aW5mbyB7CisgICAgaW50ICAgICAgICBpbml0aWFsaXplZDsgIC8vIElmIDAsIG90aGVyIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpemVkLgorICAgIGludCAgICAgICAgc2lnbmF0dXJlOyAgICAvLyBDUFVJRCgxKS5FQVgKKyAgICBpbnQgICAgICAgIGZhbWlseTsgICAgICAgLy8gQ1BVSUQoMSkuRUFYWzI3OjIwXSArIENQVUlEKDEpLkVBWFsxMTo4XSAoIEV4dGVuZGVkIEZhbWlseSArIEZhbWlseSApCisgICAgaW50ICAgICAgICBtb2RlbDsgICAgICAgIC8vICggQ1BVSUQoMSkuRUFYWzE5OjE2XSA8PCA0ICkgKyBDUFVJRCgxKS5FQVhbNzo0XSAoICggRXh0ZW5kZWQgTW9kZWwgPDwgNCApICsgTW9kZWwpCisgICAgaW50ICAgICAgICBzdGVwcGluZzsgICAgIC8vIENQVUlEKDEpLkVBWFszOjBdICggU3RlcHBpbmcgKQorICAgIGludCAgICAgICAgc3NlMjsgICAgICAgICAvLyAwIGlmIFNTRTIgaW5zdHJ1Y3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCAxIG90aGVyd2lzZS4KKyAgICBpbnQgICAgICAgIHJ0bTsgICAgICAgICAgLy8gMCBpZiBSVE0gaW5zdHJ1Y3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCAxIG90aGVyd2lzZS4KKyAgICBpbnQgICAgICAgIGNwdV9zdGFja29mZnNldDsKKyAgICBpbnQgICAgICAgIGFwaWNfaWQ7CisgICAgaW50ICAgICAgICBwaHlzaWNhbF9pZDsKKyAgICBpbnQgICAgICAgIGxvZ2ljYWxfaWQ7CisgICAga21wX3VpbnQ2NCBmcmVxdWVuY3k7ICAgIC8vIE5vbWluYWwgQ1BVIGZyZXF1ZW5jeSBpbiBIei4KK30ga21wX2NwdWluZm9fdDsKKworCisjaWZkZWYgQlVJTERfVFYKKworc3RydWN0IHR2X3RocmVhZHByaXZhdGUgeworICAgIC8qIFJlY29yZCB0eXBlICMxICovCisgICAgdm9pZCAgICAgICAgKmdsb2JhbF9hZGRyOworICAgIHZvaWQgICAgICAgICp0aHJlYWRfYWRkcjsKK307CisKK3N0cnVjdCB0dl9kYXRhIHsKKyAgICBzdHJ1Y3QgdHZfZGF0YSAgICAgICpuZXh0OworICAgIHZvaWQgICAgICAgICAgICAgICAgKnR5cGU7CisgICAgdW5pb24gdHZfdW5pb24geworICAgICAgICBzdHJ1Y3QgdHZfdGhyZWFkcHJpdmF0ZSB0cDsKKyAgICB9IHU7Cit9OworCitleHRlcm4ga21wX2tleV90IF9fa21wX3R2X2tleTsKKworI2VuZGlmIC8qIEJVSUxEX1RWICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gV2UgY2Fubm90IGluY2x1ZGUgImttcF9pdHQuaCIgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kuIERlY2xhcmUgdGhlIG9ubHkgcmVxdWlyZWQgdHlwZSBoZXJlLgorLy8gTGF0ZXIgd2Ugd2lsbCBjaGVjayB0aGUgdHlwZSBtZWV0cyByZXF1aXJlbWVudHMuCit0eXBlZGVmIGludCBrbXBfaXR0X21hcmtfdDsKKyNkZWZpbmUgS01QX0lUVF9ERUJVRyAwCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIGRhdGEgc3RydWN0dXJlcworICovCisKKyNkZWZpbmUgSElHSF9XQVRFUl9NQVJLKG5zbG90cykgICAgICAgICAoKChuc2xvdHMpICogMykgLyA0KQorI2RlZmluZSBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIICAgICAgICAxICAgICAgLyogbnVtIHRodW5rcyB0aGF0IGVhY2ggdGhyZWFkIGNhbiBzaW11bHRhbmVvdXNseSBleGVjdXRlIGZyb20gYSB0YXNrIHF1ZXVlICovCisKKy8qICBmbGFncyBmb3IgdGFza3FfZ2xvYmFsX2ZsYWdzLCBrbXBfdGFza19xdWV1ZV90IHRxX2ZsYWdzLCBrbXBjX3RodW5rX3QgdGhfZmxhZ3MgICovCisKKyNkZWZpbmUgVFFGX0lTX09SREVSRUQgICAgICAgICAgMHgwMDAxICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdGFza3Egb3JkZXJlZCAgKi8KKyNkZWZpbmUgVFFGX0lTX0xBU1RQUklWQVRFICAgICAgMHgwMDAyICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdGFza3Egd2l0aCBsYXN0cHJpdmF0ZSBsaXN0ICAqLworI2RlZmluZSBUUUZfSVNfTk9XQUlUICAgICAgICAgICAweDAwMDQgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCBlbmQgdGFza3Egbm93YWl0ICAqLworI2RlZmluZSBUUUZfSEVVUklTVElDUyAgICAgICAgICAweDAwMDggIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCB1c2UgaGV1cmlzdGljcyB0byBkZWNpZGUgdGFzayBxdWV1ZSBzaXplICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMSAweDAwMTAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDIgMHgwMDIwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQzIDB4MDA0MCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVENCAweDAwODAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKworI2RlZmluZSBUUUZfSU5URVJGQUNFX0ZMQUdTICAgICAweDAwZmYgIC8qICBhbGwgdGhlIF9fa21wY190YXNrcSBpbnRlcmZhY2UgZmxhZ3MgICovCisKKyNkZWZpbmUgVFFGX0lTX0xBU1RfVEFTSyAgICAgICAgMHgwMTAwICAvKiAgaW50ZXJuYWwvcmVhZCBieSBpbnN0cnVtZW50YXRpb247IG9ubHkgdXNlZCB3aXRoIFRRRl9JU19MQVNUUFJJVkFURSAgKi8KKyNkZWZpbmUgVFFGX1RBU0tRX1RBU0sgICAgICAgICAgMHgwMjAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IHRoaXMgdGh1bmstPnRoX3Rhc2sgaXMgdGhlIHRhc2txX3Rhc2sgICovCisjZGVmaW5lIFRRRl9SRUxFQVNFX1dPUktFUlMgICAgIDB4MDQwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyBtdXN0IHJlbGVhc2Ugd29ya2VyIHRocmVhZHMgb25jZSBBTlkgcXVldWVkIHRhc2sgZXhpc3RzIChnbG9iYWwpICovCisjZGVmaW5lIFRRRl9BTExfVEFTS1NfUVVFVUVEICAgIDB4MDgwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyBub3RpZnkgd29ya2VycyB0aGF0IG1hc3RlciBoYXMgZmluaXNoZWQgZW5xdWV1aW5nIHRhc2tzICovCisjZGVmaW5lIFRRRl9QQVJBTExFTF9DT05URVhUICAgIDB4MTAwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OiB0aGlzIHF1ZXVlIGVuY291bnRlcmVkIGluIGEgcGFyYWxsZWwgY29udGV4dDogbm90IHNlcmlhbGl6ZWQgKi8KKyNkZWZpbmUgVFFGX0RFQUxMT0NBVEVEICAgICAgICAgMHgyMDAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IHRoaXMgcXVldWUgaXMgb24gdGhlIGZyZWVsaXN0IGFuZCBub3QgaW4gdXNlICovCisKKyNkZWZpbmUgVFFGX0lOVEVSTkFMX0ZMQUdTICAgICAgMHgzZjAwICAvKiAgYWxsIHRoZSBpbnRlcm5hbCB1c2Ugb25seSBmbGFncyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9pbnQzMl90IHsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgYWlfZGF0YTsKK30ga21wY19hbGlnbmVkX2ludDMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90IHsKKyAgICBzdHJ1Y3Qga21wY190aHVua190ICAgKnFzX3RodW5rOworfSBrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCB7CisgICAgICAgIC8qIHRhc2sgcXVldWUgbGlua2FnZSBmaWVsZHMgZm9yIG4tYXJ5IHRyZWUgb2YgcXVldWVzIChsb2NrZWQgd2l0aCBnbG9iYWwgdGFza3FfdHJlZV9sY2spICovCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgdHFfbGlua19sY2s7ICAgICAgICAgIC8qICBsb2NrIGZvciBjaGlsZCBsaW5rLCBjaGlsZCBuZXh0L3ByZXYgbGlua3MgYW5kIGNoaWxkIHJlZiBjb3VudHMgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfcGFyZW50OyAgICAgICAgICAgIC8qICBwb2ludGVyIHRvIHBhcmVudCB0YXNrcSwgbm90IGxvY2tlZCAqLworICAgICAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX25leHRfZnJlZTsgICAgICAgICAvKiAgZm9yIHRhc2txIGludGVybmFsIGZyZWVsaXN0cywgbG9ja2VkIHdpdGggZ2xvYmFsIHRhc2txX2ZyZWVsaXN0X2xjayAqLworICAgIH0gdHE7CisgICAgdm9sYXRpbGUgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICp0cV9maXJzdF9jaGlsZDsgIC8qICBwb2ludGVyIHRvIGxpbmtlZC1saXN0IG9mIGNoaWxkcmVuLCBsb2NrZWQgYnkgdHEncyB0cV9saW5rX2xjayAqLworICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAgICAgKnRxX25leHRfY2hpbGQ7ICAgICAgICAvKiAgbmV4dCBjaGlsZCBpbiBsaW5rZWQtbGlzdCwgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICAgICAqdHFfcHJldl9jaGlsZDsgICAgICAgIC8qICBwcmV2aW91cyBjaGlsZCBpbiBsaW5rZWQtbGlzdCwgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgICAgdHFfcmVmX2NvdW50OyAgICAgICAgIC8qICByZWZlcmVuY2UgY291bnQgb2YgdGhyZWFkcyB3aXRoIGFjY2VzcyB0byB0aGlzIHRhc2sgcXVldWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIChvdGhlciB0aGFuIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBrbXBjX2VuZF90YXNrcSBjYWxsKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisKKyAgICAgICAgLyogc2hhcmVkIGRhdGEgZm9yIHRhc2sgcXVldWUgKi8KKyAgICBzdHJ1Y3Qga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgICAgKnRxX3NoYXJlZHM7ICAgLyogIHBlci10aHJlYWQgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIG9ubHkgb25lIGFycmF5IGVsZW1lbnQgZXhpc3RzIGZvciBhbGwgYnV0IG91dGVybW9zdCB0YXNrcSAqLworCisgICAgICAgIC8qIGJvb2trZWVwaW5nIGZvciBvcmRlcmVkIHRhc2sgcXVldWUgKi8KKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICAgICB0cV90YXNrbnVtX3F1ZXVpbmc7ICAgLyogIG9yZGVyZWQgdGFzayBudW1iZXIgYXNzaWduZWQgd2hpbGUgcXVldWluZyB0YXNrcyAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICAgICAgIHRxX3Rhc2tudW1fc2VydmluZzsgICAvKiAgb3JkZXJlZCBudW1iZXIgb2YgbmV4dCB0YXNrIHRvIGJlIHNlcnZlZCAoZXhlY3V0ZWQpICovCisKKyAgICAgICAgLyogdGh1bmsgc3RvcmFnZSBtYW5hZ2VtZW50IGZvciB0YXNrIHF1ZXVlICovCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgdHFfZnJlZV90aHVua3NfbGNrOyAgIC8qICBsb2NrIGZvciB0aHVuayBmcmVlbGlzdCBtYW5pcHVsYXRpb24gKi8KKyAgICBzdHJ1Y3Qga21wY190aHVua190ICAgICAgICAgICp0cV9mcmVlX3RodW5rczsgICAgICAgLyogIHRodW5rIGZyZWVsaXN0LCBjaGFpbmVkIHZpYSB0aC50aF9uZXh0X2ZyZWUgICovCisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAgICAgICAgICAqdHFfdGh1bmtfc3BhY2U7ICAgICAgIC8qICBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRodW5rcyBmb3IgdGhpcyB0YXNrIHF1ZXVlICAqLworCisgICAgICAgIC8qIGRhdGEgZmllbGRzIGZvciBxdWV1ZSBpdHNlbGYgKi8KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgICB0cV9xdWV1ZV9sY2s7ICAgICAgICAgLyogIGxvY2sgZm9yIFtkZV1lbnF1ZXVlIG9wZXJhdGlvbnM6IHRxX3F1ZXVlLCB0cV9oZWFkLCB0cV90YWlsLCB0cV9uZnVsbCAqLworICAgIGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QgICAgKnRxX3F1ZXVlOyAgICAgICAgICAgICAvKiAgYXJyYXkgb2YgcXVldWUgc2xvdHMgdG8gaG9sZCB0aHVua3MgZm9yIHRhc2tzICovCisgICAgdm9sYXRpbGUgc3RydWN0IGttcGNfdGh1bmtfdCAqdHFfdGFza3Ffc2xvdDsgICAgICAgIC8qICBzcGVjaWFsIHNsb3QgZm9yIHRhc2txIHRhc2sgdGh1bmssIG9jY3VwaWVkIGlmIG5vdCBOVUxMICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX25zbG90czsgICAgICAgICAgICAvKiAgIyBvZiB0cV90aHVua19zcGFjZSB0aHVua3MgYWxsb2MnZCAobm90IGluY2wuIHRxX3Rhc2txX3Nsb3Qgc3BhY2UpICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX2hlYWQ7ICAgICAgICAgICAgICAvKiAgZW5xdWV1ZSBwdXRzIG5leHQgaXRlbSBpbiBoZXJlIChpbmRleCBpbnRvIHRxX3F1ZXVlIGFycmF5KSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX3RhaWw7ICAgICAgICAgICAgICAvKiAgZGVxdWV1ZSB0YWtlcyBuZXh0IGl0ZW0gb3V0IG9mIGhlcmUgKGluZGV4IGludG8gdHFfcXVldWUgYXJyYXkpICovCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgICAgdHFfbmZ1bGw7ICAgICAgICAgICAgIC8qICAjIG9mIG9jY3VwaWVkIGVudHJpZXMgaW4gdGFzayBxdWV1ZSByaWdodCBub3cgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfaGl3YXQ7ICAgICAgICAgICAgIC8qICBoaWdoLXdhdGVyIG1hcmsgZm9yIHRxX25mdWxsIGFuZCBxdWV1ZSBzY2hlZHVsaW5nICAqLworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICAgIHRxX2ZsYWdzOyAgICAgICAgICAgICAvKiAgVFFGX3h4eCAgKi8KKworICAgICAgICAvKiBib29ra2VlcGluZyBmb3Igb3V0c3RhbmRpbmcgdGh1bmtzICovCisgICAgc3RydWN0IGttcGNfYWxpZ25lZF9pbnQzMl90ICAqdHFfdGhfdGh1bmtzOyAgICAgICAgIC8qICBwZXItdGhyZWFkIGFycmF5IGZvciAjIG9mIHJlZ3VsYXIgdGh1bmtzIGN1cnJlbnRseSBiZWluZyBleGVjdXRlZCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX25wcm9jOyAgICAgICAgICAgICAvKiAgbnVtYmVyIG9mIHRodW5rcyBpbiB0aGUgdGhfdGh1bmtzIGFycmF5ICovCisKKyAgICAgICAgLyogc3RhdGlzdGljcyBsaWJyYXJ5IGJvb2trZWVwaW5nICovCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgKnRxX2xvYzsgICAgICAgICAgICAgIC8qICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRhc2txIGRpcmVjdGl2ZSAqLworfSBrbXBjX3Rhc2tfcXVldWVfdDsKKwordHlwZWRlZiB2b2lkICgqa21wY190YXNrX3QpIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwgc3RydWN0IGttcGNfdGh1bmtfdCAqdGh1bmspOworCisvKiAgc2l6ZW9mX3NoYXJlZHMgcGFzc2VkIGFzIGFyZyB0byBfX2ttcGNfdGFza3EgY2FsbCAgKi8KK3R5cGVkZWYgc3RydWN0IGttcGNfc2hhcmVkX3ZhcnNfdCB7ICAgICAgICAgICAgIC8qICBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gKi8KKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICAgICAgICpzdl9xdWV1ZTsKKyAgICAvKiAgKHBvaW50ZXJzIHRvKSBzaGFyZWQgdmFycyAgKi8KK30ga21wY19zaGFyZWRfdmFyc190OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgeworICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBjX3NoYXJlZF92YXJzX3QgICAgICphaV9kYXRhOworfSBrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdDsKKworLyogIHNpemVvZl90aHVuayBwYXNzZWQgYXMgYXJnIHRvIGttcGNfdGFza3EgY2FsbCAgKi8KK3R5cGVkZWYgc3RydWN0IGttcGNfdGh1bmtfdCB7ICAgICAgICAgICAgICAgICAgIC8qICBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gKi8KKyAgICB1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBmaWVsZCB1c2VkIGZvciBpbnRlcm5hbCBmcmVlbGlzdHMgdG9vICAqLworICAgICAgICBrbXBjX3NoYXJlZF92YXJzX3QgICp0aF9zaGFyZWRzOworICAgICAgICBzdHJ1Y3Qga21wY190aHVua190ICp0aF9uZXh0X2ZyZWU7ICAgICAgLyogIGZyZWVsaXN0IG9mIGluZGl2aWR1YWwgdGh1bmtzIHdpdGhpbiBxdWV1ZSwgaGVhZCBhdCB0cV9mcmVlX3RodW5rcyAgKi8KKyAgICB9IHRoOworICAgIGttcGNfdGFza190IHRoX3Rhc2s7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIHRhc2txX3Rhc2sgaWYgZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSyAgKi8KKyAgICBzdHJ1Y3Qga21wY190aHVua190ICp0aF9lbmNsX3RodW5rOyAgICAgICAgIC8qICBwb2ludGVyIHRvIGR5bmFtaWNhbGx5IGVuY2xvc2luZyB0aHVuayBvbiB0aGlzIHRocmVhZCdzIGNhbGwgc3RhY2sgKi8KKyAgICBrbXBfaW50MzIgdGhfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBUUUZfeHh4ICh0cV9mbGFncyBpbnRlcmZhY2UgcGx1cyBwb3NzaWJsZSBpbnRlcm5hbCBmbGFncykgICovCisgICAga21wX2ludDMyIHRoX3N0YXR1czsKKyAgICBrbXBfdWludDMyIHRoX3Rhc2tudW07ICAgICAgICAgICAgICAgICAgICAgIC8qICB0YXNrIG51bWJlciBhc3NpZ25lZCBpbiBvcmRlciBvZiBxdWV1aW5nLCB1c2VkIGZvciBvcmRlcmVkIHNlY3Rpb25zICovCisgICAgLyogIHByaXZhdGUgdmFycyAgKi8KK30ga21wY190aHVua190OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wX3Rhc2txIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHRxX2N1cnJfdGh1bmtfY2FwYWNpdHk7CisKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnRxX3Jvb3Q7CisgICAga21wX2ludDMyICAgICAgICAgICB0cV9nbG9iYWxfZmxhZ3M7CisKKyAgICBrbXBfbG9ja190ICAgICAgICAgIHRxX2ZyZWVsaXN0X2xjazsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnRxX2ZyZWVsaXN0OworCisgICAga21wY190aHVua190ICAgICAgKip0cV9jdXJyX3RodW5rOworfSBrbXBfdGFza3FfdDsKKworLyogRU5EIFRhc2txIGRhdGEgc3RydWN0dXJlcyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYga21wX2ludDMyIGttcF9jcml0aWNhbF9uYW1lWzhdOworCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitUaGUgdHlwZSBmb3IgYSBtaWNyb3Rhc2sgd2hpY2ggZ2V0cyBwYXNzZWQgdG8gQHJlZiBfX2ttcGNfZm9ya19jYWxsKCkuCitUaGUgYXJndW1lbnRzIHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbiBhcmUKK0BwYXJhbSBnbG9iYWxfdGlkIHRoZSBnbG9iYWwgdGhyZWFkIGlkZW50aXR5IG9mIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbi4KK0BwYXJhbSBib3VuZF90aWQgIHRoZSBsb2NhbCBpZGVudGl0aXkgb2YgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uCitAcGFyYW0gLi4uIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgdGhlIGZ1bmN0aW9uLgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfbWljcm8pICAgICAgICAgICAgICAoIGttcF9pbnQzMiAqIGdsb2JhbF90aWQsIGttcF9pbnQzMiAqIGJvdW5kX3RpZCwgLi4uICk7Cit0eXBlZGVmIHZvaWQgKCprbXBjX21pY3JvX2JvdW5kKSAgICAgICAgKCBrbXBfaW50MzIgKiBib3VuZF90aWQsIGttcF9pbnQzMiAqIGJvdW5kX250aCwgLi4uICk7CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorQHsKKyovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFRocmVhZHByaXZhdGUgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworCisvKiAgZm9yIG5vbi1hcnJheSBvYmplY3RzOiAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIoKSAgKi8KKworLyohCisgUG9pbnRlciB0byB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jdG9yKSAgICAodm9pZCAqKTsKKworLyohCisgUG9pbnRlciB0byB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfZHRvcikgICAgICh2b2lkICogLyosIHNpemVfdCAqLyk7IC8qIDJuZCBhcmc6IG1hZ2ljIG51bWJlciBmb3IgS0NDIHVudXNlZCBieSBJbnRlbCBjb21waWxlciAqLworLyohCisgUG9pbnRlciB0byBhbiBhbHRlcm5hdGUgY29uc3RydWN0b3IuCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY2N0b3IpICAgKHZvaWQgKiwgdm9pZCAqKTsKKworLyogIGZvciBhcnJheSBvYmplY3RzOiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMoKSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgYXJnOiAidGhpcyIgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IGFyZzogbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICovCisvKiEKKyBBcnJheSBjb25zdHJ1Y3Rvci4KKyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisgU2Vjb25kIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY3Rvcl92ZWMpICAodm9pZCAqLCBzaXplX3QpOworLyohCisgUG9pbnRlciB0byB0aGUgYXJyYXkgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFNlY29uZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfZHRvcl92ZWMpICAgKHZvaWQgKiwgc2l6ZV90KTsKKy8qIQorIEFycmF5IGNvbnN0cnVjdG9yLgorIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyBUaGlyZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2NjdG9yX3ZlYykgKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpOyAvKiBmdW5jdGlvbiB1bnVzZWQgYnkgY29tcGlsZXIgKi8KKworLyohCitAfQorKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoga2VlcHMgdHJhY2tlZCBvZiB0aHJlYWRwcml2YXRlIGNhY2hlIGFsbG9jYXRpb25zIGZvciBjbGVhbnVwIGxhdGVyICovCit0eXBlZGVmIHN0cnVjdCBrbXBfY2FjaGVkX2FkZHIgeworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKiphZGRyOyAgICAgICAgICAgLyogYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGUgKi8KKyAgICBzdHJ1Y3Qga21wX2NhY2hlZF9hZGRyICAgICAqbmV4dDsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBjYWNoZWQgYWRkcmVzcyAqLworfSBrbXBfY2FjaGVkX2FkZHJfdDsKKworc3RydWN0IHByaXZhdGVfZGF0YSB7CisgICAgc3RydWN0IHByaXZhdGVfZGF0YSAqbmV4dDsgICAgICAgICAgLyogVGhlIG5leHQgZGVzY3JpcHRvciBpbiB0aGUgbGlzdCAgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAqZGF0YTsgICAgICAgICAgLyogVGhlIGRhdGEgYnVmZmVyIGZvciB0aGlzIGRlc2NyaXB0b3IgICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgbW9yZTsgICAgICAgICAgLyogVGhlIHJlcGVhdCBjb3VudCBmb3IgdGhpcyBkZXNjcmlwdG9yICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgLyogVGhlIGRhdGEgc2l6ZSBmb3IgdGhpcyBkZXNjcmlwdG9yICAgICovCit9OworCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24geworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAgICAgKm5leHQ7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICAgICAqbGluazsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpnYmxfYWRkcjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpwYXJfYWRkcjsgICAgICAgIC8qIHBhcl9hZGRyID09IGdibF9hZGRyIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgY21uX3NpemU7Cit9OworCitzdHJ1Y3Qgc2hhcmVkX2NvbW1vbgoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICAgICAgKm5leHQ7CisgICAgc3RydWN0IHByaXZhdGVfZGF0YSAgICAgICAqcG9kX2luaXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqb2JqX2luaXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZ2JsX2FkZHI7CisgICAgdW5pb24geworICAgICAgICBrbXBjX2N0b3IgICAgICAgICAgICAgIGN0b3I7CisgICAgICAgIGttcGNfY3Rvcl92ZWMgICAgICAgICAgY3RvcnY7CisgICAgfSBjdDsKKyAgICB1bmlvbiB7CisgICAgICAgIGttcGNfY2N0b3IgICAgICAgICAgICAgY2N0b3I7CisgICAgICAgIGttcGNfY2N0b3JfdmVjICAgICAgICAgY2N0b3J2OworICAgIH0gY2N0OworICAgIHVuaW9uIHsKKyAgICAgICAga21wY19kdG9yICAgICAgICAgICAgICBkdG9yOworICAgICAgICBrbXBjX2R0b3JfdmVjICAgICAgICAgIGR0b3J2OworICAgIH0gZHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgdmVjX2xlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBpc192ZWM7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgY21uX3NpemU7Cit9OworCisjZGVmaW5lIEtNUF9IQVNIX1RBQkxFX0xPRzIgICAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9nMiBvZiB0aGUgaGFzaCB0YWJsZSBzaXplICovCisjZGVmaW5lIEtNUF9IQVNIX1RBQkxFX1NJWkUgICAgICgxIDw8IEtNUF9IQVNIX1RBQkxFX0xPRzIpICAgICAgLyogc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSAqLworI2RlZmluZSBLTVBfSEFTSF9TSElGVCAgICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocm93IGF3YXkgdGhpcyBtYW55IGxvdyBiaXRzIGZyb20gdGhlIGFkZHJlc3MgKi8KKyNkZWZpbmUgS01QX0hBU0goeCkgICAgICAgICAgICAgKCgoKGttcF91aW50cHRyX3QpIHgpID4+IEtNUF9IQVNIX1NISUZUKSAmIChLTVBfSEFTSF9UQUJMRV9TSVpFLTEpKQorCitzdHJ1Y3QgY29tbW9uX3RhYmxlIHsKKyAgICBzdHJ1Y3QgIHByaXZhdGVfY29tbW9uICAgICAgKmRhdGFbIEtNUF9IQVNIX1RBQkxFX1NJWkUgXTsKK307CisKK3N0cnVjdCBzaGFyZWRfdGFibGUgeworICAgIHN0cnVjdCAgc2hhcmVkX2NvbW1vbiAgICAgICAqZGF0YVsgS01QX0hBU0hfVEFCTEVfU0laRSBdOworfTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMiB7CisgICAga21wX2ludDMyIGNvdW50OworICAgIGttcF9pbnQzMiB1YjsKKyAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICBrbXBfaW50MzIgbGI7CisgICAga21wX2ludDMyIHN0OworICAgIGttcF9pbnQzMiB0YzsKKyAgICBrbXBfaW50MzIgc3RhdGljX3N0ZWFsX2NvdW50ZXI7IC8qIGZvciBzdGF0aWNfc3RlYWwgb25seTsgbWF5YmUgYmV0dGVyIHRvIHB1dCBhZnRlciB1YiAqLworCisgICAgLy8gS01QX0FMSUdOKCAxNiApIGVuc3VyZXMgKCBpZiB0aGUgS01QX0FMSUdOIG1hY3JvIGlzIHR1cm5lZCBvbiApCisgICAgLy8gICAgYSkgcGFybTMgaXMgcHJvcGVybHkgYWxpZ25lZCBhbmQKKyAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAvLyBCZWNhdXNlIG9mIHBhcm0xLTQgYXJlIHVzZWQgdG9nZXRoZXIsIHBlcmZvcm1hbmNlIHNlZW1zIHRvIGJlIGJldHRlcgorICAgIC8vIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGxpbmUgKG5vdCBtZWFzdXJlZCB0aG91Z2gpLgorCisgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7IC8vIEFDOiBjaGFuZ2VkIDE2IHRvIDMyIGluIG9yZGVyIHRvIHNpbXBsaWZ5IHRlbXBsYXRlCisgICAgICAgIGttcF9pbnQzMiBwYXJtMTsgICAgIC8vICAgICBzdHJ1Y3R1cmVzIGluIGttcF9kaXNwYXRjaC5jcHAuIFRoaXMgc2hvdWxkCisgICAgICAgIGttcF9pbnQzMiBwYXJtMjsgICAgIC8vICAgICBtYWtlIG5vIHJlYWwgY2hhbmdlIGF0IGxlYXN0IHdoaWxlIHBhZGRpbmcgaXMgb2ZmLgorICAgICAgICBrbXBfaW50MzIgcGFybTM7CisgICAgICAgIGttcF9pbnQzMiBwYXJtNDsKKyAgICB9OworCisgICAga21wX3VpbnQzMiBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50MzIgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIC8vIFRoaXMgdmFyIGNhbiBiZSBwbGFjZWQgaW4gdGhlIGhvbGUgYmV0d2VlbiAndGMnIGFuZCAncGFybTEnLCBpbnN0ZWFkIG9mICdzdGF0aWNfc3RlYWxfY291bnRlcicuCisgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZWFzdXJlIGV4ZWN1dGlvbiB0aW1lcy4KKyAgICAvLyBDb25kaXRpb25hbCBpZi9lbmRpZiBjYW4gYmUgcmVtb3ZlZCBhdCBhbGwuCisgICAga21wX2ludDMyIGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0IHsKKyAgICBrbXBfaW50NjQgY291bnQ7ICAgLyogY3VycmVudCBjaHVuayBudW1iZXIgZm9yIHN0YXRpYyBhbmQgc3RhdGljLXN0ZWFsIHNjaGVkdWxpbmcqLworICAgIGttcF9pbnQ2NCB1YjsgICAgICAvKiB1cHBlci1ib3VuZCAqLworICAgIC8qIEFkZGluZyBLTVBfQUxJR05fQ0FDSEUgaGVyZSBkb2Vzbid0IGhlbHAgLyBjYW4gaHVydCBwZXJmb3JtYW5jZSAqLworICAgIGttcF9pbnQ2NCBsYjsgICAgICAvKiBsb3dlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCBzdDsgICAgICAvKiBzdHJpZGUgKi8KKyAgICBrbXBfaW50NjQgdGM7ICAgICAgLyogdHJpcCBjb3VudCAobnVtYmVyIG9mIGl0ZXJhdGlvbnMpICovCisgICAga21wX2ludDY0IHN0YXRpY19zdGVhbF9jb3VudGVyOyAvKiBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIgKi8KKworICAgIC8qIHBhcm1bMS00XSBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cyBieSBkaWZmZXJlbnQgc2NoZWR1bGluZyBhbGdvcml0aG1zICovCisKKyAgICAvLyBLTVBfQUxJR04oIDMyICkgZW5zdXJlcyAoIGlmIHRoZSBLTVBfQUxJR04gbWFjcm8gaXMgdHVybmVkIG9uICkKKyAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgIC8vICAgIGIpIGFsbCBwYXJtMS00IGFyZSBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICAgIC8vIEJlY2F1c2Ugb2YgcGFybTEtNCBhcmUgdXNlZCB0b2dldGhlciwgcGVyZm9ybWFuY2Ugc2VlbXMgdG8gYmUgYmV0dGVyCisgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICBzdHJ1Y3QgS01QX0FMSUdOKCAzMiApIHsKKyAgICAgICAga21wX2ludDY0IHBhcm0xOworICAgICAgICBrbXBfaW50NjQgcGFybTI7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtMzsKKyAgICAgICAga21wX2ludDY0IHBhcm00OworICAgIH07CisKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQ2NCBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgLy8gVGhpcyB2YXIgY2FuIGJlIHBsYWNlZCBpbiB0aGUgaG9sZSBiZXR3ZWVuICd0YycgYW5kICdwYXJtMScsIGluc3RlYWQgb2YgJ3N0YXRpY19zdGVhbF9jb3VudGVyJy4KKyAgICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWVzLgorICAgIC8vIENvbmRpdGlvbmFsIGlmL2VuZGlmIGNhbiBiZSByZW1vdmVkIGF0IGFsbC4KKyAgICBrbXBfaW50NjQgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90OworI2Vsc2UgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzIgeworICAgIGttcF9pbnQzMiBsYjsKKyAgICBrbXBfaW50MzIgdWI7CisgICAga21wX2ludDMyIHN0OworICAgIGttcF9pbnQzMiB0YzsKKworICAgIGttcF9pbnQzMiBwYXJtMTsKKyAgICBrbXBfaW50MzIgcGFybTI7CisgICAga21wX2ludDMyIHBhcm0zOworICAgIGttcF9pbnQzMiBwYXJtNDsKKworICAgIGttcF9pbnQzMiBjb3VudDsKKworICAgIGttcF91aW50MzIgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfaW50MzIgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjQgeworICAgIGttcF9pbnQ2NCBsYjsgICAgICAvKiBsb3dlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCB1YjsgICAgICAvKiB1cHBlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCBzdDsgICAgICAvKiBzdHJpZGUgKi8KKyAgICBrbXBfaW50NjQgdGM7ICAgICAgLyogdHJpcCBjb3VudCAobnVtYmVyIG9mIGl0ZXJhdGlvbnMpICovCisKKyAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworICAgIGttcF9pbnQ2NCBwYXJtMTsKKyAgICBrbXBfaW50NjQgcGFybTI7CisgICAga21wX2ludDY0IHBhcm0zOworICAgIGttcF9pbnQ2NCBwYXJtNDsKKworICAgIGttcF9pbnQ2NCBjb3VudDsgICAvKiBjdXJyZW50IGNodW5rIG51bWJlciBmb3Igc3RhdGljIHNjaGVkdWxpbmcgKi8KKworICAgIGttcF91aW50NjQgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfaW50NjQgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90OworI2VuZGlmIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvIHsKKyAgICB1bmlvbiBwcml2YXRlX2luZm8geworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90ICBwMzI7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3QgIHA2NDsKKyAgICB9IHU7CisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlOyAgLyogc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KKyAgICBrbXBfaW50MzIgICAgICAgb3JkZXJlZDsgICAvKiBvcmRlcmVkIGNsYXVzZSBzcGVjaWZpZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgb3JkZXJlZF9idW1wZWQ7CisgICAga21wX2ludDMyICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtM107IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorICAgIHN0cnVjdCBkaXNwYXRjaF9wcml2YXRlX2luZm8gKiBuZXh0OyAvKiBzdGFjayBvZiBidWZmZXJzIGZvciBuZXN0IG9mIHNlcmlhbCByZWdpb25zICovCisgICAga21wX2ludDMyICAgICAgIG5vbWVyZ2U7ICAgLyogZG9uJ3QgbWVyZ2UgaXRlcnMgaWYgc2VyaWFsaXplZCAqLworICAgIGttcF9pbnQzMiAgICAgICB0eXBlX3NpemU7IC8qIHRoZSBzaXplIG9mIHR5cGVzIGluIHByaXZhdGVfaW5mbyAqLworICAgIGVudW0gY29uc190eXBlICBwdXNoZWRfd3M7Cit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbzMyIHsKKyAgICAvKiBjaHVuayBpbmRleCB1bmRlciBkeW5hbWljLCBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHVuZGVyIHN0YXRpYy1zdGVhbDsKKyAgICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgIGl0ZXJhdGlvbjsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgbnVtX2RvbmU7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgIG9yZGVyZWRfaXRlcmF0aW9uOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0IHsKKyAgICAvKiBjaHVuayBpbmRleCB1bmRlciBkeW5hbWljLCBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHVuZGVyIHN0YXRpYy1zdGVhbDsKKyAgICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgIGl0ZXJhdGlvbjsKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgbnVtX2RvbmU7CisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgIG9yZGVyZWRfaXRlcmF0aW9uOworICAgIGttcF9pbnQ2NCAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbyB7CisgICAgdW5pb24gc2hhcmVkX2luZm8geworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mbzMyX3QgIHMzMjsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90ICBzNjQ7CisgICAgfSB1OworLyogICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgZGlzcGF0Y2hfYWJvcnQ7ICBkZXByaWNhdGVkICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgYnVmZmVyX2luZGV4OworfSBkaXNwYXRjaF9zaGFyZWRfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGlzcCB7CisgICAgLyogVmVjdG9yIGZvciBPUkRFUkVEIFNFQ1RJT04gKi8KKyAgICB2b2lkICgqdGhfZGVvX2ZjbikoIGludCAqIGd0aWQsIGludCAqIGNpZCwgaWRlbnRfdCAqKTsKKyAgICAvKiBWZWN0b3IgZm9yIEVORCBPUkRFUkVEIFNFQ1RJT04gKi8KKyAgICB2b2lkICgqdGhfZHhvX2ZjbikoIGludCAqIGd0aWQsIGludCAqIGNpZCwgaWRlbnRfdCAqKTsKKworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgICp0aF9kaXNwYXRjaF9zaF9jdXJyZW50OworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICp0aF9kaXNwYXRjaF9wcl9jdXJyZW50OworCisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKnRoX2Rpc3BfYnVmZmVyOworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICB0aF9kaXNwX2luZGV4OworICAgIHZvaWQqIGR1bW15X3BhZGRpbmdbMl07IC8vIG1ha2UgaXQgNjQgYnl0ZXMgb24gSW50ZWwoUikgNjQKKyNpZiBLTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQKKyAgICBjaGFyIG1vcmVfcGFkZGluZ1tJTlRFUk5PREVfQ0FDSEVfTElORV07CisjZW5kaWYKK30ga21wX2Rpc3BfdDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQmFycmllciBzdHVmZiAqLworCisvKiBjb25zdGFudHMgZm9yIGJhcnJpZXIgc3RhdGUgdXBkYXRlICovCisjZGVmaW5lIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgIDAgICAgICAgLyogc2hvdWxkIHByb2JhYmx5IHN0YXJ0IGZyb20gemVybyAqLworI2RlZmluZSBLTVBfQkFSUklFUl9TTEVFUF9CSVQgICAwICAgICAgIC8qIGJpdCB1c2VkIGZvciBzdXNwZW5kL3NsZWVwIHBhcnQgb2Ygc3RhdGUgKi8KKyNkZWZpbmUgS01QX0JBUlJJRVJfVU5VU0VEX0JJVCAgMSAgICAgICAvKiBiaXQgdGhhdCBtdXN0IG5ldmVyIGJlIHNldCBmb3IgdmFsaWQgc3RhdGUgKi8KKyNkZWZpbmUgS01QX0JBUlJJRVJfQlVNUF9CSVQgICAgMiAgICAgICAvKiBsc2IgdXNlZCBmb3IgYnVtcCBvZiBnby9hcnJpdmVkIHN0YXRlICovCisKKyNkZWZpbmUgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgICAgICAgICAoMSA8PCBLTVBfQkFSUklFUl9TTEVFUF9CSVQpCisjZGVmaW5lIEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURSAgICAgICAgKDEgPDwgS01QX0JBUlJJRVJfVU5VU0VEX0JJVCkKKyNkZWZpbmUgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCAgICAgICAgICAoMSA8PCBLTVBfQkFSUklFUl9CVU1QX0JJVCkKKworI2lmIChLTVBfQkFSUklFUl9TTEVFUF9CSVQgPj0gS01QX0JBUlJJRVJfQlVNUF9CSVQpCisjIGVycm9yICJCYXJyaWVyIHNsZWVwIGJpdCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBiYXJyaWVyIGJ1bXAgYml0IgorI2VuZGlmCisjaWYgKEtNUF9CQVJSSUVSX1VOVVNFRF9CSVQgPj0gS01QX0JBUlJJRVJfQlVNUF9CSVQpCisjIGVycm9yICJCYXJyaWVyIHVudXNlZCBiaXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmFycmllciBidW1wIGJpdCIKKyNlbmRpZgorCisvLyBDb25zdGFudHMgZm9yIHJlbGVhc2UgYmFycmllciB3YWl0IHN0YXRlOiBjdXJyZW50bHksIGhpZXJhcmNoaWNhbCBvbmx5CisjZGVmaW5lIEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HICAgICAgICAwICAvLyBOb3JtYWwgc3RhdGU7IHdvcmtlciBub3QgaW4gd2FpdF9zbGVlcAorI2RlZmluZSBLTVBfQkFSUklFUl9PV05fRkxBRyAgICAgICAgICAgMSAgLy8gTm9ybWFsIHN0YXRlOyB3b3JrZXIgd2FpdGluZyBvbiBvd24gYl9nbyBmbGFnIGluIHJlbGVhc2UKKyNkZWZpbmUgS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcgICAgICAgIDIgIC8vIFNwZWNpYWwgc3RhdGU7IHdvcmtlciB3YWl0aW5nIG9uIHBhcmVudCdzIGJfZ28gZmxhZyBpbiByZWxlYXNlCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRyAzICAvLyBTcGVjaWFsIHN0YXRlOyB0ZWxscyB3b3JrZXIgdG8gc2hpZnQgZnJvbSBwYXJlbnQgdG8gb3duIGJfZ28KKyNkZWZpbmUgS01QX0JBUlJJRVJfU1dJVENISU5HICAgICAgICAgIDQgIC8vIFNwZWNpYWwgc3RhdGU7IHdvcmtlciByZXNldHMgYXBwcm9wcmlhdGUgZmxhZyBvbiB3YWtlLXVwCisKK2VudW0gYmFycmllcl90eXBlIHsKKyAgICBic19wbGFpbl9iYXJyaWVyID0gMCwgICAgICAgLyogMCwgQWxsIG5vbi1mb3JrL2pvaW4gYmFycmllcnMgKGV4Y2VwdCByZWR1Y3Rpb24gYmFycmllcnMgaWYgZW5hYmxlZCkgKi8KKyAgICBic19mb3Jram9pbl9iYXJyaWVyLCAgICAgICAgLyogMSwgQWxsIGZvcmsvam9pbiAocGFyYWxsZWwgcmVnaW9uKSBiYXJyaWVycyAqLworICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICBic19yZWR1Y3Rpb25fYmFycmllciwgICAvKiAyLCBBbGwgYmFycmllcnMgdGhhdCBhcmUgdXNlZCBpbiByZWR1Y3Rpb24gKi8KKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICBic19sYXN0X2JhcnJpZXIgICAgICAgICAgICAgLyogSnVzdCBhIHBsYWNlaG9sZGVyIHRvIG1hcmsgdGhlIGVuZCAqLworfTsKKworLy8gdG8gd29yayB3aXRoIHJlZHVjdGlvbiBiYXJyaWVycyBqdXN0IGxpa2Ugd2l0aCBwbGFpbiBiYXJyaWVycworI2lmICFLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICNkZWZpbmUgYnNfcmVkdWN0aW9uX2JhcnJpZXIgYnNfcGxhaW5fYmFycmllcgorI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisKK3R5cGVkZWYgZW51bSBrbXBfYmFyX3BhdCB7ICAgICAgLyogQmFycmllciBjb21tdW5pY2F0aW9uIHBhdHRlcm5zICovCisgICAgYnBfbGluZWFyX2JhciA9IDAsICAgICAgICAgIC8qIFNpbmdsZSBsZXZlbCAoZGVnZW5lcmF0ZSkgdHJlZSAqLworICAgIGJwX3RyZWVfYmFyID0gMSwgICAgICAgICAgICAvKiBCYWxhbmNlZCB0cmVlIHdpdGggYnJhbmNoaW5nIGZhY3RvciAyXm4gKi8KKyAgICBicF9oeXBlcl9iYXIgPSAyLCAgICAgICAgICAgLyogSHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgd2l0aCBtaW4gYnJhbmNoaW5nIGZhY3RvciAyXm4gKi8KKyAgICBicF9oaWVyYXJjaGljYWxfYmFyID0gMywgICAgLyogTWFjaGluZSBoaWVyYXJjaHkgdHJlZSAqLworICAgIGJwX2xhc3RfYmFyID0gNCAgICAgICAgICAgICAvKiBQbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgKi8KK30ga21wX2Jhcl9wYXRfZTsKKworIyBkZWZpbmUgS01QX0JBUlJJRVJfSUNWX1BVU0ggICAxCisKKy8qIFJlY29yZCBmb3IgaG9sZGluZyB0aGUgdmFsdWVzIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyBzdGFjayByZWNvcmRzICovCit0eXBlZGVmIHN0cnVjdCBrbXBfaW50ZXJuYWxfY29udHJvbCB7CisgICAgaW50ICAgICAgICAgICBzZXJpYWxfbmVzdGluZ19sZXZlbDsgIC8qIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdGhfdGVhbV9zZXJpYWxpemVkIGZpZWxkICovCisgICAga21wX2ludDggICAgICBuZXN0ZWQ7ICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIG5lc3RlZCBwYXJhbGxlbGlzbSAocGVyIHRocmVhZCkgKi8KKyAgICBrbXBfaW50OCAgICAgIGR5bmFtaWM7ICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpICovCisgICAga21wX2ludDggICAgICBidF9zZXQ7ICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIHdoZXRoZXIgYmxvY2t0aW1lIGlzIGV4cGxpY2l0bHkgc2V0ICovCisgICAgaW50ICAgICAgICAgICBibG9ja3RpbWU7ICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSAqLworICAgIGludCAgICAgICAgICAgYnRfaW50ZXJ2YWxzOyAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBibG9ja3RpbWUgaW50ZXJ2YWxzICovCisgICAgaW50ICAgICAgICAgICBucHJvYzsgICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yICN0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkgKi8KKyAgICBpbnQgICAgICAgICAgIG1heF9hY3RpdmVfbGV2ZWxzOyAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgbWF4X2FjdGl2ZV9sZXZlbHMgKi8KKyAgICBrbXBfcl9zY2hlZF90IHNjaGVkOyAgICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgcnVudGltZSBzY2hlZHVsZSB7c2NoZWQsY2h1bmt9IHBhaXIgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQ7ICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBhZmZpbml0eSAgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorICAgIHN0cnVjdCBrbXBfaW50ZXJuYWxfY29udHJvbCAqbmV4dDsKK30ga21wX2ludGVybmFsX2NvbnRyb2xfdDsKKworc3RhdGljIGlubGluZSB2b2lkCitjb3B5X2ljdnMoIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKmRzdCwga21wX2ludGVybmFsX2NvbnRyb2xfdCAqc3JjICkgeworICAgICpkc3QgPSAqc3JjOworfQorCisvKiBUaHJlYWQgYmFycmllciBuZWVkcyB2b2xhdGlsZSBiYXJyaWVyIGZpZWxkcyAqLwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9ic3RhdGUgeworICAgIC8vIHRoX2ZpeGVkX2ljdnMgaXMgYWxpZ25lZCBieSB2aXJ0dWUgb2Yga21wX2JzdGF0ZSBiZWluZyBhbGlnbmVkIChhbmQgYWxsIHVzZXMgb2YgaXQpLgorICAgIC8vIEl0IGlzIG5vdCBleHBsaWNpdGx5IGFsaWduZWQgYmVsb3csIGJlY2F1c2Ugd2UgKmRvbid0KiB3YW50IGl0IHRvIGJlIHBhZGRlZCAtLSBpbnN0ZWFkLAorICAgIC8vIHdlIGZpdCBiX2dvIGludG8gdGhlIHNhbWUgY2FjaGUgbGluZSB3aXRoIHRoX2ZpeGVkX2ljdnMsIGVuYWJsaW5nIE5HTyBjYWNoZSBsaW5lcworICAgIC8vIHN0b3JlcyBpbiB0aGUgaGllcmFyY2hpY2FsIGJhcnJpZXIuCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCB0aF9maXhlZF9pY3ZzOyAgICAgICAgICAvLyBJbml0aWFsIElDVnMgZm9yIHRoZSB0aHJlYWQKKyAgICAvLyBUdWNrIGJfZ28gaW50byBlbmQgb2YgdGhfZml4ZWRfaWN2cyBjYWNoZSBsaW5lLCBzbyBpdCBjYW4gYmUgc3RvcmVkIHdpdGggc2FtZSBOR08gc3RvcmUKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0IGJfZ287ICAgICAgICAgICAgICAgICAgICAgIC8vIFNUQVRFID0+IHRhc2sgc2hvdWxkIHByb2NlZWQgKGhpZXJhcmNoaWNhbCkKKyAgICBLTVBfQUxJR05fQ0FDSEUgdm9sYXRpbGUga21wX3VpbnQ2NCBiX2Fycml2ZWQ7IC8vIFNUQVRFID0+IHRhc2sgcmVhY2hlZCBzeW5jaCBwb2ludC4KKyAgICBrbXBfdWludDMyICpza2lwX3Blcl9sZXZlbDsKKyAgICBrbXBfdWludDMyIG15X2xldmVsOworICAgIGttcF9pbnQzMiBwYXJlbnRfdGlkOworICAgIGttcF9pbnQzMiBvbGRfdGlkOworICAgIGttcF91aW50MzIgZGVwdGg7CisgICAgc3RydWN0IGttcF9ic3RhdGUgKnBhcmVudF9iYXI7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfdWludDY0IGxlYWZfc3RhdGU7CisgICAga21wX3VpbnQzMiBucHJvYzsKKyAgICBrbXBfdWludDggYmFzZV9sZWFmX2tpZHM7CisgICAga21wX3VpbnQ4IGxlYWZfa2lkczsKKyAgICBrbXBfdWludDggb2Zmc2V0OworICAgIGttcF91aW50OCB3YWl0X2ZsYWc7CisgICAga21wX3VpbnQ4IHVzZV9vbmNvcmVfYmFycmllcjsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkIGlzIGludGVuZGVkIGZvciB0aGUgZGVidWdnZXIgc29sZWx5LiBPbmx5IHRoZSB3b3JrZXIgdGhyZWFkIGl0c2VsZiBhY2Nlc3NlcyB0aGlzCisgICAgLy8gZmllbGQ6IHRoZSB3b3JrZXIgaW5jcmVhc2VzIGl0IGJ5IDEgd2hlbiBpdCBhcnJpdmVzIHRvIGEgYmFycmllci4KKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX3VpbnQgYl93b3JrZXJfYXJyaXZlZDsKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KK30ga21wX2JzdGF0ZV90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2JhcnJpZXJfdW5pb24geworICAgIGRvdWJsZSAgICAgICBiX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgIGJfcGFkWyBLTVBfUEFEKGttcF9ic3RhdGVfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYnN0YXRlX3QgYmI7Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9iYXJyaWVyX3VuaW9uIGttcF9iYWxpZ25fdDsKKworLyogVGVhbSBiYXJyaWVyIG5lZWRzIG9ubHkgbm9uLXZvbGF0aWxlIGFycml2ZWQgY291bnRlciAqLwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9iYXJyaWVyX3RlYW1fdW5pb24geworICAgIGRvdWJsZSAgICAgICBiX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgIGJfcGFkWyBDQUNIRV9MSU5FIF07CisgICAgc3RydWN0IHsKKyAgICAgICAga21wX3VpbnQ2NCAgIGJfYXJyaXZlZDsgICAgICAgLyogU1RBVEUgPT4gdGFzayByZWFjaGVkIHN5bmNoIHBvaW50LiAqLworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHR3byBmaWVsZHMgYXJlIGluZGVuZGVkIGZvciB0aGUgZGVidWdnZXIgc29sZWx5LiBPbmx5IG1hc3RlciBvZiB0aGUgdGVhbSBhY2Nlc3NlcworICAgICAgICAvLyB0aGVzZSBmaWVsZHM6IHRoZSBmaXJzdCBvbmUgaXMgaW5jcmVhc2VkIGJ5IDEgd2hlbiBtYXN0ZXIgYXJyaXZlcyB0byBhIGJhcnJpZXIsIHRoZQorICAgICAgICAvLyBzZWNvbmQgb25lIGlzIGluY3JlYXNlZCBieSBvbmUgd2hlbiBhbGwgdGhlIHRocmVhZHMgYXJyaXZlZC4KKyAgICAgICAga21wX3VpbnQgICAgIGJfbWFzdGVyX2Fycml2ZWQ7CisgICAgICAgIGttcF91aW50ICAgICBiX3RlYW1fYXJyaXZlZDsKKyNlbmRpZgorICAgIH07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9iYXJyaWVyX3RlYW1fdW5pb24ga21wX2JhbGlnbl90ZWFtX3Q7CisKKy8qCisgKiBQYWRkaW5nIGZvciBMaW51eCogT1MgcHRocmVhZHMgY29uZGl0aW9uIHZhcmlhYmxlcyBhbmQgbXV0ZXhlcyB1c2VkIHRvIHNpZ25hbAorICogdGhyZWFkcyB3aGVuIGEgY29uZGl0aW9uIGNoYW5nZXMuICBUaGlzIGlzIHRvIHdvcmthcm91bmQgYW4gTlBUTCBidWcKKyAqIHdoZXJlIHBhZGRpbmcgd2FzIGFkZGVkIHRvIHB0aHJlYWRfY29uZF90IHdoaWNoIGNhdXNlZCB0aGUgaW5pdGlhbGl6YXRpb24KKyAqIHJvdXRpbmUgdG8gd3JpdGUgb3V0c2lkZSBvZiB0aGUgc3RydWN0dXJlIGlmIGNvbXBpbGVkIG9uIHByZS1OUFRMIHRocmVhZHMuCisgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCit0eXBlZGVmIHN0cnVjdCBrbXBfd2luMzJfbXV0ZXgKK3sKKyAgICAvKiBUaGUgTG9jayAqLworICAgIENSSVRJQ0FMX1NFQ1RJT04gY3M7Cit9IGttcF93aW4zMl9tdXRleF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfd2luMzJfY29uZAoreworICAgIC8qIENvdW50IG9mIHRoZSBudW1iZXIgb2Ygd2FpdGVycy4gKi8KKyAgICBpbnQgd2FpdGVyc19jb3VudF87CisKKyAgICAvKiBTZXJpYWxpemUgYWNjZXNzIHRvIDx3YWl0ZXJzX2NvdW50Xz4gKi8KKyAgICBrbXBfd2luMzJfbXV0ZXhfdCB3YWl0ZXJzX2NvdW50X2xvY2tfOworCisgICAgLyogTnVtYmVyIG9mIHRocmVhZHMgdG8gcmVsZWFzZSB2aWEgYSA8Y29uZF9icm9hZGNhc3Q+IG9yIGEgKi8KKyAgICAvKiA8Y29uZF9zaWduYWw+ICovCisgICAgaW50IHJlbGVhc2VfY291bnRfOworCisgICAgLyogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgImdlbmVyYXRpb24iIHNvIHRoYXQgd2UgZG9uJ3QgYWxsb3cgKi8KKyAgICAvKiBvbmUgdGhyZWFkIHRvIHN0ZWFsIGFsbCB0aGUgInJlbGVhc2VzIiBmcm9tIHRoZSBicm9hZGNhc3QuICovCisgICAgaW50IHdhaXRfZ2VuZXJhdGlvbl9jb3VudF87CisKKyAgICAvKiBBIG1hbnVhbC1yZXNldCBldmVudCB0aGF0J3MgdXNlZCB0byBibG9jayBhbmQgcmVsZWFzZSB3YWl0aW5nICovCisgICAgLyogdGhyZWFkcy4gKi8KKyAgICBIQU5ETEUgZXZlbnRfOworfSBrbXBfd2luMzJfY29uZF90OworI2VuZGlmCisKKyNpZiBLTVBfT1NfVU5JWAorCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2NvbmRfdW5pb24geworICAgIGRvdWJsZSAgICAgICAgICAgICAgY19hbGlnbjsKKyAgICBjaGFyICAgICAgICAgICAgICAgIGNfcGFkWyBDQUNIRV9MSU5FIF07CisgICAgcHRocmVhZF9jb25kX3QgICAgICBjX2NvbmQ7Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9jb25kX3VuaW9uIGttcF9jb25kX2FsaWduX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfbXV0ZXhfdW5pb24geworICAgIGRvdWJsZSAgICAgICAgICAgICAgbV9hbGlnbjsKKyAgICBjaGFyICAgICAgICAgICAgICAgIG1fcGFkWyBDQUNIRV9MSU5FIF07CisgICAgcHRocmVhZF9tdXRleF90ICAgICBtX211dGV4OworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfbXV0ZXhfdW5pb24ga21wX211dGV4X2FsaWduX3Q7CisKKyNlbmRpZiAvKiBLTVBfT1NfVU5JWCAqLworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGVzY19iYXNlIHsKKyAgICB2b2lkICAgICpkc19zdGFja2Jhc2U7CisgICAgc2l6ZV90ICAgICAgICAgICAgZHNfc3RhY2tzaXplOworICAgIGludCAgICAgICAgICAgICAgIGRzX3N0YWNrZ3JvdzsKKyAgICBrbXBfdGhyZWFkX3QgICAgICBkc190aHJlYWQ7CisgICAgdm9sYXRpbGUgaW50ICAgICAgZHNfdGlkOworICAgIGludCAgICAgICAgICAgICAgIGRzX2d0aWQ7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICB2b2xhdGlsZSBpbnQgICAgICBkc19hbGl2ZTsKKyAgICBEV09SRCAgICAgICAgICAgICBkc190aHJlYWRfaWQ7CisgICAgICAgIC8qCisgICAgICAgICAgICBkc190aHJlYWQga2VlcHMgdGhyZWFkIGhhbmRsZSBvbiBXaW5kb3dzKiBPUy4gSXQgaXMgZW5vdWdoIGZvciBSVEwgcHVycG9zZXMuIEhvd2V2ZXIsCisgICAgICAgICAgICBkZWJ1Z2dlciBzdXBwb3J0IChsaWJvbXBfZGIpIGNhbm5vdCB3b3JrIHdpdGggaGFuZGxlcywgYmVjYXVzZSB0aGV5IHVuY29tcGFyYWJsZS4gRm9yCisgICAgICAgICAgICBleGFtcGxlLCBkZWJ1Z2dlciByZXF1ZXN0cyBpbmZvIGFib3V0IHRocmVhZCB3aXRoIGhhbmRsZSBoLiBoIGlzIHZhbGlkIHdpdGhpbiBkZWJ1Z2dlcgorICAgICAgICAgICAgcHJvY2VzcywgYW5kIG1lYW5pbmdsZXNzIHdpdGhpbiBkZWJ1Z2VlIHByb2Nlc3MuIEV2ZW4gaWYgaCBpcyBkdXBlZCBieSBjYWxsIHRvCisgICAgICAgICAgICBEdXBsaWNhdGVIYW5kbGUoKSwgc28gdGhlIHJlc3VsdCBoJyBpcyB2YWxpZCB3aXRoaW4gZGVidWdlZSBwcm9jZXNzLCBidXQgaXQgaXMgYSAqbmV3KgorICAgICAgICAgICAgaGFuZGxlIHdoaWNoIGRvZXMgKm5vdCogZXF1YWwgdG8gYW55IG90aGVyIGhhbmRsZSBpbiBkZWJ1Z2VlLi4uIFRoZSBvbmx5IHdheSB0bworICAgICAgICAgICAgY29tcGFyZSBoYW5kbGVzIGlzIGNvbnZlcnQgdGhlbSB0byBzeXN0ZW0td2lkZSBpZHMuIEdldFRocmVhZElkKCkgZnVuY3Rpb24gaXMKKyAgICAgICAgICAgIGF2YWlsYWJsZSBvbmx5IGluIExvbmdob3JuIGFuZCBTZXJ2ZXIgMjAwMy4gOi0oIEluIGNvbnRyYXN0LCBHZXRDdXJyZW50VGhyZWFkSWQoKSBpcworICAgICAgICAgICAgYXZhaWxhYmxlIG9uIGFsbCBXaW5kb3dzKiBPUyBmbGF2b3VycyAoaW5jbHVkaW5nIFdpbmRvd3MqIDk1KS4gVGh1cywgd2UgaGF2ZSB0byBnZXQgdGhyZWFkIGlkIGJ5CisgICAgICAgICAgICBjYWxsIHRvIEdldEN1cnJlbnRUaHJlYWRJZCgpIGZyb20gd2l0aGluIHRoZSB0aHJlYWQgYW5kIHNhdmUgaXQgdG8gbGV0IGxpYm9tcF9kYgorICAgICAgICAgICAgaWRlbnRpZnkgdGhyZWFkcy4KKyAgICAgICAgKi8KKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBrbXBfZGVzY19iYXNlX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9kZXNjIHsKKyAgICBkb3VibGUgICAgICAgICAgIGRzX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICBkc19wYWRbIEtNUF9QQUQoa21wX2Rlc2NfYmFzZV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9kZXNjX2Jhc2VfdCAgZHM7Cit9IGttcF9kZXNjX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2xvY2FsIHsKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgICAgIHRoaXNfY29uc3RydWN0OyAvKiBjb3VudCBvZiBzaW5nbGUncyBlbmNvdW50ZXJlZCBieSB0aHJlYWQgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKnJlZHVjZV9kYXRhOworI2lmIEtNUF9VU0VfQkdFVAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAqYmdldF9kYXRhOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAqYmdldF9saXN0OworI2lmICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgYmdldF9sb2NrOyAgICAgIC8qIExvY2sgZm9yIGFjY2Vzc2luZyBiZ2V0IGZyZWUgbGlzdCAqLworI2Vsc2UKKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgIGJnZXRfbG9jazsgICAgICAvKiBMb2NrIGZvciBhY2Nlc3NpbmcgYmdldCBmcmVlIGxpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNdXN0IGJlIGJvb3RzdHJhcCBsb2NrIHNvIHdlIGNhbiB1c2UgaXQgYXQgbGlicmFyeSBzaHV0ZG93biAqLworI2VuZGlmIC8qIFVTRV9MT0NLX0ZPUl9CR0VUICovCisjZW5kaWYgLyogISBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KKyNlbmRpZiAvKiBLTVBfVVNFX0JHRVQgKi8KKworI2lmZGVmIEJVSUxEX1RWCisgICAgc3RydWN0IHR2X2RhdGEgICAgICAgICp0dl9kYXRhOworI2VuZGlmCisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOyAvKiBzdG9yZWQgYnkgX19rbXBjX3JlZHVjZSooKSwgdXNlZCBieSBfX2ttcGNfZW5kX3JlZHVjZSooKSAqLworCit9IGttcF9sb2NhbF90OworCisjZGVmaW5lIGdldF9fYmxvY2t0aW1lKCB4dGVhbSwgeHRpZCApICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJsb2NrdGltZSkKKyNkZWZpbmUgZ2V0X19idF9zZXQoIHh0ZWFtLCB4dGlkICkgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfc2V0KQorI2RlZmluZSBnZXRfX2J0X2ludGVydmFscyggeHRlYW0sIHh0aWQgKSAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9pbnRlcnZhbHMpCisKKyNkZWZpbmUgZ2V0X19uZXN0ZWRfMih4dGVhbSx4dGlkKSAgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkKQorI2RlZmluZSBnZXRfX2R5bmFtaWNfMih4dGVhbSx4dGlkKSAgICAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljKQorI2RlZmluZSBnZXRfX25wcm9jXzIoeHRlYW0seHRpZCkgICAgICAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYykKKyNkZWZpbmUgZ2V0X19zY2hlZF8yKHh0ZWFtLHh0aWQpICAgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQpCisKKyNkZWZpbmUgc2V0X19ibG9ja3RpbWVfdGVhbSggeHRlYW0sIHh0aWQsIHh2YWwgKSBcCisgICAgICAgICggKCAoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYmxvY2t0aW1lICkgICAgPSAoeHZhbCkgKQorCisjZGVmaW5lIHNldF9fYnRfaW50ZXJ2YWxzX3RlYW0oIHh0ZWFtLCB4dGlkLCB4dmFsICkgXAorICAgICAgICAoICggKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X2ludGVydmFscyApID0gKHh2YWwpICkKKworI2RlZmluZSBzZXRfX2J0X3NldF90ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9zZXQgKSAgICAgICA9ICh4dmFsKSApCisKKworI2RlZmluZSBzZXRfX25lc3RlZCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCApID0gKHh2YWwpICkKKyNkZWZpbmUgZ2V0X19uZXN0ZWQoIHh0aHJlYWQgKSBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5uZXN0ZWQgKSA/IChGVE5fVFJVRSkgOiAoRlROX0ZBTFNFKSApCisKKyNkZWZpbmUgc2V0X19keW5hbWljKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYyApID0gKHh2YWwpICkKKyNkZWZpbmUgZ2V0X19keW5hbWljKCB4dGhyZWFkICkgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYyApID8gKEZUTl9UUlVFKSA6IChGVE5fRkFMU0UpICkKKworI2RlZmluZSBzZXRfX25wcm9jKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgKSA9ICh4dmFsKSApCisKKyNkZWZpbmUgc2V0X19tYXhfYWN0aXZlX2xldmVscyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgPSAoeHZhbCkgKQorCisjZGVmaW5lIHNldF9fc2NoZWQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZCApID0gKHh2YWwpICkKKworI2lmIE9NUF80MF9FTkFCTEVECisKKyNkZWZpbmUgc2V0X19wcm9jX2JpbmQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kICkgPSAoeHZhbCkgKQorI2RlZmluZSBnZXRfX3Byb2NfYmluZCggeHRocmVhZCApIFwKKyAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgKQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIE9wZW5NUCB0YXNraW5nIGRhdGEgc3RydWN0dXJlcworLy8KKwordHlwZWRlZiBlbnVtIGttcF90YXNraW5nX21vZGUgeworICAgIHRza21faW1tZWRpYXRlX2V4ZWMgPSAwLAorICAgIHRza21fZXh0cmFfYmFycmllciA9IDEsCisgICAgdHNrbV90YXNrX3RlYW1zID0gMiwKKyAgICB0c2ttX21heCA9IDIKK30ga21wX3Rhc2tpbmdfbW9kZV90OworCitleHRlcm4ga21wX3Rhc2tpbmdfbW9kZV90IF9fa21wX3Rhc2tpbmdfbW9kZTsgICAgICAgICAvKiBkZXRlcm1pbmVzIGhvdy93aGVuIHRvIGV4ZWN1dGUgdGFza3MgKi8KK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50OworCisvKiBOT1RFOiBrbXBfdGFza2RhdGFfdCBhbmQga21wX3Rhc2tfdCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBpbiBzaW5nbGUgYmxvY2sgd2l0aCB0YXNrZGF0YSBmaXJzdCAqLworI2RlZmluZSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSAgICAgKCgoa21wX3Rhc2tkYXRhX3QgKikgdGFzaykgLSAxKQorI2RlZmluZSBLTVBfVEFTS0RBVEFfVE9fVEFTSyh0YXNrZGF0YSkgKGttcF90YXNrX3QgKikgKHRhc2tkYXRhICsgMSkKKworLy8gVGhlIHR0X2ZvdW5kX3Rhc2tzIGZsYWcgaXMgYSBzaWduYWwgdG8gYWxsIHRocmVhZHMgaW4gdGhlIHRlYW0gdGhhdCB0YXNrcyB3ZXJlIHNwYXduZWQgYW5kCisvLyBxdWV1ZWQgc2luY2UgdGhlIHByZXZpb3VzIGJhcnJpZXIgcmVsZWFzZS4KKyNkZWZpbmUgS01QX1RBU0tJTkdfRU5BQkxFRCh0YXNrX3RlYW0pIFwKKyAgICAoVENSX1NZTkNfNCgodGFza190ZWFtKS0+dHQudHRfZm91bmRfdGFza3MpID09IFRSVUUpCisvKiEKK0Bpbmdyb3VwIEJBU0lDX1RZUEVTCitAeworKi8KKworLyohCisgKi8KK3R5cGVkZWYga21wX2ludDMyICgqIGttcF9yb3V0aW5lX2VudHJ5X3QpKCBrbXBfaW50MzIsIHZvaWQgKiApOworCisvKiAgc2l6ZW9mX2ttcF90YXNrX3QgcGFzc2VkIGFzIGFyZyB0byBrbXBjX29tcF90YXNrIGNhbGwgICovCisvKiEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2sgeyAgICAgICAgICAgICAgICAgICAvKiBHRUg6IFNob3VsZG4ndCB0aGlzIGJlIGFsaWduZWQgc29tZWhvdz8gKi8KKyAgICB2b2lkICogICAgICAgICAgICAgIHNoYXJlZHM7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIGJsb2NrIG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzICAgKi8KKyAgICBrbXBfcm91dGluZV9lbnRyeV90IHJvdXRpbmU7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIHJvdXRpbmUgdG8gY2FsbCBmb3IgZXhlY3V0aW5nIHRhc2sgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgIHBhcnRfaWQ7ICAgICAgICAgICAgLyoqPCBwYXJ0IGlkIGZvciB0aGUgdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgZGVzdHJ1Y3RvcnM7ICAgICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGludm9rZSBkZWNvbnN0cnVjdG9ycyBvZiBmaXJzdHByaXZhdGUgQysrIG9iamVjdHMgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorICAgIC8qICBwcml2YXRlIHZhcnMgICovCit9IGttcF90YXNrX3Q7CisKKy8qIQorQH0KKyovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tncm91cCB7CisgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNvdW50OyAgIC8vIG51bWJlciBvZiBhbGxvY2F0ZWQgYW5kIG5vdCB5ZXQgY29tcGxldGUgdGFza3MKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgY2FuY2VsX3JlcXVlc3Q7IC8vIHJlcXVlc3QgZm9yIGNhbmNlbGxhdGlvbiBvZiB0aGlzIHRhc2tncm91cAorICAgIHN0cnVjdCBrbXBfdGFza2dyb3VwICpwYXJlbnQ7ICAvLyBwYXJlbnQgdGFza2dyb3VwCit9IGttcF90YXNrZ3JvdXBfdDsKKworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9ucwordHlwZWRlZiB1bmlvbiBrbXBfZGVwbm9kZSAgICAgICBrbXBfZGVwbm9kZV90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcG5vZGVfbGlzdCAga21wX2RlcG5vZGVfbGlzdF90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGhhc2hfZW50cnkga21wX2RlcGhhc2hfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGVuZF9pbmZvIHsKKyAgICAga21wX2ludHB0cl90ICAgICAgICAgICAgICAgYmFzZV9hZGRyOworICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgIHN0cnVjdCB7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIGluOjE7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIG91dDoxOworICAgICB9IGZsYWdzOworfSBrbXBfZGVwZW5kX2luZm9fdDsKKworc3RydWN0IGttcF9kZXBub2RlX2xpc3QgeworICAga21wX2RlcG5vZGVfdCAqICAgICAgICAgICAgICBub2RlOworICAga21wX2RlcG5vZGVfbGlzdF90ICogICAgICAgICBuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGVwbm9kZSB7CisgICAga21wX2RlcG5vZGVfbGlzdF90ICAgICAgICAqIHN1Y2Nlc3NvcnM7CisgICAga21wX3Rhc2tfdCAgICAgICAgICAgICAgICAqIHRhc2s7CisKKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgbG9jazsKKworI2lmIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVAorICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICBpZDsKKyNlbmRpZgorCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgIG5wcmVkZWNlc3NvcnM7CisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgIG5yZWZzOworfSBrbXBfYmFzZV9kZXBub2RlX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVwbm9kZSB7CisgICAgZG91YmxlICAgICAgICAgIGRuX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgIGRuX3BhZFsgS01QX1BBRChrbXBfYmFzZV9kZXBub2RlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGVwbm9kZV90IGRuOworfTsKKworc3RydWN0IGttcF9kZXBoYXNoX2VudHJ5IHsKKyAgICBrbXBfaW50cHRyX3QgICAgICAgICAgICAgICBhZGRyOworICAgIGttcF9kZXBub2RlX3QgICAgICAgICAgICAqIGxhc3Rfb3V0OworICAgIGttcF9kZXBub2RlX2xpc3RfdCAgICAgICAqIGxhc3RfaW5zOworICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgICAgICAqIG5leHRfaW5fYnVja2V0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGhhc2ggeworICAga21wX2RlcGhhc2hfZW50cnlfdCAgICAgKiogYnVja2V0czsKKyNpZmRlZiBLTVBfREVCVUcKKyAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgIG5lbGVtZW50czsKKyAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgIG5jb25mbGljdHM7CisjZW5kaWYKK30ga21wX2RlcGhhc2hfdDsKKworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKworLyogVGllZCBUYXNrIHN0YWNrIGRlZmluaXRpb25zICovCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgeworICAgIGttcF90YXNrZGF0YV90ICogICAgICAgICAgc2JfYmxvY2tbIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSBdOworICAgIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgKiAgc2JfbmV4dDsKKyAgICBzdHJ1Y3Qga21wX3N0YWNrX2Jsb2NrICogIHNiX3ByZXY7Cit9IGttcF9zdGFja19ibG9ja190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza19zdGFjayB7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgICAgICAgICB0c19maXJzdF9ibG9jazsgIC8vIGZpcnN0IGJsb2NrIG9mIHN0YWNrIGVudHJpZXMKKyAgICBrbXBfdGFza2RhdGFfdCAqKiAgICAgICAgIHRzX3RvcDsgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgdG9wIG9mIHN0YWNrCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICB0c19lbnRyaWVzOyAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjaworfSBrbXBfdGFza19zdGFja190OworCisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNraW5nX2ZsYWdzIHsgICAgICAgICAgLyogVG90YWwgc3RydWN0IG11c3QgYmUgZXhhY3RseSAzMiBiaXRzICovCisgICAgLyogQ29tcGlsZXIgZmxhZ3MgKi8gICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIGNvbXBpbGVyIGZsYWdzIG11c3QgYmUgMTYgYml0cyAqLworICAgIHVuc2lnbmVkIHRpZWRuZXNzICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGVpdGhlciB0aWVkICgxKSBvciB1bnRpZWQgKDApICovCisgICAgdW5zaWduZWQgZmluYWwgICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIHRhc2sgaXMgZmluYWwoMSkgc28gZXhlY3V0ZSBpbW1lZGlhdGVseSAqLworICAgIHVuc2lnbmVkIG1lcmdlZF9pZjAgIDogMTsgICAgICAgICAgICAgICAvKiBubyBfX2ttcGNfdGFza197YmVnaW4vY29tcGxldGV9X2lmMCBjYWxscyBpbiBpZjAgY29kZSBwYXRoICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB1bnNpZ25lZCBkZXN0cnVjdG9yc190aHVuayA6IDE7ICAgICAgICAgLyogc2V0IGlmIHRoZSBjb21waWxlciBjcmVhdGVzIGEgdGh1bmsgdG8gaW52b2tlIGRlc3RydWN0b3JzIGZyb20gdGhlIHJ1bnRpbWUgKi8KKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIHVuc2lnbmVkIHByb3h5ICAgICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGEgcHJveHkgdGFzayAoaXQgd2lsbCBiZSBleGVjdXRlZCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRoZSBSVEwpICovCisgICAgdW5zaWduZWQgcmVzZXJ2ZWQgICAgOiAxMTsgICAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBjb21waWxlciB1c2UgKi8KKyNlbHNlCisgICAgdW5zaWduZWQgcmVzZXJ2ZWQgICAgOiAxMjsgICAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBjb21waWxlciB1c2UgKi8KKyNlbmRpZgorI2Vsc2UgLy8gT01QXzQwX0VOQUJMRUQKKyAgICB1bnNpZ25lZCByZXNlcnZlZCAgICA6IDEzOyAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGNvbXBpbGVyIHVzZSAqLworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyAgICAvKiBMaWJyYXJ5IGZsYWdzICovICAgICAgICAgICAgICAgICAgICAgLyogVG90YWwgbGlicmFyeSBmbGFncyBtdXN0IGJlIDE2IGJpdHMgKi8KKyAgICB1bnNpZ25lZCB0YXNrdHlwZSAgICA6IDE7ICAgICAgICAgICAgICAgLyogdGFzayBpcyBlaXRoZXIgZXhwbGljaXQoMSkgb3IgaW1wbGljaXQgKDApICovCisgICAgdW5zaWduZWQgdGFza19zZXJpYWwgOiAxOyAgICAgICAgICAgICAgIC8qIHRoaXMgdGFzayBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSAoMSkgb3IgZGVmZXJyZWQgKDApICovCisgICAgdW5zaWduZWQgdGFza2luZ19zZXIgOiAxOyAgICAgICAgICAgICAgIC8qIGFsbCB0YXNrcyBpbiB0ZWFtIGFyZSBlaXRoZXIgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgKDEpIG9yIG1heSBiZSBkZWZlcnJlZCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0ZWFtX3NlcmlhbCA6IDE7ICAgICAgICAgICAgICAgLyogZW50aXJlIHRlYW0gaXMgc2VyaWFsICgxKSBbMSB0aHJlYWRdIG9yIHBhcmFsbGVsICgwKSBbPj0gMiB0aHJlYWRzXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBlaXRoZXIgdGVhbV9zZXJpYWwgb3IgdGFza2luZ19zZXIgaXMgc2V0LCB0YXNrIHRlYW0gbWF5IGJlIE5VTEwgKi8KKyAgICAvKiBUYXNrIFN0YXRlIEZsYWdzOiAqLworICAgIHVuc2lnbmVkIHN0YXJ0ZWQgICAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1zdGFydGVkLCAwPT1ub3Qgc3RhcnRlZCAgICAgKi8KKyAgICB1bnNpZ25lZCBleGVjdXRpbmcgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09ZXhlY3V0aW5nLCAwPT1ub3QgZXhlY3V0aW5nICovCisgICAgdW5zaWduZWQgY29tcGxldGUgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWNvbXBsZXRlLCAwPT1ub3QgY29tcGxldGUgICAqLworICAgIHVuc2lnbmVkIGZyZWVkICAgICAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1mcmVlZCwgMD09YWxsb2NhdGVlZCAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBuYXRpdmUgICAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09Z2NjLWNvbXBpbGVkIHRhc2ssIDA9PWludGVsICovCisgICAgdW5zaWduZWQgcmVzZXJ2ZWQzMSAgOiA3OyAgICAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBsaWJyYXJ5IHVzZSAqLworCit9IGttcF90YXNraW5nX2ZsYWdzX3Q7CisKKworc3RydWN0IGttcF90YXNrZGF0YSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxpZ25lZCBkdXJpbmcgZHluYW1pYyBhbGxvY2F0aW9uICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfdGFza19pZDsgICAgICAgICAgICAgICAvKiBpZCwgYXNzaWduZWQgYnkgZGVidWdnZXIgICAgICAgICAgICAgICAgKi8KKyAgICBrbXBfdGFza2luZ19mbGFnc190ICAgICB0ZF9mbGFnczsgICAgICAgICAgICAgICAgIC8qIHRhc2sgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGttcF90ZWFtX3QgKiAgICAgICAgICAgIHRkX3RlYW07ICAgICAgICAgICAgICAgICAgLyogdGVhbSBmb3IgdGhpcyB0YXNrICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX2luZm9fcCAqICAgICAgICAgICAgdGRfYWxsb2NfdGhyZWFkOyAgICAgICAgICAvKiB0aHJlYWQgdGhhdCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBub3QgdXNlZCBleGNlcHQgZm9yIHBlcmhhcHMgSURCICovCisgICAga21wX3Rhc2tkYXRhX3QgKiAgICAgICAgdGRfcGFyZW50OyAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9sZXZlbDsgICAgICAgICAgICAgICAgIC8qIHRhc2sgbmVzdGluZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlkZW50X3QgKiAgICAgICAgICAgICAgIHRkX2lkZW50OyAgICAgICAgICAgICAgICAgLyogdGFzayBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFza3dhaXQgZGF0YS4KKyAgICBpZGVudF90ICogICAgICAgICAgICAgICB0ZF90YXNrd2FpdF9pZGVudDsKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICB0ZF90YXNrd2FpdF9jb3VudGVyOworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX3Rhc2t3YWl0X3RocmVhZDsgICAgICAgLyogZ3RpZCArIDEgb2YgdGhyZWFkIGVuY291bnRlcmVkIHRhc2t3YWl0ICovCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF9pbnRlcm5hbF9jb250cm9sX3QgIHRkX2ljdnM7ICAvKiBJbnRlcm5hbCBjb250cm9sIHZhcmlhYmxlcyBmb3IgdGhlIHRhc2sgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3M7ICAvKiBDaGlsZCB0YXNrcyAoKyBjdXJyZW50IHRhc2spIG5vdCB5ZXQgZGVhbGxvY2F0ZWQgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzOyAvKiBDaGlsZCB0YXNrcyBub3QgeWV0IGNvbXBsZXRlICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfdGFza2dyb3VwX3QgKiAgICAgICB0ZF90YXNrZ3JvdXA7ICAgICAgICAgLy8gRWFjaCB0YXNrIGtlZXBzIHBvaW50ZXIgdG8gaXRzIGN1cnJlbnQgdGFza2dyb3VwCisgICAga21wX2RlcGhhc2hfdCAqICAgICAgICAgdGRfZGVwaGFzaDsgICAgICAgICAgIC8vIERlcGVuZGVuY2llcyBmb3IgY2hpbGRyZW4gdGFza3MgYXJlIHRyYWNrZWQgZnJvbSBoZXJlCisgICAga21wX2RlcG5vZGVfdCAqICAgICAgICAgdGRfZGVwbm9kZTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gZ3JhcGggbm9kZSBpZiB0aGlzIHRhc2sgaGFzIGRlcGVuZGVuY2llcworI2VuZGlmCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF90YXNrX2luZm9fdCAgICAgICAgb21wdF90YXNrX2luZm87CisjZW5kaWYKKyNpZiBLTVBfSEFWRV9RVUFECisgICAgX1F1YWQgICAgICAgICAgICAgICAgICAgdGRfZHVtbXk7ICAgICAgICAgICAgIC8vIEFsaWduIHN0cnVjdHVyZSAxNi1ieXRlIHNpemUgc2luY2UgYWxsb2NhdGVkIGp1c3QgYmVmb3JlIGttcF90YXNrX3QKKyNlbHNlCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfZHVtbXlbMl07CisjZW5kaWYKK307IC8vIHN0cnVjdCBrbXBfdGFza2RhdGEKKworLy8gTWFrZSBzdXJlIHBhZGRpbmcgYWJvdmUgd29ya2VkCitLTVBfQlVJTERfQVNTRVJUKCBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICUgc2l6ZW9mKHZvaWQgKikgPT0gMCApOworCisvLyBEYXRhIGZvciB0YXNrIHRlYW0gYnV0IHBlciB0aHJlYWQKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3RocmVhZF9kYXRhIHsKKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF90aHI7ICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgYmFjayB0byB0aHJlYWQgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZCBvbmx5IGluIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUsIG1heWJlIG5vdCBhdmFpbCB1bnRpbCB0YXNrIGlzIHF1ZXVlZD8KKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgICB0ZF9kZXF1ZV9sb2NrOyAgICAgICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBkZXF1ZQorICAgIGttcF90YXNrZGF0YV90ICoqICAgICAgIHRkX2RlcXVlOyAgICAgICAgICAgICAgLy8gRGVxdWUgb2YgdGFza3MgZW5jb3VudGVyZWQgYnkgdGRfdGhyLCBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICB0ZF9kZXF1ZV9oZWFkOyAgICAgICAgIC8vIEhlYWQgb2YgZGVxdWUgKHdpbGwgd3JhcCkKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICB0ZF9kZXF1ZV90YWlsOyAgICAgICAgIC8vIFRhaWwgb2YgZGVxdWUgKHdpbGwgd3JhcCkKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9kZXF1ZV9udGFza3M7ICAgICAgIC8vIE51bWJlciBvZiB0YXNrcyBpbiBkZXF1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBzaG91bGRuJ3QgdGhpcyBiZSB2b2xhdGlsZSBzaW5jZSB1c2VkIGluIHdoaWxlLXNwaW4/CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfZGVxdWVfbGFzdF9zdG9sZW47ICAvLyBUaHJlYWQgbnVtYmVyIG9mIGxhc3Qgc3VjY2Vzc2Z1bCBzdGVhbAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGttcF90YXNrX3N0YWNrX3QgICAgICAgIHRkX3N1c3BfdGllZF90YXNrczsgICAgLy8gU3RhY2sgb2Ygc3VzcGVuZGVkIHRpZWQgdGFza3MgZm9yIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCit9IGttcF9iYXNlX3RocmVhZF9kYXRhX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aHJlYWRfZGF0YSB7CisgICAga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCAgdGQ7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgdGRfYWxpZ247ICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIHRkX3BhZFsgS01QX1BBRChrbXBfYmFzZV90aHJlYWRfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworfSBrbXBfdGhyZWFkX2RhdGFfdDsKKworCisvLyBEYXRhIGZvciB0YXNrIHRlYW1zIHdoaWNoIGFyZSB1c2VkIHdoZW4gdGFza2luZyBpcyBlbmFibGVkIGZvciB0aGUgdGVhbQordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGFza190ZWFtIHsKKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgICB0dF90aHJlYWRzX2xvY2s7ICAgICAgIC8qIExvY2sgdXNlZCB0byBhbGxvY2F0ZSBwZXItdGhyZWFkIHBhcnQgb2YgdGFzayB0ZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIGJvb3RzdHJhcCBsb2NrIHNpbmNlIHVzZWQgYXQgbGlicmFyeSBzaHV0ZG93biovCisgICAga21wX3Rhc2tfdGVhbV90ICogICAgICAgdHRfbmV4dDsgICAgICAgICAgICAgICAvKiBGb3IgbGlua2luZyB0aGUgdGFzayB0ZWFtIGZyZWUgbGlzdCAqLworICAgIGttcF90aHJlYWRfZGF0YV90ICogICAgIHR0X3RocmVhZHNfZGF0YTsgICAgICAgLyogQXJyYXkgb2YgcGVyLXRocmVhZCBzdHJ1Y3R1cmVzIGZvciB0YXNrIHRlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgc3Vydml2ZXMgdGFzayB0ZWFtIGRlYWxsb2NhdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X2ZvdW5kX3Rhc2tzOyAgICAgICAgLyogSGF2ZSB3ZSBmb3VuZCB0YXNrcyBhbmQgcXVldWVkIHRoZW0gd2hpbGUgZXhlY3V0aW5nIHRoaXMgdGVhbT8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRSVUUgbWVhbnMgdHRfdGhyZWFkc19kYXRhIGlzIHNldCB1cCBhbmQgaW5pdGlhbGl6ZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9ucHJvYzsgICAgICAgICAgICAgIC8qICN0aHJlYWRzIGluIHRlYW0gICAgICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfbWF4X3RocmVhZHM7ICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBhbGxvY2F0ZWQgZm9yIHRocmVhZHNfZGF0YSBhcnJheSAqLworI2lmIE9NUF80MV9FTkFCTEVECisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfZm91bmRfcHJveHlfdGFza3M7ICAvKiBIYXZlIHdlIGZvdW5kIHByb3h5IHRhc2tzIHNpbmNlIGxhc3QgYmFycmllciAqLworI2VuZGlmCisKKyAgICBLTVBfQUxJR05fQ0FDSEUKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICB0dF91bmZpbmlzaGVkX3RocmVhZHM7IC8qICN0aHJlYWRzIHN0aWxsIGFjdGl2ZSAgICAgICovCisKKyAgICBLTVBfQUxJR05fQ0FDSEUKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICB0dF9hY3RpdmU7ICAgICAgICAgICAgIC8qIGlzIHRoZSB0ZWFtIHN0aWxsIGFjdGl2ZWx5IGV4ZWN1dGluZyB0YXNrcyAqLworfSBrbXBfYmFzZV90YXNrX3RlYW1fdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90YXNrX3RlYW0geworICAgIGttcF9iYXNlX3Rhc2tfdGVhbV90IHR0OworICAgIGRvdWJsZSAgICAgICAgICAgICAgIHR0X2FsaWduOyAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICB0dF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfdGFza190ZWFtX3QsIENBQ0hFX0xJTkUpIF07Cit9OworCisjaWYgKCBVU0VfRkFTVF9NRU1PUlkgPT0gMyApIHx8ICggVVNFX0ZBU1RfTUVNT1JZID09IDUgKQorLy8gRnJlZSBsaXN0cyBrZWVwIHNhbWUtc2l6ZSBmcmVlIG1lbW9yeSBzbG90cyBmb3IgZmFzdCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcwordHlwZWRlZiBzdHJ1Y3Qga21wX2ZyZWVfbGlzdCB7CisgICAgdm9pZCAgICAgICAgICAgICAqdGhfZnJlZV9saXN0X3NlbGY7ICAgLy8gU2VsZi1hbGxvY2F0ZWQgdGFza3MgZnJlZSBsaXN0CisgICAgdm9pZCAgICAgICAgICAgICAqdGhfZnJlZV9saXN0X3N5bmM7ICAgLy8gU2VsZi1hbGxvY2F0ZWQgdGFza3Mgc3RvbGVuL3JldHVybmVkIGJ5IG90aGVyIHRocmVhZHMKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfb3RoZXI7ICAvLyBOb24tc2VsZiBmcmVlIGxpc3QgKHRvIGJlIHJldHVybmVkIHRvIG93bmVyJ3Mgc3luYyBsaXN0KQorfSBrbXBfZnJlZV9saXN0X3Q7CisjZW5kaWYKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworLy8gSG90IHRlYW1zIGFycmF5IGtlZXBzIGhvdCB0ZWFtcyBhbmQgdGhlaXIgc2l6ZXMgZm9yIGdpdmVuIHRocmVhZC4KKy8vIEhvdCB0ZWFtcyBhcmUgbm90IHB1dCBpbiB0ZWFtcyBwb29sLCBhbmQgdGhleSBkb24ndCBwdXQgdGhyZWFkcyBpbiB0aHJlYWRzIHBvb2wuCit0eXBlZGVmIHN0cnVjdCBrbXBfaG90X3RlYW1fcHRyIHsKKyAgICBrbXBfdGVhbV9wICpob3RfdGVhbTsgICAgICAvLyBwb2ludGVyIHRvIGhvdF90ZWFtIG9mIGdpdmVuIG5lc3RpbmcgbGV2ZWwKKyAgICBrbXBfaW50MzIgICBob3RfdGVhbV9udGg7ICAvLyBudW1iZXIgb2YgdGhyZWFkcyBhbGxvY2F0ZWQgZm9yIHRoZSBob3RfdGVhbQorfSBrbXBfaG90X3RlYW1fcHRyX3Q7CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3Qga21wX3RlYW1zX3NpemUgeworICAgIGttcF9pbnQzMiAgIG50ZWFtczsgICAgICAgIC8vIG51bWJlciBvZiB0ZWFtcyBpbiBhIGxlYWd1ZQorICAgIGttcF9pbnQzMiAgIG50aDsgICAgICAgICAgIC8vIG51bWJlciBvZiB0aHJlYWRzIGluIGVhY2ggdGVhbSBvZiB0aGUgbGVhZ3VlCit9IGttcF90ZWFtc19zaXplX3Q7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworLy8KKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9iYXNlX2luZm8geworLyoKKyAqIFN0YXJ0IHdpdGggdGhlIHJlYWRvbmx5IGRhdGEgd2hpY2ggaXMgY2FjaGUgYWxpZ25lZCBhbmQgcGFkZGVkLgorICogdGhpcyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgdGhyZWFkIHN0YXJ0cyB3b3JraW5nIGJ5IHRoZSBtYXN0ZXIuCisgKiAodWJlciBtYXN0ZXJzIG1heSB1cGRhdGUgdGhlbXNlbHZlcyBsYXRlcikKKyAqICh1c2FnZSBkb2VzIG5vdCBjb25zaWRlciBzZXJpYWxpemVkIHJlZ2lvbnMpCisgKi8KKyAgICBrbXBfZGVzY190ICAgICAgICB0aF9pbmZvOworICAgIGttcF90ZWFtX3AgICAgICAgKnRoX3RlYW07ICAgICAgIC8qIHRlYW0gd2UgYmVsb25nIHRvICovCisgICAga21wX3Jvb3RfcCAgICAgICAqdGhfcm9vdDsgICAgICAgLyogcG9pbnRlciB0byByb290IG9mIHRhc2sgaGllcmFyY2h5ICovCisgICAga21wX2luZm9fcCAgICAgICAqdGhfbmV4dF9wb29sOyAgLyogbmV4dCBhdmFpbGFibGUgdGhyZWFkIGluIHRoZSBwb29sICovCisgICAga21wX2Rpc3BfdCAgICAgICAqdGhfZGlzcGF0Y2g7ICAgLyogdGhyZWFkJ3MgZGlzcGF0Y2ggZGF0YSAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX2luX3Bvb2w7ICAgIC8qIGluIHRocmVhZCBwb29sICgzMiBiaXRzIGZvciBUQ1IvVENXKSAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgY2FjaGVkIGZyb20gdGhlIHRlYW0gaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICAvKiBUT0RPIHVzZSB0aGVzZSBpbiBtb3JlIHBsYWNlcyBhcyBkZXRlcm1pbmVkIHRvIGJlIG5lZWRlZCB2aWEgcHJvZmlsaW5nICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9ucHJvYzsgICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiBhIHRlYW0gKi8KKyAgICBrbXBfaW5mb19wICAgICAgICp0aF90ZWFtX21hc3RlcjsgICAgIC8qIHRoZSB0ZWFtJ3MgbWFzdGVyIHRocmVhZCAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fc2VyaWFsaXplZDsgLyogdGVhbSBpcyBzZXJpYWxpemVkICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBtaWNyb3Rhc2tfdCAgICAgICB0aF90ZWFtc19taWNyb3Rhc2s7IC8qIHNhdmUgZW50cnkgYWRkcmVzcyBmb3IgdGVhbXMgY29uc3RydWN0ICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbXNfbGV2ZWw7ICAgICAvKiBzYXZlIGluaXRpYWwgbGV2ZWwgb2YgdGVhbXMgY29uc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdCBpcyAwIG9uIGRldmljZSBidXQgbWF5IGJlIGFueSBvbiBob3N0ICovCisjZW5kaWYKKworICAgIC8qIFRoZSBibG9ja3RpbWUgaW5mbyBpcyBjb3BpZWQgZnJvbSB0aGUgdGVhbSBzdHJ1Y3QgdG8gdGhlIHRocmVhZCBzcnVjdCAqLworICAgIC8qIGF0IHRoZSBzdGFydCBvZiBhIGJhcnJpZXIsIGFuZCB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgdGVhbSBhcmUgdXNlZCAqLworICAgIC8qIGF0IHBvaW50cyBpbiB0aGUgY29kZSB3aGVyZSB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm8gbG9uZ2VyIGd1YXJhbnRlZWQgICAqLworICAgIC8qIHRvIGV4aXN0IChmcm9tIHRoZSBQT1Ygb2Ygd29ya2VyIHRocmVhZHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fYnRfaW50ZXJ2YWxzOworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fYnRfc2V0OworCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAga21wX2FmZmluX21hc2tfdCAgKnRoX2FmZmluX21hc2s7IC8qIHRocmVhZCdzIGN1cnJlbnQgYWZmaW5pdHkgbWFzayAqLworI2VuZGlmCisKKy8qCisgKiBUaGUgZGF0YSBzZXQgYnkgdGhlIG1hc3RlciBhdCByZWluaXQsIHRoZW4gUi9XIGJ5IHRoZSB3b3JrZXIKKyAqLworICAgIEtNUF9BTElHTl9DQUNIRSBpbnQgICAgIHRoX3NldF9ucHJvYzsgIC8qIGlmID4gMCwgdGhlbiBvbmx5IHVzZSB0aGlzIHJlcXVlc3QgZm9yIHRoZSBuZXh0IGZvcmsgKi8KKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAgICAgKnRoX2hvdF90ZWFtczsgICAgIC8qIGFycmF5IG9mIGhvdCB0ZWFtcyAqLworI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgICAgICAgICB0aF9zZXRfcHJvY19iaW5kOyAvKiBpZiAhPSBwcm9jX2JpbmRfZGVmYXVsdCwgdXNlIHJlcXVlc3QgZm9yIG5leHQgZm9yayAqLworICAgIGttcF90ZWFtc19zaXplX3QgICAgICAgIHRoX3RlYW1zX3NpemU7ICAgIC8qIG51bWJlciBvZiB0ZWFtcy90aHJlYWRzIGluIHRlYW1zIGNvbnN0cnVjdCAqLworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfY3VycmVudF9wbGFjZTsgLyogcGxhY2UgY3VycmVudGx5IGJvdW5kIHRvICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfbmV3X3BsYWNlOyAgICAgLyogcGxhY2UgdG8gYmluZCB0byBpbiBwYXIgcmVnICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfZmlyc3RfcGxhY2U7ICAgLyogZmlyc3QgcGxhY2UgaW4gcGFydGl0aW9uICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfbGFzdF9wbGFjZTsgICAgLyogbGFzdCBwbGFjZSBpbiBwYXJ0aXRpb24gKi8KKyMgZW5kaWYKKyNlbmRpZgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9iYXJfYXJyaXZlX3RpbWU7ICAgICAgICAgICAvKiBhcnJpdmFsIHRvIGJhcnJpZXIgdGltZXN0YW1wICovCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfYmFyX21pbl90aW1lOyAgICAgICAgICAgICAgLyogbWluaW11bSBhcnJpdmFsIHRpbWUgYXQgdGhlIGJhcnJpZXIgKi8KKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9mcmFtZV90aW1lOyAgICAgICAgICAgICAgICAvKiBmcmFtZSB0aW1lc3RhbXAgKi8KKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9mcmFtZV90aW1lX3NlcmlhbGl6ZWQ7ICAgICAvKiBmcmFtZSB0aW1lc3RhbXAgaW4gc2VyaWFsaXplZCBwYXJhbGxlbCAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfbG9jYWxfdCAgICAgICAgICAgICB0aF9sb2NhbDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gICp0aF9wcmlfaGVhZDsKKworLyoKKyAqIE5vdyB0aGUgZGF0YSBvbmx5IHVzZWQgYnkgdGhlIHdvcmtlciAoYWZ0ZXIgaW5pdGlhbCBhbGxvY2F0aW9uKQorICovCisgICAgLyogVE9ETyB0aGUgZmlyc3Qgc2VyaWFsIHRlYW0gc2hvdWxkIGFjdHVhbGx5IGJlIHN0b3JlZCBpbiB0aGUgaW5mb190CisgICAgICogc3RydWN0dXJlLiAgdGhpcyB3aWxsIGhlbHAgcmVkdWNlIGluaXRpYWwgYWxsb2NhdGlvbiBvdmVyaGVhZCAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfdGVhbV9wICp0aF9zZXJpYWxfdGVhbTsgLypzZXJpYWxpemVkIHRlYW0gaGVsZCBpbiByZXNlcnZlKi8KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGhyZWFkX2luZm9fdCAgICAgIG9tcHRfdGhyZWFkX2luZm87CisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBhcmUgYWxzbyByZWFkIGJ5IHRoZSBtYXN0ZXIgZHVyaW5nIHJlaW5pdCAqLworICAgIHN0cnVjdCBjb21tb25fdGFibGUgICAgKnRoX3ByaV9jb21tb247CisKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICB0aF9zcGluX2hlcmU7ICAgLyogdGhyZWFkLWxvY2FsIGxvY2F0aW9uIGZvciBzcGlubmluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBhd2FpdGluZyBxdWV1aW5nIGxvY2sgYWNxdWlyZSAqLworCisgICAgdm9sYXRpbGUgdm9pZCAgICAgICAgICAqdGhfc2xlZXBfbG9jOyAgIC8vIHRoaXMgcG9pbnRzIGF0IGEga21wX2ZsYWc8VD4KKworICAgIGlkZW50X3QgICAgICAgICAgKnRoX2lkZW50OworICAgIHVuc2lnbmVkICAgICAgICAgdGhfeDsgICAgICAgICAgICAgICAgICAgICAvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkYXRhCisgICAgdW5zaWduZWQgICAgICAgICB0aF9hOyAgICAgICAgICAgICAgICAgICAgIC8vIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGRhdGEKKworLyoKKyAqIFRhc2tpbmctcmVsYXRlZCBkYXRhIGZvciB0aGUgdGhyZWFkCisgKi8KKyAgICBrbXBfdGFza190ZWFtX3QgICAgKiB0aF90YXNrX3RlYW07ICAgICAgICAgICAvLyBUYXNrIHRlYW0gc3RydWN0CisgICAga21wX3Rhc2tkYXRhX3QgICAgICogdGhfY3VycmVudF90YXNrOyAgICAgICAgLy8gSW5uZXJtb3N0IFRhc2sgYmVpbmcgZXhlY3V0ZWQKKyAgICBrbXBfdWludDggICAgICAgICAgICB0aF90YXNrX3N0YXRlOyAgICAgICAgICAvLyBhbHRlcm5hdGluZyAwLzEgZm9yIHRhc2sgdGVhbSBpZGVudGlmaWNhdGlvbgorICAgIGttcF91aW50OCAgICAgICAgICAqIHRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjazsgIC8vIFN0YWNrIGhvbGRpbmcgbWVtb3Mgb2YgdGhfdGFza19zdGF0ZSBhdCBuZXN0ZWQgbGV2ZWxzCisgICAga21wX3VpbnQzMiAgICAgICAgICAgdGhfdGFza19zdGF0ZV90b3A7ICAgICAgICAgLy8gVG9wIGVsZW1lbnQgb2YgdGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrCisgICAga21wX3VpbnQzMiAgICAgICAgICAgdGhfdGFza19zdGF0ZV9zdGFja19zejsgICAgLy8gU2l6ZSBvZiB0aF90YXNrX3N0YXRlX21lbW9fc3RhY2sKKworICAgIC8qCisgICAgICogTW9yZSBzdHVmZiBmb3Iga2VlcGluZyB0cmFjayBvZiBhY3RpdmUvc2xlZXBpbmcgdGhyZWFkcworICAgICAqICh0aGlzIHBhcnQgaXMgd3JpdHRlbiBieSB0aGUgd29ya2VyIHRocmVhZCkKKyAgICAgKi8KKyAgICBrbXBfdWludDggICAgICAgICAgICB0aF9hY3RpdmVfaW5fcG9vbDsgICAgICAvLyBpbmNsdWRlZCBpbiBjb3VudCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICNhY3RpdmUgdGhyZWFkcyBpbiBwb29sCisgICAgaW50ICAgICAgICAgICAgICAgICAgdGhfYWN0aXZlOyAgICAgICAgICAgICAgLy8gISBzbGVlcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMyIGJpdHMgZm9yIFRDUi9UQ1cKKworCisgICAgc3RydWN0IGNvbnNfaGVhZGVyICogdGhfY29uczsgLy8gdXNlZCBmb3IgY29uc2lzdGVuY3kgY2hlY2sKKworLyoKKyAqIEFkZCB0aGUgc3luY3Jvbml6aW5nIGRhdGEgd2hpY2ggaXMgY2FjaGUgYWxpZ25lZCBhbmQgcGFkZGVkLgorICovCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF9iYWxpZ25fdCAgICAgIHRoX2JhclsgYnNfbGFzdF9iYXJyaWVyIF07CisKKyAgICBLTVBfQUxJR05fQ0FDSEUgdm9sYXRpbGUgICAgIGttcF9pbnQzMiAgICB0aF9uZXh0X3dhaXRpbmc7ICAvKiBndGlkKzEgb2YgbmV4dCB0aHJlYWQgb24gbG9jayB3YWl0IHF1ZXVlLCAwIGlmIG5vbmUgKi8KKworI2lmICggVVNFX0ZBU1RfTUVNT1JZID09IDMgKSB8fCAoIFVTRV9GQVNUX01FTU9SWSA9PSA1ICkKKyAgICAjZGVmaW5lIE5VTV9MSVNUUyA0CisgICAga21wX2ZyZWVfbGlzdF90ICAgdGhfZnJlZV9saXN0c1tOVU1fTElTVFNdOyAgIC8vIEZyZWUgbGlzdHMgZm9yIGZhc3QgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfd2luMzJfY29uZF90ICB0aF9zdXNwZW5kX2N2OworICAgIGttcF93aW4zMl9tdXRleF90IHRoX3N1c3BlbmRfbXg7CisgICAgaW50ICAgICAgICAgICAgICAgdGhfc3VzcGVuZF9pbml0OworI2VuZGlmCisjaWYgS01QX09TX1VOSVgKKyAgICBrbXBfY29uZF9hbGlnbl90ICB0aF9zdXNwZW5kX2N2OworICAgIGttcF9tdXRleF9hbGlnbl90IHRoX3N1c3BlbmRfbXg7CisgICAgaW50ICAgICAgICAgICAgICAgdGhfc3VzcGVuZF9pbml0X2NvdW50OworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX2l0dF9tYXJrX3QgICAgICAgIHRoX2l0dF9tYXJrX3NpbmdsZTsKKyAgICAvLyBhbGlnbm1lbnQgPz8/CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAga21wX3N0YXRzX2xpc3QqIHRoX3N0YXRzOworI2VuZGlmCit9IGttcF9iYXNlX2luZm9fdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2luZm8geworICAgIGRvdWJsZSAgICAgICAgICB0aF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICB0aF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfaW5mb190LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2luZm9fdCB0aDsKK30ga21wX2luZm9fdDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGhyZWFkIHRlYW0gZGF0YSBzdHJ1Y3R1cmVzCisvLwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGF0YSB7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiB0X3ZhbHVlOworfSBrbXBfYmFzZV9kYXRhX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9zbGVlcF90ZWFtIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF9zbGVlcF90ZWFtX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9vcmRlcmVkX3RlYW0geworICAgIGRvdWJsZSAgICAgICAgICAgICAgZHRfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV9kYXRhX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGF0YV90ICAgICBkdDsKK30ga21wX29yZGVyZWRfdGVhbV90OworCit0eXBlZGVmIGludCAgICAgKCpsYXVuY2hfdCkoIGludCBndGlkICk7CisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIEFSR1YgZW50cmllcyB0byBtYWxsb2MgaWYgbmVjZXNzYXJ5ICovCisjZGVmaW5lIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyAgICAgMTAwCisKKy8vIFNldCB1cCBob3cgbWFueSBhcmd2IHBvaW50ZXJzIHdpbGwgZml0IGluIGNhY2hlIGxpbmVzIGNvbnRhaW5pbmcgdF9pbmxpbmVfYXJndi4gSGlzdG9yaWNhbGx5LCB3ZQorLy8gaGF2ZSBzdXBwb3J0ZWQgYXQgbGVhc3QgOTYgYnl0ZXMuIFVzaW5nIGEgbGFyZ2VyIHZhbHVlIGZvciBtb3JlIHNwYWNlIGJldHdlZW4gdGhlIG1hc3RlciB3cml0ZS93b3JrZXIKKy8vIHJlYWQgc2VjdGlvbiBhbmQgcmVhZC93cml0ZSBieSBhbGwgc2VjdGlvbiBzZWVtcyB0byBidXkgbW9yZSBwZXJmb3JtYW5jZSBvbiBFUENDIFBBUkFMTEVMLgorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICggNCAqIENBQ0hFX0xJTkUgLSAoICggMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSArIDIgKiBzaXplb2Yoa21wX2ludDgpICsgc2l6ZW9mKGttcF9pbnQxNikgKyBzaXplb2Yoa21wX3VpbnQzMikgKSAlIENBQ0hFX0xJTkUgKSApCisjZWxzZQorIyBkZWZpbmUgS01QX0lOTElORV9BUkdWX0JZVEVTICAgICAgICAgKCAyICogQ0FDSEVfTElORSAtICggKCAzICogS01QX1BUUl9TS0lQICsgMiAqIHNpemVvZihpbnQpICkgJSBDQUNIRV9MSU5FICkgKQorI2VuZGlmCisjZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTICAgICAgICAoaW50KSggS01QX0lOTElORV9BUkdWX0JZVEVTIC8gS01QX1BUUl9TS0lQICkKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9iYXNlX3RlYW0geworICAgIC8vIFN5bmNocm9uaXphdGlvbiBEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfb3JkZXJlZF90ZWFtX3QgdF9vcmRlcmVkOworICAgIGttcF9iYWxpZ25fdGVhbV90ICAgICAgICB0X2JhclsgYnNfbGFzdF9iYXJyaWVyIF07CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICAgIHRfY29uc3RydWN0OyAgICAvLyBjb3VudCBvZiBzaW5nbGUgZGlyZWN0aXZlIGVuY291bnRlcmVkIGJ5IHRlYW0KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgdF9zaW5nbGVfbG9jazsgIC8vIHRlYW0gc3BlY2lmaWMgbG9jaworCisgICAgLy8gTWFzdGVyIG9ubHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBLTVBfQUxJR05fQ0FDSEUgaW50ICAgICAgdF9tYXN0ZXJfdGlkOyAgIC8vIHRpZCBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXN0ZXJfdGhpc19jb25zOyAvLyAidGhpc19jb25zdHJ1Y3QiIHNpbmdsZSBjb3VudGVyIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbQorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICp0X2lkZW50OyAgICAgICAgLy8gaWYgdm9sYXRpbGUsIGhhdmUgdG8gY2hhbmdlIHRvbyBtdWNoIG90aGVyIGNydWQgdG8gdm9sYXRpbGUgdG9vCisgICAga21wX3RlYW1fcCAgICAgICAgICAgICAgKnRfcGFyZW50OyAgICAgICAvLyBwYXJlbnQgdGVhbQorICAgIGttcF90ZWFtX3AgICAgICAgICAgICAgICp0X25leHRfcG9vbDsgICAgLy8gbmV4dCBmcmVlIHRlYW0gaW4gdGhlIHRlYW0gcG9vbAorICAgIGttcF9kaXNwX3QgICAgICAgICAgICAgICp0X2Rpc3BhdGNoOyAgICAgLy8gdGhyZWFkJ3MgZGlzcGF0Y2ggZGF0YQorICAgIGttcF90YXNrX3RlYW1fdCAgICAgICAgICp0X3Rhc2tfdGVhbVsyXTsgLy8gVGFzayB0ZWFtIHN0cnVjdDsgc3dpdGNoIGJldHdlZW4gMgorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90ICAgICAgICAgIHRfcHJvY19iaW5kOyAgICAvLyBiaW5kIHR5cGUgZm9yIHBhciByZWdpb24KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgdF9yZWdpb25fdGltZTsgIC8vIHJlZ2lvbiBiZWdpbiB0aW1lc3RhbXAKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAvLyBNYXN0ZXIgd3JpdGUsIHdvcmtlcnMgcmVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEtNUF9BTElHTl9DQUNIRSB2b2lkICAgKip0X2FyZ3Y7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfYXJnYzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9ucHJvYzsgICAgICAgIC8vIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0KKyAgICBtaWNyb3Rhc2tfdCAgICAgICAgICAgICAgdF9wa2ZuOworICAgIGxhdW5jaF90ICAgICAgICAgICAgICAgICB0X2ludm9rZTsgICAgICAgLy8gcHJvY2VkdXJlIHRvIGxhdW5jaCB0aGUgbWljcm90YXNrCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3RlYW1faW5mb190ICAgICAgICAgb21wdF90ZWFtX2luZm87CisgICAgb21wdF9sd190YXNrdGVhbV90ICAgICAgKm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm87CisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBrbXBfaW50OCAgICAgICAgICAgICAgICAgdF9mcF9jb250cm9sX3NhdmVkOworICAgIGttcF9pbnQ4ICAgICAgICAgICAgICAgICB0X3BhZDJiOworICAgIGttcF9pbnQxNiAgICAgICAgICAgICAgICB0X3g4N19mcHVfY29udHJvbF93b3JkOyAvLyBGUCBjb250cm9sIHJlZ3MKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgdF9teGNzcjsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdF9pbmxpbmVfYXJndlsgS01QX0lOTElORV9BUkdWX0VOVFJJRVMgXTsKKworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfaW5mb190ICoqdF90aHJlYWRzOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X21heF9hcmdjOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X21heF9ucHJvYzsgICAgLy8gbWF4aW11bSB0aHJlYWRzIHRoaXMgdGVhbSBjYW4gaGFuZGxlIChkeW5hbWljbHkgZXhwYW5kYWJsZSkKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9zZXJpYWxpemVkOyAgIC8vIGxldmVscyBkZWVwIG9mIHNlcmlhbGl6ZWQgdGVhbXMKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ICAqdF9kaXNwX2J1ZmZlcjsgIC8vIGJ1ZmZlcnMgZm9yIGRpc3BhdGNoIHN5c3RlbQorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2lkOyAgICAgICAgICAgLy8gdGVhbSdzIGlkLCBhc3NpZ25lZCBieSBkZWJ1Z2dlci4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9sZXZlbDsgICAgICAgIC8vIG5lc3RlZCBwYXJhbGxlbCBsZXZlbAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2FjdGl2ZV9sZXZlbDsgLy8gbmVzdGVkIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbAorICAgIGttcF9yX3NjaGVkX3QgICAgICAgICAgICB0X3NjaGVkOyAgICAgICAgLy8gcnVuLXRpbWUgc2NoZWR1bGUgZm9yIHRoZSB0ZWFtCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2ZpcnN0X3BsYWNlOyAgLy8gZmlyc3QgJiBsYXN0IHBsYWNlIGluIHBhcmVudCB0aHJlYWQncyBwYXJ0aXRpb24uCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbGFzdF9wbGFjZTsgICAvLyBSZXN0b3JlIHRoZXNlIHZhbHVlcyB0byBtYXN0ZXIgYWZ0ZXIgcGFyIHJlZ2lvbi4KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaW50IHRfc2l6ZV9jaGFuZ2VkOyAvLyB0ZWFtIHNpemUgd2FzIGNoYW5nZWQ/OiAwOiBubywgMTogeWVzLCAtMTogY2hhbmdlZCB2aWEgb21wX3NldF9udW1fdGhyZWFkcygpIGNhbGwKKworICAgIC8vIFJlYWQvd3JpdGUgYnkgd29ya2VycyBhcyB3ZWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIC8vIFVzaW5nIENBQ0hFX0xJTkU9NjQgcmVkdWNlcyBtZW1vcnkgZm9vdHByaW50LCBidXQgY2F1c2VzIGEgYmlnIHBlcmYgcmVncmVzc2lvbiBvZiBlcGNjICdwYXJhbGxlbCcKKyAgICAvLyBhbmQgJ2JhcnJpZXInIG9uIGZ4ZTI1NmxpbjAxLiBUaGlzIGV4dHJhIHBhZGRpbmcgc2VydmVzIHRvIGZpeCB0aGUgcGVyZm9ybWFuY2Ugb2YgZXBjYyAncGFyYWxsZWwnCisgICAgLy8gYW5kICdiYXJyaWVyJyB3aGVuIENBQ0hFX0xJTkU9NjQuIFRPRE86IGludmVzdGlnYXRlIG1vcmUgYW5kIGdldCByaWQgaWYgdGhpcyBwYWRkaW5nLgorICAgIGNoYXIgZHVtbXlfcGFkZGluZ1sxMDI0XTsKKyNlbmRpZgorICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfdGFza2RhdGFfdCAqdF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhOyAgLy8gVGFza2RhdGEgZm9yIHRoZSB0aHJlYWQncyBpbXBsaWNpdCB0YXNrCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAgKnRfY29udHJvbF9zdGFja190b3A7ICAvLyBpbnRlcm5hbCBjb250cm9sIHN0YWNrIGZvciBhZGRpdGlvbmFsIG5lc3RlZCB0ZWFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBTRVJJQUxJWkVEIHRlYW1zIG5lc3RlZCAyIG9yIG1vcmUgbGV2ZWxzIGRlZXAKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICB0X2NhbmNlbF9yZXF1ZXN0OyAvLyB0eXBlZCBmbGFnIHRvIHN0b3JlIHJlcXVlc3Qgc3RhdGUgb2YgY2FuY2VsbGF0aW9uCisjZW5kaWYKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXN0ZXJfYWN0aXZlOyAgLy8gc2F2ZSBvbiBmb3JrLCByZXN0b3JlIG9uIGpvaW4KKyAgICBrbXBfdGFza3FfdCAgICAgICAgICAgICAgdF90YXNrcTsgICAgICAgICAgLy8gdGhpcyB0ZWFtJ3MgdGFzayBxdWV1ZQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp0X2NvcHlwcml2X2RhdGE7ICAvLyB0ZWFtIHNwZWNpZmljIHBvaW50ZXIgdG8gY29weXByaXZhdGUgZGF0YSBhcnJheQorICAgIGttcF91aW50MzIgICAgICAgICAgICAgICB0X2NvcHlpbl9jb3VudGVyOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdF9zdGFja19pZDsgICAgICAgLy8gdGVhbSBzcGVjaWZpYyBzdGFjayBzdGl0Y2hpbmcgaWQgKGZvciBpdHRub3RpZnkpCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfSBrbXBfYmFzZV90ZWFtX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGVhbSB7CisgICAga21wX2Jhc2VfdGVhbV90ICAgICB0OworICAgIGRvdWJsZSAgICAgICAgICAgICAgdF9hbGlnbjsgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICB0X3BhZFsgS01QX1BBRChrbXBfYmFzZV90ZWFtX3QsIENBQ0hFX0xJTkUpIF07Cit9OworCisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aW1lX2dsb2JhbCB7CisgICAgZG91YmxlICAgICAgICAgICAgICBkdF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2RhdGFfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9kYXRhX3QgICAgIGR0OworfSBrbXBfdGltZV9nbG9iYWxfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZ2xvYmFsIHsKKyAgICAvKiBjYWNoZS1hbGlnbmVkICovCisgICAga21wX3RpbWVfZ2xvYmFsX3QgICBnX3RpbWU7CisKKyAgICAvKiBub24gY2FjaGUtYWxpZ25lZCAqLworICAgIHZvbGF0aWxlIGludCAgICAgICAgZ19hYm9ydDsKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIGdfZG9uZTsKKworICAgIGludCAgICAgICAgICAgICAgICAgZ19keW5hbWljOworICAgIGVudW0gZHluYW1pY19tb2RlICAgZ19keW5hbWljX21vZGU7Cit9IGttcF9iYXNlX2dsb2JhbF90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZ2xvYmFsIHsKKyAgICBrbXBfYmFzZV9nbG9iYWxfdCAgIGc7CisgICAgZG91YmxlICAgICAgICAgICAgICBnX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBnX3BhZFsgS01QX1BBRChrbXBfYmFzZV9nbG9iYWxfdCwgQ0FDSEVfTElORSkgXTsKK30ga21wX2dsb2JhbF90OworCisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Jvb3QgeworICAgIC8vIFRPRE86IEdFSCAtIGNvbWJpbmUgcl9hY3RpdmUgd2l0aCByX2luX3BhcmFsbGVsIHRoZW4gcl9hY3RpdmUgPT0gKHJfaW5fcGFyYWxsZWw+PSAwKQorICAgIC8vIFRPRE86IEdFSCAtIHRoZW4gcmVwbGFjZSByX2FjdGl2ZSB3aXRoIHRfYWN0aXZlX2xldmVscyBpZiB3ZSBjYW4gdG8gcmVkdWNlIHRoZSBzeW5jaAorICAgIC8vICAgICAgICAgICAgIG92ZXJoZWFkIG9yIGtlZXBpbmcgcl9hY3RpdmUKKworICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9hY3RpdmU7ICAgICAgIC8qIFRSVUUgaWYgc29tZSByZWdpb24gaW4gYSBuZXN0IGhhcyA+IDEgdGhyZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBUaGlzIGlzIG1pc25hbWVkLCBzaG91bGQgYmUgcl9pbl9wYXJhbGxlbAorICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9uZXN0ZWQ7ICAgICAgIC8vIFRPRE86IEdFSCAtIFRoaXMgaXMgdW51c2VkLCBqdXN0IHJlbW92ZSBpdCBlbnRpcmVseS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHJfaW5fcGFyYWxsZWw7ICAvKiBrZWVwcyBhIGNvdW50IG9mIGFjdGl2ZSBwYXJhbGxlbCByZWdpb25zIHBlciByb290ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBUaGlzIGlzIG1pc25hbWVkLCBzaG91bGQgYmUgcl9hY3RpdmVfbGV2ZWxzCisgICAga21wX3RlYW1fdCAgICAgICAgICpyX3Jvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICAgICAgICAgKnJfaG90X3RlYW07CisgICAga21wX2luZm9fdCAgICAgICAgICpyX3ViZXJfdGhyZWFkOworICAgIGttcF9sb2NrX3QgICAgICAgICAgcl9iZWdpbl9sb2NrOworICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9iZWdpbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJfYmxvY2t0aW1lOyAvKiBibG9ja3RpbWUgZm9yIHRoaXMgcm9vdCBhbmQgZGVzY2VuZGFudHMgKi8KK30ga21wX2Jhc2Vfcm9vdF90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfcm9vdCB7CisgICAga21wX2Jhc2Vfcm9vdF90ICAgICByOworICAgIGRvdWJsZSAgICAgICAgICAgICAgcl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgcl9wYWRbIEtNUF9QQUQoa21wX2Jhc2Vfcm9vdF90LCBDQUNIRV9MSU5FKSBdOworfSBrbXBfcm9vdF90OworCitzdHJ1Y3QgZm9ydHJhbl9pbnhfaW5mbyB7CisgICAga21wX2ludDMyICAgZGF0YTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gaW50ICAgICAgX19rbXBfc2V0dGluZ3M7CitleHRlcm4gaW50ICAgICAgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2s7CisjaWYgVVNFX0lUVF9CVUlMRAorZXh0ZXJuIGludCAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lczsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZTsKKyNlbmRpZgorZXh0ZXJuIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZDsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9kZXRlcm1fcmVkOworCisjaWZkZWYgS01QX0RFQlVHCitleHRlcm4gaW50ICAgICAga21wX2FfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2JfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2NfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2RfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2VfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2ZfZGVidWc7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKy8qIEZvciBkZWJ1ZyBpbmZvcm1hdGlvbiBsb2dnaW5nIHVzaW5nIHJvdGF0aW5nIGJ1ZmZlciAqLworI2RlZmluZSBLTVBfREVCVUdfQlVGX0xJTkVTX0lOSVQgICAgICAgIDUxMgorI2RlZmluZSBLTVBfREVCVUdfQlVGX0xJTkVTX01JTiAgICAgICAgIDEKKworI2RlZmluZSBLTVBfREVCVUdfQlVGX0NIQVJTX0lOSVQgICAgICAgIDEyOAorI2RlZmluZSBLTVBfREVCVUdfQlVGX0NIQVJTX01JTiAgICAgICAgIDIKKworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmOyAgICAgICAgICAgIC8qIFRSVUUgbWVhbnMgdXNlIGJ1ZmZlciwgRkFMU0UgbWVhbnMgcHJpbnQgdG8gc3RkZXJyICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfbGluZXM7ICAgICAgLyogSG93IG1hbnkgbGluZXMgb2YgZGVidWcgc3RvcmVkIGluIGJ1ZmZlciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX2NoYXJzOyAgICAgIC8qIEhvdyBtYW55IGNoYXJhY3RlcnMgYWxsb3dlZCBwZXIgbGluZSBpbiBidWZmZXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9hdG9taWM7ICAgICAvKiBUUlVFIG1lYW5zIHVzZSBhdG9taWMgdXBkYXRlIG9mIGJ1ZmZlciBlbnRyeSBwb2ludGVyICovCisKK2V4dGVybiBjaGFyICAgKl9fa21wX2RlYnVnX2J1ZmZlcjsgICAgICAgICAvKiBEZWJ1ZyBidWZmZXIgaXRzZWxmICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19jb3VudDsgICAgICAgICAgLyogQ291bnRlciBmb3IgbnVtYmVyIG9mIGxpbmVzIHByaW50ZWQgaW4gYnVmZmVyIHNvIGZhciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnM7IC8qIEtlZXAgdHJhY2sgb2YgY2hhciBpbmNyZWFzZSByZWNvbW1lbmRlZCBpbiB3YXJuaW5ncyAqLworLyogZW5kIHJvdGF0aW5nIGRlYnVnIGJ1ZmZlciAqLworCisjaWZkZWYgS01QX0RFQlVHCitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlOyAgICAgICAgICAgLyogKzEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgaW4gcmFuZ2UgKi8KKworI2RlZmluZSBLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOICAgICAgIDEwMjQKK2V4dGVybiBjaGFyICAgICBfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZVtLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOXTsKKyNkZWZpbmUgS01QX1BBUl9SQU5HRV9GSUxFTkFNRV9MRU4gICAgICAxMDI0CitleHRlcm4gY2hhciAgICAgX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lW0tNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOXTsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9wYXJfcmFuZ2VfbGI7CitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlX3ViOworI2VuZGlmCisKKy8qIEZvciBwcmludGluZyBvdXQgZHluYW1pYyBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2V4dGVybiBpbnQgICAgICBfX2ttcF9zdG9yYWdlX21hcDsgICAgICAgICAvKiBUcnVlIG1lYW5zIHByaW50IHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworZXh0ZXJuIGludCAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2U7IC8qIFRydWUgbWVhbnMgc3RvcmFnZSBtYXAgaW5jbHVkZXMgcGxhY2VtZW50IGluZm8gKi8KK2V4dGVybiBpbnQgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZDsKKworZXh0ZXJuIGttcF9jcHVpbmZvX3QgICAgX19rbXBfY3B1aW5mbzsKKworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X3NlcmlhbDsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9ndGlkOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X2NvbW1vbjsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9taWRkbGU7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfcGFyYWxsZWw7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfbW9uaXRvcjsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF91c2VyX2xvY2tzOworZXh0ZXJuIGludCBfX2ttcF9pbml0X2NvdW50ZXI7CitleHRlcm4gaW50IF9fa21wX3Jvb3RfY291bnRlcjsKK2V4dGVybiBpbnQgX19rbXBfdmVyc2lvbjsKKworLyogbGlzdCBvZiBhZGRyZXNzIG9mIGFsbG9jYXRlZCBjYWNoZXMgZm9yIGNvbW1vbnMgKi8KK2V4dGVybiBrbXBfY2FjaGVkX2FkZHJfdCAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0OworCisvKiBCYXJyaWVyIGFsZ29yaXRobSB0eXBlcyBhbmQgb3B0aW9ucyAqLworZXh0ZXJuIGttcF91aW50MzIgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdDsKK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0X2RmbHQ7CitleHRlcm4ga21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQ7CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyAgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0cyBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiAgICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4ga21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVybiAgICAgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZSBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGNoYXIgY29uc3QgICAqX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZSAgICAgICAgICAgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lICAgICAgICBbIGJwX2xhc3RfYmFyIF07CisKKy8qIEdsb2JhbCBMb2NrcyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2s7ICAgICAvKiBjb250cm9sIGluaXRpYWxpemF0aW9uICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZm9ya2pvaW5fbG9jazsgIC8qIGNvbnRyb2wgZm9yay9qb2luIGFjY2VzcyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX21vbml0b3JfbG9jazsgICAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7IC8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uIHRvIGNvLWV4aXN0ICovCisKK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2dsb2JhbF9sb2NrOyAgICAvKiBjb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgICovCitleHRlcm4ga21wX3F1ZXVpbmdfbG9ja190IF9fa21wX2Rpc3BhdGNoX2xvY2s7ICAvKiBjb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAvKiBjb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworCisvKiB1c2VkIGZvciB5aWVsZGluZyBzcGluLXdhaXRzICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdDsgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX25leHRfd2FpdDsgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK2V4dGVybiBlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9zY2hlZDsgICAgLyogZGVmYXVsdCBydW50aW1lIHNjaGVkdWxpbmcgKi8KK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgIF9fa21wX3N0YXRpYzsgICAvKiBkZWZhdWx0IHN0YXRpYyBzY2hlZHVsaW5nIG1ldGhvZCAqLworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSAgX19rbXBfZ3VpZGVkOyAgIC8qIGRlZmF1bHQgZ3VpZGVkIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9hdXRvOyAgICAgLyogZGVmYXVsdCBhdXRvIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gaW50ICAgICAgICAgICAgICBfX2ttcF9jaHVuazsgICAgLyogZGVmYXVsdCBydW50aW1lIGNodW5rIHNpemUgKi8KKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfc3Rrc2l6ZTsgICAgICAgIC8qIHN0YWNrIHNpemUgcGVyIHRocmVhZCAgICAgICAgICovCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemU7Lyogc3RhY2sgc2l6ZSBmb3IgbW9uaXRvciB0aHJlYWQgKi8KK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N0a29mZnNldDsgICAgICAvKiBzdGFjayBvZmZzZXQgcGVyIHRocmVhZCAgICAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfc3RrcGFkZGluZzsgICAgIC8qIFNob3VsZCB3ZSBwYWQgcm9vdCB0aHJlYWQocykgc3RhY2sgKi8KKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfbWFsbG9jX3Bvb2xfaW5jcjsgLyogaW5jcmVtZW50YWwgc2l6ZSBvZiBwb29sIGZvciBrbXBfbWFsbG9jKCkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jaHVuazsgICAgICAvKiB3YXMgS01QX0NIVU5LIHNwZWNpZmllZD8gICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfc3Rrc2l6ZTsgICAgLyogd2FzIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X29tcF9zdGtzaXplOy8qIHdhcyBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9hbGxfdGhyZWFkczsgICAgLyogd2FzIEtNUF9BTExfVEhSRUFEUyBvciBLTVBfTUFYX1RIUkVBRFMgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X29tcF9hbGxfdGhyZWFkczsvKiB3YXMgT01QX1RIUkVBRF9MSU1JVCBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lOyAgLyogd2FzIEtNUF9CTE9DS1RJTUUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2NoZWNrczsgICAgIC8qIHdhcyBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjazsgICAgIC8qIHdhcyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sgc3BlY2lmaWVkPyAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3M7IC8qIHNob3VsZCB3ZSBpc3N1ZSB3YXJuaW5ncz8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybjsgICAvKiBoYXZlIHdlIGlzc3VlZCByZXNlcnZlX3RocmVhZHMgd2FybmluZz8gKi8KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQ7ICAvKiBjb3VudCBpbnNpZGUgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSgpICovCisjZW5kaWYKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRfaW5pdDsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX25leHQ7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZGluZ19vbjsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlOworZXh0ZXJuIGttcF9pbnQzMiAgX19rbXBfeWllbGRfb25fY291bnQ7CitleHRlcm4ga21wX2ludDMyICBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQ7CisKK2V4dGVybiBzaXplX3QgICAgIF9fa21wX2FsaWduX2FsbG9jOworLyogZm9sbG93aW5nIGRhdGEgcHJvdGVjdGVkIGJ5IGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF94cHJvYzsgICAgICAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NvcnMgaW4gdGhlIHN5c3RlbSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYXZhaWxfcHJvYzsgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdmFpbGFibGUgdG8gdGhlIHByb2Nlc3MgKi8KK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZTsgLyogc3lzdGVtLWRlZmluZWQgbWluaW11bSBzdGFjayBzaXplICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9zeXNfbWF4X250aDsgICAgLyogc3lzdGVtLWltcG9zZWQgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbWF4X250aDsgICAgICAgIC8qIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIGNvbmN1cnJlbnRseS1leGlzdGluZyB0aHJlYWRzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyAvKiBjYXBhY2l0eSBvZiB0aGUgYXJyYXlzIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGg7ICAvKiBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzIGluIGEgcGFyYWxsZWwgcmVnaW9uIGEgbGEgT01QX05VTV9USFJFQURTICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViOyAvKiB1cHBlciBib3VuZCBvbiAiIiBkZXRlcm1pbmVkIGF0IHNlcmlhbCBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfdHBfY2FwYWNpdHk7ICAgIC8qIGNhcGFjaXR5IG9mIF9fa21wX3RocmVhZHMgaWYgdGhyZWFkcHJpdmF0ZSBpcyB1c2VkIChmaXhlZCkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3RwX2NhY2hlZDsgICAgICAvKiB3aGV0aGVyIHRocmVhZHByaXZhdGUgY2FjaGUgaGFzIGJlZW4gY3JlYXRlZCAoX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKCkpICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X25lc3RlZDsgICAgLyogbmVzdGVkIHBhcmFsbGVsaXNtIGVuYWJsZWQgYnkgZGVmYXVsdCBhIGxhIE9NUF9ORVNURUQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lOyAvKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGJsb2NraW5nIChlbnYgc2V0dGluZykgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX21vbml0b3Jfd2FrZXVwczsvKiBudW1iZXIgb2YgdGltZXMgbW9uaXRvciB3YWtlcyB1cCBwZXIgc2Vjb25kICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHM7ICAgLyogbnVtYmVyIG9mIG1vbml0b3IgdGltZXN0YW1wIGludGVydmFscyBiZWZvcmUgYmxvY2tpbmcgKi8KKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorZXh0ZXJuIGludCAgICAgICAgX19rbXBfemVyb19idDsgICAgICAgIC8qIHdoZXRoZXIgYmxvY2t0aW1lIGhhcyBiZWVuIGZvcmNlZCB0byB6ZXJvICovCisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKyNpZmRlZiBLTVBfREZMVF9OVEhfQ09SRVMKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX25jb3JlczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgY29yZXMgZm9yIHRocmVhZHMgcGxhY2VtZW50ICovCisjZW5kaWYKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Fib3J0X2RlbGF5OyAgICAvKiBOdW1iZXIgb2YgbWlsbGlzZWNzIHRvIGRlbGF5IG9uIGFib3J0IGZvciBWVHVuZSAqLworCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9ya19zcGVjaWZpZWQ7CitleHRlcm4gaW50ICAgICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yazsvKiBBdCBpbml0aWFsaXphdGlvbiwgY2FsbCBwdGhyZWFkX2F0Zm9yayB0byBpbnN0YWxsIGZvcmsgaGFuZGxlciAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZ3RpZF9tb2RlOyAgICAgIC8qIE1ldGhvZCBvZiBnZXR0aW5nIGd0aWQsIHZhbHVlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gbm90IHNldCwgd2lsbCBiZSBzZXQgYXQgcnVudGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSB1c2luZyBzdGFjayBzZWFyY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gZHluYW1pYyBUTFMgKHB0aHJlYWRfZ2V0c3BlY2lmaWMoTGludXgqIE9TL09TIFgqKSBvciBUbHNHZXRWYWx1ZShXaW5kb3dzKiBPUykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtIHN0YXRpYyBUTFMgKF9fZGVjbHNwZWModGhyZWFkKSBfX2ttcF9ndGlkKSwgTGludXgqIE9TIC5zbyBvbmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZTsgLyogSWYgdHJ1ZSwgYWRqdXN0IG1ldGhvZCBiYXNlZCBvbiAjdGhyZWFkcyAqLworI2lmZGVmIEtNUF9UREFUQV9HVElECisjaWYgS01QX09TX1dJTkRPV1MKK2V4dGVybiBfX2RlY2xzcGVjKHRocmVhZCkgaW50IF9fa21wX2d0aWQ7IC8qIFRoaXMgdGhyZWFkJ3MgZ3RpZCwgaWYgX19rbXBfZ3RpZF9tb2RlID09IDMgKi8KKyNlbHNlCitleHRlcm4gX190aHJlYWQgaW50IF9fa21wX2d0aWQ7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgLSB3b3JrYXJvdW5kIGJlY2F1c2UgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgY29tcGlsZXIgMjAxMTAzMTYgZG9lc24ndCBhY2NlcHQgX19kZWNsc3BlYyAqLworI2VuZGlmCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW47ICAgLyogI3RocmVhZHMgYmVsb3cgd2hpY2ggdXNlIHNwIHNlYXJjaCBmb3IgZ3RpZCAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZm9yZWlnbl90cDsgICAgIC8qIElmIHRydWUsIHNlcGFyYXRlIFRQIHZhciBmb3IgZWFjaCBmb3JlaWduIHRocmVhZCAqLworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2luaGVyaXRfZnBfY29udHJvbDsgLyogY29weSBmcCBjcmVnKHMpIHBhcmVudC0+d29ya2VycyBhdCBmb3JrICovCitleHRlcm4ga21wX2ludDE2ICBfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkOyAvKiBpbml0IHRocmVhZCdzIEZQIGNvbnRyb2wgcmVnICovCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9pbml0X214Y3NyOyAgICAgIC8qIGluaXQgdGhyZWFkJ3MgbXhzY3IgKi8KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHM7IC8qIG1heF9hY3RpdmVfbGV2ZWxzIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gZW5hYmxlZCBieSBkZWZhdWx0IGEgbGEgT01QX01BWF9BQ1RJVkVfTEVWRUxTICovCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2hvdF90ZWFtc19tb2RlOworZXh0ZXJuIGludCAgICAgICAgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbDsKKyNlbmRpZgorCisjIGlmIEtNUF9PU19MSU5VWAorZXh0ZXJuIGVudW0gY2xvY2tfZnVuY3Rpb25fdHlwZSBfX2ttcF9jbG9ja19mdW5jdGlvbjsKK2V4dGVybiBpbnQgX19rbXBfY2xvY2tfZnVuY3Rpb25fcGFyYW07CisjIGVuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCitleHRlcm4gZW51bSBtaWNfdHlwZSBfX2ttcF9taWNfdHlwZTsKKyNlbmRpZgorCisjIGlmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2V4dGVybiBkb3VibGUgICAgICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWw7ICAgLyogSW50ZXJ2YWwgZm9yIHRoZSBsb2FkIGJhbGFuY2UgYWxnb3JpdGhtICovCisjIGVuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKworLy8gT3Blbk1QIDMuMSAtIE5lc3RlZCBudW0gdGhyZWFkcyBhcnJheQordHlwZWRlZiBzdHJ1Y3Qga21wX25lc3RlZF9udGhyZWFkc190IHsKKyAgICBpbnQgKiBudGg7CisgICAgaW50ICAgc2l6ZTsKKyAgICBpbnQgICB1c2VkOworfSBrbXBfbmVzdGVkX250aHJlYWRzX3Q7CisKK2V4dGVybiBrbXBfbmVzdGVkX250aHJlYWRzX3QgX19rbXBfbmVzdGVkX250aDsKKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gUGFyYW1ldGVycyBmb3IgdGhlIHNwZWN1bGF0aXZlIGxvY2sgYmFja29mZiBzeXN0ZW0uCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zX3QgeworICAgIC8vIE51bWJlciBvZiBzb2Z0IHJldHJpZXMgYmVmb3JlIGl0IGNvdW50cyBhcyBhIGhhcmQgcmV0cnkuCisgICAga21wX3VpbnQzMiBtYXhfc29mdF9yZXRyaWVzOworICAgIC8vIEJhZG5lc3MgaXMgYSBiaXQgbWFzayA6IDAsMSwzLDcsMTUsLi4uIG9uIGVhY2ggaGFyZCBmYWlsdXJlIHdlIG1vdmUgb25lIHRvIHRoZSByaWdodAorICAgIGttcF91aW50MzIgbWF4X2JhZG5lc3M7Cit9OworCitleHRlcm4ga21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zX3QgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXM7CisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKK2V4dGVybiBjaGFyICogX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlOworI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIGludCBfX2ttcF9kaXNwbGF5X2VudjsgICAgICAgICAgIC8qIFRSVUUgb3IgRkFMU0UgKi8KK2V4dGVybiBpbnQgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZTsgICAvKiBUUlVFIGlmIE9NUF9ESVNQTEFZX0VOVj1WRVJCT1NFICovCitleHRlcm4gaW50IF9fa21wX29tcF9jYW5jZWxsYXRpb247ICAgICAgLyogVFJVRSBvciBGQUxTRSAqLworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0aGUgZm9sbG93aW5nIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGZvcmsvam9pbiBsb2NrICovCisvKiB3cml0ZTogbG9jayAgcmVhZDogYW55dGltZSAqLworZXh0ZXJuICAgICAgICAgIGttcF9pbmZvX3QgKipfX2ttcF90aHJlYWRzOyAgICAgIC8qIERlc2NyaXB0b3JzIGZvciB0aGUgdGhyZWFkcyAqLworLyogcmVhZC93cml0ZTogbG9jayAqLworZXh0ZXJuIHZvbGF0aWxlIGttcF90ZWFtX3QgICogICAgIF9fa21wX3RlYW1fcG9vbDsKK2V4dGVybiB2b2xhdGlsZSBrbXBfaW5mb190ICAqICAgICBfX2ttcF90aHJlYWRfcG9vbDsKKworLyogdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgcmVhY2hhYmxlIGZyb20gc29tZSByb290IHRocmVhZCBpbmNsdWRpbmcgYWxsIHJvb3QgdGhyZWFkcyovCitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX250aDsKKy8qIHRvdGFsIG51bWJlciBvZiB0aHJlYWRzIHJlYWNoYWJsZSBmcm9tIHNvbWUgcm9vdCB0aHJlYWQgaW5jbHVkaW5nIGFsbCByb290IHRocmVhZHMsCisgICBhbmQgdGhvc2UgaW4gdGhlIHRocmVhZCBwb29sICovCitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2FsbF9udGg7CitleHRlcm4gaW50IF9fa21wX3RocmVhZF9wb29sX250aDsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aDsKKworZXh0ZXJuIGttcF9yb290X3QgKipfX2ttcF9yb290OyAgICAgICAgIC8qIHJvb3Qgb2YgdGhyZWFkIGhpZXJhcmNoeSAqLworLyogZW5kIGRhdGEgcHJvdGVjdGVkIGJ5IGZvcmsvam9pbiBsb2NrICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIGttcF9nbG9iYWxfdCAgX19rbXBfZ2xvYmFsOyAgICAgICAgIC8qIGdsb2JhbCBzdGF0dXMgKi8KKworZXh0ZXJuIGttcF9pbmZvX3QgX19rbXBfbW9uaXRvcjsKK2V4dGVybiB2b2xhdGlsZSBrbXBfdWludDMyIF9fa21wX3RlYW1fY291bnRlcjsgICAgICAvLyBVc2VkIGJ5IERlYnVnZ2luZyBTdXBwb3J0IExpYnJhcnkuCitleHRlcm4gdm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90YXNrX2NvdW50ZXI7ICAgICAgLy8gVXNlZCBieSBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorCisjaWYgVVNFX0RFQlVHR0VSCisKKyNkZWZpbmUgX0tNUF9HRU5fSUQoIGNvdW50ZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX2RlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAodm9sYXRpbGUga21wX2ludDMyICopICYgY291bnRlciApICsgMSAgICBcCisgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICkKKyNlbHNlCisjZGVmaW5lIF9LTVBfR0VOX0lEKCBjb3VudGVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKQorI2VuZGlmIC8qIFVTRV9ERUJVR0dFUiAqLworCisjZGVmaW5lIEtNUF9HRU5fVEFTS19JRCgpICAgIF9LTVBfR0VOX0lEKCBfX2ttcF90YXNrX2NvdW50ZXIgKQorI2RlZmluZSBLTVBfR0VOX1RFQU1fSUQoKSAgICBfS01QX0dFTl9JRCggX19rbXBfdGVhbV9jb3VudGVyICkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggaW50IGd0aWQsIHZvaWQgKnAxLCB2b2lkKiBwMiwgc2l6ZV90IHNpemUsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSggdm9pZCApOworCitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9iZWdpbiggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIGludCBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKCBpbnQgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9kdG9yKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdCggdm9pZCogKTsKKworZXh0ZXJuIGludCAgX19rbXBfcmVnaXN0ZXJfcm9vdCggaW50IGluaXRpYWxfdGhyZWFkICk7CitleHRlcm4gdm9pZCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3QoIGludCBndGlkICk7CisKK2V4dGVybiBpbnQgIF9fa21wX2lnbm9yZV9tcHBiZWcoIHZvaWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2lnbm9yZV9tcHBlbmQoIHZvaWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfZW50ZXJfc2luZ2xlKCBpbnQgZ3RpZCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgcHVzaF93cyApOworZXh0ZXJuIHZvaWQgX19rbXBfZXhpdF9zaW5nbGUoIGludCBndGlkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2RlbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICk7CitleHRlcm4gdm9pZCBfX2ttcF9wYXJhbGxlbF9keG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApOworCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorZXh0ZXJuIGludCAgX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSggaW50ICk7CisjZW5kaWYKKworI2lmZGVmIEJVSUxEX1RWCitleHRlcm4gdm9pZCBfX2ttcF90dl90aHJlYWRwcml2YXRlX3N0b3JlKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqZ2xvYmFsX2FkZHIsIHZvaWQgKnRocmVhZF9hZGRyICk7CisjZW5kaWYKKworZXh0ZXJuIGludCAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoIHZvaWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfZXhpdF90aHJlYWQoIGludCBleGl0X3N0YXR1cyApOworZXh0ZXJuIHZvaWQgX19rbXBfYWJvcnQoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOworZXh0ZXJuIHZvaWQgX19rbXBfYWJvcnRfdGhyZWFkKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hYm9ydF9wcm9jZXNzKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF93YXJuKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X251bV90aHJlYWRzKCBpbnQgbmV3X250aCwgaW50IGd0aWQgKTsKKworLy8gUmV0dXJucyBjdXJyZW50IHRocmVhZCAocG9pbnRlciB0byBrbXBfaW5mb190KS4gQ3VycmVudCB0aHJlYWQgKm11c3QqIGJlIHJlZ2lzdGVyZWQuCitzdGF0aWMgaW5saW5lIGttcF9pbmZvX3QgKiBfX2ttcF9lbnRyeV90aHJlYWQoKQoreworICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyAgICAgIHJldHVybiBfX2ttcF90aHJlYWRzW2d0aWRdOworfQorCitleHRlcm4gdm9pZCBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkLCBpbnQgbmV3X21heF9hY3RpdmVfbGV2ZWxzICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggaW50IGd0aWQsIGludCBsZXZlbCApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X3RlYW1fc2l6ZSggaW50IGd0aWQsIGludCBsZXZlbCApOworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3QgbmV3X3NjaGVkLCBpbnQgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wX2dldF9zY2hlZHVsZSggaW50IGd0aWQsIGttcF9zY2hlZF90ICogc2NoZWQsIGludCAqIGNodW5rICk7CisKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBfX2ttcF9nZXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApOworCitleHRlcm4ga21wX3Jfc2NoZWRfdCBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hZGp1c3RfbnVtX3RocmVhZHMoIGludCBuZXdfbnByb2MgKTsKKworZXh0ZXJuIHZvaWQgKiBfX19rbXBfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICogX19fa21wX3BhZ2VfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19fa21wX2ZyZWUoIHZvaWQgKiBwdHIgS01QX1NSQ19MT0NfREVDTCApOworI2RlZmluZSBfX2ttcF9hbGxvY2F0ZSggc2l6ZSApICAgICAgX19fa21wX2FsbG9jYXRlKCAoc2l6ZSkgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX3BhZ2VfYWxsb2NhdGUoIHNpemUgKSBfX19rbXBfcGFnZV9hbGxvY2F0ZSggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF9mcmVlKCBwdHIgKSAgICAgICAgICAgX19fa21wX2ZyZWUoIChwdHIpIEtNUF9TUkNfTE9DX0NVUlIgKQorCisjaWYgVVNFX0ZBU1RfTUVNT1JZCitleHRlcm4gdm9pZCAqIF9fX2ttcF9mYXN0X2FsbG9jYXRlKCBrbXBfaW5mb190ICp0aGlzX3Rociwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgICBfX19rbXBfZmFzdF9mcmVlKCBrbXBfaW5mb190ICp0aGlzX3Rociwgdm9pZCAqcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19rbXBfZnJlZV9mYXN0X21lbW9yeSgga21wX2luZm9fdCAqdGhpc190aHIgKTsKK2V4dGVybiB2b2lkICAgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeSgga21wX2luZm9fdCAqdGhpc190aHIgKTsKKyNkZWZpbmUgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhpc190aHIsIHNpemUgKSBfX19rbXBfZmFzdF9hbGxvY2F0ZSggKHRoaXNfdGhyKSwgKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF9mYXN0X2ZyZWUoIHRoaXNfdGhyLCBwdHIgKSAgICAgIF9fX2ttcF9mYXN0X2ZyZWUoICh0aGlzX3RociksIChwdHIpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2VuZGlmCisKK2V4dGVybiB2b2lkICogX19fa21wX3RocmVhZF9tYWxsb2MoIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfY2FsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICogX19fa21wX3RocmVhZF9yZWFsbG9jKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fX2ttcF90aHJlYWRfZnJlZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMICk7CisjZGVmaW5lIF9fa21wX3RocmVhZF9tYWxsb2MoICB0aCwgc2l6ZSApICAgICAgICAgIF9fX2ttcF90aHJlYWRfbWFsbG9jKCAgKHRoKSwgKHNpemUpICAgICAgICAgICAgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX3RocmVhZF9jYWxsb2MoICB0aCwgbmVsZW0sIGVsc2l6ZSApIF9fX2ttcF90aHJlYWRfY2FsbG9jKCAgKHRoKSwgKG5lbGVtKSwgKGVsc2l6ZSkgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX3RocmVhZF9yZWFsbG9jKCB0aCwgcHRyLCBzaXplICkgICAgIF9fX2ttcF90aHJlYWRfcmVhbGxvYyggKHRoKSwgKHB0ciksIChzaXplKSAgICAgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX3RocmVhZF9mcmVlKCAgICB0aCwgcHRyICkgICAgICAgICAgIF9fX2ttcF90aHJlYWRfZnJlZSggICAgKHRoKSwgKHB0cikgICAgICAgICAgICAgS01QX1NSQ19MT0NfQ1VSUiApCisKKyNkZWZpbmUgS01QX0lOVEVSTkFMX01BTExPQyhzeikgICAgbWFsbG9jKHN6KQorI2RlZmluZSBLTVBfSU5URVJOQUxfRlJFRShwKSAgICAgICBmcmVlKHApCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9SRUFMTE9DKHAsc3opIHJlYWxsb2MoKHApLChzeikpCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9DQUxMT0MobixzeikgIGNhbGxvYygobiksKHN6KSkKKworZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IG51bV90aHJlYWRzICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9wcm9jX2JpbmQoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfbnVtX3RlYW1zKCBpZGVudF90ICpsb2MsIGludCBndGlkLCBpbnQgbnVtX3RlYW1zLCBpbnQgbnVtX3RocmVhZHMgKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF95aWVsZCggaW50IGNvbmQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAga21wX2ludDMyIGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50MzIgbGIsIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDY0IGxiLCBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAga21wX2ludDY0IGNodW5rICk7CisKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX2ludDMyICpwX2xiLCBrbXBfaW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApOworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX3VpbnQzMiAqcF9sYiwga21wX3VpbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQ2NCAqcF9sYiwga21wX2ludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKTsKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50NjQgKnBfbGIsIGttcF91aW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApOworCitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKKworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfZXFfNCggIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbmVxXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbHRfNCggIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfZ2VfNCggIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbGVfNCggIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfd2FpdF95aWVsZF80KCBrbXBfdWludDMyIHZvbGF0aWxlICogc3Bpbm5lciwga21wX3VpbnQzMiBjaGVja2VyLCBrbXBfdWludDMyICgqcHJlZCkgKGttcF91aW50MzIsIGttcF91aW50MzIpLCB2b2lkICogb2JqICk7CisKK2NsYXNzIGttcF9mbGFnXzMyOworY2xhc3Mga21wX2ZsYWdfNjQ7CitjbGFzcyBrbXBfZmxhZ19vbmNvcmU7CitleHRlcm4gdm9pZCBfX2ttcF93YWl0XzMyKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ18zMiAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV8zMihrbXBfZmxhZ18zMiAqZmxhZyk7CitleHRlcm4gdm9pZCBfX2ttcF93YWl0XzY0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV82NChrbXBfZmxhZ182NCAqZmxhZyk7CitleHRlcm4gdm9pZCBfX2ttcF93YWl0X29uY29yZShrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfb25jb3JlICpmbGFnLCBpbnQgZmluYWxfc3BpbgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAsIHZvaWQgKiBpdHRfc3luY19vYmoKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX29uY29yZShrbXBfZmxhZ19vbmNvcmUgKmZsYWcpOworCitleHRlcm4gdm9pZCBfX2ttcF9pbmZpbml0ZV9sb29wKCB2b2lkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFudXAoIHZvaWQgKTsKKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIGV4dGVybiBpbnQgIF9fa21wX2hhbmRsZV9zaWduYWxzOworICAgIGV4dGVybiB2b2lkIF9fa21wX2luc3RhbGxfc2lnbmFscyggaW50IHBhcmFsbGVsX2luaXQgKTsKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9yZW1vdmVfc2lnbmFscyggdm9pZCApOworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFyX3N5c3RlbV90aW1lKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCBkb3VibGUgKmRlbHRhICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIGttcF9pbmZvX3QgKnRociApOworCitleHRlcm4gdm9pZCBfX2ttcF9leHBhbmRfaG9zdF9uYW1lKCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplICk7CitleHRlcm4gdm9pZCBfX2ttcF9leHBhbmRfZmlsZV9uYW1lKCBjaGFyICpyZXN1bHQsIHNpemVfdCBybGVuLCBjaGFyICpwYXR0ZXJuICk7CisKKyNpZiBLTVBfT1NfV0lORE9XUworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljayggdm9pZCApOyAgLyogSW5pdGlhbGl6ZSB0aW1lciB0aWNrIHZhbHVlICovCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfcnVudGltZV9pbml0aWFsaXplKCB2b2lkICk7ICAvKiBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCitleHRlcm4gdm9pZCBfX2ttcF9ydW50aW1lX2Rlc3Ryb3koIHZvaWQgKTsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKK2V4dGVybiBjaGFyICpfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGttcF9hZmZpbl9tYXNrX3QgKm1hc2spOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soaW50IGd0aWQsIGludCBpc2Ffcm9vdCk7IC8qIHNldCBhZmZpbml0eSBhY2NvcmRpbmcgdG8gS01QX0FGRklOSVRZICovCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3NldF9wbGFjZShpbnQgZ3RpZCk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCBjb25zdCBjaGFyICplbnZfdmFyICk7CitleHRlcm4gaW50IF9fa21wX2F1eF9zZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spOworZXh0ZXJuIHZvaWQgX19rbXBfYmFsYW5jZWRfYWZmaW5pdHkoIGludCB0aWQsIGludCB0ZWFtX3NpemUgKTsKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFudXBfaGllcmFyY2h5KCk7CitleHRlcm4gdm9pZCBfX2ttcF9nZXRfaGllcmFyY2h5KGttcF91aW50MzIgbnByb2MsIGttcF9ic3RhdGVfdCAqdGhyX2Jhcik7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisKK2V4dGVybiBpbnQgX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGUoIHZvaWQgKTsKKworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworZXh0ZXJuIHZvaWQgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGludCBndGlkICk7CitleHRlcm4gaW50ICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYyggdm9pZCApOworCitleHRlcm4gZG91YmxlIF9fa21wX3JlYWRfY3B1X3RpbWUoIHZvaWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfcmVhZF9zeXN0ZW1faW5mbyggc3RydWN0IGttcF9zeXNfaW5mbyAqaW5mbyApOworCitleHRlcm4gdm9pZCBfX2ttcF9jcmVhdGVfbW9uaXRvcigga21wX2luZm9fdCAqdGggKTsKKworZXh0ZXJuIHZvaWQgKl9fa21wX2xhdW5jaF90aHJlYWQoIGttcF9pbmZvX3QgKnRociApOworCitleHRlcm4gdm9pZCBfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICk7CisKKyNpZiBLTVBfT1NfV0lORE9XUworZXh0ZXJuIGludCAgX19rbXBfc3RpbGxfcnVubmluZyhrbXBfaW5mb190ICp0aCk7CitleHRlcm4gaW50ICBfX2ttcF9pc190aHJlYWRfYWxpdmUoIGttcF9pbmZvX3QgKiB0aCwgRFdPUkQgKmV4aXRfdmFsICk7CitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX2hhbmRsZSgga21wX3RocmVhZF90IHRIYW5kbGUgKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF9yZWFwX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWFwX3dvcmtlcigga21wX2luZm9fdCAqdGggKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGludCBndGlkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfMzIoIGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZyApOworZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF82NCggaW50IHRoX2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX29uY29yZSggaW50IHRoX2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZyApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVzdW1lXzMyKCBpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzMyICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZXN1bWVfNjQoIGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcgKTsKK2V4dGVybiB2b2lkIF9fa21wX3Jlc3VtZV9vbmNvcmUoIGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2VsYXBzZWQoIGRvdWJsZSAqICk7CitleHRlcm4gdm9pZCBfX2ttcF9lbGFwc2VkX3RpY2soIGRvdWJsZSAqICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2VuYWJsZSggaW50IG9sZF9zdGF0ZSApOworZXh0ZXJuIHZvaWQgX19rbXBfZGlzYWJsZSggaW50ICpvbGRfc3RhdGUgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfdGhyZWFkX3NsZWVwKCBpbnQgbWlsbGlzICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NvbW1vbl9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9jb21tb25fZGVzdHJveSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZCggaW50IGd0aWQgKTsKKworI2lmIEtNUF9PU19VTklYCitleHRlcm4gdm9pZCBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsoIHZvaWQgKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICk7CisKK2V4dGVybiBrbXBfaW5mb190ICogX19rbXBfYWxsb2NhdGVfdGhyZWFkKCBrbXBfcm9vdF90ICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQpOworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4ga21wX3RlYW1fdCAqIF9fa21wX2FsbG9jYXRlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcoa21wX2luZm9fdCAqdGhyKSApOworI2Vsc2UKK2V4dGVybiBrbXBfdGVhbV90ICogX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICp0aHIpICk7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfdGhyZWFkKCBrbXBfaW5mb190ICogKTsKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfdGVhbSgga21wX3Jvb3RfdCAqLCBrbXBfdGVhbV90ICogIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICopICk7CitleHRlcm4ga21wX3RlYW1fdCAqIF9fa21wX3JlYXBfdGVhbSgga21wX3RlYW1fdCAqICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gdm9pZCBfX2ttcF9pbml0aWFsaXplX2JnZXQoIGttcF9pbmZvX3QgKnRoICk7CitleHRlcm4gdm9pZCBfX2ttcF9maW5hbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApOworCitLTVBfRVhQT1JUIHZvaWQgKmttcGNfbWFsbG9jKCBzaXplX3Qgc2l6ZSApOworS01QX0VYUE9SVCB2b2lkICprbXBjX2NhbGxvYyggc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplICk7CitLTVBfRVhQT1JUIHZvaWQgKmttcGNfcmVhbGxvYyggdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSApOworS01QX0VYUE9SVCB2b2lkICBrbXBjX2ZyZWUoIHZvaWQgKnB0ciApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgdXNlICovCisKK2V4dGVybiBpbnQgIF9fa21wX2JhcnJpZXIoIGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCwgaW50IGlzX3NwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopICk7CitleHRlcm4gdm9pZCBfX2ttcF9lbmRfc3BsaXRfYmFycmllciAoIGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCApOworCisvKiEKKyAqIFRlbGwgdGhlIGZvcmsgY2FsbCB3aGljaCBjb21waWxlciBnZW5lcmF0ZWQgdGhlIGZvcmsgY2FsbCwgYW5kIHRoZXJlZm9yZSBob3cgdG8gZGVhbCB3aXRoIHRoZSBjYWxsLgorICovCitlbnVtIGZvcmtfY29udGV4dF9lCit7CisgICAgZm9ya19jb250ZXh0X2dudSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENhbGxlZCBmcm9tIEdOVSBnZW5lcmF0ZWQgY29kZSwgc28gbXVzdCBub3QgaW52b2tlIHRoZSBtaWNyb3Rhc2sgaW50ZXJuYWxseS4gKi8KKyAgICBmb3JrX2NvbnRleHRfaW50ZWwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FsbGVkIGZyb20gSW50ZWwgZ2VuZXJhdGVkIGNvZGUuICAqLworICAgIGZvcmtfY29udGV4dF9sYXN0Cit9OworZXh0ZXJuIGludCBfX2ttcF9mb3JrX2NhbGwoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGVudW0gZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0LAorICBrbXBfaW50MzIgYXJnYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgdm9pZCAqdW53cmFwcGVkX3Rhc2ssCisjZW5kaWYKKyAgbWljcm90YXNrX3QgbWljcm90YXNrLCBsYXVuY2hfdCBpbnZva2VyLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgKmFwCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfam9pbl9jYWxsKCBpZGVudF90ICpsb2MsIGludCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVudW0gZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgZXhpdF90ZWFtcyA9IDAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICppZCwga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZm9yayggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9qb2luKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiBpbnQgX19rbXBfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApOworCisvLyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGV4cG9ydGVkCitLTVBfRVhQT1JUIGludCBfX2ttcGNfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIGludCAgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3RlYW1zX21hc3RlciggaW50IGd0aWQgKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scygga21wX2luZm9fdCAqIHRocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdXNlcl9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBzaXplX3QgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfYmxvY2t0aW1lIChpbnQgYXJnLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCB0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggY2hhciBjb25zdCAqIHN0ciwgaW50IGxlbiApOworCisvKiBGdW5jdGlvbnMgYmVsb3cgcHV0IGhlcmUgdG8gY2FsbCB0aGVtIGZyb20gX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCkgaW4ga21wX3NldHRpbmdzLmMgKi8KK3ZvaWQga21wY19zZXRfYmxvY2t0aW1lIChpbnQgYXJnKTsKK3ZvaWQgb21wY19zZXRfbmVzdGVkKCBpbnQgZmxhZyApOwordm9pZCBvbXBjX3NldF9keW5hbWljKCBpbnQgZmxhZyApOwordm9pZCBvbXBjX3NldF9udW1fdGhyZWFkcyggaW50IGFyZyApOworCitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIgKTsKK2V4dGVybiBrbXBfdGFza190KiBfX2ttcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqZmxhZ3MsIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkLCBpbnQgc2V0X2N1cnJfdGFzayApOworCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc18zMihrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ18zMiAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqLAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc182NChrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqLAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc19vbmNvcmUoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90YXNrX3RlYW0oIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfdGFza190ZWFtcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNrX3RlYW1fc2V0dXAgKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IGFsd2F5cyApOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3N5bmMgICgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tfdGVhbV93YWl0ICAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgd2FpdD0xCispOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza2luZ19iYXJyaWVyKCBrbXBfdGVhbV90ICp0ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCBndGlkICk7CisKK2V4dGVybiBpbnQgIF9fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCB2b2lkICphZGRyICk7CitleHRlcm4ga21wX3VpbnQ2NCBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCk7CisKKyNpZiBLTVBfT1NfVU5JWAorZXh0ZXJuIGludCAgX19rbXBfcmVhZF9mcm9tX2ZpbGUoIGNoYXIgY29uc3QgKnBhdGgsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICk7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLworLy8gQXNzZW1ibHkgcm91dGluZXMgdGhhdCBoYXZlIG5vIGNvbXBpbGVyIGludHJpbnNpYyByZXBsYWNlbWVudAorLy8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworZXh0ZXJuIHZvaWQgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoIGttcF9jcHVpbmZvX3QgKnAgKTsKKworI2RlZmluZSBfX2ttcF9sb2FkX214Y3NyKHApIF9tbV9zZXRjc3IoKihwKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9zdG9yZV9teGNzcigga21wX3VpbnQzMiAqcCApIHsgKnAgPSBfbW1fZ2V0Y3NyKCk7IH0KKworZXh0ZXJuIHZvaWQgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisjIGRlZmluZSBLTVBfWDg2X01YQ1NSX01BU0sgICAgICAweGZmZmZmZmMwICAgLyogaWdub3JlIHN0YXR1cyBmbGFncyAoNiBsc2IpICovCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK2V4dGVybiBpbnQgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwgaW50IGd0aWQsIGludCBucHIsIGludCBhcmdjLCB2b2lkICphcmd2W10KKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB2b2lkICoqZXhpdF9mcmFtZV9wdHIKKyNlbmRpZgorKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2JlZ2luICAgICAgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZmxhZ3MgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmQgICAgICAgICAgICAgICAgICAoIGlkZW50X3QgKiApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMgKCBpZGVudF90ICosIHZvaWQgKiBkYXRhLCBrbXBjX2N0b3JfdmVjIGN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfY2N0b3JfdmVjIGNjdG9yLCBrbXBjX2R0b3JfdmVjIGR0b3IsIHNpemVfdCB2ZWN0b3JfbGVuZ3RoICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlciAgICAgKCBpZGVudF90ICosIHZvaWQgKiBkYXRhLCBrbXBjX2N0b3IgY3Rvciwga21wY19jY3RvciBjY3Rvciwga21wY19kdG9yIGR0b3IgKTsKK0tNUF9FWFBPUlQgdm9pZCAqIF9fa21wY190aHJlYWRwcml2YXRlICAgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIHZvaWQgKiBkYXRhLCBzaXplX3Qgc2l6ZSApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtICAoIGlkZW50X3QgKiApOworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19nbG9iYWxfbnVtX3RocmVhZHMgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYm91bmRfdGhyZWFkX251bSAgICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2JvdW5kX251bV90aHJlYWRzICAoIGlkZW50X3QgKiApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX29rX3RvX2ZvcmsgICAgICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZm9ya19jYWxsICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgbmFyZ3MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4gKTsKKworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZmx1c2ggICAgICAgICAgICAgICggaWRlbnRfdCAqKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19iYXJyaWVyICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX21hc3RlciAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9tYXN0ZXIgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19vcmRlcmVkICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX29yZGVyZWQgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2NyaXRpY2FsICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfY3JpdGljYWwgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqICk7CisKKyNpZiBPTVBfNDFfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludCAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICosIHVpbnRwdHJfdCBoaW50ICk7CisjZW5kaWYKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19iYXJyaWVyX21hc3RlciAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0ICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX3NpbmdsZSAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9zaW5nbGUgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkIEtNUENfRk9SX1NUQVRJQ19JTklUICAgICggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ICpwbG93ZXIsIGttcF9pbnQgKnB1cHBlciwga21wX2ludCAqcHN0cmlkZSwga21wX2ludCBpbmNyLCBrbXBfaW50IGNodW5rICk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9yX3N0YXRpY19maW5pICAoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY19jb3B5cHJpdmF0ZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgc2l6ZV90IGNweV9zaXplLCB2b2lkICpjcHlfZGF0YSwgdm9pZCgqY3B5X2Z1bmMpKHZvaWQqLHZvaWQqKSwga21wX2ludDMyIGRpZGl0ICk7CisKK2V4dGVybiB2b2lkIEtNUENfU0VUX05VTV9USFJFQURTICAgICAgICAoIGludCBhcmcgKTsKK2V4dGVybiB2b2lkIEtNUENfU0VUX0RZTkFNSUMgICAgICAgICAgICAoIGludCBmbGFnICk7CitleHRlcm4gdm9pZCBLTVBDX1NFVF9ORVNURUQgICAgICAgICAgICAgKCBpbnQgZmxhZyApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIGludGVyZmFjZSByb3V0aW5lcworICovCisKK0tNUF9FWFBPUlQga21wY190aHVua190ICogX19rbXBjX3Rhc2txIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfdCB0YXNrcV90YXNrLCBzaXplX3Qgc2l6ZW9mX3RodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywga21wX2ludDMyIGZsYWdzLCBrbXBjX3NoYXJlZF92YXJzX3QgKipzaGFyZWRzKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2txIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY190YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdGFza3FfdGFzayAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHN0YXR1cyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrcV90YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wY190aHVua190ICogX19rbXBjX3Rhc2tfYnVmZmVyIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rLCBrbXBjX3Rhc2tfdCB0YXNrKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBPTVAgMy4wIHRhc2tpbmcgaW50ZXJmYWNlIHJvdXRpbmVzCisgKi8KKworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworS01QX0VYUE9SVCBrbXBfdGFza190KgorX19rbXBjX29tcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5ICk7CitLTVBfRVhQT1JUIHZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbl9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApOworS01QX0VYUE9SVCB2b2lkCitfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApOworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza19wYXJ0cyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t5aWVsZCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGludCBlbmRfcGFydCApOworCisjaWYgVEFTS19VTlVTRUQKK3ZvaWQgX19rbXBjX29tcF90YXNrX2JlZ2luKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKTsKK3ZvaWQgX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApOworI2VuZGlmIC8vIFRBU0tfVU5VU0VECisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY190YXNrZ3JvdXAoIGlkZW50X3QgKiBsb2MsIGludCBndGlkICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrZ3JvdXAoIGlkZW50X3QgKiBsb2MsIGludCBndGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMgKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19vbXBfd2FpdF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKnRhc2sgKTsKKworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9vbXBfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywgYm9vbCBzZXJpYWxpemVfaW1tZWRpYXRlICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19jYW5jZWwoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50KGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19jYW5jZWxfYmFycmllcihpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCk7CitLTVBfRVhQT1JUIGludCBfX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhpbnQgY2FuY2VsX2tpbmQpOworCisjaWYgT01QXzQxX0VOQUJMRUQKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZCgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnB0YXNrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyAoIGttcF90YXNrX3QgKnB0YXNrICk7CisKKyNlbmRpZgorCisjZW5kaWYKKworCisvKgorICogTG9jayBpbnRlcmZhY2Ugcm91dGluZXMgKGZhc3QgdmVyc2lvbnMgd2l0aCBndGlkIHBhc3NlZCBpbikKKyAqLworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsICB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2luaXRfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2Rlc3Ryb3lfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kZXN0cm95X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19zZXRfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19zZXRfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Vuc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIGludCBfX2ttcGNfdGVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIGludCBfX2ttcGNfdGVzdF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKKworI2lmIE9NUF80MV9FTkFCTEVECitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2luaXRfbG9ja193aXRoX2hpbnQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2ssIHVpbnRwdHJfdCBoaW50ICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaywgdWludHB0cl90IGhpbnQgKTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEludGVyZmFjZSB0byBmYXN0IHNjYWxhYmxlIHJlZHVjZSBtZXRob2RzIHJvdXRpbmVzCisgKi8KKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX3JlZHVjZV9ub3dhaXQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfcmVkdWNlKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfcmVkdWNlKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CisKKy8qCisgKiBpbnRlcm5hbCBmYXN0IHJlZHVjdGlvbiByb3V0aW5lcworICovCisKK2V4dGVybiBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UCitfX2ttcF9kZXRlcm1pbmVfcmVkdWN0aW9uX21ldGhvZCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKKworLy8gdGhpcyBmdW5jdGlvbiBpcyBmb3IgdGVzdGluZyBzZXQvZ2V0L2RldGVybWluZSByZWR1Y2UgbWV0aG9kCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcF9nZXRfcmVkdWNlX21ldGhvZCggdm9pZCApOworCitLTVBfRVhQT1JUIGttcF91aW50NjQgX19rbXBjX2dldF90YXNraWQoKTsKK0tNUF9FWFBPUlQga21wX3VpbnQ2NCBfX2ttcGNfZ2V0X3BhcmVudF90YXNraWQoKTsKKworLy8gdGhpcyBmdW5jdGlvbiBleHBvcnRlZCBmb3IgdGVzdGluZyBvZiBLTVBfUExBQ0VfVEhSRUFEUyBmdW5jdGlvbmFsaXR5CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3BsYWNlX3RocmVhZHMoaW50LGludCxpbnQsaW50LGludCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIEMrKyBwb3J0CisvLyBtaXNzaW5nICdleHRlcm4gIkMiJyBkZWNsYXJhdGlvbnMKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2luX3BhcmFsbGVsKCBpZGVudF90ICpsb2MgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcG9wX251bV90aHJlYWRzKCAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX251bV90aHJlYWRzKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgbnVtX3RocmVhZHMgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3B1c2hfcHJvY19iaW5kKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBpbnQgcHJvY19iaW5kICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3B1c2hfbnVtX3RlYW1zKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgbnVtX3RlYW1zLCBrbXBfaW50MzIgbnVtX3RocmVhZHMgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9ya190ZWFtcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBhcmdjLCBrbXBjX21pY3JvIG1pY3JvdGFzaywgLi4uKTsKKworI2VuZGlmCisKK0tNUF9FWFBPUlQgdm9pZCoKK19fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqKiogY2FjaGUgKTsKKworLy8gU3ltYm9scyBmb3IgTVMgbXV0dWFsIGRldGVjdGlvbi4KK2V4dGVybiBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9leGFjdGx5X29uZV9PcGVuTVBfbGlicmFyeTsKK2V4dGVybiBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9JbnRlbF9PcGVuTVBfbGlicmFyeTsKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiAoIEtNUF9WRVJTSU9OX01BSk9SID4gNCApCisgICAgZXh0ZXJuIGludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeTsKKyNlbmRpZgorCisKKy8vIFRoZSByb3V0aW5lcyBiZWxvdyBhcmUgbm90IGV4cG9ydGVkLgorLy8gQ29uc2lkZXIgbWFraW5nIHRoZW0gJ3N0YXRpYycgaW4gY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZXMuCit2b2lkCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApOworc3RydWN0IHByaXZhdGVfY29tbW9uICoKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydCggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKKworLy8KKy8vIG9tcGNfLCBrbXBjXyBlbnRyaWVzIG1vdmVkIGZyb20gb21wLmguCisvLworI2lmIEtNUF9PU19XSU5ET1dTCisjICAgZGVmaW5lIEtNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjZWxzZQorIyAgIGRlZmluZSBLTVBDX0NPTlZFTlRJT04KKyNlbmRpZgorCisjaWZuZGVmIF9fT01QX0gKK3R5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisgICAgb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorICAgIG9tcF9zY2hlZF9keW5hbWljID0gMiwKKyAgICBvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisgICAgb21wX3NjaGVkX2F1dG8gICAgPSA0Cit9IG9tcF9zY2hlZF90OwordHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKyNlbmRpZgorCitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzKGludCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIG9tcGNfc2V0X3NjaGVkdWxlKG9tcF9zY2hlZF90LCBpbnQpOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGludCk7CitLTVBfRVhQT1JUIGludCAgS01QQ19DT05WRU5USU9OIG9tcGNfZ2V0X3RlYW1fc2l6ZShpbnQpOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CitLTVBfRVhQT1JUIGludCAgS01QQ19DT05WRU5USU9OIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfc3RhY2tzaXplKGludCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X3N0YWNrc2l6ZV9zKHNpemVfdCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2xpYnJhcnkoaW50KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfZGVmYXVsdHMoY2hhciBjb25zdCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzZmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwCkBAIC0wLDAgKzEsNDc3MyBAQAorLyoKKyAqIGttcF9hZmZpbml0eS5jcHAgLS0gYWZmaW5pdHkgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX2FmZmluaXR5LmgiCisKKy8vIFN0b3JlIHRoZSByZWFsIG9yIGltYWdpbmVkIG1hY2hpbmUgaGllcmFyY2h5IGhlcmUKK3N0YXRpYyBoaWVyYXJjaHlfaW5mbyBtYWNoaW5lX2hpZXJhcmNoeTsKKwordm9pZCBfX2ttcF9jbGVhbnVwX2hpZXJhcmNoeSgpIHsKKyAgICBtYWNoaW5lX2hpZXJhcmNoeS5maW5pKCk7Cit9CisKK3ZvaWQgX19rbXBfZ2V0X2hpZXJhcmNoeShrbXBfdWludDMyIG5wcm9jLCBrbXBfYnN0YXRlX3QgKnRocl9iYXIpIHsKKyAgICBrbXBfdWludDMyIGRlcHRoOworICAgIC8vIFRoZSB0ZXN0IGJlbG93IGlzIHRydWUgaWYgYWZmaW5pdHkgaXMgYXZhaWxhYmxlLCBidXQgc2V0IHRvICJub25lIi4gTmVlZCB0byBpbml0IG9uIGZpcnN0IHVzZSBvZiBoaWVyYXJjaGljYWwgYmFycmllci4KKyAgICBpZiAoVENSXzEobWFjaGluZV9oaWVyYXJjaHkudW5pbml0aWFsaXplZCkpCisgICAgICAgIG1hY2hpbmVfaGllcmFyY2h5LmluaXQoTlVMTCwgbnByb2MpOworCisgICAgLy8gQWRqdXN0IHRoZSBoaWVyYXJjaHkgaW4gY2FzZSBudW0gdGhyZWFkcyBleGNlZWRzIG9yaWdpbmFsCisgICAgaWYgKG5wcm9jID4gbWFjaGluZV9oaWVyYXJjaHkuYmFzZV9udW1fdGhyZWFkcykKKyAgICAgICAgbWFjaGluZV9oaWVyYXJjaHkucmVzaXplKG5wcm9jKTsKKworICAgIGRlcHRoID0gbWFjaGluZV9oaWVyYXJjaHkuZGVwdGg7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA+IDApOworCisgICAgdGhyX2Jhci0+ZGVwdGggPSBkZXB0aDsKKyAgICB0aHJfYmFyLT5iYXNlX2xlYWZfa2lkcyA9IChrbXBfdWludDgpbWFjaGluZV9oaWVyYXJjaHkubnVtUGVyTGV2ZWxbMF0tMTsKKyAgICB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbCA9IG1hY2hpbmVfaGllcmFyY2h5LnNraXBQZXJMZXZlbDsKK30KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLy8KKy8vIFByaW50IHRoZSBhZmZpbml0eSBtYXNrIHRvIHRoZSBjaGFyYWN0ZXIgYXJyYXkgaW4gYSBwcmV0dHkgZm9ybWF0LgorLy8KKyNpZiBLTVBfVVNFX0hXTE9DCitjaGFyICoKK19fa21wX2FmZmluaXR5X3ByaW50X21hc2soY2hhciAqYnVmLCBpbnQgYnVmX2xlbiwga21wX2FmZmluX21hc2tfdCAqbWFzaykKK3sKKyAgICBpbnQgbnVtX2NoYXJzX3RvX3dyaXRlLCBudW1fY2hhcnNfd3JpdHRlbjsKKyAgICBjaGFyKiBzY2FuOworICAgIEtNUF9BU1NFUlQoYnVmX2xlbiA+PSA0MCk7CisKKyAgICAvLyBidWZzaXplIG9mIDAganVzdCByZXRyaWV2ZXMgdGhlIG5lZWRlZCBidWZmZXIgc2l6ZS4KKyAgICBudW1fY2hhcnNfdG9fd3JpdGUgPSBod2xvY19iaXRtYXBfbGlzdF9zbnByaW50ZihidWYsIDAsIChod2xvY19iaXRtYXBfdCltYXNrKTsKKworICAgIC8vIG5lZWQgJ3snLCAieHh4eHh4eHguLi54eCIsICd9JywgJ1wwJyA9IG51bV9jaGFyc190b193cml0ZSArIDMgYnl0ZXMKKyAgICAvLyAqIG51bV9jaGFyc190b193cml0ZSByZXR1cm5lZCBieSBod2xvY19iaXRtYXBfbGlzdF9zbnByaW50ZiBkb2VzIG5vdAorICAgIC8vICAgdGFrZSBpbnRvIGFjY291bnQgdGhlICdcMCcgY2hhcmFjdGVyLgorICAgIGlmKGh3bG9jX2JpdG1hcF9pc3plcm8oKGh3bG9jX2JpdG1hcF90KW1hc2spKSB7CisgICAgICAgIEtNUF9TTlBSSU5URihidWYsIGJ1Zl9sZW4sICJ7PGVtcHR5Pn0iKTsKKyAgICB9IGVsc2UgaWYobnVtX2NoYXJzX3RvX3dyaXRlIDwgYnVmX2xlbiAtIDMpIHsKKyAgICAgICAgLy8gbm8gcHJvYmxlbSBmaXR0aW5nIHRoZSBtYXNrIGludG8gYnVmX2xlbiBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAgICBidWZbMF0gPSAneyc7CisgICAgICAgIC8vIHVzZSBidWZfbGVuLTMgYmVjYXVzZSB3ZSBoYXZlIHRoZSB0aHJlZSBjaGFyYWN0ZXJzOiAneycgJ30nICdcMCcgdG8gYWRkIHRvIHRoZSBidWZmZXIKKyAgICAgICAgbnVtX2NoYXJzX3dyaXR0ZW4gPSBod2xvY19iaXRtYXBfbGlzdF9zbnByaW50ZihidWYrMSwgYnVmX2xlbi0zLCAoaHdsb2NfYml0bWFwX3QpbWFzayk7CisgICAgICAgIGJ1ZltudW1fY2hhcnNfd3JpdHRlbisxXSA9ICd9JzsKKyAgICAgICAgYnVmW251bV9jaGFyc193cml0dGVuKzJdID0gJ1wwJzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOZWVkIHRvIHRydW5jYXRlIHRoZSBhZmZpbml0eSBtYXNrIHN0cmluZyBhbmQgYWRkIGVsbGlwc2lzLgorICAgICAgICAvLyBUbyBkbyB0aGlzLCB3ZSBmaXJzdCB3cml0ZSBvdXQgdGhlICd7JyArIHN0cihtYXNrKQorICAgICAgICBidWZbMF0gPSAneyc7CisgICAgICAgIGh3bG9jX2JpdG1hcF9saXN0X3NucHJpbnRmKGJ1ZisxLCBidWZfbGVuLTcsIChod2xvY19iaXRtYXBfdCltYXNrKTsKKyAgICAgICAgLy8gdGhlbiwgd2hhdCB3ZSBkbyBoZXJlIGlzIGdvIHRvIHRoZSA3dGggdG8gbGFzdCBjaGFyYWN0ZXIsIHRoZW4gZ28gYmFja3dhcmRzIHVudGlsIHdlIGFyZSBOT1QKKyAgICAgICAgLy8gb24gYSBkaWdpdCB0aGVuIHdyaXRlICIuLi59XDAiLiAgVGhpcyB3YXkgaXQgaXMgYSBjbGVhbiBlbGxpcHNpcyBhZGRpdGlvbiBhbmQgd2UgZG9uJ3QKKyAgICAgICAgLy8gb3ZlcndyaXRlIHBhcnQgb2YgYW4gYWZmaW5pdHkgbnVtYmVyLiBpLmUuLCB3ZSBhdm9pZCBzb21ldGhpbmcgbGlrZSB7IDQ1LCA2NywgOC4uLn0gYW5kIGdldAorICAgICAgICAvLyB7IDQ1LCA2NywuLi59IGluc3RlYWQuCisgICAgICAgIHNjYW4gPSBidWYgKyBidWZfbGVuIC0gNzsKKyAgICAgICAgd2hpbGUoKnNjYW4gPj0gJzAnICYmICpzY2FuIDw9ICc5JyAmJiBzY2FuID49IGJ1ZikKKyAgICAgICAgICAgIHNjYW4tLTsKKyAgICAgICAgKihzY2FuKzEpID0gJy4nOworICAgICAgICAqKHNjYW4rMikgPSAnLic7CisgICAgICAgICooc2NhbiszKSA9ICcuJzsKKyAgICAgICAgKihzY2FuKzQpID0gJ30nOworICAgICAgICAqKHNjYW4rNSkgPSAnXDAnOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorI2Vsc2UKK2NoYXIgKgorX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhjaGFyICpidWYsIGludCBidWZfbGVuLCBrbXBfYWZmaW5fbWFza190ICptYXNrKQoreworICAgIEtNUF9BU1NFUlQoYnVmX2xlbiA+PSA0MCk7CisgICAgY2hhciAqc2NhbiA9IGJ1ZjsKKyAgICBjaGFyICplbmQgPSBidWYgKyBidWZfbGVuIC0gMTsKKworICAgIC8vCisgICAgLy8gRmluZCBmaXJzdCBlbGVtZW50IC8gY2hlY2sgZm9yIGVtcHR5IHNldC4KKyAgICAvLworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBLTVBfQ1BVX1NFVFNJWkU7IGkrKykgeworICAgICAgICBpZiAoS01QX0NQVV9JU1NFVChpLCBtYXNrKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gS01QX0NQVV9TRVRTSVpFKSB7CisgICAgICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAiezxlbXB0eT59Iik7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgICAgIEtNUF9BU1NFUlQoc2NhbiA8PSBlbmQpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAieyVsZCIsIChsb25nKWkpOworICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgaSsrOworICAgIGZvciAoOyBpIDwgS01QX0NQVV9TRVRTSVpFOyBpKyspIHsKKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBtYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBmb3IgYnVmZmVyIG92ZXJmbG93LiAgQSBzdHJpbmcgb2YgdGhlIGZvcm0gIiw8bj4iIHdpbGwgaGF2ZQorICAgICAgICAvLyBhdCBtb3N0IDEwIGNoYXJhY3RlcnMsIHBsdXMgd2Ugd2FudCB0byBsZWF2ZSByb29tIHRvIHByaW50ICIsLi4ufSIKKyAgICAgICAgLy8gaWYgdGhlIHNldCBpcyB0b28gbGFyZ2UgdG8gcHJpbnQgZm9yIGEgdG90YWwgb2YgMTUgY2hhcmFjdGVycy4KKyAgICAgICAgLy8gV2UgYWxyZWFkeSBsZWZ0IHJvb20gZm9yICdcMCcgaW4gc2V0dGluZyBlbmQuCisgICAgICAgIC8vCisgICAgICAgIGlmIChlbmQgLSBzY2FuIDwgMTUpIHsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgS01QX1NOUFJJTlRGKHNjYW4sIGVuZC1zY2FuKzEsICIsJS1sZCIsIChsb25nKWkpOworICAgICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIH0KKyAgICBpZiAoaSA8IEtNUF9DUFVfU0VUU0laRSkgeworICAgICAgICBLTVBfU05QUklOVEYoc2NhbiwgZW5kLXNjYW4rMSwgICIsLi4uIik7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgfQorICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAifSIpOworICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgS01QX0FTU0VSVChzY2FuIDw9IGVuZCk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZiAvLyBLTVBfVVNFX0hXTE9DCisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfZW50aXJlX21hY2hpbmVfbWFzayhrbXBfYWZmaW5fbWFza190ICptYXNrKQoreworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIGludCBncm91cDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCAhPSBOVUxMKTsKKyAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBncm91cCsrKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGludCBudW0gPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudChncm91cCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVChpICsgZ3JvdXAgKiAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSksIG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgIHsKKyAgICAgICAgaW50IHByb2M7CisgICAgICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBfX2ttcF94cHJvYzsgcHJvYysrKSB7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVChwcm9jLCBtYXNrKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8KKy8vIFdoZW4gc29ydGluZyBieSBsYWJlbHMsIF9fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKCkgbXVzdCBmaXJzdCBiZQorLy8gY2FsbGVkIHRvIHJlbnVtYmVyIHRoZSBsYWJlbHMgZnJvbSBbMC4ubl0gYW5kIHBsYWNlIHRoZW0gaW50byB0aGUgY2hpbGRfbnVtCisvLyB2ZWN0b3Igb2YgdGhlIGFkZHJlc3Mgb2JqZWN0LiAgVGhpcyBpcyBkb25lIGluIGNhc2UgdGhlIGxhYmVscyB1c2VkIGZvcgorLy8gdGhlIGNoaWxkcmVuIGF0IG9uZSBub2RlIG9mIHRoZSBoaWVyYXJjaHkgZGlmZmVyIGZyb20gdGhvc2UgdXNlZCBmb3IKKy8vIGFub3RoZXIgbm9kZSBhdCB0aGUgc2FtZSBsZXZlbC4gIEV4YW1wbGU6ICBzdXBwb3NlIHRoZSBtYWNoaW5lIGhhcyAyIG5vZGVzCisvLyB3aXRoIDIgcGFja2FnZXMgZWFjaC4gIFRoZSBmaXJzdCBub2RlIGNvbnRhaW5zIHBhY2thZ2VzIDYwMSBhbmQgNjAyLCBhbmQKKy8vIHNlY29uZCBub2RlIGNvbnRhaW5zIHBhY2thZ2VzIDYwMyBhbmQgNjA0LiAgSWYgd2UgdHJ5IHRvIHNvcnQgdGhlIHRhYmxlCisvLyBmb3IgInNjYXR0ZXIiIGFmZmluaXR5LCB0aGUgdGFibGUgd2lsbCBzdGlsbCBiZSBzb3J0ZWQgNjAxLCA2MDIsIDYwMywgNjA0CisvLyBiZWNhdXNlIHdlIGFyZSBwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZSBsYWJlbHMgdGhlbXNlbHZlcywgbm90IHRoZSBvcmRpbmFsCisvLyBjaGlsZCBudW1iZXJzLiAgQnkgdXNpbmcgdGhlIGNoaWxkIG51bWJlcnMgaW4gdGhlIHNvcnQsIHRoZSByZXN1bHQgaXMKKy8vIHswLDB9PTYwMSwgezAsMX09NjAzLCB7MSwwfT02MDIsIHsxLDF9PTYwNC4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfYXNzaWduX2NoaWxkX251bXMoQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsCisgIGludCBudW1BZGRycykKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bUFkZHJzID4gMCk7CisgICAgaW50IGRlcHRoID0gYWRkcmVzczJvcy0+Zmlyc3QuZGVwdGg7CisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmxhc3RMYWJlbCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIGludCBsYWJDdDsKKyAgICBmb3IgKGxhYkN0ID0gMDsgbGFiQ3QgPCBkZXB0aDsgbGFiQ3QrKykgeworICAgICAgICBhZGRyZXNzMm9zWzBdLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSBjb3VudHNbbGFiQ3RdID0gMDsKKyAgICAgICAgbGFzdExhYmVsW2xhYkN0XSA9IGFkZHJlc3Myb3NbMF0uZmlyc3QubGFiZWxzW2xhYkN0XTsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMTsgaSA8IG51bUFkZHJzOyBpKyspIHsKKyAgICAgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1tsYWJDdF0gIT0gbGFzdExhYmVsW2xhYkN0XSkgeworICAgICAgICAgICAgICAgIGludCBsYWJDdDI7CisgICAgICAgICAgICAgICAgZm9yIChsYWJDdDIgPSBsYWJDdCArIDE7IGxhYkN0MiA8IGRlcHRoOyBsYWJDdDIrKykgeworICAgICAgICAgICAgICAgICAgICBjb3VudHNbbGFiQ3QyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxhc3RMYWJlbFtsYWJDdDJdID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3QyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnRzW2xhYkN0XSsrOworICAgICAgICAgICAgICAgIGxhc3RMYWJlbFtsYWJDdF0gPSBhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1tsYWJDdF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuY2hpbGROdW1zW2xhYkN0XSA9IGNvdW50c1tsYWJDdF07CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGxhYkN0IDwgKGludClBZGRyZXNzOjptYXhEZXB0aDsgbGFiQ3QrKykgeworICAgICAgICAgICAgYWRkcmVzczJvc1tpXS5maXJzdC5jaGlsZE51bXNbbGFiQ3RdID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLworLy8gQWxsIG9mIHRoZSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfKl9tYXAoKSByb3V0aW5lcyBzaG91bGQgc2V0CisvLyBfX2ttcF9hZmZpbml0eV9tYXNrcyB0byBhIHZlY3RvciBvZiBhZmZpbml0eSBtYXNrIG9iamVjdHMgb2YgbGVuZ3RoCisvLyBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSwgYW5kCisvLyByZXR1cm4gdGhlIG51bWJlciBvZiBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdHJlZSAoemVybyBpZgorLy8gX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKS4KKy8vCisvLyBBbGwgb2YgdGhlIF9fa21wX2FmZmluaXR5X2NyZWF0ZV8qX21hcCgpIHJvdXRpbmVzIHNob3VsZCBzZXQgKmZ1bGxNYXNrCisvLyB0byB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHRocmVhZC4gIFRoZXkgbmVlZCB0byBzYXZlIGFuZAorLy8gcmVzdG9yZSB0aGUgbWFzaywgYW5kIGl0IGNvdWxkIGJlIG5lZWRlZCBsYXRlciwgc28gc2F2aW5nIGl0IGlzIGp1c3QgYW4KKy8vIG9wdGltaXphdGlvbiB0byBhdm9pZCBjYWxsaW5nIGttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCkgYWdhaW4uCisvLworc3RhdGljIGttcF9hZmZpbl9tYXNrX3QgKmZ1bGxNYXNrID0gTlVMTDsKKwora21wX2FmZmluX21hc2tfdCAqCitfX2ttcF9hZmZpbml0eV9nZXRfZnVsbE1hc2soKSB7IHJldHVybiBmdWxsTWFzazsgfQorCisKK3N0YXRpYyBpbnQgbkNvcmVzUGVyUGtnLCBuUGFja2FnZXM7CitzdGF0aWMgaW50IF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyNpZm5kZWYgS01QX0RGTFRfTlRIX0NPUkVTCitzdGF0aWMgaW50IF9fa21wX25jb3JlczsKKyNlbmRpZgorCisvLworLy8gX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpIGRvZXNuJ3Qgd29yayB3aGVuIGNhbGxlZCBmcm9tCisvLyBwbGFjZXMgd2hpY2ggc3VwcG9ydCBhcmJpdHJhcmlseSBtYW55IGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neQorLy8gbWFwLCBpLmUuIHRoZSBub24tZGVmYXVsdCBjYXNlcyBpbiBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoKQorLy8gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3gyYXBpY2lkX21hcCgpLgorLy8KK2lubGluZSBzdGF0aWMgYm9vbAorX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpCit7CisgICAgcmV0dXJuIF9fa21wX2F2YWlsX3Byb2MgPT0gKF9fa21wX25UaHJlYWRzUGVyQ29yZSAqIG5Db3Jlc1BlclBrZyAqIG5QYWNrYWdlcyk7Cit9CisKKworLy8KKy8vIFByaW50IG91dCB0aGUgZGV0YWlsZWQgbWFjaGluZSB0b3BvbG9neSBtYXAsIGkuZS4gdGhlIHBoeXNpY2FsIGxvY2F0aW9ucworLy8gb2YgZWFjaCBPUyBwcm9jLgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShBZGRyVW5zUGFpciAqYWRkcmVzczJvcywgaW50IGxlbiwgaW50IGRlcHRoLAorICBpbnQgcGtnTGV2ZWwsIGludCBjb3JlTGV2ZWwsIGludCB0aHJlYWRMZXZlbCkKK3sKKyAgICBpbnQgcHJvYzsKKworICAgIEtNUF9JTkZPUk0oT1NQcm9jVG9QaHlzaWNhbFRocmVhZE1hcCwgIktNUF9BRkZJTklUWSIpOworICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBsZW47IHByb2MrKykgeworICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gdGhyZWFkTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoVGhyZWFkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSBjb3JlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoQ29yZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoUGFja2FnZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPiBwa2dMZXZlbCkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzXyVkICIsIEtNUF9JMThOX1NUUihOb2RlKSwKKyAgICAgICAgICAgICAgICAgIGxldmVsIC0gcGtnTGV2ZWwgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIkwlZCAiLCBsZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZCAiLAorICAgICAgICAgICAgICBhZGRyZXNzMm9zW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF0pOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oT1NQcm9jTWFwVG9QYWNrLCAiS01QX0FGRklOSVRZIiwgYWRkcmVzczJvc1twcm9jXS5zZWNvbmQsCisgICAgICAgICAgYnVmLnN0cik7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9Cit9CisKKyNpZiBLTVBfVVNFX0hXTE9DCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfaHdsb2NfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICB1bnNpZ25lZCBkZXB0aCA9IGh3bG9jX3RvcG9sb2d5X2dldF9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSk7CisgICAgaW50IHRocmVhZExldmVsID0gaHdsb2NfZ2V0X3R5cGVfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIEhXTE9DX09CSl9QVSk7CisgICAgaW50IGNvcmVMZXZlbCA9IGh3bG9jX2dldF90eXBlX2RlcHRoKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfQ09SRSk7CisgICAgaW50IHBrZ0xldmVsID0gaHdsb2NfZ2V0X3R5cGVfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIEhXTE9DX09CSl9TT0NLRVQpOworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IG5QYWNrYWdlcyA9IDA7CisKKyAgICAvLworICAgIC8vIFRoaXMgbWFrZXMgYW4gYXNzdW1wdGlvbiBhYm91dCB0aGUgdG9wb2xvZ3kgYmVpbmcgZm91ciBsZXZlbHM6CisgICAgLy8gbWFjaGluZXMgLT4gcGFja2FnZXMgLT4gY29yZXMgLT4gaGFyZHdhcmUgdGhyZWFkcworICAgIC8vCisgICAgaHdsb2Nfb2JqX3QgY3VycmVudF9sZXZlbF9pdGVyYXRvciA9IGh3bG9jX2dldF9yb290X29iaihfX2ttcF9od2xvY190b3BvbG9neSk7CisgICAgaHdsb2Nfb2JqX3QgY2hpbGRfaXRlcmF0b3I7CisgICAgZm9yKGNoaWxkX2l0ZXJhdG9yID0gaHdsb2NfZ2V0X25leHRfY2hpbGQoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIGN1cnJlbnRfbGV2ZWxfaXRlcmF0b3IsIE5VTEwpOworICAgICAgICBjaGlsZF9pdGVyYXRvciAhPSBOVUxMOworICAgICAgICBjaGlsZF9pdGVyYXRvciA9IGh3bG9jX2dldF9uZXh0X2NoaWxkKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBjdXJyZW50X2xldmVsX2l0ZXJhdG9yLCBjaGlsZF9pdGVyYXRvcikpCisgICAgeworICAgICAgICBuUGFja2FnZXMrKzsKKyAgICB9CisgICAgY3VycmVudF9sZXZlbF9pdGVyYXRvciA9IGh3bG9jX2dldF9vYmpfYnlfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIHBrZ0xldmVsLCAwKTsKKyAgICBmb3IoY2hpbGRfaXRlcmF0b3IgPSBod2xvY19nZXRfbmV4dF9jaGlsZChfX2ttcF9od2xvY190b3BvbG9neSwgY3VycmVudF9sZXZlbF9pdGVyYXRvciwgTlVMTCk7CisgICAgICAgIGNoaWxkX2l0ZXJhdG9yICE9IE5VTEw7CisgICAgICAgIGNoaWxkX2l0ZXJhdG9yID0gaHdsb2NfZ2V0X25leHRfY2hpbGQoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIGN1cnJlbnRfbGV2ZWxfaXRlcmF0b3IsIGNoaWxkX2l0ZXJhdG9yKSkKKyAgICB7CisgICAgICAgIG5Db3Jlc1BlclBrZysrOworICAgIH0KKyAgICBjdXJyZW50X2xldmVsX2l0ZXJhdG9yID0gaHdsb2NfZ2V0X29ial9ieV9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSwgY29yZUxldmVsLCAwKTsKKyAgICBmb3IoY2hpbGRfaXRlcmF0b3IgPSBod2xvY19nZXRfbmV4dF9jaGlsZChfX2ttcF9od2xvY190b3BvbG9neSwgY3VycmVudF9sZXZlbF9pdGVyYXRvciwgTlVMTCk7CisgICAgICAgIGNoaWxkX2l0ZXJhdG9yICE9IE5VTEw7CisgICAgICAgIGNoaWxkX2l0ZXJhdG9yID0gaHdsb2NfZ2V0X25leHRfY2hpbGQoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIGN1cnJlbnRfbGV2ZWxfaXRlcmF0b3IsIGNoaWxkX2l0ZXJhdG9yKSkKKyAgICB7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSsrOworICAgIH0KKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBIYWNrIHRvIHRyeSBhbmQgaW5mZXIgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdXNpbmcgb25seSB0aGUgZGF0YQorICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSBjcHVpZCBvbiB0aGUgY3VycmVudCB0aHJlYWQsIGFuZCBfX2ttcF94cHJvYy4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworCisgICAgICAgIF9fa21wX25jb3JlcyA9IF9fa21wX3hwcm9jIC8gX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICBuUGFja2FnZXMgPSAoX19rbXBfeHByb2MgKyBuQ29yZXNQZXJQa2cgLSAxKSAvIG5Db3Jlc1BlclBrZzsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQWxsb2NhdGUgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgQWRkclVuc1BhaXIgKnJldHZhbCA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIHVuc2lnbmVkIG51bV9oYXJkd2FyZV90aHJlYWRzID0gaHdsb2NfZ2V0X25ib2Jqc19ieV9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSwgdGhyZWFkTGV2ZWwpOworICAgIHVuc2lnbmVkIGk7CisgICAgaHdsb2Nfb2JqX3QgaGFyZHdhcmVfdGhyZWFkX2l0ZXJhdG9yOworICAgIGludCBuQWN0aXZlVGhyZWFkcyA9IDA7CisgICAgZm9yKGk9MDtpPG51bV9oYXJkd2FyZV90aHJlYWRzO2krKykgeworICAgICAgICBoYXJkd2FyZV90aHJlYWRfaXRlcmF0b3IgPSBod2xvY19nZXRfb2JqX2J5X2RlcHRoKF9fa21wX2h3bG9jX3RvcG9sb2d5LCB0aHJlYWRMZXZlbCwgaSk7CisgICAgICAgIEFkZHJlc3MgYWRkcigzKTsKKyAgICAgICAgaWYoISBLTVBfQ1BVX0lTU0VUKGksIGZ1bGxNYXNrKSkgY29udGludWU7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gaGFyZHdhcmVfdGhyZWFkX2l0ZXJhdG9yLT5wYXJlbnQtPnBhcmVudC0+bG9naWNhbF9pbmRleDsKKyAgICAgICAgYWRkci5sYWJlbHNbMV0gPSBoYXJkd2FyZV90aHJlYWRfaXRlcmF0b3ItPnBhcmVudC0+bG9naWNhbF9pbmRleCAlIG5Db3Jlc1BlclBrZzsKKyAgICAgICAgYWRkci5sYWJlbHNbMl0gPSBoYXJkd2FyZV90aHJlYWRfaXRlcmF0b3ItPmxvZ2ljYWxfaW5kZXggJSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisgICAgICAgIHJldHZhbFtuQWN0aXZlVGhyZWFkc10gPSBBZGRyVW5zUGFpcihhZGRyLCBoYXJkd2FyZV90aHJlYWRfaXRlcmF0b3ItPm9zX2luZGV4KTsKKyAgICAgICAgbkFjdGl2ZVRocmVhZHMrKzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgcmV0dXJuIG5vdy4KKyAgICAvLworICAgIEtNUF9BU1NFUlQobkFjdGl2ZVRocmVhZHMgPiAwKTsKKyAgICBpZiAobkFjdGl2ZVRocmVhZHMgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9ybSBhbiBBZGRyZXNzIG9iamVjdCB3aGljaCBvbmx5IGluY2x1ZGVzIHRoZSBwYWNrYWdlIGxldmVsLgorICAgICAgICAvLworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gcmV0dmFsWzBdLmZpcnN0LmxhYmVsc1twa2dMZXZlbC0xXTsKKyAgICAgICAgcmV0dmFsWzBdLmZpcnN0ID0gYWRkcjsKKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3kocmV0dmFsLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgICAvLworICAgIHFzb3J0KHJldHZhbCwgbkFjdGl2ZVRocmVhZHMsIHNpemVvZigqcmV0dmFsKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIF9fa21wX25jb3JlcyA9IGh3bG9jX2dldF9uYm9ianNfYnlfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIGNvcmVMZXZlbCk7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjaGluZSB0b3BvbG9neSBpcyB1bmlmb3JtCisgICAgLy8KKyAgICB1bnNpZ25lZCBucGFja2FnZXMgPSBod2xvY19nZXRfbmJvYmpzX2J5X2RlcHRoKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBwa2dMZXZlbCk7CisgICAgdW5zaWduZWQgbmNvcmVzID0gX19rbXBfbmNvcmVzOworICAgIHVuc2lnbmVkIG50aHJlYWRzID0gaHdsb2NfZ2V0X25ib2Jqc19ieV9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSwgdGhyZWFkTGV2ZWwpOworICAgIHVuc2lnbmVkIHVuaWZvcm0gPSAobnBhY2thZ2VzICogbkNvcmVzUGVyUGtnICogX19rbXBfblRocmVhZHNQZXJDb3JlID09IG50aHJlYWRzKTsKKworICAgIC8vCisgICAgLy8gUHJpbnQgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgc3VtbWFyeS4KKyAgICAvLworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgbWFza1tLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKG1hc2ssIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCBucGFja2FnZXMpOworICAgICAgICAvL2ZvciAobGV2ZWwgPSAxOyBsZXZlbCA8PSBwa2dMZXZlbDsgbGV2ZWwrKykgeworICAgICAgICAvLyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAlZCIsIG1heEN0W2xldmVsXSk7CisgICAgICAgLy8gfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGaW5kIGFueSBsZXZlbHMgd2l0aCByYWRpaXggMSwgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcAorICAgIC8vIChleGNlcHQgZm9yIHRoZSBwYWNrYWdlIGxldmVsKS4KKyAgICAvLworICAgIGludCBuZXdfZGVwdGggPSAwOworICAgIGludCBsZXZlbDsKKyAgICB1bnNpZ25lZCBwcm9jOworICAgIGZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IChpbnQpZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgaWYgKChod2xvY19nZXRfbmJvYmpzX2J5X2RlcHRoKF9fa21wX2h3bG9jX3RvcG9sb2d5LGxldmVsKSA9PSAxKSAmJiAobGV2ZWwgIT0gcGtnTGV2ZWwpKSB7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5ld19kZXB0aCsrOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgd2UgYXJlIHJlbW92aW5nIGFueSBsZXZlbHMsIGFsbG9jYXRlIGEgbmV3IHZlY3RvciB0byByZXR1cm4sCisgICAgLy8gYW5kIGNvcHkgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIHRvIGl0LgorICAgIC8vCisgICAgaWYgKG5ld19kZXB0aCAhPSBkZXB0aC0xKSB7CisgICAgICAgIEFkZHJVbnNQYWlyICpuZXdfcmV0dmFsID0gKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG5BY3RpdmVUaHJlYWRzKTsKKyAgICAgICAgZm9yIChwcm9jID0gMDsgKGludClwcm9jIDwgbkFjdGl2ZVRocmVhZHM7IHByb2MrKykgeworICAgICAgICAgICAgQWRkcmVzcyBhZGRyKG5ld19kZXB0aCk7CisgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdID0gQWRkclVuc1BhaXIoYWRkciwgcmV0dmFsW3Byb2NdLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld19sZXZlbCA9IDA7CisgICAgICAgIGZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IChpbnQpZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIGlmICgoaHdsb2NfZ2V0X25ib2Jqc19ieV9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSxsZXZlbCkgPT0gMSkgJiYgKGxldmVsICE9IHBrZ0xldmVsKSkgeworICAgICAgICAgICAgICAgaWYgKGxldmVsID09IHRocmVhZExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgdGhyZWFkTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKSAmJiAobGV2ZWwgPCB0aHJlYWRMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAgICB0aHJlYWRMZXZlbC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKGxldmVsID09IGNvcmVMZXZlbCkgeworICAgICAgICAgICAgICAgICAgIGNvcmVMZXZlbCA9IC0xOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNvcmVMZXZlbCA+PSAwKSAmJiAobGV2ZWwgPCBjb3JlTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgICAgY29yZUxldmVsLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCBwa2dMZXZlbCkgeworICAgICAgICAgICAgICAgICAgIHBrZ0xldmVsLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAocHJvYyA9IDA7IChpbnQpcHJvYyA8IG5BY3RpdmVUaHJlYWRzOyBwcm9jKyspIHsKKyAgICAgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tuZXdfbGV2ZWxdCisgICAgICAgICAgICAgICAgICA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X2xldmVsKys7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgIHJldHZhbCA9IG5ld19yZXR2YWw7CisgICAgICAgIGRlcHRoID0gbmV3X2RlcHRoOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbC0xID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgoY29yZUxldmVsLTEgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3kocmV0dmFsLCBuQWN0aXZlVGhyZWFkcywgZGVwdGgtMSwgcGtnTGV2ZWwtMSwKKyAgICAgICAgICBjb3JlTGV2ZWwtMSwgdGhyZWFkTGV2ZWwtMSk7CisgICAgfQorCisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICphZGRyZXNzMm9zID0gcmV0dmFsOworICAgIGlmKGRlcHRoID09IDApIHJldHVybiAwOworICAgIGVsc2UgcmV0dXJuIGRlcHRoLTE7Cit9CisjZW5kaWYgLy8gS01QX1VTRV9IV0xPQworCisvLworLy8gSWYgd2UgZG9uJ3Qga25vdyBob3cgdG8gcmV0cmlldmUgdGhlIG1hY2hpbmUncyBwcm9jZXNzb3IgdG9wb2xvZ3ksIG9yCisvLyBlbmNvdW50ZXIgYW4gZXJyb3IgaW4gZG9pbmcgc28sIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZm9ybSBhICJmbGF0IgorLy8gbWFwcGluZyBvZiBvcyB0aHJlYWQgaWQncyA8LT4gcHJvY2Vzc29yIGlkJ3MuCisvLworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY3JlYXRlX2ZsYXRfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gRXZlbiBpZiBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUsIHRoaXMgcm91dGluZSBtaWdodCBzdGlsbAorICAgIC8vIGNhbGxlZCB0byBzZXQgX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzCisgICAgLy8gX19rbXBfblRocmVhZHNQZXJDb3JlLCBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLgorICAgIC8vCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IF9fa21wX3hwcm9jOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZGbGF0VG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vICBjb3JyZWN0bHksIGFuZCByZXR1cm4gbm93IGlmIGFmZmluaXR5IGlzIG5vdCBlbmFibGVkLgorICAgIC8vCisgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIGZ1bGxNYXNrKTsKKworICAgICAgICBLTVBfSU5GT1JNKEFmZkNhcGFibGVVc2VGbGF0LCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb250cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoKiphZGRyZXNzMm9zKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGludCBhdmFpbF9jdCA9IDA7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgS01QX0NQVV9TRVRfSVRFUkFURShpLCBmdWxsTWFzaykgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSBpOworICAgICAgICAoKmFkZHJlc3Myb3MpW2F2YWlsX2N0KytdID0gQWRkclVuc1BhaXIoYWRkcixpKTsKKyAgICB9CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgS01QX0lORk9STShPU1Byb2NUb1BhY2thZ2UsICJLTVBfQUZGSU5JVFkiKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE9ubHkgdGhlIHBhY2thZ2UgbGV2ZWwgaXMgbW9kZWxlZCBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAsCisgICAgICAgIC8vIHNvIHRoZSAjbGV2ZWxzIG9mIGdyYW51bGFyaXR5IGlzIGVpdGhlciAwIG9yIDEuCisgICAgICAgIC8vCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworLy8KKy8vIElmIG11bHRpcGxlIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cHMgZXhpc3QsIHdlIGNhbiBjcmVhdGUgYSAyLWxldmVsCisvLyB0b3BvbG9neSBtYXAgd2l0aCB0aGUgZ3JvdXBzIGF0IGxldmVsIDAgYW5kIHRoZSBpbmRpdmlkdWFsIHByb2NzIGF0CisvLyBsZXZlbCAxLgorLy8KKy8vIFRoaXMgZmFjaWxpdGF0ZXMgbGV0dGluZyB0aGUgdGhyZWFkcyBmbG9hdCBhbW9uZyBhbGwgcHJvY3MgaW4gYSBncm91cCwKKy8vIGlmIGdyYW51bGFyaXR5PWdyb3VwICh0aGUgZGVmYXVsdCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBncm91cHMpLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9wcm9jX2dyb3VwX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIElmIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgcHJvY2Vzc29yIGdyb3VwcywgcmV0dXJuIG5vdy4KKyAgICAvLyBUaGUgZmxhdCBtYXBwaW5nIHdpbGwgYmUgdXNlZC4KKyAgICAvLworICAgIGlmICgoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB8fCAoX19rbXBfZ2V0X3Byb2NfZ3JvdXAoZnVsbE1hc2spID49IDApKSB7CisgICAgICAgIC8vIEZJWE1FIHNldCAqbXNnX2lkCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvbnRydWN0IHRoZSBkYXRhIHN0cnVjdHVyZSB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZigqKmFkZHJlc3Myb3MpICogX19rbXBfYXZhaWxfcHJvYyk7CisgICAgaW50IGF2YWlsX2N0ID0gMDsKKyAgICBpbnQgaTsKKyAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksIGZ1bGxNYXNrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQWRkcmVzcyBhZGRyKDIpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IGkgLyAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgIGFkZHIubGFiZWxzWzFdID0gaSAlIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICAgICAgKCphZGRyZXNzMm9zKVthdmFpbF9jdCsrXSA9IEFkZHJVbnNQYWlyKGFkZHIsaSk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmT1NQcm9jVG9Hcm91cCwgIktNUF9BRkZJTklUWSIsIGksIGFkZHIubGFiZWxzWzBdLAorICAgICAgICAgICAgICBhZGRyLmxhYmVsc1sxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZ3JvdXApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2ZpbmUpCisgICAgICAgICAgfHwgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpncmFuX3N0ciA9IE5VTEw7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2NvcmUpIHsKKyAgICAgICAgICAgICAgICBncmFuX3N0ciA9ICJjb3JlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICAgICAgZ3Jhbl9zdHIgPSAicGFja2FnZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fbm9kZSkgeworICAgICAgICAgICAgICAgIGdyYW5fc3RyID0gIm5vZGUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2FybmluZzogY2FuJ3QgdXNlIGFmZmluaXR5IGdyYW51bGFyaXR5IFwiZ3JhblwiIHdpdGggZ3JvdXAgdG9wb2xvZ3kgbWV0aG9kLCB1c2luZyAidGhyZWFkIgorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAyOworfQorCisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitzdGF0aWMgaW50CitfX2ttcF9jcHVpZF9tYXNrX3dpZHRoKGludCBjb3VudCkgeworICAgIGludCByID0gMDsKKworICAgIHdoaWxlKCgxPDxyKSA8IGNvdW50KQorICAgICAgICArK3I7CisgICAgcmV0dXJuIHI7Cit9CisKKworY2xhc3MgYXBpY1RocmVhZEluZm8geworcHVibGljOgorICAgIHVuc2lnbmVkIG9zSWQ7ICAgICAgICAgICAgICAvLyBwYXJhbSB0byBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZAorICAgIHVuc2lnbmVkIGFwaWNJZDsgICAgICAgICAgICAvLyBmcm9tIGNwdWlkIGFmdGVyIGJpbmRpbmcKKyAgICB1bnNpZ25lZCBtYXhDb3Jlc1BlclBrZzsgICAgLy8gICAgICAiIgorICAgIHVuc2lnbmVkIG1heFRocmVhZHNQZXJQa2c7ICAvLyAgICAgICIiCisgICAgdW5zaWduZWQgcGtnSWQ7ICAgICAgICAgICAgIC8vIGluZmVycmVkIGZyb20gYWJvdmUgdmFsdWVzCisgICAgdW5zaWduZWQgY29yZUlkOyAgICAgICAgICAgIC8vICAgICAgIiIKKyAgICB1bnNpZ25lZCB0aHJlYWRJZDsgICAgICAgICAgLy8gICAgICAiIgorfTsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfYXBpY1RocmVhZEluZm9fb3NfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYWEgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKilhOworICAgIGNvbnN0IGFwaWNUaHJlYWRJbmZvICpiYiA9IChjb25zdCBhcGljVGhyZWFkSW5mbyAqKWI7CisgICAgaWYgKGFhLT5vc0lkIDwgYmItPm9zSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPm9zSWQgPiBiYi0+b3NJZCkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX3BoeXNfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYWEgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKilhOworICAgIGNvbnN0IGFwaWNUaHJlYWRJbmZvICpiYiA9IChjb25zdCBhcGljVGhyZWFkSW5mbyAqKWI7CisgICAgaWYgKGFhLT5wa2dJZCA8IGJiLT5wa2dJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+cGtnSWQgPiBiYi0+cGtnSWQpIHJldHVybiAxOworICAgIGlmIChhYS0+Y29yZUlkIDwgYmItPmNvcmVJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+Y29yZUlkID4gYmItPmNvcmVJZCkgcmV0dXJuIDE7CisgICAgaWYgKGFhLT50aHJlYWRJZCA8IGJiLT50aHJlYWRJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+dGhyZWFkSWQgPiBiYi0+dGhyZWFkSWQpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKKy8vCisvLyBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZSwgd2UgYXR0ZW1wdCB0byB1c2UKKy8vIGFuIGFsZ29yaXRobSB3aGljaCBjeWNsZXMgdGhyb3VnaCB0aGUgYXZhaWxhYmxlIG9zIHRocmVhZHMsIHNldHRpbmcKKy8vIHRoZSBjdXJyZW50IHRocmVhZCdzIGFmZmluaXR5IG1hc2sgdG8gdGhhdCB0aHJlYWQsIGFuZCB0aGVuIHJldHJpZXZlcworLy8gdGhlIEFwaWMgSWQgZm9yIGVhY2ggdGhyZWFkIGNvbnRleHQgdXNpbmcgdGhlIGNwdWlkIGluc3RydWN0aW9uLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgIGttcF9jcHVpZCBidWY7CisgICAgaW50IHJjOworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgaWYgY3B1aWQgbGVhZiA0IGlzIHN1cHBvcnRlZC4KKyAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4IDwgNCkgeworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob0xlYWY0U3VwcG9ydDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgLy8KKyAgICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgc3RhcnRzIGJ5IHNldHRpbmcgdGhlIGFmZmluaXR5IHRvIGVhY2ggYXZhaWxhYmxlCisgICAgLy8gdGhyZWFkIGFuZCByZXRyaWV2aW5nIGluZm8gZnJvbSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sIHNvIGlmIHdlIGFyZQorICAgIC8vIG5vdCBjYXBhYmxlIG9mIGNhbGxpbmcgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZAorICAgIC8vIF9rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpLCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UgLSB1c2UKKyAgICAvLyB0aGUgZGVmYXVsdHMgdGhhdCB3ZSBjYWxjdWxhdGVkIGZyb20gaXNzdWluZyBjcHVpZCB3aXRob3V0IGJpbmRpbmcKKyAgICAvLyB0byBlYWNoIHByb2MuCisgICAgLy8KKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gR2V0IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgcGFja2FnZSB1c2luZworICAgICAgICAvLyBjcHVpZCgxKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT24gc29tZSBPUy9jaHBzIGNvbWJpbmF0aW9ucyB3aGVyZSBIVCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAKKyAgICAgICAgLy8gYnV0IGlzIGRpc2FibGVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgMiBvbiBhIHNpbmdsZSBjb3JlIGNoaXAuCisgICAgICAgIC8vIFVzdWFsbHksIGl0IHdpbGwgYmUgMiBpZiBIVCBpcyBlbmFibGVkIGFuZCAxIGlmIEhUIGlzIGRpc2FibGVkLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgJmJ1Zik7CisgICAgICAgIGludCBtYXhUaHJlYWRzUGVyUGtnID0gKGJ1Zi5lYnggPj4gMTYpICYgMHhmZjsKKyAgICAgICAgaWYgKG1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgbWF4VGhyZWFkc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgbnVtIGNvcmVzIHBlciBwa2cgY29tZXMgZnJvbSBjcHVpZCg0KS4KKyAgICAgICAgLy8gMSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmNvZGVkIHZhbHVlLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgYXV0aG9yIG9mIGNwdV9jb3VudC5jcHAgdHJlYXRlZCB0aGlzIG9ubHkgYW4gdXBwZXIgYm91bmQKKyAgICAgICAgLy8gb24gdGhlIG51bWJlciBvZiBjb3JlcywgYnV0IEkgaGF2ZW4ndCBzZWVuIGFueSBjYXNlcyB3aGVyZSBpdAorICAgICAgICAvLyB3YXMgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNvcmVzLCBzbyB3ZSB3aWxsIHRyZWF0CisgICAgICAgIC8vIGl0IGFzIGV4YWN0IGluIHRoaXMgYmxvY2sgb2YgY29kZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgaWYgY3B1aWQoNCkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgY2hpcC4KKyAgICAgICAgLy8gVG8gc2VlIGlmIGNwdWlkKG4pIGlzIHN1cHBvcnRlZCwgaXNzdWUgY3B1aWQoMCkgYW5kIGNoZWNrIGlmIGVheAorICAgICAgICAvLyBoYXMgdGhlIHZhbHVlIG4gb3IgZ3JlYXRlci4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgICAgICBpZiAoYnVmLmVheCA+PSA0KSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoNCwgMCwgJmJ1Zik7CisgICAgICAgICAgICBuQ29yZXNQZXJQa2cgPSAoKGJ1Zi5lYXggPj4gMjYpICYgMHgzZikgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIGlzIG5vIHdheSB0byByZWxpYWJseSB0ZWxsIGlmIEhUIGlzIGVuYWJsZWQgd2l0aG91dCBpc3N1aW5nCisgICAgICAgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmcm9tIGV2ZXJ5IHRocmVhZCwgY2FuIGNvcnJlbGF0aW5nIHRoZSBjcHVpZAorICAgICAgICAvLyBpbmZvLCBzbyBpZiB0aGUgbWFjaGluZSBpcyBub3QgYWZmaW5pdHkgY2FwYWJsZSwgd2UgYXNzdW1lIHRoYXQgSFQKKyAgICAgICAgLy8gaXMgb2ZmLiAgV2UgaGF2ZSBzZWVuIHF1aXRlIGEgZmV3IG1hY2hpbmVzIHdoZXJlIG1heFRocmVhZHNQZXJQa2cKKyAgICAgICAgLy8gaXMgMiwgeWV0IHRoZSBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQgSFQuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gT2xkZXIgT1NlcyBhcmUgdXN1YWxseSBmb3VuZCBvbiBtYWNoaW5lcyB3aXRoIG9sZGVyIGNoaXBzLCB3aGljaAorICAgICAgICAvLyAgIGRvIG5vdCBzdXBwb3J0IEhULgorICAgICAgICAvLworICAgICAgICAvLyAtIFRoZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBtaXN0YWtlbmx5IGlkZW50aWZ5aW5nIGEgbWFjaGluZSBhcworICAgICAgICAvLyAgIEhUIHdoZW4gaXQgaXNuJ3QgKHdoaWNoIHJlc3VsdHMgaW4gYmxvY2t0aW1lIGJlaW5nIGluY29ycmVjbHkgc2V0CisgICAgICAgIC8vICAgdG8gMCkgaXMgZ3JlYXRlciB0aGFuIHRoZSBwZW5hbHR5IHdoZW4gZm9yIG1pc3Rha2VubHkgaWRlbnRpZnlpbmcKKyAgICAgICAgLy8gICBhIG1hY2hpbmUgYXMgYmVpbmcgMSB0aHJlYWQvY29yZSB3aGVuIGl0IGlzIHJlYWxseSBIVCBlbmFibGVkCisgICAgICAgIC8vICAgKHdoaWNoIHJlc3VsdHMgaW4gYmxvY2t0aW1lIGJlaW5nIGluY29ycmVjdGx5IHNldCB0byBhIHBvc2l0aXZlCisgICAgICAgIC8vICAgdmFsdWUpLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VMb2NDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8gRnJvbSBoZXJlIG9uLCB3ZSBjYW4gYXNzdW1lIHRoYXQgaXQgaXMgc2FmZSB0byBjYWxsCisgICAgLy8gX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZCBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCksCisgICAgLy8gZXZlbiBpZiBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZS4KKyAgICAvLworCisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBhZmZpbml0eSBtYXNrIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICpvbGRNYXNrOworICAgIEtNUF9DUFVfQUxMT0Mob2xkTWFzayk7CisgICAgS01QX0FTU0VSVChvbGRNYXNrICE9IE5VTEwpOworICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIGVhY2ggb2YgdGhlIGF2YWlsYWJsZSBjb250ZXh0cywgYmluZGluZyB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAvLyB0byBpdCwgYW5kIG9idGFpbmluZyB0aGUgcGVydGluZW50IGluZm9ybWF0aW9uIHVzaW5nIHRoZSBjcHVpZCBpbnN0ci4KKyAgICAvLworICAgIC8vIFRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBpczoKKyAgICAvLworICAgIC8vIEFwaWMgSWQ6IEJpdHMgMjQ6MzEgb2YgZWJ4IGFmdGVyIGlzc3VpbmcgY3B1aWQoMSkgLSBlYWNoIHRocmVhZCBjb250ZXh0CisgICAgLy8gICAgaGFzIGEgdW5pcWllIEFwaWMgSWQsIHdoaWNoIGlzIG9mIHRoZSBmb3JtIHBrZyMgOiBjb3JlIyA6IHRocmVhZCMuCisgICAgLy8KKyAgICAvLyBNYXggVGhyZWFkcyBQZXIgUGtnOiBCaXRzIDE2OjIzIG9mIGVieCBhZnRlciBpc3N1aW5nIGNwdWlkKDEpLiAgVGhlCisgICAgLy8gICAgdmFsdWUgb2YgdGhpcyBmaWVsZCBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiB0aGUgY29yZSMgKyB0aHJlYWQjCisgICAgLy8gICAgZmllbGRzIGluIHRoZSBBcGljIElkLiAgSXQgaXMgYWxzbyBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyCisgICAgLy8gICAgb2YgdGhyZWFkcyBwZXIgcGFja2FnZSwgYnV0IGl0IGhhcyBiZWVuIHZlcmlmaWVkIHRoYXQgc2l0dWF0aW9ucworICAgIC8vICAgIGhhcHBlbiB3ZXJlIGl0IGlzIG5vdCBleGFjdC4gIEluIHBhcnRpY3VsYXIsIG9uIGNlcnRhaW4gT1MvY2hpcAorICAgIC8vICAgIGNvbWJpbmF0aW9ucyB3aGVyZSBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSBpcyBzdXBwb3J0ZWQKKyAgICAvLyAgICBieSB0aGUgY2hpcCBidXQgaGFzCisgICAgLy8gICAgYmVlbiBkaXNhYmxlZCwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgd2lsbCBiZSAyIChmb3IgYSBzaW5nbGUgY29yZQorICAgIC8vICAgIGNoaXApLiAgT24gb3RoZXIgT1MvY2hpcCBjb21iaW5hdGlvbnMgc3VwcG9ydGluZworICAgIC8vICAgIEludGVsKFIpIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5LCB0aGUgdmFsdWUgb2YKKyAgICAvLyAgICB0aGlzIGZpZWxkIHdpbGwgYmUgMSB3aGVuIEludGVsKFIpIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5IGlzCisgICAgLy8gICAgZGlzYWJsZWQgYW5kIDIgd2hlbiBpdCBpcyBlbmFibGVkLgorICAgIC8vCisgICAgLy8gTWF4IENvcmVzIFBlciBQa2c6ICBCaXRzIDI2OjMxIG9mIGVheCBhZnRlciBpc3N1aW5nIGNwdWlkKDQpLiAgVGhlCisgICAgLy8gICAgdmFsdWUgb2YgdGhpcyBmaWVsZCAoKzEpIGRldGVybWluZXMgdGhlIHdpZHRoIG9mIHRoZSBjb3JlIyBmaWVsZCBpbgorICAgIC8vICAgIHRoZSBBcGljIElkLiAgVGhlIGNvbW1lbnRzIGluICJjcHVjb3VudC5jcHAiIHNheSB0aGF0IHRoaXMgdmFsdWUgaXMKKyAgICAvLyAgICBhbiB1cHBlciBib3VuZCwgYnV0IHRoZSBJQS0zMiBhcmNoaXRlY3R1cmUgbWFudWFsIHNheXMgdGhhdCBpdCBpcworICAgIC8vICAgIGV4YWN0bHkgdGhlIG51bWJlciBvZiBjb3JlcyBwZXIgcGFja2FnZSwgYW5kIEkgaGF2ZW4ndCBzZWVuIGFueQorICAgIC8vICAgIGNhc2Ugd2hlcmUgaXQgd2Fzbid0LgorICAgIC8vCisgICAgLy8gRnJvbSB0aGlzIGluZm9ybWF0aW9uLCBkZWR1Y2UgdGhlIHBhY2thZ2UgSWQsIGNvcmUgSWQsIGFuZCB0aHJlYWQgSWQsCisgICAgLy8gYW5kIHNldCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgaW4gdGhlIGFwaWNUaHJlYWRJbmZvIHN0cnVjdC4KKyAgICAvLworICAgIHVuc2lnbmVkIGk7CisgICAgYXBpY1RocmVhZEluZm8gKnRocmVhZEluZm8gPSAoYXBpY1RocmVhZEluZm8gKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgIF9fa21wX2F2YWlsX3Byb2MgKiBzaXplb2YoYXBpY1RocmVhZEluZm8pKTsKKyAgICB1bnNpZ25lZCBuQXBpY3MgPSAwOworICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgZnVsbE1hc2spIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAvLworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoaW50KW5BcGljcyA8IF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgICAgIF9fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKGkpOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ub3NJZCA9IGk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGFwaWMgaWQgYW5kIG1heCB0aHJlYWRzIHBlciBwa2cgY29tZSBmcm9tIGNwdWlkKDEpLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgJmJ1Zik7CisgICAgICAgIGlmICghIChidWYuZWR4ID4+IDkpICYgMSkgeworICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0FwaWNOb3RQcmVzZW50OworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPSAoYnVmLmVieCA+PiAyNCkgJiAweGZmOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9IChidWYuZWJ4ID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9PSAwKSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBNYXggY29yZXMgcGVyIHBrZyBjb21lcyBmcm9tIGNwdWlkKDQpLgorICAgICAgICAvLyAxIG11c3QgYmUgYWRkZWQgdG8gdGhlIGVuY29kZWQgdmFsdWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGNwdWlkKDQpIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGNoaXAuCisgICAgICAgIC8vIFRvIHNlZSBpZiBjcHVpZChuKSBpcyBzdXBwb3J0ZWQsIGlzc3VlIGNwdWlkKDApIGFuZCBjaGVjayBpZiBlYXgKKyAgICAgICAgLy8gaGFzIHRoZSB2YWx1ZSBuIG9yIGdyZWF0ZXIuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICAgICAgaWYgKGJ1Zi5lYXggPj0gNCkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKDQsIDAsICZidWYpOworICAgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heENvcmVzUGVyUGtnID0gKChidWYuZWF4ID4+IDI2KSAmIDB4M2YpICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBJbmZlciB0aGUgcGtnSWQgLyBjb3JlSWQgLyB0aHJlYWRJZCB1c2luZyBvbmx5IHRoZSBpbmZvCisgICAgICAgIC8vIG9idGFpbmVkIGxvY2FsbHkuCisgICAgICAgIC8vCisgICAgICAgIGludCB3aWR0aENUID0gX19rbXBfY3B1aWRfbWFza193aWR0aCgKKyAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyk7CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5wa2dJZCA9IHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPj4gd2lkdGhDVDsKKworICAgICAgICBpbnQgd2lkdGhDID0gX19rbXBfY3B1aWRfbWFza193aWR0aCgKKyAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4Q29yZXNQZXJQa2cpOworICAgICAgICBpbnQgd2lkdGhUID0gd2lkdGhDVCAtIHdpZHRoQzsKKyAgICAgICAgaWYgKHdpZHRoVCA8IDApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJJ3ZlIG5ldmVyIHNlZW4gdGhpcyBvbmUgaGFwcGVuLCBidXQgSSBzdXBwb3NlIGl0IGNvdWxkLCBpZgorICAgICAgICAgICAgLy8gdGhlIGNwdWlkIGluc3RydWN0aW9uIG9uIGEgY2hpcCB3YXMgcmVhbGx5IHNjcmV3ZWQgdXAuCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gcmVzdG9yZSB0aGUgYWZmaW5pdHkgbWFzayBiZWZvcmUgdGhlIHRhaWwgY2FsbC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtYXNrQyA9ICgxIDw8IHdpZHRoQykgLSAxOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10uY29yZUlkID0gKHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPj4gd2lkdGhUKQorICAgICAgICAgICZtYXNrQzsKKworICAgICAgICBpbnQgbWFza1QgPSAoMSA8PCB3aWR0aFQpIC0gMTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLnRocmVhZElkID0gdGhyZWFkSW5mb1tuQXBpY3NdLmFwaWNJZCAmbWFza1Q7CisKKyAgICAgICAgbkFwaWNzKys7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSd2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBpbmZvIHdlIG5lZWQuCisgICAgLy8gUmVzdG9yZSB0aGUgb2xkIGFmZmluaXR5IG1hc2sgZm9yIHRoaXMgdGhyZWFkLgorICAgIC8vCisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0aHJlYWQgY29udGV4dCB0byBiaW5kIHRvLCBmb3JtIGFuIEFkZHJlc3Mgb2JqZWN0CisgICAgLy8gd2l0aCBkZXB0aCAxIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgKG9yLCBpZiBhZmZpbml0eSBpcyBvZmYsIHNldAorICAgIC8vIGFkZHJlc3Myb3MgdG8gTlVMTCBhbmQgcmV0dXJuKS4KKyAgICAvLworICAgIC8vIElmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gb21pdCB0aGUgcGFja2FnZSBsZXZlbCB3aGVuIHRoZXJlIGlzIG9ubHkgYQorICAgIC8vIHNpbmdsZSBwYWNrYWdlLCB0aGUgbG9naWMgYXQgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgd29uJ3Qgd29yayBpZgorICAgIC8vIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGhyZWFkIC0gaXQgd291bGQgdHJ5IHRvIGZvcm0gYW4gQWRkcmVzcworICAgIC8vIG9iamVjdCB3aXRoIGRlcHRoIDAuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG5BcGljcyA+IDApOworICAgIGlmIChuQXBpY3MgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikpOworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gdGhyZWFkSW5mb1swXS5wa2dJZDsKKyAgICAgICAgKCphZGRyZXNzMm9zKVswXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHRocmVhZEluZm9bMF0ub3NJZCk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRocmVhZEluZm8gdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydCh0aHJlYWRJbmZvLCBuQXBpY3MsIHNpemVvZigqdGhyZWFkSW5mbyksCisgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfYXBpY1RocmVhZEluZm9fcGh5c19pZCk7CisKKyAgICAvLworICAgIC8vIFRoZSB0YWJsZSBpcyBub3cgc29ydGVkIGJ5IHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQsIGJ1dCB3ZSByZWFsbHkKKyAgICAvLyBkb24ndCBrbm93IHRoZSByYWRpeCBvZiBhbnkgb2YgdGhlIGZpZWxkcy4gIHBrZ0lkJ3MgbWF5IGJlIHNwYXJzZWx5CisgICAgLy8gYXNzaWduZWQgYW1vbmcgdGhlIGNoaXBzIG9uIGEgc3lzdGVtLiAgQWx0aG91Z2ggY29yZUlkJ3MgYXJlIHVzdWFsbHkKKyAgICAvLyBhc3NpZ25lZCBbMCAuLiBjb3Jlc1BlclBrZy0xXSBhbmQgdGhyZWFkSWQncyBhcmUgdXN1YWxseSBhc3NpZ25lZAorICAgIC8vIFswLi50aHJlYWRzUGVyQ29yZS0xXSwgd2UgZG9uJ3Qgd2FudCB0byBtYWtlIGFueSBzdWNoIGFzc3VtcHRpb25zLgorICAgIC8vCisgICAgLy8gRm9yIHRoYXQgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoYXQgY29yZXNQZXJQa2cgYW5kIHRocmVhZHNQZXJDb3JlCisgICAgLy8gKG9yIHRoZSB0b3RhbCAjIHBhY2thZ2VzKSBhcmUgYXQgdGhpcyBwb2ludCAtIHdlIHdhbnQgdG8gZGV0ZXJtaW5lCisgICAgLy8gdGhhdCBub3cuICBXZSBvbmx5IGhhdmUgYW4gdXBwZXIgYm91bmQgb24gdGhlIGZpcnN0IHR3byBmaWd1cmVzLgorICAgIC8vCisgICAgLy8gV2UgYWxzbyBwZXJmb3JtIGEgY29uc2lzdGVuY3kgY2hlY2sgYXQgdGhpcyBwb2ludDogdGhlIHZhbHVlcyByZXR1cm5lZAorICAgIC8vIGJ5IHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmb3IgYW55IHRocmVhZCBib3VuZCB0byBhIGdpdmVuIHBhY2thZ2UgaGFkCisgICAgLy8gYmV0dGVyIHJldHVybiB0aGUgc2FtZSBpbmZvIGZvciBtYXhUaHJlYWRzUGVyUGtnIGFuZCBtYXhDb3Jlc1BlclBrZy4KKyAgICAvLworICAgIG5QYWNrYWdlcyA9IDE7CisgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICAgIHVuc2lnbmVkIG5Db3JlcyA9IDE7CisKKyAgICB1bnNpZ25lZCBwa2dDdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSByYWRpaQorICAgIHVuc2lnbmVkIGxhc3RQa2dJZCA9IHRocmVhZEluZm9bMF0ucGtnSWQ7CisgICAgdW5zaWduZWQgY29yZUN0ID0gMTsKKyAgICB1bnNpZ25lZCBsYXN0Q29yZUlkID0gdGhyZWFkSW5mb1swXS5jb3JlSWQ7CisgICAgdW5zaWduZWQgdGhyZWFkQ3QgPSAxOworICAgIHVuc2lnbmVkIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9bMF0udGhyZWFkSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJhLXBrZyBjb25zaXN0IGNoZWNrcworICAgIHVuc2lnbmVkIHByZXZNYXhDb3Jlc1BlclBrZyA9IHRocmVhZEluZm9bMF0ubWF4Q29yZXNQZXJQa2c7CisgICAgdW5zaWduZWQgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvWzBdLm1heFRocmVhZHNQZXJQa2c7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbkFwaWNzOyBpKyspIHsKKyAgICAgICAgaWYgKHRocmVhZEluZm9baV0ucGtnSWQgIT0gbGFzdFBrZ0lkKSB7CisgICAgICAgICAgICBuQ29yZXMrKzsKKyAgICAgICAgICAgIHBrZ0N0Kys7CisgICAgICAgICAgICBsYXN0UGtnSWQgPSB0aHJlYWRJbmZvW2ldLnBrZ0lkOworICAgICAgICAgICAgaWYgKChpbnQpY29yZUN0ID4gbkNvcmVzUGVyUGtnKSBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgICAgICAgICAgICBjb3JlQ3QgPSAxOworICAgICAgICAgICAgbGFzdENvcmVJZCA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICAgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworICAgICAgICAgICAgdGhyZWFkQ3QgPSAxOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkaWZmZXJlbnQgcGFja2FnZSwgc28gZ28gb24gdG8gdGhlIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAvLyB3aXRob3V0IGRvaW5nIGFueSBjb25zaXN0ZW5jeSBjaGVja3MuICBSZXNldCB0aGUgY29uc2lzdGVuY3kKKyAgICAgICAgICAgIC8vIGNoZWNrIHZhcnMsIHRob3VnaC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBwcmV2TWF4Q29yZXNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnOworICAgICAgICAgICAgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2c7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldLmNvcmVJZCAhPSBsYXN0Q29yZUlkKSB7CisgICAgICAgICAgICBuQ29yZXMrKzsKKyAgICAgICAgICAgIGNvcmVDdCsrOworICAgICAgICAgICAgbGFzdENvcmVJZCA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICAgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworICAgICAgICAgICAgdGhyZWFkQ3QgPSAxOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0aHJlYWRJbmZvW2ldLnRocmVhZElkICE9IGxhc3RUaHJlYWRJZCkgeworICAgICAgICAgICAgdGhyZWFkQ3QrKzsKKyAgICAgICAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9MZWdhY3lBcGljSURzTm90VW5pcXVlOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBjZXJ0YWluIHRoYXQgdGhlIG1heENvcmVzUGVyUGtnIGFuZCBtYXhUaHJlYWRzUGVyUGtnCisgICAgICAgIC8vIGZpZWxkcyBhZ3JlZSBiZXR3ZWVuIGFsbCB0aGUgdGhyZWFkcyBib3VuZHMgdG8gYSBnaXZlbiBwYWNrYWdlLgorICAgICAgICAvLworICAgICAgICBpZiAoKHByZXZNYXhDb3Jlc1BlclBrZyAhPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnKQorICAgICAgICAgIHx8IChwcmV2TWF4VGhyZWFkc1BlclBrZyAhPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2cpKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgblBhY2thZ2VzID0gcGtnQ3Q7CisgICAgaWYgKChpbnQpY29yZUN0ID4gbkNvcmVzUGVyUGtnKSBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gY29ycmVjdGx5LCBhbmQgcmV0dXJuIG5vdyBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIF9fa21wX25jb3JlcyA9IG5Db3JlczsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGRldGVybWluZWQgdGhlIG51bWJlciBvZiBwYWNrYWdlcywgdGhlIG51bWJlciBvZiBjb3JlcworICAgIC8vIHBlciBwYWNrYWdlLCBhbmQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHBlciBjb3JlLCB3ZSBjYW4gY29uc3RydWN0IHRoZQorICAgIC8vIGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICBpbnQgcGtnTGV2ZWwgPSAwOworICAgIGludCBjb3JlTGV2ZWwgPSAobkNvcmVzUGVyUGtnIDw9IDEpID8gLTEgOiAxOworICAgIGludCB0aHJlYWRMZXZlbCA9IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPD0gMSkgPyAtMSA6ICgoY29yZUxldmVsID49IDApID8gMiA6IDEpOworICAgIHVuc2lnbmVkIGRlcHRoID0gKHBrZ0xldmVsID49IDApICsgKGNvcmVMZXZlbCA+PSAwKSArICh0aHJlYWRMZXZlbCA+PSAwKTsKKworICAgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG5BcGljcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkFwaWNzOyArK2kpIHsKKyAgICAgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICAgICAgdW5zaWduZWQgb3MgPSB0aHJlYWRJbmZvW2ldLm9zSWQ7CisgICAgICAgIGludCBkID0gMDsKKworICAgICAgICBpZiAocGtnTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgYWRkci5sYWJlbHNbZCsrXSA9IHRocmVhZEluZm9baV0ucGtnSWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS5jb3JlSWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocmVhZExldmVsID49IDApIHsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2QrK10gPSB0aHJlYWRJbmZvW2ldLnRocmVhZElkOworICAgICAgICB9CisgICAgICAgICgqYWRkcmVzczJvcylbaV0gPSBBZGRyVW5zUGFpcihhZGRyLCBvcyk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkCisgICAgICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICBpZiAoKHRocmVhZExldmVsID49IDApCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3RocmVhZCkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgocGtnTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIG5BcGljcywgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgIHJldHVybiBkZXB0aDsKK30KKworCisvLworLy8gSW50ZWwoUikgbWljcm9hcmNoaXRlY3R1cmUgY29kZSBuYW1lIE5laGFsZW0sIER1bm5pbmd0b24gYW5kIGxhdGVyCisvLyBhcmNoaXRlY3R1cmVzIHN1cHBvcnQgYSBuZXdlciBpbnRlcmZhY2UgZm9yIHNwZWNpZnlpbmcgdGhlIHgyQVBJQyBJZHMsCisvLyBiYXNlZCBvbiBjcHVpZCBsZWFmIDExLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAga21wX2NwdWlkIGJ1ZjsKKworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGNwdWlkIGxlYWYgMTEgaXMgc3VwcG9ydGVkLgorICAgIC8vCisgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgIGlmIChidWYuZWF4IDwgMTEpIHsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob0xlYWYxMVN1cHBvcnQ7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgX19rbXBfeDg2X2NwdWlkKDExLCAwLCAmYnVmKTsKKyAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmMTFTdXBwb3J0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5LiAgV2hpbGUgd2UncmUgYXQgaXQsCisgICAgLy8gZ2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgX19rbXBfblRocmVhZHNQZXJDb3JlICYgbkNvcmVzUGVyUGtnLiAgV2Ugd2lsbAorICAgIC8vIHRyeSB0byBnZXQgbW9yZSBhY2N1cmF0ZSB2YWx1ZXMgbGF0ZXIgYnkgZXhwbGljaXRseSBjb3VudGluZyB0aGVtLAorICAgIC8vIGJ1dCBnZXQgcmVhc29uYWJsZSBkZWZhdWx0cyBub3csIGluIGNhc2Ugd2UgcmV0dXJuIGVhcmx5LgorICAgIC8vCisgICAgaW50IGxldmVsOworICAgIGludCB0aHJlYWRMZXZlbCA9IC0xOworICAgIGludCBjb3JlTGV2ZWwgPSAtMTsKKyAgICBpbnQgcGtnTGV2ZWwgPSAtMTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSBuUGFja2FnZXMgPSAxOworCisgICAgZm9yIChsZXZlbCA9IDA7OyBsZXZlbCsrKSB7CisgICAgICAgIGlmIChsZXZlbCA+IDMxKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRklYTUU6IEhhY2sgZm9yIERQRDIwMDE2MzE4MAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIGxldmVsIGlzIGJpZyB0aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nIC0+IGV4aXRpbmcKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBhY3R1YWxseSBiZSAzMiB2YWxpZCBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3ksCisgICAgICAgICAgICAvLyBidXQgc28gZmFyLCB0aGUgb25seSBtYWNoaW5lIHdlIGhhdmUgc2VlbiB3aGljaCBkb2VzIG5vdCBleGl0CisgICAgICAgICAgICAvLyB0aGlzIGxvb3AgYmVmb3JlIGl0ZXJhdGlvbiAzMiBoYXMgZnViYXIgeDJBUElDIHNldHRpbmdzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZvciBub3csIGp1c3QgcmVqZWN0IHRoaXMgY2FzZSBiYXNlZCB1cG9uIGxvb3AgdHJpcCBjb3VudC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDExLCBsZXZlbCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWJ4ID09IDApIHsKKyAgICAgICAgICAgIGlmIChwa2dMZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdpbGwgaW5mZXIgblBhY2thZ2VzIGZyb20gX19rbXBfeHByb2MKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHBrZ0xldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBraW5kID0gKGJ1Zi5lY3ggPj4gOCkgJiAweGZmOworICAgICAgICBpZiAoa2luZCA9PSAxKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU01UIGxldmVsCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdGhyZWFkTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIGNvcmVMZXZlbCA9IC0xOworICAgICAgICAgICAgcGtnTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IGJ1Zi5lYnggJiAweGZmOworICAgICAgICAgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChraW5kID09IDIpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBjb3JlIGxldmVsCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29yZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBwa2dMZXZlbCA9IC0xOworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gYnVmLmVieCAmIDB4ZmY7CisgICAgICAgICAgICBpZiAobkNvcmVzUGVyUGtnID09IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGxldmVsIDw9IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBrZ0xldmVsID49IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrZ0xldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBuUGFja2FnZXMgPSBidWYuZWJ4ICYgMHhmZjsKKyAgICAgICAgICAgIGlmIChuUGFja2FnZXMgPT0gMCkgeworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaW50IGRlcHRoID0gbGV2ZWw7CisKKyAgICAvLworICAgIC8vIEluIHRoZSBhYm92ZSBsb29wLCAibGV2ZWwiIHdhcyBjb3VudGVkIGZyb20gdGhlIGZpbmVzdCBsZXZlbCAodXN1YWxseQorICAgIC8vIHRocmVhZCkgdG8gdGhlIGNvYXJzZXN0LiAgVGhlIGNhbGxlciBleHBlY3RzIHRoYXQgd2Ugd2lsbCBwbGFjZSB0aGUKKyAgICAvLyBsYWJlbHMgaW4gKCphZGRyZXNzMm9zKVtdLmZpcnN0LmxhYmVsc1tdIGluIHRoZSBpbnZlcnNlIG9yZGVyLCBzbworICAgIC8vIHdlIG5lZWQgdG8gaW52ZXJ0IHRoZSB2YXJzIHNheWluZyB3aGljaCBsZXZlbCBtZWFucyB3aGF0LgorICAgIC8vCisgICAgaWYgKHRocmVhZExldmVsID49IDApIHsKKyAgICAgICAgdGhyZWFkTGV2ZWwgPSBkZXB0aCAtIHRocmVhZExldmVsIC0gMTsKKyAgICB9CisgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgIGNvcmVMZXZlbCA9IGRlcHRoIC0gY29yZUxldmVsIC0gMTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChwa2dMZXZlbCA+PSAwKTsKKyAgICBwa2dMZXZlbCA9IGRlcHRoIC0gcGtnTGV2ZWwgLSAxOworCisgICAgLy8KKyAgICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgc3RhcnRzIGJ5IHNldHRpbmcgdGhlIGFmZmluaXR5IHRvIGVhY2ggYXZhaWxhYmxlCisgICAgLy8gdGhyZWFkIGFuZCByZXRyaWV2aW5nIGluZm8gZnJvbSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sIHNvIGlmIHdlIGFyZQorICAgIC8vIG5vdCBjYXBhYmxlIG9mIGNhbGxpbmcgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZAorICAgIC8vIF9rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpLCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UgLSB1c2UKKyAgICAvLyB0aGUgZGVmYXVsdHMgdGhhdCB3ZSBjYWxjdWxhdGVkIGZyb20gaXNzdWluZyBjcHVpZCB3aXRob3V0IGJpbmRpbmcKKyAgICAvLyB0byBlYWNoIHByb2MuCisgICAgLy8KKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKQorICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGFjayB0byB0cnkgYW5kIGluZmVyIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHVzaW5nIG9ubHkgdGhlIGRhdGEKKyAgICAgICAgLy8gYXZhaWxhYmxlIGZyb20gY3B1aWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQgX19rbXBfeHByb2MuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKworICAgICAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYyAvIF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyAgICAgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VMb2NDcHVpZEwxMSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8gRnJvbSBoZXJlIG9uLCB3ZSBjYW4gYXNzdW1lIHRoYXQgaXQgaXMgc2FmZSB0byBjYWxsCisgICAgLy8gX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZCBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCksCisgICAgLy8gZXZlbiBpZiBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZS4KKyAgICAvLworCisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBhZmZpbml0eSBtYXNrIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICpvbGRNYXNrOworICAgIEtNUF9DUFVfQUxMT0Mob2xkTWFzayk7CisgICAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gQWxsb2NhdGUgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgQWRkclVuc1BhaXIgKnJldHZhbCA9IChBZGRyVW5zUGFpciAqKQorICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCBlYWNoIG9mIHRoZSBhdmFpbGFibGUgY29udGV4dHMsIGJpbmRpbmcgdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgLy8gdG8gaXQsIGFuZCBvYnRhaW5pbmcgdGhlIHBlcnRpbmVudCBpbmZvcm1hdGlvbiB1c2luZyB0aGUgY3B1aWQgaW5zdHIuCisgICAgLy8KKyAgICB1bnNpZ25lZCBpbnQgcHJvYzsKKyAgICBpbnQgbkFwaWNzID0gMDsKKyAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKHByb2MsIGZ1bGxNYXNrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobkFwaWNzIDwgX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQocHJvYyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXh0cmFjaCB0aGUgbGFiZWxzIGZvciBlYWNoIGxldmVsIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcAorICAgICAgICAvLyBmcm9tIHRoZSBBcGljIElELgorICAgICAgICAvLworICAgICAgICBBZGRyZXNzIGFkZHIoZGVwdGgpOworICAgICAgICBpbnQgcHJldl9zaGlmdCA9IDA7CisKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgbGV2ZWwsICZidWYpOworICAgICAgICAgICAgdW5zaWduZWQgYXBpY0lkID0gYnVmLmVkeDsKKyAgICAgICAgICAgIGlmIChidWYuZWJ4ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgIT0gZGVwdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkci5sYWJlbHNbZGVwdGggLSBsZXZlbCAtIDFdID0gYXBpY0lkID4+IHByZXZfc2hpZnQ7CisgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzaGlmdCA9IGJ1Zi5lYXggJiAweDFmOworICAgICAgICAgICAgaW50IG1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxOworICAgICAgICAgICAgYWRkci5sYWJlbHNbZGVwdGggLSBsZXZlbCAtIDFdID0gKGFwaWNJZCAmIG1hc2spID4+IHByZXZfc2hpZnQ7CisgICAgICAgICAgICBwcmV2X3NoaWZ0ID0gc2hpZnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsICE9IGRlcHRoKSB7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0luY29uc2lzdGVudENwdWlkSW5mbzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHZhbFtuQXBpY3NdID0gQWRkclVuc1BhaXIoYWRkciwgcHJvYyk7CisgICAgICAgIG5BcGljcysrOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UndmUgY29sbGVjdGVkIGFsbCB0aGUgaW5mbyB3ZSBuZWVkLgorICAgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgICAvLworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgcmV0dXJuIG5vdy4KKyAgICAvLworICAgIEtNUF9BU1NFUlQobkFwaWNzID4gMCk7CisgICAgaWYgKG5BcGljcyA9PSAxKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IDE7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IDE7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvcm0gYW4gQWRkcmVzcyBvYmplY3Qgd2hpY2ggb25seSBpbmNsdWRlcyB0aGUgcGFja2FnZSBsZXZlbC4KKyAgICAgICAgLy8KKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbcGtnTGV2ZWxdOworICAgICAgICByZXR2YWxbMF0uZmlyc3QgPSBhZGRyOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShyZXR2YWwsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKworICAgICAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICAgIC8vCisgICAgcXNvcnQocmV0dmFsLCBuQXBpY3MsIHNpemVvZigqcmV0dmFsKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIC8vCisgICAgLy8gRmluZCB0aGUgcmFkaXggYXQgZWFjaCBvZiB0aGUgbGV2ZWxzLgorICAgIC8vCisgICAgdW5zaWduZWQgKnRvdGFscyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKm1heEN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbGFzdCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgdG90YWxzW2xldmVsXSA9IDE7CisgICAgICAgIG1heEN0W2xldmVsXSA9IDE7CisgICAgICAgIGNvdW50c1tsZXZlbF0gPSAxOworICAgICAgICBsYXN0W2xldmVsXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgIH0KKworICAgIC8vCisgICAgLy8gRnJvbSBoZXJlIG9uLCB0aGUgaXRlcmF0aW9uIHZhcmlhYmxlICJsZXZlbCIgcnVucyBmcm9tIHRoZSBmaW5lc3QKKyAgICAvLyBsZXZlbCB0byB0aGUgY29hcnNlc3QsIGkuZS4gd2UgaXRlcmF0ZSBmb3J3YXJkIHRocm91Z2gKKyAgICAvLyAoKmFkZHJlc3Myb3MpW10uZmlyc3QubGFiZWxzW10gLSBpbiB0aGUgcHJldmlvdXMgbG9vcHMsIHdlIGl0ZXJhdGVkCisgICAgLy8gYmFja3dhcmRzLgorICAgIC8vCisgICAgZm9yIChwcm9jID0gMTsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgaW50IGxldmVsOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdICE9IGxhc3RbbGV2ZWxdKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgZm9yIChqID0gbGV2ZWwgKyAxOyBqIDwgZGVwdGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICB0b3RhbHNbal0rKzsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2pdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgYmVsb3cgY2F1c2VzIHByaW50aW5nIGluY29ycmVjdCB0b3BvbG9neSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSBtYXggdmFsdWUgZm9yIHNvbWUgbGV2ZWwgKG1heEN0W2xldmVsXSkgaXMgZW5jb3VudGVyZWQgZWFybGllciB0aGFuCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgbGVzcyB2YWx1ZSB3aGlsZSBnb2luZyB0aHJvdWdoIHRoZSBhcnJheS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGxldCBwa2cwIGhhcyA0IGNvcmVzIGFuZCBwa2cxIGhhcyAyIGNvcmVzLiBUaGVuIG1heEN0WzFdID09IDIKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmVhcyBpdCBtdXN0IGJlIDQuCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8hISEgQ2hlY2sgaWYgaXQgY2FuIGJlIGNvbW1lbnRlZCBzYWZlbHkKKyAgICAgICAgICAgICAgICAgICAgLy9tYXhDdFtqXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxhc3Rbal0gPSByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3RhbHNbbGV2ZWxdKys7CisgICAgICAgICAgICAgICAgY291bnRzW2xldmVsXSsrOworICAgICAgICAgICAgICAgIGlmIChjb3VudHNbbGV2ZWxdID4gbWF4Q3RbbGV2ZWxdKSB7CisgICAgICAgICAgICAgICAgICAgIG1heEN0W2xldmVsXSA9IGNvdW50c1tsZXZlbF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RbbGV2ZWxdID0gcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSBkZXB0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGxhc3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX3gyQXBpY0lEc05vdFVuaXF1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyBjb3JyZWN0bHksIGFuZCByZXR1cm4gaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBpZiAodGhyZWFkTGV2ZWwgPj0gMCkgeworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBtYXhDdFt0aHJlYWRMZXZlbF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICAgIH0KKyAgICBuUGFja2FnZXMgPSB0b3RhbHNbcGtnTGV2ZWxdOworCisgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IHRvdGFsc1tjb3JlTGV2ZWxdOworICAgICAgICBuQ29yZXNQZXJQa2cgPSBtYXhDdFtjb3JlTGV2ZWxdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzOworICAgICAgICBuQ29yZXNQZXJQa2cgPSAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgICAvLworICAgIHVuc2lnbmVkIHByb2QgPSBtYXhDdFswXTsKKyAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgIHByb2QgKj0gbWF4Q3RbbGV2ZWxdOworICAgIH0KKyAgICBib29sIHVuaWZvcm0gPSAocHJvZCA9PSB0b3RhbHNbbGV2ZWwgLSAxXSk7CisKKyAgICAvLworICAgIC8vIFByaW50IHRoZSBtYWNoaW5lIHRvcG9sb2d5IHN1bW1hcnkuCisgICAgLy8KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIG1hc2tbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhtYXNrLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCB0b3RhbHNbMF0pOworICAgICAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPD0gcGtnTGV2ZWw7IGxldmVsKyspIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4ICVkIiwgbWF4Q3RbbGV2ZWxdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCBhbnkgbGV2ZWxzIHdpdGggcmFkaWl4IDEsIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAKKyAgICAvLyAoZXhjZXB0IGZvciB0aGUgcGFja2FnZSBsZXZlbCkuCisgICAgLy8KKyAgICBpbnQgbmV3X2RlcHRoID0gMDsKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICBpZiAoKG1heEN0W2xldmVsXSA9PSAxKSAmJiAobGV2ZWwgIT0gcGtnTGV2ZWwpKSB7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5ld19kZXB0aCsrOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgd2UgYXJlIHJlbW92aW5nIGFueSBsZXZlbHMsIGFsbG9jYXRlIGEgbmV3IHZlY3RvciB0byByZXR1cm4sCisgICAgLy8gYW5kIGNvcHkgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIHRvIGl0LgorICAgIC8vCisgICAgaWYgKG5ld19kZXB0aCAhPSBkZXB0aCkgeworICAgICAgICBBZGRyVW5zUGFpciAqbmV3X3JldHZhbCA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgIHNpemVvZihBZGRyVW5zUGFpcikgKiBuQXBpY3MpOworICAgICAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICAgICAgQWRkcmVzcyBhZGRyKG5ld19kZXB0aCk7CisgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdID0gQWRkclVuc1BhaXIoYWRkciwgcmV0dmFsW3Byb2NdLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld19sZXZlbCA9IDA7CisgICAgICAgIGludCBuZXdQa2dMZXZlbCA9IC0xOworICAgICAgICBpbnQgbmV3Q29yZUxldmVsID0gLTE7CisgICAgICAgIGludCBuZXdUaHJlYWRMZXZlbCA9IC0xOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIGlmICgobWF4Q3RbbGV2ZWxdID09IDEpCisgICAgICAgICAgICAgICYmIChsZXZlbCAhPSBwa2dMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGxldmVsLiBOZXZlciByZW1vdmUgdGhlIHBhY2thZ2UgbGV2ZWwKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsID09IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgbmV3UGtnTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSBjb3JlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBuZXdDb3JlTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSB0aHJlYWRMZXZlbCkgeworICAgICAgICAgICAgICAgIG5ld1RocmVhZExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICAgICAgICAgIG5ld19yZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW25ld19sZXZlbF0KKyAgICAgICAgICAgICAgICAgID0gcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdfbGV2ZWwrKzsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgcmV0dmFsID0gbmV3X3JldHZhbDsKKyAgICAgICAgZGVwdGggPSBuZXdfZGVwdGg7CisgICAgICAgIHBrZ0xldmVsID0gbmV3UGtnTGV2ZWw7CisgICAgICAgIGNvcmVMZXZlbCA9IG5ld0NvcmVMZXZlbDsKKyAgICAgICAgdGhyZWFkTGV2ZWwgPSBuZXdUaHJlYWRMZXZlbDsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNldCB0aGUgZ3JhbnVsYXJpdHkgbGV2ZWwgYmFzZWQgb24gd2hhdCBsZXZlbHMgYXJlIG1vZGVsZWQKKyAgICAgICAgLy8gaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIGlmICgodGhyZWFkTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3RocmVhZCkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3kocmV0dmFsLCBuQXBpY3MsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKGxhc3QpOworICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICphZGRyZXNzMm9zID0gcmV0dmFsOworICAgIHJldHVybiBkZXB0aDsKK30KKworCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworCisjZGVmaW5lIG9zSWRJbmRleCAgICAgICAwCisjZGVmaW5lIHRocmVhZElkSW5kZXggICAxCisjZGVmaW5lIGNvcmVJZEluZGV4ICAgICAyCisjZGVmaW5lIHBrZ0lkSW5kZXggICAgICAzCisjZGVmaW5lIG5vZGVJZEluZGV4ICAgICA0CisKK3R5cGVkZWYgdW5zaWduZWQgKlByb2NDcHVJbmZvOworc3RhdGljIHVuc2lnbmVkIG1heEluZGV4ID0gcGtnSWRJbmRleDsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfUHJvY0NwdUluZm9fb3NfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCB1bnNpZ25lZCAqYWEgPSAoY29uc3QgdW5zaWduZWQgKilhOworICAgIGNvbnN0IHVuc2lnbmVkICpiYiA9IChjb25zdCB1bnNpZ25lZCAqKWI7CisgICAgaWYgKGFhW29zSWRJbmRleF0gPCBiYltvc0lkSW5kZXhdKSByZXR1cm4gLTE7CisgICAgaWYgKGFhW29zSWRJbmRleF0gPiBiYltvc0lkSW5kZXhdKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK307CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX3BoeXNfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIGNvbnN0IHVuc2lnbmVkICphYSA9ICooKGNvbnN0IHVuc2lnbmVkICoqKWEpOworICAgIGNvbnN0IHVuc2lnbmVkICpiYiA9ICooKGNvbnN0IHVuc2lnbmVkICoqKWIpOworICAgIGZvciAoaSA9IG1heEluZGV4OyA7IGktLSkgeworICAgICAgICBpZiAoYWFbaV0gPCBiYltpXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWFbaV0gPiBiYltpXSkgcmV0dXJuIDE7CisgICAgICAgIGlmIChpID09IG9zSWRJbmRleCkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8vCisvLyBQYXJzZSAvcHJvYy9jcHVpbmZvIChvciBhbiBhbHRlcm5hdGUgZmlsZSBpbiB0aGUgc2FtZSBmb3JtYXQpIHRvIG9idGFpbiB0aGUKKy8vIGFmZmluaXR5IG1hcC4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLCBpbnQgKmxpbmUsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCwgRklMRSAqZikKK3sKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIFNjYW4gb2YgdGhlIGZpbGUsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mICJwcm9jZXNzb3IiIChvc0lkKSBmaWVsZHMsCisgICAgLy8gYW5kIGZpbmQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgPG4+IGZvciBhIG5vZGVfPG4+IGZpZWxkLgorICAgIC8vCisgICAgY2hhciBidWZbMjU2XTsKKyAgICB1bnNpZ25lZCBudW1fcmVjb3JkcyA9IDA7CisgICAgd2hpbGUgKCEgZmVvZihmKSkgeworICAgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDE7CisgICAgICAgIGlmICghIGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCBlcnJvcnMgcHJlc3VtYWJseSBiZWNhdXNlIG9mIEVPRgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2hhciBzMVtdID0gInByb2Nlc3NvciI7CisgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczEsIHNpemVvZihzMSkgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICBudW1fcmVjb3JkcysrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRSAtIHRoaXMgd2lsbCBtYXRjaCAibm9kZV88bj4gPGdhcmJhZ2U+IgorICAgICAgICAvLworICAgICAgICB1bnNpZ25lZCBsZXZlbDsKKyAgICAgICAgaWYgKEtNUF9TU0NBTkYoYnVmLCAibm9kZV8lZCBpZCIsICZsZXZlbCkgPT0gMSkgeworICAgICAgICAgICAgaWYgKG5vZGVJZEluZGV4ICsgbGV2ZWwgPj0gbWF4SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBtYXhJbmRleCA9IG5vZGVJZEluZGV4ICsgbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgZm9yIGVtcHR5IGZpbGUgLyBubyB2YWxpZCBwcm9jZXNzb3IgcmVjb3Jkcywgb3IgdG9vIG1hbnkuCisgICAgLy8gVGhlIG51bWJlciBvZiByZWNvcmRzIGNhbid0IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gdGhlCisgICAgLy8gYWZmaW5pdHkgbWFzay4KKyAgICAvLworICAgIGlmIChudW1fcmVjb3JkcyA9PSAwKSB7CisgICAgICAgICpsaW5lID0gMDsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob1Byb2NSZWNvcmRzOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChudW1fcmVjb3JkcyA+ICh1bnNpZ25lZClfX2ttcF94cHJvYykgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfVG9vTWFueVByb2NSZWNvcmRzOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGZpbGUgcG9pbnRlciBiYWNrIHRvIHRoZSBiZWdnaW5uaW5nLCBzbyB0aGF0IHdlIGNhbiBzY2FuIHRoZQorICAgIC8vIGZpbGUgYWdhaW4sIHRoaXMgdGltZSBwZXJmb3JtaW5nIGEgZnVsbCBwYXJzZSBvZiB0aGUgZGF0YS4KKyAgICAvLyBBbGxvY2F0ZSBhIHZlY3RvciBvZiBQcm9jQ3B1SW5mbyBvYmplY3QsIHdoZXJlIHdlIHdpbGwgcGxhY2UgdGhlIGRhdGEuCisgICAgLy8gQWRkaW5nIGFuIGV4dHJhIGVsZW1lbnQgYXQgdGhlIGVuZCBhbGxvd3MgdXMgdG8gcmVtb3ZlIGEgbG90IG9mIGV4dHJhCisgICAgLy8gY2hlY2tzIGZvciB0ZXJtaW5hdGlvbiBjb25kaXRpb25zLgorICAgIC8vCisgICAgaWYgKGZzZWVrKGYsIDAsIFNFRUtfU0VUKSAhPSAwKSB7CisgICAgICAgICpsaW5lID0gMDsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9DYW50UmV3aW5kQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gQWxsb2NhdGUgdGhlIGFycmF5IG9mIHJlY29yZHMgdG8gc3RvcmUgdGhlIHByb2MgaW5mbyBpbi4gIFRoZSBkdW1teQorICAgIC8vIGVsZW1lbnQgYXQgdGhlIGVuZCBtYWtlcyB0aGUgbG9naWMgaW4gZmlsbGluZyB0aGVtIG91dCBlYXNpZXIgdG8gY29kZS4KKyAgICAvLworICAgIHVuc2lnbmVkICoqdGhyZWFkSW5mbyA9ICh1bnNpZ25lZCAqKilfX2ttcF9hbGxvY2F0ZSgobnVtX3JlY29yZHMgKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQgKikpOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSA8PSBudW1fcmVjb3JkczsgaSsrKSB7CisgICAgICAgIHRocmVhZEluZm9baV0gPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgfQorCisjZGVmaW5lIENMRUFOVVBfVEhSRUFEX0lORk8gXAorICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm9baV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisKKyAgICAvLworICAgIC8vIEEgdmFsdWUgb2YgVUlOVF9NQVggbWVhbnMgdGhhdCB3ZSBkaWRuJ3QgZmluZCB0aGUgZmllbGQKKyAgICAvLworICAgIHVuc2lnbmVkIF9faW5kZXg7CisKKyNkZWZpbmUgSU5JVF9QUk9DX0lORk8ocCkgXAorICAgIGZvciAoX19pbmRleCA9IDA7IF9faW5kZXggPD0gbWF4SW5kZXg7IF9faW5kZXgrKykgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAocClbX19pbmRleF0gPSBVSU5UX01BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeworICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW2ldKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBudW1fYXZhaWwgPSAwOworICAgICpsaW5lID0gMDsKKyAgICB3aGlsZSAoISBmZW9mKGYpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSBhbiBpbm5lciBzY29waW5nIGxldmVsLCBzbyB0aGF0IGFsbCB0aGUgZ290byB0YXJnZXRzIGF0IHRoZQorICAgICAgICAvLyBlbmQgb2YgdGhlIGxvb3AgYXBwZWFyIGluIGFuIG91dGVyIHNjb3BpbmcgbGV2ZWwuICBUaGlzIGF2b2lkcworICAgICAgICAvLyB3YXJuaW5ncyBhYm91dCBqdW1waW5nIHBhc3QgYW4gaW5pdGlhbGl6YXRpb24gdG8gYSB0YXJnZXQgaW4gdGhlCisgICAgICAgIC8vIHNhbWUgYmxvY2suCisgICAgICAgIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMTsKKyAgICAgICAgICAgIGJvb2wgbG9uZ19saW5lID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoISBmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVhZCBlcnJvcnMgcHJlc3VtYWJseSBiZWNhdXNlIG9mIEVPRgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgdmFsaWQgZGF0YSBpbiB0aHJlYWRJbmZvW251bV9hdmFpbF0sIHRoZW4gZmFrZQorICAgICAgICAgICAgICAgIC8vIGEgYmxhbmsgbGluZSBpbiBlbnN1cmUgdGhhdCB0aGUgbGFzdCBhZGRyZXNzIGdldHMgcGFyc2VkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4SW5kZXg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW2ldICE9IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCEgdmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFidWZbc2l6ZW9mKGJ1ZikgLSAxXSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlci4gIFNldCBhIGZsYWcgYW5kIGRvbid0CisgICAgICAgICAgICAgICAgLy8gZW1pdCBhbiBlcnJvciBpZiB3ZSB3ZXJlIGdvaW5nIHRvIGlnbm9yZSB0aGUgbGluZSwgYW55d2F5LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgbG9uZ19saW5lID0gdHJ1ZTsKKworI2RlZmluZSBDSEVDS19MSU5FIFwKKyAgICBpZiAobG9uZ19saW5lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Mb25nTGluZUNwdWluZm87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmxpbmUpKys7CisKKyAgICAgICAgICAgIGNoYXIgczFbXSA9ICJwcm9jZXNzb3IiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMSwgc2l6ZW9mKHMxKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMxKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoS01QX1NTQ0FORihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSA9IHZhbDsKKyNpZiBLTVBfT1NfTElOVVggJiYgVVNFX1NZU0ZTX0lORk8KKyAgICAgICAgICAgICAgICBjaGFyIHBhdGhbMjU2XTsKKyAgICAgICAgICAgICAgICBLTVBfU05QUklOVEYocGF0aCwgc2l6ZW9mKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JXUvdG9wb2xvZ3kvcGh5c2ljYWxfcGFja2FnZV9pZCIsCisgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWFkX2Zyb21fZmlsZShwYXRoLCAiJXUiLCAmdGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdKTsKKworICAgICAgICAgICAgICAgIEtNUF9TTlBSSU5URihwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAgICAgICAgICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUldS90b3BvbG9neS9jb3JlX2lkIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0pOworICAgICAgICAgICAgICAgIF9fa21wX3JlYWRfZnJvbV9maWxlKHBhdGgsICIldSIsICZ0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbHNlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIHMyW10gPSAicGh5c2ljYWwgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMiwgc2l6ZW9mKHMyKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMyKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoS01QX1NTQ0FORihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtwa2dJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzM1tdID0gImNvcmUgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMywgc2l6ZW9mKHMzKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMzKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoS01QX1NTQ0FORihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtjb3JlSWRJbmRleF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtjb3JlSWRJbmRleF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIFVTRV9TWVNGU19JTkZPCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIHM0W10gPSAidGhyZWFkIGlkIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczQsIHNpemVvZihzNCkgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzNCkgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bdGhyZWFkSWRJbmRleF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVt0aHJlYWRJZEluZGV4XSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsOworICAgICAgICAgICAgaWYgKEtNUF9TU0NBTkYoYnVmLCAibm9kZV8lZCBpZCIsICZsZXZlbCkgPT0gMSkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczQpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChLTVBfU1NDQU5GKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKG5vZGVJZEluZGV4ICsgbGV2ZWwgPD0gbWF4SW5kZXgpOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bbm9kZUlkSW5kZXggKyBsZXZlbF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtub2RlSWRJbmRleCArIGxldmVsXSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdlIGRpZG4ndCByZWNvZ25pemUgdGhlIGxlYWRpbmcgdG9rZW4gb24gdGhlIGxpbmUuCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbG90cyBvZiBsZWFkaW5nIHRva2VucyB0aGF0IHdlIGRvbid0IHJlY29nbml6ZSAtCisgICAgICAgICAgICAvLyBpZiB0aGUgbGluZSBpc24ndCBlbXB0eSwgZ28gb24gdG8gdGhlIG5leHQgbGluZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKCpidWYgIT0gMCkgJiYgKCpidWYgIT0gJ1xuJykpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIsIHJlYWQgY2hhcmFjdGVycworICAgICAgICAgICAgICAgIC8vIHVudGlsIHdlIGZpbmQgYSBuZXdsaW5lLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKGxvbmdfbGluZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2g7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKGNoID0gZmdldGMoZikpICE9IEVPRikgJiYgKGNoICE9ICdcbicpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBIG5ld2xpbmUgaGFzIHNpZ25hbGxlZCB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzb3IgcmVjb3JkLgorICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmVuJ3QgdG9vIG1hbnkgcHJvY3Mgc3BlY2lmaWVkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgoaW50KW51bV9hdmFpbCA9PSBfX2ttcF94cHJvYykgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ub29NYW55RW50cmllczsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgbWlzc2luZyBmaWVsZHMuICBUaGUgb3NJZCBmaWVsZCBtdXN0IGJlIHRoZXJlLCBhbmQgd2UKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSByZXF1aXJlIHRoYXQgdGhlIHBoeXNpY2FsIGlkIGZpZWxkIGlzIHNwZWNpZmllZCwgYWxzby4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTWlzc2luZ1Byb2NGaWVsZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1swXVtwa2dJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nUGh5c2ljYWxJREZpZWxkOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW251bV9hdmFpbF0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHN1Y2Nlc3NmdWwgcGFyc2Ugb2YgdGhpcyBwcm9jJ3MgaW5mby4KKyAgICAgICAgICAgIC8vIEluY3JlbWVudCB0aGUgY291bnRlciwgYW5kIHByZXBhcmUgZm9yIHRoZSBuZXh0IHByb2MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbnVtX2F2YWlsKys7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA8PSBudW1fcmVjb3Jkcyk7CisgICAgICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW251bV9hdmFpbF0pOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG5vX3ZhbDoKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nVmFsQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGR1cF9maWVsZDoKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9EdXBsaWNhdGVGaWVsZENwdWluZm87CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKmxpbmUgPSAwOworCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgIHVuc2lnbmVkIHRlYW1TaXplID0gMDsKKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICAvLyBjaGVjayBmb3IgbnVtX3JlY29yZHMgPT0gX19rbXBfeHByb2MgPz8/CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgZm9ybSBhbiBBZGRyZXNzIG9iamVjdAorICAgIC8vIHdpdGggZGVwdGggMSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IChvciwgaWYgYWZmaW5pdHkgaXMgb2ZmLCBzZXQKKyAgICAvLyBhZGRyZXNzMm9zIHRvIE5VTEwgYW5kIHJldHVybikuCisgICAgLy8KKyAgICAvLyBJZiBpdCBpcyBjb25maWd1cmVkIHRvIG9taXQgdGhlIHBhY2thZ2UgbGV2ZWwgd2hlbiB0aGVyZSBpcyBvbmx5IGEKKyAgICAvLyBzaW5nbGUgcGFja2FnZSwgdGhlIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIHdvbid0IHdvcmsgaWYKKyAgICAvLyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRocmVhZCAtIGl0IHdvdWxkIHRyeSB0byBmb3JtIGFuIEFkZHJlc3MKKyAgICAvLyBvYmplY3Qgd2l0aCBkZXB0aCAwLgorICAgIC8vCisgICAgS01QX0FTU0VSVChudW1fYXZhaWwgPiAwKTsKKyAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA8PSBudW1fcmVjb3Jkcyk7CisgICAgaWYgKG51bV9hdmFpbCA9PSAxKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IDE7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IG5QYWNrYWdlcyA9IDE7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlQ3B1aW5mbywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICBmdWxsTWFzayk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZDYXBhYmxlVXNlQ3B1aW5mbywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIjEiKTsKKyAgICAgICAgICAgIGZvciAoaW5kZXggPSBtYXhJbmRleCAtIDE7IGluZGV4ID4gcGtnSWRJbmRleDsgaW5kZXgtLSkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4IDEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3lFeHRyYSwgIktNUF9BRkZJTklUWSIsIGJ1Zi5zdHIsIDEsIDEsIDEpOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikpOworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gdGhyZWFkSW5mb1swXVtwa2dJZEluZGV4XTsKKyAgICAgICAgKCphZGRyZXNzMm9zKVswXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHRocmVhZEluZm9bMF1bb3NJZEluZGV4XSk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSB0aHJlYWRJbmZvIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICAgIC8vCisgICAgcXNvcnQodGhyZWFkSW5mbywgbnVtX2F2YWlsLCBzaXplb2YoKnRocmVhZEluZm8pLAorICAgICAgX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX3BoeXNfaWQpOworCisgICAgLy8KKyAgICAvLyBUaGUgdGFibGUgaXMgbm93IHNvcnRlZCBieSBwa2dJZCAvIGNvcmVJZCAvIHRocmVhZElkLCBidXQgd2UgcmVhbGx5CisgICAgLy8gZG9uJ3Qga25vdyB0aGUgcmFkaXggb2YgYW55IG9mIHRoZSBmaWVsZHMuICBwa2dJZCdzIG1heSBiZSBzcGFyc2VseQorICAgIC8vIGFzc2lnbmVkIGFtb25nIHRoZSBjaGlwcyBvbiBhIHN5c3RlbS4gIEFsdGhvdWdoIGNvcmVJZCdzIGFyZSB1c3VhbGx5CisgICAgLy8gYXNzaWduZWQgWzAgLi4gY29yZXNQZXJQa2ctMV0gYW5kIHRocmVhZElkJ3MgYXJlIHVzdWFsbHkgYXNzaWduZWQKKyAgICAvLyBbMC4udGhyZWFkc1BlckNvcmUtMV0sIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBhbnkgc3VjaCBhc3N1bXB0aW9ucy4KKyAgICAvLworICAgIC8vIEZvciB0aGF0IG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGF0IGNvcmVzUGVyUGtnIGFuZCB0aHJlYWRzUGVyQ29yZQorICAgIC8vIChvciB0aGUgdG90YWwgIyBwYWNrYWdlcykgYXJlIGF0IHRoaXMgcG9pbnQgLSB3ZSB3YW50IHRvIGRldGVybWluZQorICAgIC8vIHRoYXQgbm93LiAgV2Ugb25seSBoYXZlIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBmaXJzdCB0d28gZmlndXJlcy4KKyAgICAvLworICAgIHVuc2lnbmVkICpjb3VudHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbWF4Q3QgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqdG90YWxzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmxhc3RJZCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworCisgICAgYm9vbCBhc3NpZ25fdGhyZWFkX2lkcyA9IGZhbHNlOworICAgIHVuc2lnbmVkIHRocmVhZElkQ3Q7CisgICAgdW5zaWduZWQgaW5kZXg7CisKKyAgICByZXN0YXJ0X3JhZGl4X2NoZWNrOgorICAgIHRocmVhZElkQ3QgPSAwOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIHRoZSBjb3VudGVyIGFycmF5cyB3aXRoIGRhdGEgZnJvbSB0aHJlYWRJbmZvWzBdLgorICAgIC8vCisgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzKSB7CisgICAgICAgIGlmICh0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdID0gdGhyZWFkSWRDdCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRocmVhZElkQ3QgPD0gdGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSkgeworICAgICAgICAgICAgdGhyZWFkSWRDdCA9IHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0gKyAxOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8PSBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgICBjb3VudHNbaW5kZXhdID0gMTsKKyAgICAgICAgbWF4Q3RbaW5kZXhdID0gMTsKKyAgICAgICAgdG90YWxzW2luZGV4XSA9IDE7CisgICAgICAgIGxhc3RJZFtpbmRleF0gPSB0aHJlYWRJbmZvWzBdW2luZGV4XTs7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgT1MgcHJvY3MuCisgICAgLy8KKyAgICBmb3IgKGkgPSAxOyBpIDwgbnVtX2F2YWlsOyBpKyspIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRmluZCB0aGUgbW9zdCBzaWduaWZpY2FudCBpbmRleCB3aG9zZSBpZCBkaWZmZXJzCisgICAgICAgIC8vIGZyb20gdGhlIGlkIGZvciB0aGUgcHJldmlvdXMgT1MgcHJvYy4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yIChpbmRleCA9IG1heEluZGV4OyBpbmRleCA+PSB0aHJlYWRJZEluZGV4OyBpbmRleC0tKSB7CisgICAgICAgICAgICBpZiAoYXNzaWduX3RocmVhZF9pZHMgJiYgKGluZGV4ID09IHRocmVhZElkSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBdXRvLWFzc2lnbiB0aGUgdGhyZWFkIGlkIGZpZWxkIGlmIGl0IHdhc24ndCBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID0gdGhyZWFkSWRDdCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQXBhcnJlbnRseSB0aGUgdGhyZWFkIGlkIGZpZWxkIHdhcyBzcGVjaWZpZWQgZm9yIHNvbWUKKyAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIGFuZCBub3Qgb3RoZXJzLiAgU3RhcnQgdGhlIHRocmVhZCBpZCBjb3VudGVyCisgICAgICAgICAgICAgICAgLy8gb2ZmIGF0IHRoZSBuZXh0IGhpZ2hlciB0aHJlYWQgaWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0aHJlYWRJZEN0IDw9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSWRDdCA9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldW2luZGV4XSAhPSBsYXN0SWRbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSdW4gdGhyb3VnaCBhbGwgaW5kaWNlcyB3aGljaCBhcmUgbGVzcyBzaWduaWZpY2FudCwKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVzZXQgdGhlIGNvdW50cyB0byAxLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQXQgYWxsIGxldmVscyB1cCB0byBhbmQgaW5jbHVkaW5nIGluZGV4LCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSB0b3RhbHMgYW5kIHJlY29yZCB0aGUgbGFzdCBpZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4MjsKKyAgICAgICAgICAgICAgICBmb3IgKGluZGV4MiA9IHRocmVhZElkSW5kZXg7IGluZGV4MiA8IGluZGV4OyBpbmRleDIrKykgeworICAgICAgICAgICAgICAgICAgICB0b3RhbHNbaW5kZXgyXSsrOworICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRzW2luZGV4Ml0gPiBtYXhDdFtpbmRleDJdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhDdFtpbmRleDJdID0gY291bnRzW2luZGV4Ml07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2luZGV4Ml0gPSAxOworICAgICAgICAgICAgICAgICAgICBsYXN0SWRbaW5kZXgyXSA9IHRocmVhZEluZm9baV1baW5kZXgyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnRzW2luZGV4XSsrOworICAgICAgICAgICAgICAgIHRvdGFsc1tpbmRleF0rKzsKKyAgICAgICAgICAgICAgICBsYXN0SWRbaW5kZXhdID0gdGhyZWFkSW5mb1tpXVtpbmRleF07CisKKyAgICAgICAgICAgICAgICBpZiAoYXNzaWduX3RocmVhZF9pZHMgJiYgKGluZGV4ID4gdGhyZWFkSWRJbmRleCkpIHsKKworIyBpZiBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdGVhbSBzaXplIGlzIHRoZSB0b3RhbCAjdGhyZWFkcyBpbiB0aGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICAvLyBtaW51cyAxIHRocmVhZCBmb3IgZXZlcnkgY29yZSB0aGF0IGhhcyAzIG9yIG1vcmUgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgdGVhbVNpemUgKz0gKCB0aHJlYWRJZEN0IDw9IDIgKSA/ICggdGhyZWFkSWRDdCApIDogKCB0aHJlYWRJZEN0IC0gMSApOworIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aHJlYWQgY291bnRlciwgYXMgd2UgYXJlIG9uIGEgbmV3IGNvcmUuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIHRocmVhZElkQ3QgPSAwOworCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIEF1dG8tYXNzaWduIHRoZSB0aHJlYWQgaWQgZmllbGQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPSB0aHJlYWRJZEN0Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBcGFycmVudGx5IHRoZSB0aHJlYWQgaWQgZmllbGQgd2FzIHNwZWNpZmllZCBmb3Igc29tZQorICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIGFuZCBub3Qgb3RoZXJzLiAgU3RhcnQgdGhlIHRocmVhZCBpZCBjb3VudGVyCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZiBhdCB0aGUgbmV4dCBoaWdoZXIgdGhyZWFkIGlkLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aHJlYWRJZEN0IDw9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPCB0aHJlYWRJZEluZGV4KSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgdGhyZWFkIGlkcyB3ZXJlIHNwZWNpZmllZCwgaXQgaXMgYW4gZXJyb3IgaWYgdGhleSBhcmUgbm90CisgICAgICAgICAgICAvLyB1bmlxdWUuICBBbHNvLCBjaGVjayB0aGF0IHdlIHdhdmVuJ3QgYWxyZWFkeSByZXN0YXJ0ZWQgdGhlCisgICAgICAgICAgICAvLyBsb29wICh0byBiZSBzYWZlIC0gc2hvdWxkbid0IG5lZWQgdG8pLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgodGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSAhPSBVSU5UX01BWCkKKyAgICAgICAgICAgICAgfHwgYXNzaWduX3RocmVhZF9pZHMpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGxhc3RJZCk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfUGh5c2ljYWxJRHNOb3RVbmlxdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBpZHMgd2VyZSBub3Qgc3BlY2lmaWVkIGFuZCB3ZSBzZWUgZW50cmllcworICAgICAgICAgICAgLy8gZW50cmllcyB0aGF0IGFyZSBkdXBsaWNhdGVzLCBzdGFydCB0aGUgbG9vcCBvdmVyIGFuZAorICAgICAgICAgICAgLy8gYXNzaWduIHRoZSB0aHJlYWQgaWRzIG1hbnVhbGx5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGFzc2lnbl90aHJlYWRfaWRzID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gcmVzdGFydF9yYWRpeF9jaGVjazsKKyAgICAgICAgfQorICAgIH0KKworIyBpZiBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKyAgICAvLworICAgIC8vIFRoZSBkZWZhdWx0IHRlYW0gc2l6ZSBpcyB0aGUgdG90YWwgI3RocmVhZHMgaW4gdGhlIG1hY2hpbmUKKyAgICAvLyBtaW51cyAxIHRocmVhZCBmb3IgZXZlcnkgY29yZSB0aGF0IGhhcyAzIG9yIG1vcmUgdGhyZWFkcy4KKyAgICAvLworICAgIHRlYW1TaXplICs9ICggdGhyZWFkSWRDdCA8PSAyICkgPyAoIHRocmVhZElkQ3QgKSA6ICggdGhyZWFkSWRDdCAtIDEgKTsKKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGNvdW50c1tpbmRleF0gPiBtYXhDdFtpbmRleF0pIHsKKyAgICAgICAgICAgIG1heEN0W2luZGV4XSA9IGNvdW50c1tpbmRleF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBtYXhDdFt0aHJlYWRJZEluZGV4XTsKKyAgICBuQ29yZXNQZXJQa2cgPSBtYXhDdFtjb3JlSWRJbmRleF07CisgICAgblBhY2thZ2VzID0gdG90YWxzW3BrZ0lkSW5kZXhdOworCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgaXMgdW5pZm9ybQorICAgIC8vCisgICAgdW5zaWduZWQgcHJvZCA9IHRvdGFsc1ttYXhJbmRleF07CisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDwgbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICBwcm9kICo9IG1heEN0W2luZGV4XTsKKyAgICB9CisgICAgYm9vbCB1bmlmb3JtID0gKHByb2QgPT0gdG90YWxzW3RocmVhZElkSW5kZXhdKTsKKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9uY29yZXMgPSB0b3RhbHNbY29yZUlkSW5kZXhdOworCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBmdWxsTWFzayk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZDYXBhYmxlVXNlQ3B1aW5mbywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICAgICAgaWYgKHVuaWZvcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCB0b3RhbHNbbWF4SW5kZXhdKTsKKyAgICAgICAgZm9yIChpbmRleCA9IG1heEluZGV4IC0gMTsgaW5kZXggPj0gcGtnSWRJbmRleDsgaW5kZXgtLSkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggJWQiLCBtYXhDdFtpbmRleF0pOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3lFeHRyYSwgIktNUF9BRkZJTklUWSIsIGJ1Zi5zdHIsICBtYXhDdFtjb3JlSWRJbmRleF0sCisgICAgICAgICAgbWF4Q3RbdGhyZWFkSWRJbmRleF0sIF9fa21wX25jb3Jlcyk7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgIH0KKworIyBpZiBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKyAgICAvLworICAgIC8vIFNldCB0aGUgZGVmYXVsdCB0ZWFtIHNpemUuCisgICAgLy8KKyAgICBpZiAoKF9fa21wX2RmbHRfdGVhbV9udGggPT0gMCkgJiYgKHRlYW1TaXplID4gMCkpIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IHRlYW1TaXplOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXA6IHNldHRpbmcgX19rbXBfZGZsdF90ZWFtX250aCA9ICVkXG4iLAorICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGgpKTsKKyAgICB9CisjIGVuZGlmIC8vIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICBfX2ttcF9mcmVlKGxhc3RJZCk7CisgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxldmVscyB3aGljaCBoYXZlIG1vcmUgbm9kZXMgYXQgdGhhdCBsZXZlbCB0aGFuCisgICAgLy8gYXQgdGhlIHBhcmVudCdzIGxldmVsICh3aXRoIHRoZXJlIGJlaW5nIGFuIGltcGxpY2l0IHJvb3Qgbm9kZSBvZgorICAgIC8vIHRoZSB0b3AgbGV2ZWwpLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNheWluZyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0CisgICAgLy8gb25lIG5vZGUgYXQgdGhpcyBsZXZlbCB3aGljaCBoYXMgYSBzaWJsaW5nLiAgVGhlc2UgbGV2ZWxzIGFyZSBpbiB0aGUKKyAgICAvLyBtYXAsIGFuZCB0aGUgcGFja2FnZSBsZXZlbCBpcyBhbHdheXMgaW4gdGhlIG1hcC4KKyAgICAvLworICAgIGJvb2wgKmluTWFwID0gKGJvb2wgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKSAqIHNpemVvZihib29sKSk7CisgICAgaW50IGxldmVsID0gMDsKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPCBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgICBLTVBfQVNTRVJUKHRvdGFsc1tpbmRleF0gPj0gdG90YWxzW2luZGV4ICsgMV0pOworICAgICAgICBpbk1hcFtpbmRleF0gPSAodG90YWxzW2luZGV4XSA+IHRvdGFsc1tpbmRleCArIDFdKTsKKyAgICB9CisgICAgaW5NYXBbbWF4SW5kZXhdID0gKHRvdGFsc1ttYXhJbmRleF0gPiAxKTsKKyAgICBpbk1hcFtwa2dJZEluZGV4XSA9IHRydWU7CisKKyAgICBpbnQgZGVwdGggPSAwOworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8PSBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgICBpZiAoaW5NYXBbaW5kZXhdKSB7CisgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICB9CisgICAgfQorICAgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0IHRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKQorICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG51bV9hdmFpbCk7CisgICAgaW50IHBrZ0xldmVsID0gLTE7CisgICAgaW50IGNvcmVMZXZlbCA9IC0xOworICAgIGludCB0aHJlYWRMZXZlbCA9IC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9hdmFpbDsgKytpKSB7CisgICAgICAgIEFkZHJlc3MgYWRkcihkZXB0aCk7CisgICAgICAgIHVuc2lnbmVkIG9zID0gdGhyZWFkSW5mb1tpXVtvc0lkSW5kZXhdOworICAgICAgICBpbnQgc3JjX2luZGV4OworICAgICAgICBpbnQgZHN0X2luZGV4ID0gMDsKKworICAgICAgICBmb3IgKHNyY19pbmRleCA9IG1heEluZGV4OyBzcmNfaW5kZXggPj0gdGhyZWFkSWRJbmRleDsgc3JjX2luZGV4LS0pIHsKKyAgICAgICAgICAgIGlmICghIGluTWFwW3NyY19pbmRleF0pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2RzdF9pbmRleF0gPSB0aHJlYWRJbmZvW2ldW3NyY19pbmRleF07CisgICAgICAgICAgICBpZiAoc3JjX2luZGV4ID09IHBrZ0lkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBwa2dMZXZlbCA9IGRzdF9pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNyY19pbmRleCA9PSBjb3JlSWRJbmRleCkgeworICAgICAgICAgICAgICAgIGNvcmVMZXZlbCA9IGRzdF9pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNyY19pbmRleCA9PSB0aHJlYWRJZEluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhyZWFkTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RfaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgICAoKmFkZHJlc3Myb3MpW2ldID0gQWRkclVuc1BhaXIoYWRkciwgb3MpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIHVuc2lnbmVkIHNyY19pbmRleDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICBmb3IgKHNyY19pbmRleCA9IHRocmVhZElkSW5kZXg7IHNyY19pbmRleCA8PSBtYXhJbmRleDsgc3JjX2luZGV4KyspIHsKKyAgICAgICAgICAgIGlmICghIGluTWFwW3NyY19pbmRleF0pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoc3JjX2luZGV4KSB7CisgICAgICAgICAgICAgICAgY2FzZSB0aHJlYWRJZEluZGV4OgorICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNvcmVJZEluZGV4OgorICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwa2dJZEluZGV4OgorICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIG51bV9hdmFpbCwgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUoaW5NYXApOworICAgIF9fa21wX2ZyZWUobGFzdElkKTsKKyAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgcmV0dXJuIGRlcHRoOworfQorCisKKy8vCisvLyBDcmVhdGUgYW5kIHJldHVybiBhIHRhYmxlIG9mIGFmZmluaXR5IG1hc2tzLCBpbmRleGVkIGJ5IE9TIHRocmVhZCBJRC4KKy8vIFRoaXMgcm91dGluZSBoYW5kbGVzIE9SJ2luZyB0b2dldGhlciBhbGwgdGhlIGFmZmluaXR5IG1hc2tzIG9mIHRocmVhZHMKKy8vIHRoYXQgYXJlIHN1ZmZpY2llbnRseSBjbG9zZSwgaWYgZ3JhbnVsYXJpdHkgPiBmaW5lLgorLy8KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICoKK19fa21wX2NyZWF0ZV9tYXNrcyh1bnNpZ25lZCAqbWF4SW5kZXgsIHVuc2lnbmVkICpudW1VbmlxdWUsCisgIEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLCB1bnNpZ25lZCBudW1BZGRycykKK3sKKyAgICAvLworICAgIC8vIEZpcnN0IGZvcm0gYSB0YWJsZSBvZiBhZmZpbml0eSBtYXNrcyBpbiBvcmRlciBvZiBPUyB0aHJlYWQgaWQuCisgICAgLy8KKyAgICB1bnNpZ25lZCBkZXB0aDsKKyAgICB1bnNpZ25lZCBtYXhPc0lkOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBLTVBfQVNTRVJUKG51bUFkZHJzID4gMCk7CisgICAgZGVwdGggPSBhZGRyZXNzMm9zWzBdLmZpcnN0LmRlcHRoOworCisgICAgbWF4T3NJZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG51bUFkZHJzOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3NbaV0uc2Vjb25kOworICAgICAgICBpZiAob3NJZCA+IG1heE9zSWQpIHsKKyAgICAgICAgICAgIG1heE9zSWQgPSBvc0lkOworICAgICAgICB9CisgICAgfQorICAgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DX0FSUkFZKG9zSWQyTWFzaywgKG1heE9zSWQrMSkpOworCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSBhZGRyZXNzMm9zIHRhYmxlIGFjY29yZGluZyB0byBwaHlzaWNhbCBvcmRlci4gIERvaW5nIHNvCisgICAgLy8gd2lsbCBwdXQgYWxsIHRocmVhZHMgb24gdGhlIHNhbWUgY29yZS9wYWNrYWdlL25vZGUgaW4gY29uc2VjdXRpdmUKKyAgICAvLyBsb2NhdGlvbnMuCisgICAgLy8KKyAgICBxc29ydChhZGRyZXNzMm9zLCBudW1BZGRycywgc2l6ZW9mKCphZGRyZXNzMm9zKSwKKyAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2xhYmVscyk7CisKKyAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID49IDApOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlICYmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA+IDApKSB7CisgICAgICAgIEtNUF9JTkZPUk0oVGhyZWFkc01pZ3JhdGUsICJLTVBfQUZGSU5JVFkiLCAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMpOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPj0gKGludClkZXB0aCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRocmVhZHNNYXlNaWdyYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIHRhYmxlLCBmb3JtaW5nIHRoZSBtYXNrcyBmb3IgYWxsIHRocmVhZHMgb24gZWFjaAorICAgIC8vIGNvcmUuICBUaHJlYWRzIG9uIHRoZSBzYW1lIGNvcmUgd2lsbCBoYXZlIGlkZW50aWNhbCAiQWRkcmVzcyIKKyAgICAvLyBvYmplY3RzLCBub3QgY29uc2lkZXJpbmcgdGhlIGxhc3QgbGV2ZWwsIHdoaWNoIG11c3QgYmUgdGhlIHRocmVhZAorICAgIC8vIGlkLiAgQWxsIHRocmVhZHMgb24gYSBjb3JlIHdpbGwgYXBwZWFyIGNvbnNlY3V0aXZlbHkuCisgICAgLy8KKyAgICB1bnNpZ25lZCB1bmlxdWUgPSAwOworICAgIHVuc2lnbmVkIGogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggb2YgMXN0IHRocmVhZCBvbiBjb3JlCisgICAgdW5zaWduZWQgbGVhZGVyID0gMDsKKyAgICBBZGRyZXNzICpsZWFkZXJBZGRyID0gJihhZGRyZXNzMm9zWzBdLmZpcnN0KTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpzdW07CisgICAgS01QX0NQVV9BTExPQ19PTl9TVEFDSyhzdW0pOworICAgIEtNUF9DUFVfWkVSTyhzdW0pOworICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbMF0uc2Vjb25kLCBzdW0pOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIHN1ZmZpY2llbnRseSBjbG9zZSB0byB0aGUgbGVhZGVyICh3aXRoaW4gdGhlCisgICAgICAgIC8vIGdyYW51bGFyaXR5IHNldHRpbmcpLCB0aGVuIHNldCB0aGUgYml0IGZvciB0aGlzIG9zIHRocmVhZCBpbiB0aGUKKyAgICAgICAgLy8gYWZmaW5pdHkgbWFzayBmb3IgdGhpcyBncm91cCwgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IHRocmVhZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGxlYWRlckFkZHItPmlzQ2xvc2UoYWRkcmVzczJvc1tpXS5maXJzdCwKKyAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscykpIHsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbaV0uc2Vjb25kLCBzdW0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGb3IgZXZlcnkgdGhyZWFkIGluIHRoaXMgZ3JvdXAsIGNvcHkgdGhlIG1hc2sgdG8gdGhlIHRocmVhZCdzCisgICAgICAgIC8vIGVudHJ5IGluIHRoZSBvc0lkMk1hc2sgdGFibGUuICBNYXJrIHRoZSBmaXJzdCBhZGRyZXNzIGFzIGEKKyAgICAgICAgLy8gbGVhZGVyLgorICAgICAgICAvLworICAgICAgICBmb3IgKDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3Nbal0uc2Vjb25kOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvc0lkIDw9IG1heE9zSWQpOworICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgICAgIEtNUF9DUFVfQ09QWShtYXNrLCBzdW0pOworICAgICAgICAgICAgYWRkcmVzczJvc1tqXS5maXJzdC5sZWFkZXIgPSAoaiA9PSBsZWFkZXIpOworICAgICAgICB9CisgICAgICAgIHVuaXF1ZSsrOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFN0YXJ0IGEgbmV3IG1hc2suCisgICAgICAgIC8vCisgICAgICAgIGxlYWRlciA9IGk7CisgICAgICAgIGxlYWRlckFkZHIgPSAmKGFkZHJlc3Myb3NbaV0uZmlyc3QpOworICAgICAgICBLTVBfQ1BVX1pFUk8oc3VtKTsKKyAgICAgICAgS01QX0NQVV9TRVQoYWRkcmVzczJvc1tpXS5zZWNvbmQsIHN1bSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGb3IgZXZlcnkgdGhyZWFkIGluIGxhc3QgZ3JvdXAsIGNvcHkgdGhlIG1hc2sgdG8gdGhlIHRocmVhZCdzCisgICAgLy8gZW50cnkgaW4gdGhlIG9zSWQyTWFzayB0YWJsZS4KKyAgICAvLworICAgIGZvciAoOyBqIDwgaTsgaisrKSB7CisgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2pdLnNlY29uZDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvc0lkIDw9IG1heE9zSWQpOworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG9zSWQpOworICAgICAgICBLTVBfQ1BVX0NPUFkobWFzaywgc3VtKTsKKyAgICAgICAgYWRkcmVzczJvc1tqXS5maXJzdC5sZWFkZXIgPSAoaiA9PSBsZWFkZXIpOworICAgIH0KKyAgICB1bmlxdWUrKzsKKyAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhzdW0pOworCisgICAgKm1heEluZGV4ID0gbWF4T3NJZDsKKyAgICAqbnVtVW5pcXVlID0gdW5pcXVlOworICAgIHJldHVybiBvc0lkMk1hc2s7Cit9CisKKworLy8KKy8vIFN0dWZmIGZvciB0aGUgYWZmaW5pdHkgcHJvY2xpc3QgcGFyc2Vycy4gIEl0J3MgZWFzaWVyIHRvIGRlY2xhcmUgdGhlc2UgdmFycworLy8gYXMgZmlsZS1zdGF0aWMgdGhhbiB0byB0cnkgYW5kIHBhc3MgdGhlbSB0aHJvdWdoIHRoZSBjYWxsaW5nIHNlcXVlbmNlIG9mCisvLyB0aGUgcmVjdXJzaXZlLWRlc2NlbnQgT01QX1BMQUNFUyBwYXJzZXIuCisvLworc3RhdGljIGttcF9hZmZpbl9tYXNrX3QgKm5ld01hc2tzOworc3RhdGljIGludCBudW1OZXdNYXNrczsKK3N0YXRpYyBpbnQgbmV4dE5ld01hc2s7CisKKyNkZWZpbmUgQUREX01BU0soX21hc2spIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG5leHROZXdNYXNrID49IG51bU5ld01hc2tzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG51bU5ld01hc2tzICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfSU5URVJOQUxfQUxMT0NfQVJSQVkodGVtcCwgbnVtTmV3TWFza3MpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvcihpPTA7aTxudW1OZXdNYXNrcy8yO2krKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190KiBzcmMgID0gS01QX0NQVV9JTkRFWChuZXdNYXNrcywgaSk7ICAgIFwKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190KiBkZXN0ID0gS01QX0NQVV9JTkRFWCh0ZW1wLCBpKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MvMik7ICAgICAgIFwKKyAgICAgICAgICAgIG5ld01hc2tzID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NQVV9DT1BZKEtNUF9DUFVfSU5ERVgobmV3TWFza3MsIG5leHROZXdNYXNrKSwgKF9tYXNrKSk7ICAgIFwKKyAgICAgICAgbmV4dE5ld01hc2srKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQUREX01BU0tfT1NJRChfb3NJZCxfb3NJZDJNYXNrLF9tYXhPc0lkKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKF9vc0lkKSA+IF9tYXhPc0lkKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVCgoX29zSWQpLCBLTVBfQ1BVX0lOREVYKChfb3NJZDJNYXNrKSwgKF9vc0lkKSkpKSkgeyBcCisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgICAgICBcCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgX29zSWQpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBRERfTUFTSyhLTVBfQ1BVX0lOREVYKF9vc0lkMk1hc2ssIChfb3NJZCkpKTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKy8vCisvLyBSZS1wYXJzZSB0aGUgcHJvY2xpc3QgKGZvciB0aGUgZXhwbGljaXQgYWZmaW5pdHkgdHlwZSksIGFuZCBmb3JtIHRoZSBsaXN0CisvLyBvZiBhZmZpbml0eSBuZXdNYXNrcyBpbmRleGVkIGJ5IGd0aWQuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X3Byb2Nlc3NfcHJvY2xpc3Qoa21wX2FmZmluX21hc2tfdCAqKm91dF9tYXNrcywKKyAgdW5zaWduZWQgaW50ICpvdXRfbnVtTWFza3MsIGNvbnN0IGNoYXIgKnByb2NsaXN0LAorICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2ssIGludCBtYXhPc0lkKQoreworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBwcm9jbGlzdDsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gcHJvY2xpc3Q7CisKKyAgICAvLworICAgIC8vIFdlIHVzZSBtYWxsb2MoKSBmb3IgdGhlIHRlbXBvcmFyeSBtYXNrIHZlY3RvciwKKyAgICAvLyBzbyB0aGF0IHdlIGNhbiB1c2UgcmVhbGxvYygpIHRvIGV4dGVuZCBpdC4KKyAgICAvLworICAgIG51bU5ld01hc2tzID0gMjsKKyAgICBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKG5ld01hc2tzLCBudW1OZXdNYXNrcyk7CisgICAgbmV4dE5ld01hc2sgPSAwOworICAgIGttcF9hZmZpbl9tYXNrX3QgKnN1bU1hc2s7CisgICAgS01QX0NQVV9BTExPQyhzdW1NYXNrKTsKKyAgICBpbnQgc2V0U2l6ZSA9IDA7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzdGFydCwgZW5kLCBzdHJpZGU7CisKKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqbmV4dCA9PSAneycpIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ3snCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksCisgICAgICAgICAgICAgICJiYWQgcHJvY2xpc3QiKTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihudW0gPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENvcHkgdGhlIG1hc2sgZm9yIHRoYXQgb3NJZCB0byB0aGUgc3VtICh1bmlvbikgbWFzay4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKG51bSA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQobnVtLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgbnVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0NQVV9aRVJPKHN1bU1hc2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9DT1BZKHN1bU1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgICAgICAgICBzZXRTaXplID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzZXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOyAgICAgLy8gc2tpcCAnfScKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIG5leHQgaW50ZWdlciBpbiB0aGUgc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksCisgICAgICAgICAgICAgICAgICAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVDIobnVtID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbWFzayBmb3IgdGhhdCBvc0lkIHRvIHRoZSBzdW0gbWFzay4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICgobnVtID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQobnVtLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9VTklPTihzdW1NYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSk7CisgICAgICAgICAgICAgICAgICAgIHNldFNpemUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTSyhzdW1NYXNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgaW50ZWdlci4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUMihzdGFydCA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgYSByYW5nZSwgdGhlbiBhZGQgYSBtYXNrIHRvIHRoZSBsaXN0IGFuZCBnbyBvbi4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCpuZXh0ICE9ICctJykgeworICAgICAgICAgICAgQUREX01BU0tfT1NJRChzdGFydCwgb3NJZDJNYXNrLCBtYXhPc0lkKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIGEgcmFuZ2UuICBTa2lwIG92ZXIgdGhlICctJyBhbmQgcmVhZCBpbiB0aGUgMm5kIGludC4KKyAgICAgICAgLy8KKyAgICAgICAgbmV4dCsrOyAgICAgICAgIC8vIHNraXAgJy0nCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGVuZCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUMihlbmQgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBmb3IgYSBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIHN0cmlkZSA9IDE7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnOicpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBIHN0cmlkZSBpcyBzcGVjaWZpZWQuICBTa2lwIG92ZXIgdGhlICc6IiBhbmQgcmVhZCB0aGUgM3JkIGludC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICAgICAgbmV4dCsrOyAgICAgICAgIC8vIHNraXAgJzonCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICAnMCcpICYmICgqbmV4dCA8PSAnOScpLAorICAgICAgICAgICAgICAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKHN0cmlkZSA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICAgICAgc3RyaWRlICo9IHNpZ247CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBEbyBzb21lIHJhbmdlIGNoZWNrcy4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVDIoc3RyaWRlICE9IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihzdGFydCA8PSBlbmQsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihzdGFydCA+PSBlbmQsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgS01QX0FTU0VSVDIoKGVuZCAtIHN0YXJ0KSAvIHN0cmlkZSA8PSA2NTUzNiwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAvLworICAgICAgICAvLyBBZGQgdGhlIG1hc2sgZm9yIGVhY2ggT1MgcHJvYyAjIHRvIHRoZSBsaXN0LgorICAgICAgICAvLworICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gc3RyaWRlOworICAgICAgICAgICAgfSB3aGlsZSAoc3RhcnQgPD0gZW5kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTS19PU0lEKHN0YXJ0LCBvc0lkMk1hc2ssIG1heE9zSWQpOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHN0YXJ0ID49IGVuZCk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0KKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgfQorCisgICAgKm91dF9udW1NYXNrcyA9IG5leHROZXdNYXNrOworICAgIGlmIChuZXh0TmV3TWFzayA9PSAwKSB7CisgICAgICAgICpvdXRfbWFza3MgPSBOVUxMOworICAgICAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfQ1BVX0FMTE9DX0FSUkFZKCgqb3V0X21hc2tzKSwgbmV4dE5ld01hc2spOworICAgIGZvcihpID0gMDsgaSA8IG5leHROZXdNYXNrOyBpKyspIHsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCogc3JjICA9IEtNUF9DUFVfSU5ERVgobmV3TWFza3MsIGkpOworICAgICAgICBrbXBfYWZmaW5fbWFza190KiBkZXN0ID0gS01QX0NQVV9JTkRFWCgoKm91dF9tYXNrcyksIGkpOworICAgICAgICBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKTsKKyAgICB9CisgICAgS01QX0NQVV9JTlRFUk5BTF9GUkVFX0FSUkFZKG5ld01hc2tzLCBudW1OZXdNYXNrcyk7CisgICAgS01QX0NQVV9GUkVFKHN1bU1hc2spOworfQorCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZS1wYXJzZSB0aGUgT01QX1BMQUNFUyBwcm9jIGlkIGxpc3QsIGZvcm1pbmcgdGhlIG5ld01hc2tzIGZvciB0aGUgZGlmZmVyZW50CitwbGFjZXMuICBBZ2FpbiwgSGVyZSBpcyB0aGUgZ3JhbW1hcjoKKworcGxhY2VfbGlzdCA6PSBwbGFjZQorcGxhY2VfbGlzdCA6PSBwbGFjZSAsIHBsYWNlX2xpc3QKK3BsYWNlIDo9IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtIDogc2lnbmVkCitwbGFjZSA6PSB7IHN1YnBsYWNlbGlzdCB9CitwbGFjZSA6PSAhIHBsYWNlICAgICAgICAgICAgICAgICAgLy8gKGxvd2VzdCBwcmlvcml0eSkKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UgLCBzdWJwbGFjZV9saXN0CitzdWJwbGFjZSA6PSBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtIDogc2lnbmVkCitzaWduZWQgOj0gbnVtCitzaWduZWQgOj0gKyBzaWduZWQKK3NpZ25lZCA6PSAtIHNpZ25lZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcm9jZXNzX3N1YnBsYWNlX2xpc3QoY29uc3QgY2hhciAqKnNjYW4sIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgaW50IG1heE9zSWQsIGttcF9hZmZpbl9tYXNrX3QgKnRlbXBNYXNrLCBpbnQgKnNldFNpemUpCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlLCBpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgaW4gdGhlIHN0YXJ0aW5nIHByb2MgaWQKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdGFydCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JyB8fCAqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChzdGFydCwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZG9uJ3QgcHJvbGlmZXJhdGUgd2FybmluZ3MgZm9yIGxhcmdlIGNvdW50CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICcrJykgeworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICAgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JyB8fCAqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChzdGFydCwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZG9uJ3QgcHJvbGlmZXJhdGUgd2FybmluZ3MgZm9yIGxhcmdlIGNvdW50CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3Byb2Nlc3NfcGxhY2UoY29uc3QgY2hhciAqKnNjYW4sIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgaW50IG1heE9zSWQsIGttcF9hZmZpbl9tYXNrX3QgKnRlbXBNYXNrLCBpbnQgKnNldFNpemUpCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIC8vCisgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICd7JyAnIScgYW5kIG51bQorICAgIC8vCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAneycpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ3snCisgICAgICAgIF9fa21wX3Byb2Nlc3Nfc3VicGxhY2VfbGlzdChzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQgLCB0ZW1wTWFzaywKKyAgICAgICAgICBzZXRTaXplKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICd9JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnfScKKyAgICB9CisgICAgZWxzZSBpZiAoKipzY2FuID09ICchJykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnIScKKyAgICAgICAgX19rbXBfcHJvY2Vzc19wbGFjZShzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQsIHRlbXBNYXNrLCBzZXRTaXplKTsKKyAgICAgICAgS01QX0NQVV9DT01QTEVNRU5UKG1heE9zSWQsIHRlbXBNYXNrKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSkgeworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBpbnQgbnVtID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKG51bSA+PSAwKTsKKyAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQobnVtLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSkpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgbnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgfQorICAgICAgICAqc2NhbiA9IG5leHQ7ICAvLyBza2lwIG51bQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgIH0KK30KKworCisvL3N0YXRpYyB2b2lkCit2b2lkCitfX2ttcF9hZmZpbml0eV9wcm9jZXNzX3BsYWNlbGlzdChrbXBfYWZmaW5fbWFza190ICoqb3V0X21hc2tzLAorICB1bnNpZ25lZCBpbnQgKm91dF9udW1NYXNrcywgY29uc3QgY2hhciAqcGxhY2VsaXN0LAorICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2ssIGludCBtYXhPc0lkKQoreworICAgIGludCBpLGosY291bnQsc3RyaWRlLHNpZ247CisgICAgY29uc3QgY2hhciAqc2NhbiA9IHBsYWNlbGlzdDsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gcGxhY2VsaXN0OworCisgICAgbnVtTmV3TWFza3MgPSAyOworICAgIEtNUF9DUFVfSU5URVJOQUxfQUxMT0NfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICBuZXh0TmV3TWFzayA9IDA7CisKKyAgICAvLyB0ZW1wTWFzayBpcyBtb2RpZmllZCBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb3IgaW5pdGlhbAorICAgIC8vICAgcGxhY2UgdG8gZm9ybSB0aGUgY3VycmVudCBwbGFjZQorICAgIC8vIHByZXZpb3VzTWFzayBjb250YWlucyB0aGUgcHJldmlvdXMgcGxhY2UKKyAgICBrbXBfYWZmaW5fbWFza190ICp0ZW1wTWFzazsKKyAgICBrbXBfYWZmaW5fbWFza190ICpwcmV2aW91c01hc2s7CisgICAgS01QX0NQVV9BTExPQyh0ZW1wTWFzayk7CisgICAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgICBLTVBfQ1BVX0FMTE9DKHByZXZpb3VzTWFzayk7CisgICAgS01QX0NQVV9aRVJPKHByZXZpb3VzTWFzayk7CisgICAgaW50IHNldFNpemUgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgICBfX2ttcF9wcm9jZXNzX3BsYWNlKCZzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQsIHRlbXBNYXNrLCAmc2V0U2l6ZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJyB8fCAqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGlmIChzZXRTaXplID4gMCkgeworICAgICAgICAgICAgICAgIEFERF9NQVNLKHRlbXBNYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCpzY2FuID49ICcwJykgJiYgKCpzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGNvdW50ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcgfHwgKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzdHJpZGUgPSArMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCpzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBzaWduID0gKzE7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbisrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpzY2FuID49ICcwJykgJiYgKCpzY2FuIDw9ICc5JyksCisgICAgICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBwbGFjZXMgZGV0ZXJtaW5lZCBieSBpbml0aWFsX3BsYWNlIDogY291bnQgOiBzdHJpZGUKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzZXRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBwbGFjZSwgdGhlbiBidWlsZCB0aGUgbmV4dCBwbGFjZSAodGVtcE1hc2spIGZyb20gdGhhdAorICAgICAgICAgICAgS01QX0NQVV9DT1BZKHByZXZpb3VzTWFzaywgdGVtcE1hc2spOworICAgICAgICAgICAgQUREX01BU0socHJldmlvdXNNYXNrKTsKKyAgICAgICAgICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaiwgcHJldmlvdXNNYXNrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChqLCBwcmV2aW91c01hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoaitzdHJpZGUgPiBtYXhPc0lkKSB8fCAoaitzdHJpZGUgPCAwKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChqK3N0cmlkZSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIGorc3RyaWRlKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpICYmIGkgPCBjb3VudCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIGorc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoaitzdHJpZGUsIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgICBzZXRTaXplID0gMDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICB9CisKKyAgICAqb3V0X251bU1hc2tzID0gbmV4dE5ld01hc2s7CisgICAgaWYgKG5leHROZXdNYXNrID09IDApIHsKKyAgICAgICAgKm91dF9tYXNrcyA9IE5VTEw7CisgICAgICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtNUF9DUFVfQUxMT0NfQVJSQVkoKCpvdXRfbWFza3MpLCBuZXh0TmV3TWFzayk7CisgICAgS01QX0NQVV9GUkVFKHRlbXBNYXNrKTsKKyAgICBLTVBfQ1BVX0ZSRUUocHJldmlvdXNNYXNrKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBuZXh0TmV3TWFzazsgaSsrKSB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIHNyYyAgPSBLTVBfQ1BVX0lOREVYKG5ld01hc2tzLCBpKTsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCogZGVzdCA9IEtNUF9DUFVfSU5ERVgoKCpvdXRfbWFza3MpLCBpKTsKKyAgICAgICAgS01QX0NQVV9DT1BZKGRlc3QsIHNyYyk7CisgICAgfQorICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworfQorCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyN1bmRlZiBBRERfTUFTSworI3VuZGVmIEFERF9NQVNLX09TSUQKKworc3RhdGljIHZvaWQKK19fa21wX2FwcGx5X3RocmVhZF9wbGFjZXMoQWRkclVuc1BhaXIgKipwQWRkciwgaW50IGRlcHRoKQoreworICAgIGlmIChfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9PSAwICYmCisgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9PSAwICYmCisgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID09IDAgKQorICAgICAgICByZXR1cm47ICAgLy8gbm8gdG9wb2xvZ3kgbGltaXRpbmcgYWN0aW9ucyByZXF1ZXN0ZWQsIGV4aXQKKyAgICBpZiAoX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPT0gMCkKKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPSBuUGFja2FnZXM7ICAgIC8vIHVzZSBhbGwgYXZhaWxhYmxlIHNvY2tldHMKKyAgICBpZiAoX19rbXBfcGxhY2VfbnVtX2NvcmVzID09IDApCisgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG5Db3Jlc1BlclBrZzsgICAvLyB1c2UgYWxsIGF2YWlsYWJsZSBjb3JlcworICAgIGlmIChfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9PSAwIHx8CisgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID4gX19rbXBfblRocmVhZHNQZXJDb3JlKQorICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IF9fa21wX25UaHJlYWRzUGVyQ29yZTsgLy8gdXNlIGFsbCBIVyBjb250ZXh0cworCisgICAgaWYgKCAhX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpICkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmVGhyUGxhY2VOb25Vbmlmb3JtICk7CisgICAgICAgIHJldHVybjsgLy8gZG9uJ3Qgc3VwcG9ydCBub24tdW5pZm9ybSB0b3BvbG9neQorICAgIH0KKyAgICBpZiAoIGRlcHRoICE9IDMgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZU5vblRocmVlTGV2ZWwgKTsKKyAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBzdXBwb3J0IG5vdC0zLWxldmVsIHRvcG9sb2d5CisgICAgfQorICAgIGlmIChfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ICsgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPiBuUGFja2FnZXMpIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VNYW55U29ja2V0cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCArIF9fa21wX3BsYWNlX251bV9jb3JlcyA+IG5Db3Jlc1BlclBrZyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlTWFueUNvcmVzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBZGRyVW5zUGFpciAqbmV3QWRkciA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoQWRkclVuc1BhaXIpICoKKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgKiBfX2ttcF9wbGFjZV9udW1fY29yZXMgKiBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSk7CisKKyAgICBpbnQgaSwgaiwgaywgbl9vbGQgPSAwLCBuX25ldyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG5QYWNrYWdlczsgKytpKQorICAgICAgICBpZiAoaSA8IF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQgfHwKKyAgICAgICAgICAgIGkgPj0gX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCArIF9fa21wX3BsYWNlX251bV9zb2NrZXRzKQorICAgICAgICAgICAgbl9vbGQgKz0gbkNvcmVzUGVyUGtnICogX19rbXBfblRocmVhZHNQZXJDb3JlOyAvLyBza2lwIG5vdC1yZXF1ZXN0ZWQgc29ja2V0CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuQ29yZXNQZXJQa2c7ICsraikgLy8gd2FsayB0aHJvdWdoIHJlcXVlc3RlZCBzb2NrZXQKKyAgICAgICAgICAgICAgICBpZiAoaiA8IF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgICAgIGogPj0gX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fY29yZXMpCisgICAgICAgICAgICAgICAgICAgIG5fb2xkICs9IF9fa21wX25UaHJlYWRzUGVyQ29yZTsgLy8gc2tpcCBub3QtcmVxdWVzdGVkIGNvcmUKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBfX2ttcF9uVGhyZWFkc1BlckNvcmU7ICsraykgeyAvLyB3YWxrIHRocm91Z2ggcmVxdWVzdGVkIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrIDwgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBZGRyW25fbmV3XSA9ICgqcEFkZHIpW25fb2xkXTsgLy8gY29sbGVjdCByZXF1ZXN0ZWQgdGhyZWFkJ3MgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fbmV3Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuX29sZCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChuX29sZCA9PSBuUGFja2FnZXMgKiBuQ29yZXNQZXJQa2cgKiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpOworICAgIEtNUF9ERUJVR19BU1NFUlQobl9uZXcgPT0gX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgKiBfX2ttcF9wbGFjZV9udW1fY29yZXMgKgorICAgICAgICAgICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpOworCisgICAgblBhY2thZ2VzID0gX19rbXBfcGxhY2VfbnVtX3NvY2tldHM7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgblBhY2thZ2VzCisgICAgbkNvcmVzUGVyUGtnID0gX19rbXBfcGxhY2VfbnVtX2NvcmVzOyAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgbkNvcmVzUGVyUGtnCisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmU7IC8vIGNvcnJlY3QgX19rbXBfblRocmVhZHNQZXJDb3JlCisgICAgX19rbXBfYXZhaWxfcHJvYyA9IG5fbmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgYXZhaWxfcHJvYworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyAqIF9fa21wX3BsYWNlX251bV9jb3JlczsgICAgICAgICAvLyBjb3JyZWN0IG5jb3JlcworCisgICAgX19rbXBfZnJlZSggKnBBZGRyICk7CisgICAgKnBBZGRyID0gbmV3QWRkcjsgICAgICAvLyByZXBsYWNlIG9sZCB0b3BvbG9neSB3aXRoIG5ldyBvbmUKK30KKworCitzdGF0aWMgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MgPSBOVUxMOworc3RhdGljIGludCAgICAgICAgICAgKiBwcm9jYXJyID0gTlVMTDsKK3N0YXRpYyBpbnQgICAgIF9fa21wX2FmZl9kZXB0aCA9IDA7CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdXhfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIGlmIChfX2ttcF9hZmZpbml0eV9tYXNrcyAhPSBOVUxMKSB7CisgICAgICAgIEtNUF9BU1NFUlQoZnVsbE1hc2sgIT0gTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENyZWF0ZSB0aGUgImZ1bGwiIG1hc2sgLSB0aGlzIGRlZmluZXMgYWxsIG9mIHRoZSBwcm9jZXNzb3JzIHRoYXQgd2UKKyAgICAvLyBjb25zaWRlciB0byBiZSBpbiB0aGUgbWFjaGluZSBtb2RlbC4gIElmIHJlc3BlY3QgaXMgc2V0LCB0aGVuIGl0IGlzCisgICAgLy8gdGhlIGluaXRpYWxpemF0aW9uIHRocmVhZCdzIGFmZmluaXR5IG1hc2suICBPdGhlcndpc2UsIGl0IGlzIGFsbAorICAgIC8vIHByb2Nlc3NvcnMgdGhhdCB3ZSBrbm93IGFib3V0IG9uIHRoZSBtYWNoaW5lLgorICAgIC8vCisgICAgaWYgKGZ1bGxNYXNrID09IE5VTEwpIHsKKyAgICAgICAgS01QX0NQVV9BTExPQyhmdWxsTWFzayk7CisgICAgfQorICAgIGlmIChLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoZnVsbE1hc2ssIFRSVUUpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29ycy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB1bnNpZ25lZCBpOworICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IDA7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksIGZ1bGxNYXNrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX2ttcF9hdmFpbF9wcm9jID4gX19rbXBfeHByb2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhFcnJvckluaXRpYWxpemVBZmZpbml0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZW50aXJlX21hY2hpbmVfbWFzayhmdWxsTWFzayk7CisgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gX19rbXBfeHByb2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgZGVwdGggPSAtMTsKKyAgICBrbXBfaTE4bl9pZF90IG1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBzZXR0aW5nIEtNUF9DUFVJTkZPX0ZJTEUgPT4KKyAgICAvLyBLTVBfVE9QT0xPR1lfTUVUSE9EPWNwdWluZm8KKyAgICAvLworICAgIGlmICgoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpICYmCisgICAgICAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCkpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCkgeworICAgICAgICAvLworICAgICAgICAvLyBJbiB0aGUgZGVmYXVsdCBjb2RlIHBhdGgsIGVycm9ycyBhcmUgbm90IGZhdGFsIC0gd2UganVzdCB0cnkgdXNpbmcKKyAgICAgICAgLy8gYW5vdGhlciBtZXRob2QuICBXZSBvbmx5IGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYWZmaW5pdHkgaXMgb24sCisgICAgICAgIC8vIG9yIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0LCBhbiB0aGUgbm93YXJuaW5ncyBmbGFnIHdhcyBub3Qgc2V0LgorICAgICAgICAvLworICAgICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUgPSBOVUxMOworICAgICAgICBpbnQgbGluZSA9IDA7CisjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFfX2ttcF9od2xvY19lcnJvcikgeworICAgICAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2h3bG9jX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZGVwdGggPCAwICYmIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZJZ25vcmluZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZklnbm9yaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIyBlbmRpZgorCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsIEtNUF9JMThOX1NUUihEZWNvZGluZ3gyQVBJQykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWxlX25hbWUgPSBOVUxMOworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXNnX2lkICE9IGttcF9pMThuX251bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0clN0ciwgIktNUF9BRkZJTklUWSIsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLCBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSBOVUxMOworICAgICAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2FwaWNpZF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjIGlmIEtNUF9PU19MSU5VWAorCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmU3RyUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpLCAiL3Byb2MvY3B1aW5mbyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZQYXJzZUZpbGVuYW1lLCAiS01QX0FGRklOSVRZIiwgIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigiL3Byb2MvY3B1aW5mbyIsICJyIik7CisgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbXNnX2lkID0ga21wX2kxOG5fc3RyX0NhbnRPcGVuQ3B1aW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9ICIvcHJvYy9jcHVpbmZvIjsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcCgmYWRkcmVzczJvcywgJmxpbmUsICZtc2dfaWQsIGYpOworICAgICAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjIGVuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgICAgICAgIGlmICgoZGVwdGggPCAwKSAmJiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZXaW5kb3dzUHJvY0dyb3VwTWFwLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3Byb2NfZ3JvdXBfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggIT0gMCk7CisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAmJiAobXNnX2lkICE9IGttcF9pMThuX251bGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdGbGF0T1MsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGluZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdGbGF0T1NGaWxlLCBmaWxlX25hbWUsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdGbGF0T1NGaWxlTGluZSwgZmlsZV9uYW1lLCBsaW5lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUUgLSBwcmludCBtc2cgaWYgbXNnX2lkID0ga21wX2kxOG5fbnVsbCA/Pz8KKworICAgICAgICAgICAgZmlsZV9uYW1lID0gIiI7CisgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9mbGF0X21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zICE9IE5VTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIHRoYXQgYSBwYXJpY3VsYXIgdG9wb2xvZ3kgZGlzY292ZXJ5IG1ldGhvZAorICAgIC8vIGlzIHRvIGJlIHVzZWQsIHRoZW4gd2UgYWJvcnQgaWYgdGhhdCBtZXRob2QgZmFpbHMuICBUaGUgZXhjZXB0aW9uIGlzCisgICAgLy8gZ3JvdXAgYWZmaW5pdHksIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBpbXBsaWNpdGx5IHNldC4KKyAgICAvLworCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyLCAiS01QX0FGRklOSVRZIiwKKyAgICAgICAgICAgICAgS01QX0kxOE5fU1RSKERlY29kaW5neDJBUElDKSk7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgICAgICAgS01QX0ZBVEFMKE1zZ0V4aXRpbmcsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLAorICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm8pIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgICAgIGlmIChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgZmlsZW5hbWUgPSBfX2ttcF9jcHVpbmZvX2ZpbGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmaWxlbmFtZSA9ICIvcHJvYy9jcHVpbmZvIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludCBjb2RlID0gZXJybm87CisgICAgICAgICAgICBpZiAoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoY29kZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoTmFtZUNvbWVzRnJvbV9DUFVJTkZPX0ZJTEUpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoY29kZSksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgbGluZSA9IDA7CisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCZhZGRyZXNzMm9zLCAmbGluZSwgJm1zZ19pZCwgZik7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICAgICAgICBpZiAobGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoRmlsZUxpbmVNc2dFeGl0aW5nLCBmaWxlbmFtZSwgbGluZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEZpbGVNc2dFeGl0aW5nLCBmaWxlbmFtZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggPT0gMCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXApIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmV2luZG93c1Byb2NHcm91cE1hcCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfcHJvY19ncm91cF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBLTVBfQVNTRVJUKGRlcHRoICE9IDApOworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0ZsYXRPUywgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZCBub3QgZmFpbAorICAgICAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyAhPSBOVUxMKTsKKyAgICB9CisKKyMgaWYgS01QX1VTRV9IV0xPQworICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9od2xvYykgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfaHdsb2NfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorIyAgaWYgS01QX0RFQlVHCisgICAgICAgIEFkZHJVbnNQYWlyICpvdGhlcmFkZHJlc3Myb3MgPSBOVUxMOworICAgICAgICBpbnQgb3RoZXJkZXB0aCA9IC0xOworIyAgIGlmIEtNUF9NSUMKKyAgICAgICAgb3RoZXJkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKCZvdGhlcmFkZHJlc3Myb3MsICZtc2dfaWQpOworIyAgIGVsc2UKKyAgICAgICAgb3RoZXJkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoJm90aGVyYWRkcmVzczJvcywgJm1zZ19pZCk7CisjICAgZW5kaWYKKyAgICAgICAgaWYob3RoZXJhZGRyZXNzMm9zICE9IE5VTEwgJiYgYWRkcmVzczJvcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGFyZW50X2VxdWFsX2ZsYWcgPSAwOworICAgICAgICAgICAgZm9yKGk9MDtpPF9fa21wX2F2YWlsX3Byb2M7aSsrKSB7CisgICAgICAgICAgICAgICAgaWYob3RoZXJhZGRyZXNzMm9zW2ldICE9IGFkZHJlc3Myb3NbaV0pIGFyZW50X2VxdWFsX2ZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYXJlbnRfZXF1YWxfZmxhZykgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplOiBId2xvYyBhZmZpbml0eSBwbGFjZXMgYXJlIGRpZmZlcmVudCBmcm9tIEFQSUNJRFxuIikpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplOiBBUElDSUQgVGFibGU6XG4iKSk7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPF9fa21wX2F2YWlsX3Byb2M7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG90aGVyYWRkcmVzczJvc1tpXS5wcmludCgpOyBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplOiBId2xvYyBUYWJsZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBmb3IoaT0wO2k8X19rbXBfYXZhaWxfcHJvYztpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzczJvc1tpXS5wcmludCgpOyBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfYXV4X2FmZmluaXR5X2luaXRpYWxpemU6IEh3bG9jIGFmZmluaXR5IHBsYWNlcyBhcmUgc2FtZSBhcyBBUElDSURcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIyAgZW5kaWYgLy8gS01QX0RFQlVHCisgICAgfQorIyBlbmRpZiAvLyBLTVBfVVNFX0hXTE9DCisKKyAgICBpZiAoYWRkcmVzczJvcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoRXJyb3JJbml0aWFsaXplQWZmaW5pdHkpOworICAgICAgICB9CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX19rbXBfYXBwbHlfdGhyZWFkX3BsYWNlcygmYWRkcmVzczJvcywgZGVwdGgpOworCisgICAgLy8KKyAgICAvLyBDcmVhdGUgdGhlIHRhYmxlIG9mIG1hc2tzLCBpbmRleGVkIGJ5IHRocmVhZCBJZC4KKyAgICAvLworICAgIHVuc2lnbmVkIG1heEluZGV4OworICAgIHVuc2lnbmVkIG51bVVuaXF1ZTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2sgPSBfX2ttcF9jcmVhdGVfbWFza3MoJm1heEluZGV4LCAmbnVtVW5pcXVlLAorICAgICAgYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID09IDApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoaW50KW51bVVuaXF1ZSA9PSBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgY2hpbGROdW1zIHZlY3RvciBpbiBhbGwgQWRkcmVzcyBvYmplY3RzLiAgVGhpcyBtdXN0IGJlIGRvbmUKKyAgICAvLyBiZWZvcmUgd2UgY2FuIHNvcnQgdXNpbmcgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKCksCisgICAgLy8gd2hpY2ggdGFrZXMgaW50byBhY2NvdW50IHRoZSBzZXR0aW5nIG9mIF9fa21wX2FmZmluaXR5X2NvbXBhY3QuCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbml0eV9hc3NpZ25fY2hpbGRfbnVtcyhhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIHN3aXRjaCAoX19rbXBfYWZmaW5pdHlfdHlwZSkgeworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsKQorIyBlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jZXNzX3Byb2NsaXN0KCZfX2ttcF9hZmZpbml0eV9tYXNrcywKKyAgICAgICAgICAgICAgJl9fa21wX2FmZmluaXR5X251bV9tYXNrcywgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsIG9zSWQyTWFzaywKKyAgICAgICAgICAgICAgbWF4SW5kZXgpOworICAgICAgICB9CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wbGFjZWxpc3QoJl9fa21wX2FmZmluaXR5X21hc2tzLAorICAgICAgICAgICAgICAmX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzLCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCwgb3NJZDJNYXNrLAorICAgICAgICAgICAgICBtYXhJbmRleCk7CisgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmTm9WYWxpZFByb2NJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgb3RoZXIgYWZmaW5pdHkgdHlwZXMgcmVseSBvbiBzb3J0aW5nIHRoZSBBZGRyZXNzZXMgYWNjb3JkaW5nCisgICAgICAgIC8vIHRvIHNvbWUgcGVybXV0YXRpb24gb2YgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdHJlZS4gIFNldAorICAgICAgICAvLyBfX2ttcF9hZmZpbml0eV9jb21wYWN0IGFuZCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgYXBwcm9wcmlhdGVseSwKKyAgICAgICAgLy8gdGhlbiBqdW1wIHRvIGEgY29tbW9uIGNvZGUgZnJhZ21lbnQgdG8gZG8gdGhlIHNvcnQgYW5kIGNyZWF0ZQorICAgICAgICAvLyB0aGUgYXJyYXkgb2YgYWZmaW5pdHkgbWFza3MuCisgICAgICAgIC8vCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOgorICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X29mZnNldCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ID0gX19rbXBfblRocmVhZHNQZXJDb3JlICogX19rbXBfYWZmaW5pdHlfb2Zmc2V0CisgICAgICAgICAgICAgICUgX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDoKKyAgICAgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA+IDEpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAxOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9vZmZzZXQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCA9IF9fa21wX25UaHJlYWRzUGVyQ29yZSAqIF9fa21wX2FmZmluaXR5X29mZnNldAorICAgICAgICAgICAgICAlIF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjoKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IGRlcHRoIC0gMSAtIF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDoKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSBkZXB0aCAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6CisgICAgICAgIC8vIEJhbGFuY2VkIHdvcmtzIG9ubHkgZm9yIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHBhY2thZ2UKKyAgICAgICAgaWYoIG5QYWNrYWdlcyA+IDEgKSB7CisgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmQmFsYW5jZWROb3RBdmFpbCwgIktNUF9BRkZJTklUWSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeyAvLyBOb24tdW5pZm9ybSB0b3BvbG9neQorCisgICAgICAgICAgICAvLyBTYXZlIHRoZSBkZXB0aCBmb3IgZnVydGhlciB1c2FnZQorICAgICAgICAgICAgX19rbXBfYWZmX2RlcHRoID0gZGVwdGg7CisKKyAgICAgICAgICAgIC8vIE51bWJlciBvZiBoeXBlciB0aHJlYWRzIHBlciBjb3JlIGluIEhUIG1hY2hpbmUKKyAgICAgICAgICAgIGludCBudGhfcGVyX2NvcmUgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisKKyAgICAgICAgICAgIGludCBjb3JlX2xldmVsOworICAgICAgICAgICAgaWYoIG50aF9wZXJfY29yZSA+IDEgKSB7CisgICAgICAgICAgICAgICAgY29yZV9sZXZlbCA9IGRlcHRoIC0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29yZV9sZXZlbCA9IGRlcHRoIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBuY29yZXMgPSBhZGRyZXNzMm9zWyBfX2ttcF9hdmFpbF9wcm9jIC0gMSBdLmZpcnN0LmxhYmVsc1sgY29yZV9sZXZlbCBdICsgMTsKKyAgICAgICAgICAgIGludCBucHJvYyA9IG50aF9wZXJfY29yZSAqIG5jb3JlczsKKworICAgICAgICAgICAgcHJvY2FyciA9ICggaW50ICogKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGludCApICogbnByb2MgKTsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBwcm9jYXJyWyBpIF0gPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaW50IHByb2MgPSBhZGRyZXNzMm9zWyBpIF0uc2Vjb25kOworICAgICAgICAgICAgICAgIC8vIElmIGRlcHRoID09IDMgdGhlbiBsZXZlbD0wIC0gcGFja2FnZSwgbGV2ZWw9MSAtIGNvcmUsIGxldmVsPTIgLSB0aHJlYWQuCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgdGhyZWFkIHBlciBjb3JlIHRoZW4gZGVwdGggPT0gMjogbGV2ZWwgMCAtIHBhY2thZ2UsCisgICAgICAgICAgICAgICAgLy8gbGV2ZWwgMSAtIGNvcmUuCisgICAgICAgICAgICAgICAgaW50IGxldmVsID0gZGVwdGggLSAxOworCisgICAgICAgICAgICAgICAgLy8gX19rbXBfbnRoX3Blcl9jb3JlID09IDEKKyAgICAgICAgICAgICAgICBpbnQgdGhyZWFkID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgY29yZSA9IGFkZHJlc3Myb3NbIGkgXS5maXJzdC5sYWJlbHNbIGxldmVsIF07CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBsZXZlbCBleGlzdHMsIHRoYXQgaXMgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIHRocmVhZCBjb250ZXh0IHBlciBjb3JlCisgICAgICAgICAgICAgICAgaWYoIG50aF9wZXJfY29yZSA+IDEgKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGFkZHJlc3Myb3NbIGkgXS5maXJzdC5sYWJlbHNbIGxldmVsIF0gJSBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIGNvcmUgPSBhZGRyZXNzMm9zWyBpIF0uZmlyc3QubGFiZWxzWyBsZXZlbCAtIDEgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvY2FyclsgY29yZSAqIG50aF9wZXJfY29yZSArIHRocmVhZCBdID0gcHJvYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzb3J0QWRkcmVzc2VzOgorICAgICAgICAvLworICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgZ3RpZC0+YWZmaW5pdHkgbWFzayB0YWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2R1cHMpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBudW1VbmlxdWU7CisgICAgICAgIH0KKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9pbnRlbCApCisgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID4gMCApCisgICAgICAgICAgJiYgKCAodW5zaWduZWQpX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA8IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKyAgICAgICAgfQorIyBlbmRpZgorCisgICAgICAgIEtNUF9DUFVfQUxMT0NfQVJSQVkoX19rbXBfYWZmaW5pdHlfbWFza3MsIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU29ydCB0aGUgYWRkcmVzczJvcyB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBvZgorICAgICAgICAvLyBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCB0aGVuIGZpbGwgb3V0IF9fa21wX2FmZmluaXR5X21hc2tzLgorICAgICAgICAvLworICAgICAgICBxc29ydChhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBzaXplb2YoKmFkZHJlc3Myb3MpLAorICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2NoaWxkX251bSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgdW5zaWduZWQgajsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCghIF9fa21wX2FmZmluaXR5X2R1cHMpICYmICghIGFkZHJlc3Myb3NbaV0uZmlyc3QubGVhZGVyKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3NbaV0uc2Vjb25kOworICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKnNyYyA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpkZXN0CisgICAgICAgICAgICAgICAgICA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIGopOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoS01QX0NQVV9JU1NFVChvc0lkLCBzcmMpKTsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKTsKKyAgICAgICAgICAgICAgICBpZiAoKytqID49IF9fa21wX2FmZmluaXR5X251bV9tYXNrcykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGogPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUMigwLCAiVW5leHBlY3RlZCBhZmZpbml0eSBzZXR0aW5nIik7CisgICAgfQorCisgICAgX19rbXBfZnJlZShvc0lkMk1hc2spOworICAgIG1hY2hpbmVfaGllcmFyY2h5LmluaXQoYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYyk7Cit9CisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8vCisgICAgLy8gTXVjaCBvZiB0aGUgY29kZSBhYm92ZSB3YXMgd3JpdHRlbiBhc3N1bW1pbmcgdGhhdCBpZiBhIG1hY2hpbmUgd2FzIG5vdAorICAgIC8vIGFmZmluaXR5IGNhcGFibGUsIHRoZW4gX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLiAgV2Ugbm93CisgICAgLy8gZXhwbGljaXRseSByZXByZXNlbnQgdGhpcyBhcyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkLgorICAgIC8vCisgICAgLy8gVGhlcmUgYXJlIHRvbyBtYW55IGNoZWNrcyBmb3IgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lCisgICAgLy8gaW4gdGhpcyBjb2RlLiAgSW5zdGVhZCBvZiB0cnlpbmcgdG8gY2hhbmdlIHRoZW0gYWxsLCBjaGVjayBpZgorICAgIC8vIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQsIGFuZCBpZiBzbywgc2xhbSBpdCB3aXRoCisgICAgLy8gYWZmaW5pdHlfbm9uZSwgY2FsbCB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLCB0aGVuIHJlc3RvcmUKKyAgICAvLyBfX2ttcF9hZmZpbml0eV90eXBlIHRvIGFmZmluaXR5X2Rpc2FibGVkLgorICAgIC8vCisgICAgaW50IGRpc2FibGVkID0gKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQpOworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgS01QX0FTU0VSVChkaXNhYmxlZCk7CisgICAgfQorICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICB9CisgICAgX19rbXBfYXV4X2FmZmluaXR5X2luaXRpYWxpemUoKTsKKyAgICBpZiAoZGlzYWJsZWQpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2Rpc2FibGVkOworICAgIH0KK30KKworCit2b2lkCitfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUodm9pZCkKK3sKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfbWFza3MgIT0gTlVMTCkgeworICAgICAgICBLTVBfQ1BVX0ZSRUVfQVJSQVkoX19rbXBfYWZmaW5pdHlfbWFza3MsIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisgICAgICAgIF9fa21wX2FmZmluaXR5X21hc2tzID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGZ1bGxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgS01QX0NQVV9GUkVFKGZ1bGxNYXNrKTsKKyAgICAgICAgZnVsbE1hc2sgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSAwOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworIyBlbmRpZgorICAgIGlmIChfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QpOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IE5VTEw7CisgICAgfQorICAgIGlmKCBhZGRyZXNzMm9zICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIGFkZHJlc3Myb3MgKTsKKyAgICAgICAgYWRkcmVzczJvcyA9IE5VTEw7CisgICAgfQorICAgIGlmKCBwcm9jYXJyICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIHByb2NhcnIgKTsKKyAgICAgICAgcHJvY2FyciA9IE5VTEw7CisgICAgfQorfQorCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soaW50IGd0aWQsIGludCBpc2Ffcm9vdCkKK3sKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfaW5mb190ICp0aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0pOworICAgIGlmICh0aC0+dGgudGhfYWZmaW5fbWFzayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9DUFVfQUxMT0ModGgtPnRoLnRoX2FmZmluX21hc2spOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0NQVV9aRVJPKHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvcHkgdGhlIHRocmVhZCBtYXNrIHRvIHRoZSBrbXBfaW5mb190IHN0cnVjdXR1cmUuCisgICAgLy8gSWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLCBjb3B5IHRoZSAiZnVsbCIgbWFzaywgaS5lLiBvbmUKKyAgICAvLyB0aGF0IGhhcyBhbGwgb2YgdGhlIE9TIHByb2MgaWRzIHNldCwgb3IgaWYgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrCisgICAgLy8gaXMgc2V0LCB0aGVuIHRoZSBmdWxsIG1hc2sgaXMgdGhlIHNhbWUgYXMgdGhlIG1hc2sgb2YgdGhlIGluaXRpYWxpemF0aW9uCisgICAgLy8gdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzazsKKyAgICBpbnQgaTsKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsKQorIyBlbmRpZgorICAgIHsKKyAgICAgICAgaWYgKChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHx8IChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2JhbGFuY2VkKQorICAgICAgICAgICkgeworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorIyBlbmRpZgorICAgICAgICAgICAgS01QX0FTU0VSVChmdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgICAgIGkgPSBLTVBfUExBQ0VfQUxMOworICAgICAgICAgICAgbWFzayA9IGZ1bGxNYXNrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID4gMCApOworICAgICAgICAgICAgaSA9IChndGlkICsgX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSAlIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgICAgICAgIG1hc2sgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCghIGlzYV9yb290KQorICAgICAgICAgIHx8IChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ZhbHNlKSkgeworIyAgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyMgIGVuZGlmCisgICAgICAgICAgICBLTVBfQVNTRVJUKGZ1bGxNYXNrICE9IE5VTEwpOworICAgICAgICAgICAgaSA9IEtNUF9QTEFDRV9BTEw7CisgICAgICAgICAgICBtYXNrID0gZnVsbE1hc2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gaW50IGkgPSBzb21lIGhhc2ggZnVuY3Rpb24gb3IganVzdCBhIGNvdW50ZXIgdGhhdCBkb2Vzbid0CisgICAgICAgICAgICAvLyBhbHdheXMgc3RhcnQgYXQgMC4gIFVzZSBndGlkIGZvciBub3cuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID4gMCApOworICAgICAgICAgICAgaSA9IChndGlkICsgX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSAlIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgICAgICAgIG1hc2sgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyMgZW5kaWYKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoLT50aC50aF9jdXJyZW50X3BsYWNlID0gaTsKKyAgICBpZiAoaXNhX3Jvb3QpIHsKKyAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IGk7CisgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IDA7CisgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMTsKKyAgICB9CisKKyAgICBpZiAoaSA9PSBLTVBfUExBQ0VfQUxMKSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gYWxsIHBsYWNlc1xuIiwKKyAgICAgICAgICBndGlkKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIHBsYWNlICVkXG4iLAorICAgICAgICAgIGd0aWQsIGkpKTsKKyAgICB9CisjIGVsc2UKKyAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIGZ1bGxNYXNrXG4iLAorICAgICAgICAgIGd0aWQpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gbWFzayAlZFxuIiwKKyAgICAgICAgICBndGlkLCBpKSk7CisgICAgfQorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgS01QX0NQVV9DT1BZKHRoLT50aC50aF9hZmZpbl9tYXNrLCBtYXNrKTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLCBndGlkLAorICAgICAgICAgIGJ1Zik7CisgICAgfQorCisjIGlmIEtNUF9PU19XSU5ET1dTCisgICAgLy8KKyAgICAvLyBPbiBXaW5kb3dzKiBPUywgdGhlIHByb2Nlc3MgYWZmaW5pdHkgbWFzayBtaWdodCBoYXZlIGNoYW5nZWQuCisgICAgLy8gSWYgdGhlIHVzZXIgZGlkbid0IHJlcXVlc3QgYWZmaW5pdHkgYW5kIHRoaXMgY2FsbCBmYWlscywKKyAgICAvLyBqdXN0IGNvbnRpbnVlIHNpbGVudGx5LiAgU2VlIENRMTcxMzkzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUgKSB7CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkodGgtPnRoLnRoX2FmZmluX21hc2ssIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorIyBlbmRpZgorICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkodGgtPnRoLnRoX2FmZmluX21hc2ssIFRSVUUpOworfQorCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKwordm9pZAorX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGludCBndGlkKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfaW5mb190ICp0aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0pOworCisgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9wbGFjZTogYmluZGluZyBUIyVkIHRvIHBsYWNlICVkIChjdXJyZW50IHBsYWNlID0gJWQpXG4iLAorICAgICAgZ3RpZCwgdGgtPnRoLnRoX25ld19wbGFjZSwgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UpKTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbmV3IHBsYWNlIGlzIHdpdGhpbiB0aGlzIHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX2FmZmluX21hc2sgIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVCh0aC0+dGgudGhfbmV3X3BsYWNlID49IDApOworICAgIEtNUF9BU1NFUlQoKHVuc2lnbmVkKXRoLT50aC50aF9uZXdfcGxhY2UgPD0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKTsKKyAgICBpZiAodGgtPnRoLnRoX2ZpcnN0X3BsYWNlIDw9IHRoLT50aC50aF9sYXN0X3BsYWNlKSB7CisgICAgICAgIEtNUF9BU1NFUlQoKHRoLT50aC50aF9uZXdfcGxhY2UgPj0gdGgtPnRoLnRoX2ZpcnN0X3BsYWNlKQorICAgICAgICAgJiYgKHRoLT50aC50aF9uZXdfcGxhY2UgPD0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9BU1NFUlQoKHRoLT50aC50aF9uZXdfcGxhY2UgPD0gdGgtPnRoLnRoX2ZpcnN0X3BsYWNlKQorICAgICAgICAgfHwgKHRoLT50aC50aF9uZXdfcGxhY2UgPj0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvcHkgdGhlIHRocmVhZCBtYXNrIHRvIHRoZSBrbXBfaW5mb190IHN0cnVjdXR1cmUsCisgICAgLy8gYW5kIHNldCB0aGlzIHRocmVhZCdzIGFmZmluaXR5LgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsCisgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlKTsKKyAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIG1hc2spOworICAgIHRoLT50aC50aF9jdXJyZW50X3BsYWNlID0gdGgtPnRoLnRoX25ld19wbGFjZTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJPTVBfUFJPQ19CSU5EIiwgKGttcF9pbnQzMilnZXRwaWQoKSwKKyAgICAgICAgICBndGlkLCBidWYpOworICAgIH0KKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBUUlVFKTsKK30KKworIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKK2ludAorX19rbXBfYXV4X3NldF9hZmZpbml0eSh2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfaW5mb190ICp0aDsKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgICAgIF9fa21wX2RlYnVnX3ByaW50Zigia21wX3NldF9hZmZpbml0eTogc2V0dGluZyBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHByb2M7CisgICAgICAgICAgICBpbnQgbnVtX3Byb2NzID0gMDsKKworICAgICAgICAgICAgS01QX0NQVV9TRVRfSVRFUkFURShwcm9jLCAoKGttcF9hZmZpbl9tYXNrX3QqKSgqbWFzaykpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1fcHJvY3MrKzsKKyAgICAgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bV9wcm9jcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgICAgICBpZiAoX19rbXBfZ2V0X3Byb2NfZ3JvdXAoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKSA8IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICAgIH0KKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICAgICAgfQorICAgIH0KKworICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwpOworICAgIHJldHZhbCA9IF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spLCBGQUxTRSk7CisgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgIEtNUF9DUFVfQ09QWSh0aC0+dGgudGhfYWZmaW5fbWFzaywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aC0+dGgudGhfY3VycmVudF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gMDsKKyAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDE7CisKKyAgICAvLworICAgIC8vIFR1cm4gb2ZmIDQuMCBhZmZpbml0eSBmb3IgdGhlIGN1cnJlbnQgdHJlYWQgYXQgdGhpcyBwYXJhbGxlbCBsZXZlbC4KKyAgICAvLworICAgIHRoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworIyBlbmRpZgorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQKK19fa21wX2F1eF9nZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spCit7CisgICAgaW50IGd0aWQ7CisgICAgaW50IHJldHZhbDsKKyAgICBrbXBfaW5mb190ICp0aDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX2FmZmluX21hc2sgIT0gTlVMTCk7CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJrbXBfZ2V0X2FmZmluaXR5OiBzdG9yZWQgYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX2dldF9hZmZpbml0eSIpOworICAgICAgICB9CisgICAgfQorCisjIGlmICFLTVBfT1NfV0lORE9XUworCisgICAgcmV0dmFsID0gX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzayksIEZBTFNFKTsKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgICAgIF9fa21wX3ByaW50Zigia21wX2dldF9hZmZpbml0eTogc3lzdGVtIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLCBndGlkLCBidWYpOworICAgIH0pOworICAgIHJldHVybiByZXR2YWw7CisKKyMgZWxzZQorCisgICAgS01QX0NQVV9DT1BZKChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgIHJldHVybiAwOworCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKK30KKworaW50CitfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spCit7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwMDAsIDt7CisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgICAgIF9fa21wX2RlYnVnX3ByaW50Zigia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2M6IHNldHRpbmcgcHJvYyAlZCBpbiBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBwcm9jLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHByb2MgPCAwKQorIyBpZiAhS01QX1VTRV9IV0xPQworICAgICAgICAgfHwgKCh1bnNpZ25lZClwcm9jID49IEtNUF9DUFVfU0VUU0laRSkKKyMgZW5kaWYKKyAgICAgICApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgS01QX0NQVV9TRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKK19fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2M6IHVuc2V0dGluZyBwcm9jICVkIGluIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIHByb2MsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkKKyMgaWYgIUtNUF9VU0VfSFdMT0MKKyAgICAgICAgIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpCisjIGVuZGlmCisgICAgICAgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIEtNUF9DUFVfQ0xSKHByb2MsIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CitfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spCit7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwMDAsIDt7CisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgICAgIF9fa21wX2RlYnVnX3ByaW50Zigia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2M6IGdldHRpbmcgcHJvYyAlZCBpbiBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBwcm9jLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHByb2MgPCAwKQorIyBpZiAhS01QX1VTRV9IV0xPQworICAgICAgICAgfHwgKCh1bnNpZ25lZClwcm9jID49IEtNUF9DUFVfU0VUU0laRSkKKyMgZW5kaWYKKyAgICAgICApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gS01QX0NQVV9JU1NFVChwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworfQorCisKKy8vIER5bmFtaWMgYWZmaW5pdHkgc2V0dGluZ3MgLSBBZmZpbml0eSBiYWxhbmNlZAordm9pZCBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSggaW50IHRpZCwgaW50IG50aHJlYWRzICkKK3sKKyAgICBpZiggX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpICkgeworICAgICAgICBpbnQgY29yZUlEOworICAgICAgICBpbnQgdGhyZWFkSUQ7CisgICAgICAgIC8vIE51bWJlciBvZiBoeXBlciB0aHJlYWRzIHBlciBjb3JlIGluIEhUIG1hY2hpbmUKKyAgICAgICAgaW50IF9fa21wX250aF9wZXJfY29yZSA9IF9fa21wX2F2YWlsX3Byb2MgLyBfX2ttcF9uY29yZXM7CisgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcworICAgICAgICBpbnQgbmNvcmVzID0gX19rbXBfbmNvcmVzOworICAgICAgICAvLyBIb3cgbWFueSB0aHJlYWRzIHdpbGwgYmUgYm91bmQgdG8gZWFjaCBjb3JlCisgICAgICAgIGludCBjaHVuayA9IG50aHJlYWRzIC8gbmNvcmVzOworICAgICAgICAvLyBIb3cgbWFueSBjb3JlcyB3aWxsIGhhdmUgYW4gYWRkaXRpb25hbCB0aHJlYWQgYm91bmQgdG8gaXQgLSAiYmlnIGNvcmVzIgorICAgICAgICBpbnQgYmlnX2NvcmVzID0gbnRocmVhZHMgJSBuY29yZXM7CisgICAgICAgIC8vIE51bWJlciBvZiB0aHJlYWRzIG9uIHRoZSBiaWcgY29yZXMKKyAgICAgICAgaW50IGJpZ19udGggPSAoIGNodW5rICsgMSApICogYmlnX2NvcmVzOworICAgICAgICBpZiggdGlkIDwgYmlnX250aCApIHsKKyAgICAgICAgICAgIGNvcmVJRCA9IHRpZCAvIChjaHVuayArIDEgKTsKKyAgICAgICAgICAgIHRocmVhZElEID0gKCB0aWQgJSAoY2h1bmsgKyAxICkgKSAlIF9fa21wX250aF9wZXJfY29yZSA7CisgICAgICAgIH0gZWxzZSB7IC8vdGlkID49IGJpZ19udGgKKyAgICAgICAgICAgIGNvcmVJRCA9ICggdGlkIC0gYmlnX2NvcmVzICkgLyBjaHVuazsKKyAgICAgICAgICAgIHRocmVhZElEID0gKCAoIHRpZCAtIGJpZ19jb3JlcyApICUgY2h1bmsgKSAlIF9fa21wX250aF9wZXJfY29yZSA7CisgICAgICAgIH0KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgICAgICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0sobWFzayk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworICAgICAgICAvLyBHcmFudWxhcml0eSA9PSB0aHJlYWQKKyAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lIHx8IF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgICAgICAgIGludCBvc0lEID0gYWRkcmVzczJvc1sgY29yZUlEICogX19rbXBfbnRoX3Blcl9jb3JlICsgdGhyZWFkSUQgXS5zZWNvbmQ7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgIH0gZWxzZSBpZiggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2NvcmUgKSB7IC8vIEdyYW51bGFyaXR5ID09IGNvcmUKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfbnRoX3Blcl9jb3JlOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaW50IG9zSUQ7CisgICAgICAgICAgICAgICAgb3NJRCA9IGFkZHJlc3Myb3NbIGNvcmVJRCAqIF9fa21wX250aF9wZXJfY29yZSArIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgICAgICB0aWQsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbWFzaywgVFJVRSApOworICAgICAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKKyAgICB9IGVsc2UgeyAvLyBOb24tdW5pZm9ybSB0b3BvbG9neQorCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgICAgICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0sobWFzayk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworICAgICAgICAvLyBOdW1iZXIgb2YgaHlwZXIgdGhyZWFkcyBwZXIgY29yZSBpbiBIVCBtYWNoaW5lCisgICAgICAgIGludCBudGhfcGVyX2NvcmUgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisgICAgICAgIGludCBjb3JlX2xldmVsOworICAgICAgICBpZiggbnRoX3Blcl9jb3JlID4gMSApIHsKKyAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBfX2ttcF9hZmZfZGVwdGggLSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29yZV9sZXZlbCA9IF9fa21wX2FmZl9kZXB0aCAtIDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBOdW1iZXIgb2YgY29yZXMgLSBtYXhpbXVtIHZhbHVlOyBpdCBkb2VzIG5vdCBjb3VudCB0cmFpbCBjb3JlcyB3aXRoIDAgcHJvY2Vzc29ycworICAgICAgICBpbnQgbmNvcmVzID0gYWRkcmVzczJvc1sgX19rbXBfYXZhaWxfcHJvYyAtIDEgXS5maXJzdC5sYWJlbHNbIGNvcmVfbGV2ZWwgXSArIDE7CisKKyAgICAgICAgLy8gRm9yIHBlcmZvcm1hbmNlIGdhaW4gY29uc2lkZXIgdGhlIHNwZWNpYWwgY2FzZSBudGhyZWFkcyA9PSBfX2ttcF9hdmFpbF9wcm9jCisgICAgICAgIGlmKCBudGhyZWFkcyA9PSBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lIHx8IF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIHRpZCBdLnNlY29uZDsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeyAvLyBHcmFudWxhcml0eSA9PSBjb3JlCisgICAgICAgICAgICAgICAgaW50IGNvcmVJRCA9IGFkZHJlc3Myb3NbIHRpZCBdLmZpcnN0LmxhYmVsc1sgY29yZV9sZXZlbCBdOworICAgICAgICAgICAgICAgIC8vIFdlJ2xsIGNvdW50IGZvdW5kIG9zSURzIGZvciB0aGUgY3VycmVudCBjb3JlOyB0aGV5IGNhbiBiZSBub3QgbW9yZSB0aGFuIG50aF9wZXJfY29yZTsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYWRkcmVzczJvcyBpcyBzb3J0aWVkIHdlIGNhbiBicmVhayB3aGVuIGNudD09bnRoX3Blcl9jb3JlCisgICAgICAgICAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gYWRkcmVzczJvc1sgaSBdLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvcmUgPSBhZGRyZXNzMm9zWyBpIF0uZmlyc3QubGFiZWxzWyBjb3JlX2xldmVsIF07CisgICAgICAgICAgICAgICAgICAgIGlmKCBjb3JlID09IGNvcmVJRCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNudCA9PSBudGhfcGVyX2NvcmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiggbnRocmVhZHMgPD0gX19rbXBfbmNvcmVzICkgeworCisgICAgICAgICAgICBpbnQgY29yZSA9IDA7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrICkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgY29yZSBmcm9tIHByb2NhcnJbXSBpcyBpbiB0aGUgbWFzaworICAgICAgICAgICAgICAgIGludCBpbl9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcHJvY2FyclsgaSAqIG50aF9wZXJfY29yZSArIGogXSAhPSAtIDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbl9tYXNrID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpbl9tYXNrICkgeworICAgICAgICAgICAgICAgICAgICBpZiggdGlkID09IGNvcmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgaSAqIG50aF9wZXJfY29yZSArIGogXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggb3NJRCAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2sgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGdyYW51bGFyaXR5PXRocmVhZCBpdCBpcyBlbm91Z2ggdG8gc2V0IHRoZSBmaXJzdCBhdmFpbGFibGUgb3NJRCBmb3IgdGhpcyBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29yZSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7IC8vIG50aHJlYWRzID4gX19rbXBfbmNvcmVzCisKKyAgICAgICAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF0IGVhY2ggY29yZQorICAgICAgICAgICAgaW50KiBucHJvY19hdF9jb3JlID0gKGludCopS01QX0FMTE9DQShzaXplb2YoaW50KSpuY29yZXMpOworICAgICAgICAgICAgLy8gQXJyYXkgdG8gc2F2ZSB0aGUgbnVtYmVyIG9mIGNvcmVzIHdpdGggIngiIGF2YWlsYWJsZSBwcm9jZXNzb3JzOworICAgICAgICAgICAgaW50KiBuY29yZXNfd2l0aF94X3Byb2NzID0gKGludCopS01QX0FMTE9DQShzaXplb2YoaW50KSoobnRoX3Blcl9jb3JlKzEpKTsKKyAgICAgICAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBjb3JlcyB3aXRoICMgcHJvY3MgZnJvbSB4IHRvIG50aF9wZXJfY29yZQorICAgICAgICAgICAgaW50KiBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jcyA9IChpbnQqKUtNUF9BTExPQ0Eoc2l6ZW9mKGludCkqKG50aF9wZXJfY29yZSsxKSk7CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDw9IG50aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfcHJvY3NbIGkgXSA9IDA7CisgICAgICAgICAgICAgICAgbmNvcmVzX3dpdGhfeF90b19tYXhfcHJvY3NbIGkgXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmNvcmVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF0gIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBucHJvY19hdF9jb3JlWyBpIF0gPSBjbnQ7CisgICAgICAgICAgICAgICAgbmNvcmVzX3dpdGhfeF9wcm9jc1sgY250IF0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPD0gbnRoX3Blcl9jb3JlOyBpKysgKSB7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IGk7IGogPD0gbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBpIF0gKz0gbmNvcmVzX3dpdGhfeF9wcm9jc1sgaiBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBwcm9jZXNzb3JzCisgICAgICAgICAgICBpbnQgbnByb2MgPSBudGhfcGVyX2NvcmUgKiBuY29yZXM7CisgICAgICAgICAgICAvLyBBbiBhcnJheSB0byBrZWVwIG51bWJlciBvZiB0aHJlYWRzIHBlciBlYWNoIGNvbnRleHQKKyAgICAgICAgICAgIGludCAqIG5ld2FyciA9ICggaW50ICogKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGludCApICogbnByb2MgKTsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBuZXdhcnJbIGkgXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBudGggPSBudGhyZWFkczsKKyAgICAgICAgICAgIGludCBmbGFnID0gMDsKKyAgICAgICAgICAgIHdoaWxlKCBudGggPiAwICkgeworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAxOyBqIDw9IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY250ID0gbmNvcmVzX3dpdGhfeF90b19tYXhfcHJvY3NbIGogXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuY29yZXM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGNvcmUgd2l0aCAwIHByb2Nlc3NvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBucHJvY19hdF9jb3JlWyBpIF0gPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGsgPSAwOyBrIDwgbnRoX3Blcl9jb3JlOyBrKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2FyclsgaSAqIG50aF9wZXJfY29yZSArIGsgXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50aC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmxhZyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2FyclsgaSAqIG50aF9wZXJfY29yZSArIGsgXSArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbnQgPT0gMCB8fCBudGggPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiggbnRoID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBucHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgIHN1bSArPSBuZXdhcnJbIGkgXTsKKyAgICAgICAgICAgICAgICBpZiggc3VtID4gdGlkICkgeworICAgICAgICAgICAgICAgICAgICAvLyBHcmFudWxhcml0eSA9PSB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lIHx8IF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgaSBdOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeyAvLyBHcmFudWxhcml0eSA9PSBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29yZUlEID0gaSAvIG50aF9wZXJfY29yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGlpID0gMDsgaWkgPCBudGhfcGVyX2NvcmU7IGlpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9zSUQgPSBwcm9jYXJyWyBjb3JlSUQgKiBudGhfcGVyX2NvcmUgKyBpaSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBvc0lEICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIG5ld2FyciApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBtYXNrKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQm91bmRUb09TUHJvY1NldCwgIktNUF9BRkZJTklUWSIsIChrbXBfaW50MzIpZ2V0cGlkKCksCisgICAgICAgICAgICAgIHRpZCwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBtYXNrLCBUUlVFICk7CisgICAgICAgIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKG1hc2spOworICAgIH0KK30KKworI2lmIEtNUF9PU19MSU5VWAorLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIGVudHJ5IGZvciBXaW5kb3dzIGJlY2F1c2UKKy8vIHRoZXJlIGlzIEdldFByb2Nlc3NBZmZpbml0eU1hc2soKSBhcGkKKy8vCisvLyBUaGUgaW50ZW5kZWQgdXNhZ2UgaXMgaW5kaWNhdGVkIGJ5IHRoZXNlIHN0ZXBzOgorLy8gMSkgVGhlIHVzZXIgZ2V0cyB0aGUgY3VycmVudCBhZmZpbml0eSBtYXNrCisvLyAyKSBUaGVuIHNldHMgdGhlIGFmZmluaXR5IGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorLy8gMykgRXJyb3IgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQorLy8gNCkgVXNlIG5vbi1PcGVuTVAgcGFyYWxsZWxpemF0aW9uCisvLyA1KSBSZXNldCB0aGUgYWZmaW5pdHkgdG8gd2hhdCB3YXMgc3RvcmVkIGluIHN0ZXAgMSkKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitpbnQKK2ttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbCgpCisvLyB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisvLyAgIC0xIGlmIHdlIGNhbm5vdCBiaW5kIHRocmVhZAorLy8gICA+MCAoZXJybm8pIGlmIGFuIGVycm9yIGhhcHBlbmVkIGR1cmluZyBiaW5kaW5nCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGlmIChndGlkIDwgMCkgeworICAgICAgICAvLyBEbyBub3QgdG91Y2ggbm9uLW9tcCB0aHJlYWRzCisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJrbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2luaXRpYWw6ICIKKyAgICAgICAgICAgICJub24tb21wIHRocmVhZCwgcmV0dXJuaW5nXG4iKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpIHx8ICFfX2ttcF9pbml0X21pZGRsZSkgeworICAgICAgICBLQV9UUkFDRSgzMCwgKCAia21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19pbml0aWFsOiAiCisgICAgICAgICAgICAiYWZmaW5pdHkgbm90IGluaXRpYWxpemVkLCByZXR1cm5pbmdcbiIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBLQV9UUkFDRSgzMCwgKCAia21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19pbml0aWFsOiAiCisgICAgICAgICJzZXQgZnVsbCBtYXNrIGZvciB0aHJlYWQgJWRcbiIsIGd0aWQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGZ1bGxNYXNrICE9IE5VTEwpOworICAgIHJldHVybiBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KGZ1bGxNYXNrLCBGQUxTRSk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkMzQxNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5oCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICoga21wX2FmZmluaXR5LmggLS0gaGVhZGVyIGZvciBhZmZpbml0eSBtYW5hZ2VtZW50CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEtNUF9BRkZJTklUWV9ICisjZGVmaW5lIEtNUF9BRkZJTklUWV9ICisKK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfY29tcGFjdDsgLyogQWZmaW5pdHkgJ2NvbXBhY3QnIHZhbHVlICovCisKK2NsYXNzIEFkZHJlc3MgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhEZXB0aCA9IDMyOworICAgIHVuc2lnbmVkIGxhYmVsc1ttYXhEZXB0aF07CisgICAgdW5zaWduZWQgY2hpbGROdW1zW21heERlcHRoXTsKKyAgICB1bnNpZ25lZCBkZXB0aDsKKyAgICB1bnNpZ25lZCBsZWFkZXI7CisgICAgQWRkcmVzcyh1bnNpZ25lZCBfZGVwdGgpCisgICAgICA6IGRlcHRoKF9kZXB0aCksIGxlYWRlcihGQUxTRSkgeworICAgIH0KKyAgICBBZGRyZXNzICZvcGVyYXRvcj0oY29uc3QgQWRkcmVzcyAmYikgeworICAgICAgICBkZXB0aCA9IGIuZGVwdGg7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICAgICAgICBsYWJlbHNbaV0gPSBiLmxhYmVsc1tpXTsKKyAgICAgICAgICAgIGNoaWxkTnVtc1tpXSA9IGIuY2hpbGROdW1zW2ldOworICAgICAgICB9CisgICAgICAgIGxlYWRlciA9IEZBTFNFOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBZGRyZXNzICZiKSBjb25zdCB7CisgICAgICAgIGlmIChkZXB0aCAhPSBiLmRlcHRoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKyAgICAgICAgICAgIGlmKGxhYmVsc1tpXSAhPSBiLmxhYmVsc1tpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIGlzQ2xvc2UoY29uc3QgQWRkcmVzcyAmYiwgaW50IGxldmVsKSBjb25zdCB7CisgICAgICAgIGlmIChkZXB0aCAhPSBiLmRlcHRoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoKHVuc2lnbmVkKWxldmVsID49IGRlcHRoKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAoZGVwdGggLSBsZXZlbCk7IGkrKykKKyAgICAgICAgICAgIGlmKGxhYmVsc1tpXSAhPSBiLmxhYmVsc1tpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oYik7CisgICAgfQorICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgICAgIHVuc2lnbmVkIGk7CisgICAgICAgIHByaW50ZigiRGVwdGg6ICV1IC0tLSAiLCBkZXB0aCk7CisgICAgICAgIGZvcihpPTA7aTxkZXB0aDtpKyspIHsKKyAgICAgICAgICAgIHByaW50ZigiJXUgIiwgbGFiZWxzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK2NsYXNzIEFkZHJVbnNQYWlyIHsKK3B1YmxpYzoKKyAgICBBZGRyZXNzIGZpcnN0OworICAgIHVuc2lnbmVkIHNlY29uZDsKKyAgICBBZGRyVW5zUGFpcihBZGRyZXNzIF9maXJzdCwgdW5zaWduZWQgX3NlY29uZCkKKyAgICAgIDogZmlyc3QoX2ZpcnN0KSwgc2Vjb25kKF9zZWNvbmQpIHsKKyAgICB9CisgICAgQWRkclVuc1BhaXIgJm9wZXJhdG9yPShjb25zdCBBZGRyVW5zUGFpciAmYikKKyAgICB7CisgICAgICAgIGZpcnN0ID0gYi5maXJzdDsKKyAgICAgICAgc2Vjb25kID0gYi5zZWNvbmQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgdm9pZCBwcmludCgpIGNvbnN0IHsKKyAgICAgICAgcHJpbnRmKCJmaXJzdCA9ICIpOyBmaXJzdC5wcmludCgpOworICAgICAgICBwcmludGYoIiAtLS0gc2Vjb25kID0gJXUiLCBzZWNvbmQpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkclVuc1BhaXIgJmIpIGNvbnN0IHsKKyAgICAgICAgaWYoZmlyc3QgIT0gYi5maXJzdCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZihzZWNvbmQgIT0gYi5zZWNvbmQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBZGRyVW5zUGFpciAmYikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oYik7CisgICAgfQorfTsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBBZGRyZXNzICphYSA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYSkKKyAgICAgIC0+Zmlyc3QpOworICAgIGNvbnN0IEFkZHJlc3MgKmJiID0gKGNvbnN0IEFkZHJlc3MgKikmKCgoQWRkclVuc1BhaXIgKiliKQorICAgICAgLT5maXJzdCk7CisgICAgdW5zaWduZWQgZGVwdGggPSBhYS0+ZGVwdGg7CisgICAgdW5zaWduZWQgaTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGRlcHRoID09IGJiLT5kZXB0aCk7CisgICAgZm9yIChpICA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICAgIGlmIChhYS0+bGFiZWxzW2ldIDwgYmItPmxhYmVsc1tpXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWEtPmxhYmVsc1tpXSA+IGJiLT5sYWJlbHNbaV0pIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19jaGlsZF9udW0oY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBBZGRyZXNzICphYSA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYSkKKyAgICAgIC0+Zmlyc3QpOworICAgIGNvbnN0IEFkZHJlc3MgKmJiID0gKGNvbnN0IEFkZHJlc3MgKikmKCgoQWRkclVuc1BhaXIgKiliKQorICAgICAgLT5maXJzdCk7CisgICAgdW5zaWduZWQgZGVwdGggPSBhYS0+ZGVwdGg7CisgICAgdW5zaWduZWQgaTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGRlcHRoID09IGJiLT5kZXB0aCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCgodW5zaWduZWQpX19rbXBfYWZmaW5pdHlfY29tcGFjdCA8PSBkZXB0aCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IDApOworICAgIGZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQpX19rbXBfYWZmaW5pdHlfY29tcGFjdDsgaSsrKSB7CisgICAgICAgIGludCBqID0gZGVwdGggLSBpIC0gMTsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPCBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdID4gYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciAoOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICBpbnQgaiA9IGkgLSBfX2ttcF9hZmZpbml0eV9jb21wYWN0OworICAgICAgICBpZiAoYWEtPmNoaWxkTnVtc1tqXSA8IGJiLT5jaGlsZE51bXNbal0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPiBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqIEEgc3RydWN0dXJlIGZvciBob2xkaW5nIG1hY2hpbmUtc3BlY2lmaWMgaGllcmFyY2h5IGluZm8gdG8gYmUgY29tcHV0ZWQgb25jZSBhdCBpbml0LgorICAgIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBtYXBwaW5nIG9mIHRocmVhZHMgdG8gdGhlIGFjdHVhbCBtYWNoaW5lIGhpZXJhcmNoeSwgb3IgdG8KKyAgICBvdXIgYmVzdCBndWVzcyBhdCB3aGF0IHRoZSBoaWVyYXJjaHkgbWlnaHQgYmUsIGZvciB0aGUgcHVycG9zZSBvZiBwZXJmb3JtaW5nIGFuCisgICAgZWZmaWNpZW50IGJhcnJpZXIuICBJbiB0aGUgd29yc3QgY2FzZSwgd2hlbiB0aGVyZSBpcyBubyBtYWNoaW5lIGhpZXJhcmNoeSBpbmZvcm1hdGlvbiwKKyAgICBpdCBwcm9kdWNlcyBhIHRyZWUgc3VpdGFibGUgZm9yIGEgYmFycmllciwgc2ltaWxhciB0byB0aGUgdHJlZSB1c2VkIGluIHRoZSBoeXBlciBiYXJyaWVyLiAqLworY2xhc3MgaGllcmFyY2h5X2luZm8geworcHVibGljOgorICAgIC8qKiBHb29kIGRlZmF1bHQgdmFsdWVzIGZvciBudW1iZXIgb2YgbGVhdmVzIGFuZCBicmFuY2hpbmcgZmFjdG9yLCBnaXZlbiBubyBhZmZpbml0eSBpbmZvcm1hdGlvbi4KKwlCZWhhdmVzIGEgYml0IGxpa2UgaHlwZXIgYmFycmllci4gKi8KKyAgICBzdGF0aWMgY29uc3Qga21wX3VpbnQzMiBtYXhMZWF2ZXM9NDsKKyAgICBzdGF0aWMgY29uc3Qga21wX3VpbnQzMiBtaW5CcmFuY2g9NDsKKyAgICAvKiogTnVtYmVyIG9mIGxldmVscyBpbiB0aGUgaGllcmFyY2h5LiBUeXBpY2FsIGxldmVscyBhcmUgdGhyZWFkcy9jb3JlLCBjb3Jlcy9wYWNrYWdlCisJb3Igc29ja2V0LCBwYWNrYWdlcy9ub2RlLCBub2Rlcy9tYWNoaW5lLCBldGMuICBXZSBkb24ndCB3YW50IHRvIGdldCBzcGVjaWZpYyB3aXRoCisJbm9tZW5jbGF0dXJlLiAgV2hlbiB0aGUgbWFjaGluZSBpcyBvdmVyc3Vic2NyaWJlZCB3ZSBhZGQgbGV2ZWxzIHRvIGR1cGxpY2F0ZSB0aGUKKwloaWVyYXJjaHksIGRvdWJsaW5nIHRoZSB0aHJlYWQgY2FwYWNpdHkgb2YgdGhlIGhpZXJhcmNoeSBlYWNoIHRpbWUgd2UgYWRkIGEgbGV2ZWwuICovCisgICAga21wX3VpbnQzMiBtYXhMZXZlbHM7CisKKyAgICAvKiogVGhpcyBpcyBzcGVjaWZpY2FsbHkgdGhlIGRlcHRoIG9mIHRoZSBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gaGllcmFyY2h5LCBpbiB0ZXJtcyBvZiB0aGUKKyAgICAgICAgbnVtYmVyIG9mIGxldmVscyBhbG9uZyB0aGUgbG9uZ2VzdCBwYXRoIGZyb20gcm9vdCB0byBhbnkgbGVhZi4gSXQgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIGluIG51bVBlckxldmVsIGlmIHdlIGV4Y2x1ZGUgYWxsIGJ1dCBvbmUgdHJhaWxpbmcgMS4gKi8KKyAgICBrbXBfdWludDMyIGRlcHRoOworICAgIGttcF91aW50MzIgYmFzZV9udW1fdGhyZWFkczsKKyAgICBlbnVtIGluaXRfc3RhdHVzIHsgaW5pdGlhbGl6ZWQ9MCwgbm90X2luaXRpYWxpemVkPTEsIGluaXRpYWxpemluZz0yIH07CisgICAgdm9sYXRpbGUga21wX2ludDggdW5pbml0aWFsaXplZDsgLy8gMD1pbml0aWFsaXplZCwgMT1ub3QgaW5pdGlhbGl6ZWQsIDI9aW5pdGlhbGl6YXRpb24gaW4gcHJvZ3Jlc3MKKyAgICB2b2xhdGlsZSBrbXBfaW50OCByZXNpemluZzsgLy8gMD1ub3QgcmVzaXppbmcsIDE9cmVzaXppbmcKKworICAgIC8qKiBMZXZlbCAwIGNvcnJlc3BvbmRzIHRvIGxlYXZlcy4gbnVtUGVyTGV2ZWxbaV0gaXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGUgcGFyZW50IG9mIGEKKyAgICAgICAgbm9kZSBhdCBsZXZlbCBpIGhhcy4gRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYSBtYWNoaW5lIHdpdGggNCBwYWNrYWdlcywgNCBjb3Jlcy9wYWNrYWdlCisgICAgICAgIGFuZCAyIEhUIHBlciBjb3JlLCB0aGVuIG51bVBlckxldmVsID0gezIsIDQsIDQsIDEsIDF9LiBBbGwgZW1wdHkgbGV2ZWxzIGFyZSBzZXQgdG8gMS4gKi8KKyAgICBrbXBfdWludDMyICpudW1QZXJMZXZlbDsKKyAgICBrbXBfdWludDMyICpza2lwUGVyTGV2ZWw7CisKKyAgICB2b2lkIGRlcml2ZUxldmVscyhBZGRyVW5zUGFpciAqYWRyMm9zLCBpbnQgbnVtX2FkZHJzKSB7CisgICAgICAgIGludCBoaWVyX2RlcHRoID0gYWRyMm9zWzBdLmZpcnN0LmRlcHRoOworICAgICAgICBpbnQgbGV2ZWwgPSAwOworICAgICAgICBmb3IgKGludCBpPWhpZXJfZGVwdGgtMTsgaT49MDsgLS1pKSB7CisgICAgICAgICAgICBpbnQgbWF4ID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8bnVtX2FkZHJzOyArK2opIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dCA9IGFkcjJvc1tqXS5maXJzdC5jaGlsZE51bXNbaV07CisgICAgICAgICAgICAgICAgaWYgKG5leHQgPiBtYXgpIG1heCA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1QZXJMZXZlbFtsZXZlbF0gPSBtYXgrMTsKKyAgICAgICAgICAgICsrbGV2ZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoaWVyYXJjaHlfaW5mbygpIDogbWF4TGV2ZWxzKDcpLCBkZXB0aCgxKSwgdW5pbml0aWFsaXplZChub3RfaW5pdGlhbGl6ZWQpLCByZXNpemluZygwKSB7fQorCisgICAgdm9pZCBmaW5pKCkgeyBpZiAoIXVuaW5pdGlhbGl6ZWQgJiYgbnVtUGVyTGV2ZWwpIF9fa21wX2ZyZWUobnVtUGVyTGV2ZWwpOyB9CisKKyAgICB2b2lkIGluaXQoQWRkclVuc1BhaXIgKmFkcjJvcywgaW50IG51bV9hZGRycykKKyAgICB7CisgICAgICAgIGttcF9pbnQ4IGJvb2xfcmVzdWx0ID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgoJnVuaW5pdGlhbGl6ZWQsIG5vdF9pbml0aWFsaXplZCwgaW5pdGlhbGl6aW5nKTsKKyAgICAgICAgaWYgKGJvb2xfcmVzdWx0ID09IDApIHsgLy8gV2FpdCBmb3IgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgIHdoaWxlIChUQ1JfMSh1bmluaXRpYWxpemVkKSAhPSBpbml0aWFsaXplZCkgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYm9vbF9yZXN1bHQ9PTEpOworCisgICAgICAgIC8qIEFkZGVkIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIG9mIHRoZSBkYXRhIGZpZWxkcyBoZXJlIHRvIHByZXZlbnQgdXNhZ2Ugb2YgZGlydHkgdmFsdWUKKyAgICAgICAgICAgb2JzZXJ2ZWQgd2hlbiBzdGF0aWMgbGlicmFyeSBpcyByZS1pbml0aWFsaXplZCBtdWx0aXBsZSB0aW1lcyAoZS5nLiB3aGVuCisgICAgICAgICAgIG5vbi1PcGVuTVAgdGhyZWFkIHJlcGVhdGVkbHkgbGF1bmNoZXMvam9pbnMgdGhyZWFkIHRoYXQgdXNlcyBPcGVuTVApLiAqLworICAgICAgICBkZXB0aCA9IDE7CisgICAgICAgIHJlc2l6aW5nID0gMDsKKyAgICAgICAgbWF4TGV2ZWxzID0gNzsKKyAgICAgICAgbnVtUGVyTGV2ZWwgPSAoa21wX3VpbnQzMiAqKV9fa21wX2FsbG9jYXRlKG1heExldmVscyoyKnNpemVvZihrbXBfdWludDMyKSk7CisgICAgICAgIHNraXBQZXJMZXZlbCA9ICYobnVtUGVyTGV2ZWxbbWF4TGV2ZWxzXSk7CisgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPTA7IGk8bWF4TGV2ZWxzOyArK2kpIHsgLy8gaW5pdCBudW1QZXJMZXZlbFsqXSB0byAxIGl0ZW0gcGVyIGxldmVsCisgICAgICAgICAgICBudW1QZXJMZXZlbFtpXSA9IDE7CisgICAgICAgICAgICBza2lwUGVyTGV2ZWxbaV0gPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gU29ydCB0YWJsZSBieSBwaHlzaWNhbCBJRAorICAgICAgICBpZiAoYWRyMm9zKSB7CisgICAgICAgICAgICBxc29ydChhZHIyb3MsIG51bV9hZGRycywgc2l6ZW9mKCphZHIyb3MpLCBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMpOworICAgICAgICAgICAgZGVyaXZlTGV2ZWxzKGFkcjJvcywgbnVtX2FkZHJzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG51bVBlckxldmVsWzBdID0gbWF4TGVhdmVzOworICAgICAgICAgICAgbnVtUGVyTGV2ZWxbMV0gPSBudW1fYWRkcnMvbWF4TGVhdmVzOworICAgICAgICAgICAgaWYgKG51bV9hZGRycyVtYXhMZWF2ZXMpIG51bVBlckxldmVsWzFdKys7CisgICAgICAgIH0KKworICAgICAgICBiYXNlX251bV90aHJlYWRzID0gbnVtX2FkZHJzOworICAgICAgICBmb3IgKGludCBpPW1heExldmVscy0xOyBpPj0wOyAtLWkpIC8vIGNvdW50IG5vbi1lbXB0eSBsZXZlbHMgdG8gZ2V0IGRlcHRoCisgICAgICAgICAgICBpZiAobnVtUGVyTGV2ZWxbaV0gIT0gMSB8fCBkZXB0aCA+IDEpIC8vIG9ubHkgY291bnQgb25lIHRvcC1sZXZlbCAnMScKKyAgICAgICAgICAgICAgICBkZXB0aCsrOworCisgICAgICAgIGttcF91aW50MzIgYnJhbmNoID0gbWluQnJhbmNoOworICAgICAgICBpZiAobnVtUGVyTGV2ZWxbMF0gPT0gMSkgYnJhbmNoID0gbnVtX2FkZHJzL21heExlYXZlczsKKyAgICAgICAgaWYgKGJyYW5jaDxtaW5CcmFuY2gpIGJyYW5jaD1taW5CcmFuY2g7CisgICAgICAgIGZvciAoa21wX3VpbnQzMiBkPTA7IGQ8ZGVwdGgtMTsgKytkKSB7IC8vIG9wdGltaXplIGhpZXJhcmNoeSB3aWR0aAorICAgICAgICAgICAgd2hpbGUgKG51bVBlckxldmVsW2RdID4gYnJhbmNoIHx8IChkPT0wICYmIG51bVBlckxldmVsW2RdPm1heExlYXZlcykpIHsgLy8gbWF4IDQgb24gbGV2ZWwgMCEKKyAgICAgICAgICAgICAgICBpZiAobnVtUGVyTGV2ZWxbZF0gJiAxKSBudW1QZXJMZXZlbFtkXSsrOworICAgICAgICAgICAgICAgIG51bVBlckxldmVsW2RdID0gbnVtUGVyTGV2ZWxbZF0gPj4gMTsKKyAgICAgICAgICAgICAgICBpZiAobnVtUGVyTGV2ZWxbZCsxXSA9PSAxKSBkZXB0aCsrOworICAgICAgICAgICAgICAgIG51bVBlckxldmVsW2QrMV0gPSBudW1QZXJMZXZlbFtkKzFdIDw8IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihudW1QZXJMZXZlbFswXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYnJhbmNoID0gYnJhbmNoID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKGJyYW5jaDw0KSBicmFuY2ggPSBtaW5CcmFuY2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGttcF91aW50MzIgaT0xOyBpPGRlcHRoOyArK2kpCisgICAgICAgICAgICBza2lwUGVyTGV2ZWxbaV0gPSBudW1QZXJMZXZlbFtpLTFdICogc2tpcFBlckxldmVsW2ktMV07CisgICAgICAgIC8vIEZpbGwgaW4gaGllcmFyY2h5IGluIHRoZSBjYXNlIG9mIG92ZXJzdWJzY3JpcHRpb24KKyAgICAgICAgZm9yIChrbXBfdWludDMyIGk9ZGVwdGg7IGk8bWF4TGV2ZWxzOyArK2kpCisgICAgICAgICAgICBza2lwUGVyTGV2ZWxbaV0gPSAyKnNraXBQZXJMZXZlbFtpLTFdOworCisgICAgICAgIHVuaW5pdGlhbGl6ZWQgPSBpbml0aWFsaXplZDsgLy8gT25lIHdyaXRlcgorCisgICAgfQorCisgICAgLy8gUmVzaXplIHRoZSBoaWVyYXJjaHkgaWYgbnByb2MgY2hhbmdlcyB0byBzb21ldGhpbmcgbGFyZ2VyIHRoYW4gYmVmb3JlCisgICAgdm9pZCByZXNpemUoa21wX3VpbnQzMiBucHJvYykKKyAgICB7CisgICAgICAgIGttcF9pbnQ4IGJvb2xfcmVzdWx0ID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgoJnJlc2l6aW5nLCAwLCAxKTsKKyAgICAgICAgd2hpbGUgKGJvb2xfcmVzdWx0ID09IDApIHsgLy8gc29tZW9uZSBlbHNlIGlzIHRyeWluZyB0byByZXNpemUKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIGlmIChucHJvYyA8PSBiYXNlX251bV90aHJlYWRzKSAgLy8gaGFwcHkgd2l0aCBvdGhlciB0aHJlYWQncyByZXNpemUKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBlbHNlIC8vIHRyeSB0byByZXNpemUKKyAgICAgICAgICAgICAgICBib29sX3Jlc3VsdCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KCZyZXNpemluZywgMCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChib29sX3Jlc3VsdCE9MCk7CisgICAgICAgIGlmIChucHJvYyA8PSBiYXNlX251bV90aHJlYWRzKSByZXR1cm47IC8vIGhhcHB5IHdpdGggb3RoZXIgdGhyZWFkJ3MgcmVzaXplCisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBtYXhMZXZlbHMKKyAgICAgICAga21wX3VpbnQzMiBvbGRfc3ogPSBza2lwUGVyTGV2ZWxbZGVwdGgtMV07CisgICAgICAgIGttcF91aW50MzIgaW5jcyA9IDAsIG9sZF9tYXhMZXZlbHMgPSBtYXhMZXZlbHM7CisgICAgICAgIC8vIEZpcnN0IHNlZSBpZiBvbGQgbWF4TGV2ZWxzIGlzIGVub3VnaCB0byBjb250YWluIG5ldyBzaXplCisgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPWRlcHRoOyBpPG1heExldmVscyAmJiBucHJvYz5vbGRfc3o7ICsraSkgeworICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gMipza2lwUGVyTGV2ZWxbaS0xXTsKKyAgICAgICAgICAgIG51bVBlckxldmVsW2ktMV0gKj0gMjsKKyAgICAgICAgICAgIG9sZF9zeiAqPSAyOworICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAobnByb2MgPiBvbGRfc3opIHsgLy8gTm90IGVub3VnaCBzcGFjZSwgbmVlZCB0byBleHBhbmQgaGllcmFyY2h5CisgICAgICAgICAgICB3aGlsZSAobnByb2MgPiBvbGRfc3opIHsKKyAgICAgICAgICAgICAgICBvbGRfc3ogKj0yOworICAgICAgICAgICAgICAgIGluY3MrKzsKKyAgICAgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4TGV2ZWxzICs9IGluY3M7CisKKyAgICAgICAgICAgIC8vIFJlc2l6ZSBhcnJheXMKKyAgICAgICAgICAgIGttcF91aW50MzIgKm9sZF9udW1QZXJMZXZlbCA9IG51bVBlckxldmVsOworICAgICAgICAgICAga21wX3VpbnQzMiAqb2xkX3NraXBQZXJMZXZlbCA9IHNraXBQZXJMZXZlbDsKKyAgICAgICAgICAgIG51bVBlckxldmVsID0gc2tpcFBlckxldmVsID0gTlVMTDsKKyAgICAgICAgICAgIG51bVBlckxldmVsID0gKGttcF91aW50MzIgKilfX2ttcF9hbGxvY2F0ZShtYXhMZXZlbHMqMipzaXplb2Yoa21wX3VpbnQzMikpOworICAgICAgICAgICAgc2tpcFBlckxldmVsID0gJihudW1QZXJMZXZlbFttYXhMZXZlbHNdKTsKKworICAgICAgICAgICAgLy8gQ29weSBvbGQgZWxlbWVudHMgZnJvbSBvbGQgYXJyYXlzCisgICAgICAgICAgICBmb3IgKGttcF91aW50MzIgaT0wOyBpPG9sZF9tYXhMZXZlbHM7ICsraSkgeyAvLyBpbml0IG51bVBlckxldmVsWypdIHRvIDEgaXRlbSBwZXIgbGV2ZWwKKyAgICAgICAgICAgICAgICBudW1QZXJMZXZlbFtpXSA9IG9sZF9udW1QZXJMZXZlbFtpXTsKKyAgICAgICAgICAgICAgICBza2lwUGVyTGV2ZWxbaV0gPSBvbGRfc2tpcFBlckxldmVsW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbml0IG5ldyBlbGVtZW50cyBpbiBhcnJheXMgdG8gMQorICAgICAgICAgICAgZm9yIChrbXBfdWludDMyIGk9b2xkX21heExldmVsczsgaTxtYXhMZXZlbHM7ICsraSkgeyAvLyBpbml0IG51bVBlckxldmVsWypdIHRvIDEgaXRlbSBwZXIgbGV2ZWwKKyAgICAgICAgICAgICAgICBudW1QZXJMZXZlbFtpXSA9IDE7CisgICAgICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRnJlZSBvbGQgYXJyYXlzCisgICAgICAgICAgICBfX2ttcF9mcmVlKG9sZF9udW1QZXJMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxsIGluIG92ZXJzdWJzY3JpcHRpb24gbGV2ZWxzIG9mIGhpZXJhcmNoeQorICAgICAgICBmb3IgKGttcF91aW50MzIgaT1vbGRfbWF4TGV2ZWxzOyBpPG1heExldmVsczsgKytpKQorICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gMipza2lwUGVyTGV2ZWxbaS0xXTsKKworICAgICAgICBiYXNlX251bV90aHJlYWRzID0gbnByb2M7CisgICAgICAgIHJlc2l6aW5nID0gMDsgLy8gT25lIHdyaXRlcgorCisgICAgfQorfTsKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2FsbG9jLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTUxOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2FsbG9jLmMKQEAgLTAsMCArMSwyMDQ4IEBACisvKgorICoga21wX2FsbG9jLmMgLS0gcHJpdmF0ZS9zaGFyZWQgZHlhbm1pYyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfbWFsbG9jLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKy8vIERpc2FibGUgYmdldCB3aGVuIGl0IGlzIG5vdCB1c2VkCisjaWYgS01QX1VTRV9CR0VUCisKKy8qIFRocmVhZCBwcml2YXRlIGJ1ZmZlciBtYW5hZ2VtZW50IGNvZGUgKi8KKwordHlwZWRlZiBpbnQgICAoKmJnZXRfY29tcGFjdF90KShzaXplX3QsIGludCk7Cit0eXBlZGVmIHZvaWQgKigqYmdldF9hY3F1aXJlX3QpKHNpemVfdCk7Cit0eXBlZGVmIHZvaWQgICgqYmdldF9yZWxlYXNlX3QpKHZvaWQgKik7CisKKy8qIE5PVEU6IGJ1ZnNpemUgbXVzdCBiZSBhIHNpZ25lZCBkYXRhdHlwZSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorICAgdHlwZWRlZiBrbXBfaW50MzIgYnVmc2l6ZTsKKyMgZWxzZQorICAgdHlwZWRlZiBrbXBfaW50NjQgYnVmc2l6ZTsKKyMgZW5kaWYKKyNlbHNlCisgIHR5cGVkZWYgc3NpemVfdCBidWZzaXplOworI2VuZGlmCisKKy8qIFRoZSB0aHJlZSBtb2RlcyBvZiBvcGVyYXRpb24gYXJlLCBmaWZvIHNlYXJjaCwgbGlmbyBzZWFyY2gsIGFuZCBiZXN0LWZpdCAqLworCit0eXBlZGVmIGVudW0gYmdldF9tb2RlIHsKKyAgICBiZ2V0X21vZGVfZmlmbyA9IDAsCisgICAgYmdldF9tb2RlX2xpZm8gPSAxLAorICAgIGJnZXRfbW9kZV9iZXN0ID0gMgorfSBiZ2V0X21vZGVfdDsKKworCitzdGF0aWMgdm9pZCAgICBicG9vbCgga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZmZlciwgYnVmc2l6ZSBsZW4pOworc3RhdGljIHZvaWQgICAqYmdldCgga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgc2l6ZSk7CitzdGF0aWMgdm9pZCAgICpiZ2V0eigga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgc2l6ZSk7CitzdGF0aWMgdm9pZCAgICpiZ2V0cigga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZmZlciwgYnVmc2l6ZSBuZXdzaXplKTsKK3N0YXRpYyB2b2lkICAgIGJyZWwoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYpOworc3RhdGljIHZvaWQgICAgYmVjdGwoICBrbXBfaW5mb190ICp0aCwgYmdldF9jb21wYWN0X3QgY29tcGFjdCwgYmdldF9hY3F1aXJlX3QgYWNxdWlyZSwgYmdldF9yZWxlYXNlX3QgcmVsZWFzZSwgYnVmc2l6ZSBwb29sX2luY3IgKTsKKworI2lmZGVmIEtNUF9ERUJVRworc3RhdGljIHZvaWQgICAgYnN0YXRzKCBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqY3VyYWxsb2MsIGJ1ZnNpemUgKnRvdGZyZWUsIGJ1ZnNpemUgKm1heGZyZWUsIGxvbmcgKm5nZXQsIGxvbmcgKm5yZWwpOworc3RhdGljIHZvaWQgICAgYnN0YXRzZSgga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKnBvb2xfaW5jciwgbG9uZyAqbnBvb2wsIGxvbmcgKm5wZ2V0LCBsb25nICpucHJlbCwgbG9uZyAqbmRnZXQsIGxvbmcgKm5kcmVsKTsKK3N0YXRpYyB2b2lkICAgIGJ1ZmR1bXAoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYpOworc3RhdGljIHZvaWQgICAgYnBvb2xkKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcG9vbCwgaW50IGR1bXBhbGxvYywgaW50IGR1bXBmcmVlKTsKK3N0YXRpYyBpbnQgICAgIGJwb29sdigga21wX2luZm9fdCAqdGgsIHZvaWQgKnBvb2wpOworI2VuZGlmCisKKy8qIEJHRVQgQ09ORklHVVJBVElPTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgYWxsb2NhdGlvbiBzaXplIHF1YW50dW06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBidWZmZXJzIGFsbG9jYXRlZCBhcmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBvZiB0aGlzIHNpemUuICBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VU1QgYmUgYSBwb3dlciBvZiB0d28uICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT24gSUEtMzIgYXJjaGl0ZWN0dXJlIHdpdGggIExpbnV4KiBPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFsbG9jKCkgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlIDE2IGJ5dGUgYWxpZ25tbmVudCAqLworCisjaWYgS01QX0FSQ0hfWDg2IHx8ICFLTVBfSEFWRV9RVUFECisKKyNkZWZpbmUgU2l6ZVF1YW50ICAgOAorI2RlZmluZSBBbGlnblR5cGUgICBkb3VibGUKKworI2Vsc2UKKworI2RlZmluZSBTaXplUXVhbnQgICAxNgorI2RlZmluZSBBbGlnblR5cGUgICBfUXVhZAorCisjZW5kaWYKKworI2RlZmluZSBCdWZTdGF0cyAgICAxICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3RhdHMoKSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0b3RhbCBmcmVlIHNwYWNlIGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCwgdGhlIGxhcmdlc3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYW5kIHRoZSB0b3RhbCBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgYWxsb2NhdGVkLiAqLworCisjaWZkZWYgS01QX0RFQlVHCisKKyNkZWZpbmUgQnVmRHVtcCAgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBvb2xkKCkgZnVuY3Rpb24gd2hpY2ggZHVtcHMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMgaW4gYSBidWZmZXIgcG9vbC4gKi8KKworI2RlZmluZSBCdWZWYWxpZCAgICAxICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicG9vbHYoKSBmdW5jdGlvbiBmb3IgdmFsaWRhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJ1ZmZlciBwb29sLiAqLworCisjZGVmaW5lIER1bXBEYXRhICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmR1bXAoKSBmdW5jdGlvbiB3aGljaCBhbGxvd3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcGluZyB0aGUgY29udGVudHMgb2YgYW4gYWxsb2NhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGZyZWUgYnVmZmVyLiAqLworI2lmZGVmIE5PVF9VU0VEX05PVworCisjZGVmaW5lIEZyZWVXaXBlICAgIDEgICAgICAgICAgICAgICAgIC8qIFdpcGUgZnJlZSBidWZmZXJzIHRvIGEgZ3VhcmFudGVlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuIG9mIGdhcmJhZ2UgdG8gdHJpcCB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjcmVhbnRzIHdobyBhdHRlbXB0IHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVycyBpbnRvIHJlbGVhc2VkIGJ1ZmZlcnMuICovCisKKyNkZWZpbmUgQmVzdEZpdCAgICAgMSAgICAgICAgICAgICAgICAgLyogVXNlIGEgYmVzdCBmaXQgYWxnb3JpdGhtIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoaW5nIGZvciBzcGFjZSBmb3IgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbiByZXF1ZXN0LiAgVGhpcyB1c2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBtb3JlIGVmZmljaWVudGx5LCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbiB3aWxsIGJlIG11Y2ggc2xvd2VyLiAqLworI2VuZGlmIC8qIE5PVF9VU0VEX05PVyAqLworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisKK3N0YXRpYyBidWZzaXplIGJnZXRfYmluX3NpemVbIF0gPSB7CisgICAgMCwKKy8vICAgIDEgPDwgNiwgICAgLyogLjUgQ2FjaGUgbGluZSAqLworICAgIDEgPDwgNywgICAgLyogMSBDYWNoZSBsaW5lLCBuZXcgKi8KKyAgICAxIDw8IDgsICAgIC8qIDIgQ2FjaGUgbGluZXMgKi8KKyAgICAxIDw8IDksICAgIC8qIDQgQ2FjaGUgbGluZXMsIG5ldyAqLworICAgIDEgPDwgMTAsICAgLyogOCBDYWNoZSBsaW5lcyAqLworICAgIDEgPDwgMTEsICAgLyogMTYgQ2FjaGUgbGluZXMsIG5ldyAqLworICAgIDEgPDwgMTIsCisgICAgMSA8PCAxMywgICAvKiBuZXcgKi8KKyAgICAxIDw8IDE0LAorICAgIDEgPDwgMTUsICAgLyogbmV3ICovCisgICAgMSA8PCAxNiwKKyAgICAxIDw8IDE3LAorICAgIDEgPDwgMTgsCisgICAgMSA8PCAxOSwKKyAgICAxIDw8IDIwLCAgICAvKiAgMU1CICovCisgICAgMSA8PCAyMSwgICAgLyogIDJNQiAqLworICAgIDEgPDwgMjIsICAgIC8qICA0TUIgKi8KKyAgICAxIDw8IDIzLCAgICAvKiAgOE1CICovCisgICAgMSA8PCAyNCwgICAgLyogMTZNQiAqLworICAgIDEgPDwgMjUsICAgIC8qIDMyTUIgKi8KK307CisKKyNkZWZpbmUgTUFYX0JHRVRfQklOUyAgIChpbnQpKHNpemVvZihiZ2V0X2Jpbl9zaXplKSAvIHNpemVvZihidWZzaXplKSkKKworc3RydWN0IGJmaGVhZDsKKworLyogIERlY2xhcmUgdGhlIGludGVyZmFjZSwgaW5jbHVkaW5nIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHNpemUgdHlwZSwKKyAgICBidWZzaXplLiAgKi8KKworLyogUXVldWUgbGlua3MgKi8KKwordHlwZWRlZiBzdHJ1Y3QgcWxpbmtzIHsKKyAgICBzdHJ1Y3QgYmZoZWFkICpmbGluazsgICAgICAgICAgICAgLyogRm9yd2FyZCBsaW5rICovCisgICAgc3RydWN0IGJmaGVhZCAqYmxpbms7ICAgICAgICAgICAgIC8qIEJhY2t3YXJkIGxpbmsgKi8KK30gcWxpbmtzX3Q7CisKKy8qIEhlYWRlciBpbiBhbGxvY2F0ZWQgYW5kIGZyZWUgYnVmZmVycyAqLworCit0eXBlZGVmIHN0cnVjdCBiaGVhZDIgeworICAgIGttcF9pbmZvX3QgKmJ0aHI7ICAgICAgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIHdoaWNoIG93bnMgdGhlIGJ1ZmZlciBwb29sICovCisgICAgYnVmc2l6ZSAgICAgcHJldmZyZWU7ICAgICAgICAgICAgIC8qIFJlbGF0aXZlIGxpbmsgYmFjayB0byBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlIGJ1ZmZlciBpbiBtZW1vcnkgb3IgMCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBidWZmZXIgaXMgYWxsb2NhdGVkLiAgKi8KKyAgICBidWZzaXplICAgICBic2l6ZTsgICAgICAgICAgICAgICAgLyogQnVmZmVyIHNpemU6IHBvc2l0aXZlIGlmIGZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIGlmIGFsbG9jYXRlZC4gKi8KK30gYmhlYWQyX3Q7CisKKy8qIE1ha2Ugc3VyZSB0aGUgYmhlYWQgc3RydWN0dXJlIGlzIGEgbXVsdGlwbGUgb2YgU2l6ZVF1YW50IGluIHNpemUuICovCisKK3R5cGVkZWYgdW5pb24gYmhlYWQgeworICAgIEtNUF9BTElHTiggU2l6ZVF1YW50ICkKKyAgICBBbGlnblR5cGUgICAgICAgICAgIGJfYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBiX3BhZFsgc2l6ZW9mKGJoZWFkMl90KSArIChTaXplUXVhbnQgLSAoc2l6ZW9mKGJoZWFkMl90KSAlIFNpemVRdWFudCkpIF07CisgICAgYmhlYWQyX3QgICAgICAgICAgICBiYjsKK30gYmhlYWRfdDsKKyNkZWZpbmUgQkgocCkgICAoKGJoZWFkX3QgKikgKHApKQorCisvKiAgSGVhZGVyIGluIGRpcmVjdGx5IGFsbG9jYXRlZCBidWZmZXJzIChieSBhY3FmY24pICovCisKK3R5cGVkZWYgc3RydWN0IGJkaGVhZAoreworICAgIGJ1ZnNpemUgdHNpemU7ICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBzaXplLCBpbmNsdWRpbmcgb3ZlcmhlYWQgKi8KKyAgICBiaGVhZF90IGJoOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIGhlYWRlciAqLworfSBiZGhlYWRfdDsKKyNkZWZpbmUgQkRIKHApICAoKGJkaGVhZF90ICopIChwKSkKKworLyogSGVhZGVyIGluIGZyZWUgYnVmZmVycyAqLworCit0eXBlZGVmIHN0cnVjdCBiZmhlYWQgeworICAgIGJoZWFkX3QgIGJoOyAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tb24gYWxsb2NhdGVkL2ZyZWUgaGVhZGVyICovCisgICAgcWxpbmtzX3QgcWw7ICAgICAgICAgICAgICAgICAgICAgIC8qIExpbmtzIG9uIGZyZWUgbGlzdCAqLworfSBiZmhlYWRfdDsKKyNkZWZpbmUgQkZIKHApICAoKGJmaGVhZF90ICopIChwKSkKKwordHlwZWRlZiBzdHJ1Y3QgdGhyX2RhdGEgeworICAgIGJmaGVhZF90IGZyZWVsaXN0WyBNQVhfQkdFVF9CSU5TIF07CisjaWYgQnVmU3RhdHMKKyAgICBzaXplX3QgdG90YWxsb2M7ICAgICAgICAgICAgICAgLyogVG90YWwgc3BhY2UgY3VycmVudGx5IGFsbG9jYXRlZCAqLworICAgIGxvbmcgbnVtZ2V0LCBudW1yZWw7ICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmdldCgpIGFuZCBicmVsKCkgY2FsbHMgKi8KKyAgICBsb25nIG51bXBibGs7ICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHBvb2wgYmxvY2tzICovCisgICAgbG9uZyBudW1wZ2V0LCBudW1wcmVsOyAgICAgICAgIC8qIE51bWJlciBvZiBibG9jayBnZXRzIGFuZCByZWxzICovCisgICAgbG9uZyBudW1kZ2V0LCBudW1kcmVsOyAgICAgICAgIC8qIE51bWJlciBvZiBkaXJlY3QgZ2V0cyBhbmQgcmVscyAqLworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKyAgICAvKiBBdXRvbWF0aWMgZXhwYW5zaW9uIGJsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisgICAgYmdldF9jb21wYWN0X3QgY29tcGZjbjsKKyAgICBiZ2V0X2FjcXVpcmVfdCBhY3FmY247CisgICAgYmdldF9yZWxlYXNlX3QgcmVsZmNuOworCisgICAgYmdldF9tb2RlX3QgICAgbW9kZTsgICAgICAgICAgICAgIC8qIHdoYXQgYWxsb2NhdGlvbiBtb2RlIHRvIHVzZT8gKi8KKworICAgIGJ1ZnNpemUgZXhwX2luY3I7ICAgICAgICAgICAgICAgICAvKiBFeHBhbnNpb24gYmxvY2sgc2l6ZSAqLworICAgIGJ1ZnNpemUgcG9vbF9sZW47ICAgICAgICAgICAgICAgICAvKiAwOiBubyBicG9vbCBjYWxscyBoYXZlIGJlZW4gbWFkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogbm90IGFsbCBwb29sIGJsb2NrcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjA6IChjb21tb24pIGJsb2NrIHNpemUgZm9yIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBvb2wgY2FsbHMgbWFkZSBzbyBmYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBiZmhlYWRfdCAqIGxhc3RfcG9vbDsgICAgICAgICAgICAgLyogTGFzdCBwb29sIG93bmVkIGJ5IHRoaXMgdGhyZWFkIChkZWxheSBkZWFsb2NhdGlvbikgKi8KK30gdGhyX2RhdGFfdDsKKworLyogIE1pbmltdW0gYWxsb2NhdGlvbiBxdWFudHVtOiAqLworCisjZGVmaW5lIFFMU2l6ZSAgKHNpemVvZihxbGlua3NfdCkpCisjZGVmaW5lIFNpemVRICAgKChTaXplUXVhbnQgPiBRTFNpemUpID8gU2l6ZVF1YW50IDogUUxTaXplKQorI2RlZmluZSBNYXhTaXplIChidWZzaXplKSggfiAoICggKGJ1ZnNpemUpKCAxICkgPDwgKCBzaXplb2YoIGJ1ZnNpemUgKSAqIENIQVJfQklUIC0gMSApICkgfCAoIFNpemVRdWFudCAtIDEgKSApICkKKyAgICAvLyBNYXhpbXVuIGZvciB0aGUgcmVxdWVzdGVkIHNpemUuCisKKy8qIEVuZCBzZW50aW5lbDogdmFsdWUgcGxhY2VkIGluIGJzaXplIGZpZWxkIG9mIGR1bW15IGJsb2NrIGRlbGltaXRpbmcKKyAgIGVuZCBvZiBwb29sIGJsb2NrLiAgVGhlIG1vc3QgbmVnYXRpdmUgbnVtYmVyIHdoaWNoIHdpbGwgIGZpdCAgaW4gIGEKKyAgIGJ1ZnNpemUsIGRlZmluZWQgaW4gYSB3YXkgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBhY2NlcHQuICovCisKKyNkZWZpbmUgRVNlbnQgICAoKGJ1ZnNpemUpICgtKCgoKChidWZzaXplKTEpPDwoKGludClzaXplb2YoYnVmc2l6ZSkqOC0yKSktMSkqMiktMikpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaHJlYWQgRGF0YSBtYW5hZ2VtZW50IHJvdXRpbmVzICovCisKK3N0YXRpYyBpbnQKK2JnZXRfZ2V0X2JpbiggYnVmc2l6ZSBzaXplICkKK3sKKyAgICAvLyBiaW5hcnkgY2hvcCBiaW5zCisgICAgaW50IGxvID0gMCwgaGkgPSBNQVhfQkdFVF9CSU5TIC0gMTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgPiAwICk7CisKKyAgICB3aGlsZSAoIChoaSAtIGxvKSA+IDEgKSB7CisgICAgICAgIGludCBtaWQgPSAobG8gKyBoaSkgPj4gMTsKKyAgICAgICAgaWYgKHNpemUgPCBiZ2V0X2Jpbl9zaXplWyBtaWQgXSkKKyAgICAgICAgICAgIGhpID0gbWlkIC0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG8gPSBtaWQ7CisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggKGxvID49IDApICYmIChsbyA8IE1BWF9CR0VUX0JJTlMpICk7CisKKyAgICByZXR1cm4gbG87Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdGhyX2RhdGEoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgaTsKKyAgICB0aHJfZGF0YV90ICpkYXRhOworCisgICAgZGF0YSA9CisgICAgICAgICh0aHJfZGF0YV90ICopKAorICAgICAgICAgICAgKCAhIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgKSA/IF9fa21wX2FsbG9jYXRlKCBzaXplb2YoICpkYXRhICkgKSA6IHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEKKyAgICAgICAgKTsKKworICAgIG1lbXNldCggZGF0YSwgJ1wwJywgc2l6ZW9mKCAqZGF0YSApICk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0JHRVRfQklOUzsgKytpKSB7CisgICAgICAgIGRhdGEtPmZyZWVsaXN0WyBpIF0ucWwuZmxpbmsgPSAmIGRhdGEtPmZyZWVsaXN0WyBpIF07CisgICAgICAgIGRhdGEtPmZyZWVsaXN0WyBpIF0ucWwuYmxpbmsgPSAmIGRhdGEtPmZyZWVsaXN0WyBpIF07CisgICAgfQorCisgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9IGRhdGE7CisgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCA9IDA7CisjaWYgISBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgX19rbXBfaW5pdF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyNlbHNlCisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisjZW5kaWYgLyogVVNFX0xPQ0tfRk9SX0JHRVQgKi8KKyNlbmRpZiAvKiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworfQorCitzdGF0aWMgdGhyX2RhdGFfdCAqCitnZXRfdGhyX2RhdGEoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICB0aHJfZGF0YV90ICpkYXRhOworCisgICAgZGF0YSA9ICh0aHJfZGF0YV90ICopIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGE7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBkYXRhICE9IDAgKTsKKworICAgIHJldHVybiBkYXRhOworfQorCisKKyNpZmRlZiBLTVBfREVCVUcKKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfdmFsaWRhdGVfcXVldWUoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICAvKiBOT1RFOiBhc3N1bWUgdGhhdCB0aGUgZ2xvYmFsX2xvY2sgaXMgaGVsZCAqLworCisgICAgdm9pZCAqcCA9ICh2b2lkICopIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3Q7CisKKyAgICB3aGlsZSAocCAhPSAwKSB7CisgICAgICAgIGJmaGVhZF90ICpiID0gQkZIKCgoY2hhciAqKSBwKSAtIHNpemVvZihiaGVhZF90KSk7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5ic2l6ZSAhPSAwKTsKKyAgICAgICAgcCA9ICh2b2lkICopIGItPnFsLmZsaW5rOworICAgIH0KK30KKworI2VuZGlmCisKKy8qIFdhbGsgdGhlIGZyZWUgbGlzdCBhbmQgcmVsZWFzZSB0aGUgZW5xdWV1ZWQgYnVmZmVycyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF9kZXF1ZXVlKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgdm9pZCAqcCA9IFRDUl9TWU5DX1BUUih0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0KTsKKworICAgIGlmIChwICE9IDApIHsKKyAgICAgICAgI2lmIFVTRV9DTVBfWENIR19GT1JfQkdFVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZvbGF0aWxlIHZvaWQgKm9sZF92YWx1ZSA9IFRDUl9TWU5DX1BUUih0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0KTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICAgICAgICAgJiB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0LCBvbGRfdmFsdWUsIE5VTEwgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgICAgIG9sZF92YWx1ZSA9IFRDUl9TWU5DX1BUUih0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcCA9ICh2b2lkICopIG9sZF92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgI2Vsc2UgLyogISBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KKyAgICAgICAgICAgICNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoKSApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyAgICAgICAgICAgICNlbmRpZiAvKiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUICovCisKKyAgICAgICAgICAgICBwID0gKHZvaWQgKikgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdDsKKyAgICAgICAgICAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0ID0gMDsKKworICAgICAgICAgICAgI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGgpICk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICNlbmRpZiAvKiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KKworICAgICAgICAvKiBDaGVjayBhZ2FpbiB0byBtYWtlIHN1cmUgdGhlIGxpc3QgaXMgbm90IGVtcHR5ICovCisKKyAgICAgICAgd2hpbGUgKHAgIT0gMCkgeworICAgICAgICAgICAgdm9pZCAqYnVmID0gcDsKKyAgICAgICAgICAgIGJmaGVhZF90ICpiID0gQkZIKCgoY2hhciAqKSBwKSAtIHNpemVvZihiaGVhZF90KSk7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPmJoLmJiLmJzaXplICE9IDAgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICggKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmIH4xICkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50cHRyX3QpdGggKTsgLy8gY2xlYXIgcG9zc2libGUgbWFyaworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+cWwuYmxpbmsgPT0gMCApOworCisgICAgICAgICAgICBwID0gKHZvaWQgKikgYi0+cWwuZmxpbms7CisKKyAgICAgICAgICAgIGJyZWwoIHRoLCBidWYgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ2hhaW4gdG9nZXRoZXIgdGhlIGZyZWUgYnVmZmVycyBieSB1c2luZyB0aGUgdGhyZWFkIG93bmVyIGZpZWxkICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X2VucXVldWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgICAgICwga21wX2ludDMyIHJlbF9ndGlkCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBiZmhlYWRfdCAqYiA9IEJGSCgoKGNoYXIgKikgYnVmKSAtIHNpemVvZihiaGVhZF90KSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5iaC5iYi5ic2l6ZSAhPSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoa21wX3VpbnRwdHJfdClUQ1JfUFRSKGItPmJoLmJiLmJ0aHIpICYgfjEgKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50cHRyX3QpdGggKTsgLy8gY2xlYXIgcG9zc2libGUgbWFyaworCisgICAgYi0+cWwuYmxpbmsgPSAwOworCisgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9iZ2V0X2VucXVldWU6IG1vdmluZyBidWZmZXIgdG8gVCMlZCBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApICkgKTsKKworI2lmIFVTRV9DTVBfWENIR19GT1JfQkdFVAorICAgIHsKKyAgICAgICAgdm9sYXRpbGUgdm9pZCAqb2xkX3ZhbHVlID0gVENSX1BUUih0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0KTsKKyAgICAgICAgLyogdGhlIG5leHQgcG9pbnRlciBtdXN0IGJlIHNldCBiZWZvcmUgc2V0dGluZyBiZ2V0X2xpc3QgdG8gYnVmIHRvIGF2b2lkCisgICAgICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICAgICAgYi0+cWwuZmxpbmsgPSBCRkgoIG9sZF92YWx1ZSApOworCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAgICAgJiB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0LCBvbGRfdmFsdWUsIGJ1ZiApICkKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgb2xkX3ZhbHVlID0gVENSX1BUUih0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0KTsKKyAgICAgICAgICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgYmdldF9saXN0IHRvIGJ1ZiB0byBhdm9pZAorICAgICAgICAgICAgICAgZXhwb3NpbmcgYSBicm9rZW4gbGlzdCB0byBvdGhlciB0aHJlYWRzLCBldmVuIGZvciBhbiBpbnN0YW50LiAqLworICAgICAgICAgICAgYi0+cWwuZmxpbmsgPSBCRkgoIG9sZF92YWx1ZSApOworICAgICAgICB9CisgICAgfQorI2Vsc2UgLyogISBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KKyMgaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLCByZWxfZ3RpZCApOworIyBlbHNlCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisgIyBlbmRpZgorCisgICAgYi0+cWwuZmxpbmsgPSBCRkgoIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgKTsKKyAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0ID0gKHZvaWQgKikgYnVmOworCisjIGlmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywgcmVsX2d0aWQgKTsKKyMgZWxzZQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworIyBlbmRpZgorI2VuZGlmIC8qIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworfQorCisvKiBpbnNlcnQgYnVmZmVyIGJhY2sgb250byBhIG5ldyBmcmVlbGlzdCAqLworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyX2RhdGFfdCAqdGhyLCBiZmhlYWRfdCAqYiApCit7CisgICAgaW50IGJpbjsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KWIgKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+YmguYmIuYnNpemUgJSBTaXplUXVhbnQgPT0gMCApOworCisgICAgYmluID0gYmdldF9nZXRfYmluKCBiLT5iaC5iYi5ic2l6ZSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5ibGluay0+cWwuZmxpbmsgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmZsaW5rLT5xbC5ibGluayA9PSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pOworCisgICAgYi0+cWwuZmxpbmsgPSAmdGhyLT5mcmVlbGlzdFsgYmluIF07CisgICAgYi0+cWwuYmxpbmsgPSB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5ibGluazsKKworICAgIHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmJsaW5rID0gYjsKKyAgICBiLT5xbC5ibGluay0+cWwuZmxpbmsgPSBiOworfQorCisvKiB1bmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBvbGQgZnJlZWxpc3QgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGJmaGVhZF90ICpiICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKGItPnFsLmJsaW5rLT5xbC5mbGluayA9PSBiKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGItPnFsLmZsaW5rLT5xbC5ibGluayA9PSBiKTsKKworICAgIGItPnFsLmJsaW5rLT5xbC5mbGluayA9IGItPnFsLmZsaW5rOworICAgIGItPnFsLmZsaW5rLT5xbC5ibGluayA9IGItPnFsLmJsaW5rOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIEdFVCBTVEFUUyAtLSBjaGVjayBpbmZvIG9uIGZyZWUgbGlzdCAqLworCitzdGF0aWMgdm9pZAorYmNoZWNrKCAga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKm1heF9mcmVlLCBidWZzaXplICp0b3RhbF9mcmVlICkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisgICAgaW50IGJpbjsKKworICAgICp0b3RhbF9mcmVlID0gKm1heF9mcmVlID0gMDsKKworICAgIGZvciAoYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgYmZoZWFkX3QgKmIsICpiZXN0OworCisgICAgICAgIGJlc3QgPSAmdGhyLT5mcmVlbGlzdFsgYmluIF07CisgICAgICAgIGIgPSBiZXN0LT5xbC5mbGluazsKKworICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgICp0b3RhbF9mcmVlICs9IChiLT5iaC5iYi5ic2l6ZSAtIHNpemVvZiggYmhlYWRfdCApKTsKKyAgICAgICAgICAgIGlmICgoYmVzdCA9PSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHx8IChiLT5iaC5iYi5ic2l6ZSA8IGJlc3QtPmJoLmJiLmJzaXplKSkKKyAgICAgICAgICAgICAgICBiZXN0ID0gYjsKKworICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgYiA9IGItPnFsLmZsaW5rOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCptYXhfZnJlZSA8IGJlc3QtPmJoLmJiLmJzaXplKQorICAgICAgICAgICAgKm1heF9mcmVlID0gYmVzdC0+YmguYmIuYnNpemU7CisgICAgfQorCisgICAgaWYgKCptYXhfZnJlZSA+IChidWZzaXplKXNpemVvZiggYmhlYWRfdCApKQorICAgICAgICAqbWF4X2ZyZWUgLT0gc2l6ZW9mKCBiaGVhZF90ICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgQkdFVCAgLS0gIEFsbG9jYXRlIGEgYnVmZmVyLiAgKi8KKworc3RhdGljIHZvaWQgKgorYmdldCggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHJlcXVlc3RlZF9zaXplICkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisgICAgYnVmc2l6ZSBzaXplID0gcmVxdWVzdGVkX3NpemU7CisgICAgYmZoZWFkX3QgKmI7CisgICAgdm9pZCAqYnVmOworICAgIGludCBjb21wYWN0c2VxID0gMDsKKyAgICBpbnQgdXNlX2JsaW5rID0gMDsKKy8qIEZvciBCZXN0Rml0ICovCisgICAgYmZoZWFkX3QgKmJlc3Q7CisKKyAgICBpZiAoIHNpemUgPCAwIHx8IHNpemUgKyBzaXplb2YoIGJoZWFkX3QgKSA+IE1heFNpemUgKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworICAgIGlmIChzaXplIDwgKGJ1ZnNpemUpU2l6ZVEpIHsgICAgICAvKiBOZWVkIGF0IGxlYXN0IHJvb20gZm9yIHRoZSAqLworICAgICAgICBzaXplID0gU2l6ZVE7ICAgICAgICAgICAgICAgICAvKiAgICBxdWV1ZSBsaW5rcy4gICovCisgICAgfQorICAgICNpZiBkZWZpbmVkKCBTaXplUXVhbnQgKSAmJiAoIFNpemVRdWFudCA+IDEgKQorICAgICAgICBzaXplID0gKHNpemUgKyAoU2l6ZVF1YW50IC0gMSkpICYgKH4oU2l6ZVF1YW50IC0gMSkpOworICAgICNlbmRpZgorCisgICAgc2l6ZSArPSBzaXplb2YoYmhlYWRfdCk7ICAgICAvKiBBZGQgb3ZlcmhlYWQgaW4gYWxsb2NhdGVkIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzaXplIHJlcXVpcmVkLiAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgPj0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgJSBTaXplUXVhbnQgPT0gMCApOworCisgICAgdXNlX2JsaW5rID0gKCB0aHItPm1vZGUgPT0gYmdldF9tb2RlX2xpZm8gKTsKKworICAgIC8qIElmIGEgY29tcGFjdCBmdW5jdGlvbiB3YXMgcHJvdmlkZWQgaW4gdGhlIGNhbGwgdG8gYmVjdGwoKSwgd3JhcAorICAgICAgIGEgbG9vcCBhcm91bmQgdGhlIGFsbG9jYXRpb24gcHJvY2VzcyAgdG8gIGFsbG93ICBjb21wYWN0aW9uICB0bworICAgICAgIGludGVydmVuZSBpbiBjYXNlIHdlIGRvbid0IGZpbmQgYSBzdWl0YWJsZSBidWZmZXIgaW4gdGhlIGNoYWluLiAqLworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgYmluOworCisgICAgICAgIGZvciAoYmluID0gYmdldF9nZXRfYmluKCBzaXplICk7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgICAgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgICAgICBiID0gKCB1c2VfYmxpbmsgPyB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5ibGluayA6IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmZsaW5rICk7CisKKyAgICAgICAgICAgIGlmICh0aHItPm1vZGUgPT0gYmdldF9tb2RlX2Jlc3QpIHsKKyAgICAgICAgICAgICAgICBiZXN0ID0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOworCisgICAgICAgICAgICAgICAgLyogU2NhbiB0aGUgZnJlZSBsaXN0IHNlYXJjaGluZyBmb3IgdGhlIGZpcnN0IGJ1ZmZlciBiaWcgZW5vdWdoCisgICAgICAgICAgICAgICAgICAgdG8gaG9sZCB0aGUgcmVxdWVzdGVkIHNpemUgYnVmZmVyLiAqLworCisgICAgICAgICAgICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiLT5iaC5iYi5ic2l6ZSA+PSAoYnVmc2l6ZSkgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChiZXN0ID09ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgfHwgKGItPmJoLmJiLmJzaXplIDwgYmVzdC0+YmguYmIuYnNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIGIgPSAoIHVzZV9ibGluayA/IGItPnFsLmJsaW5rIDogYi0+cWwuZmxpbmsgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYiA9IGJlc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgeworICAgICAgICAgICAgICAgIGlmICgoYnVmc2l6ZSkgYi0+YmguYmIuYnNpemUgPj0gKGJ1ZnNpemUpIHNpemUpIHsKKworICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgIGlzIGJpZyBlbm91Z2ggdG8gc2F0aXNmeSAgdGhlIHJlcXVlc3QuICBBbGxvY2F0ZSBpdAorICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY2FsbGVyLiAgV2UgbXVzdCBkZWNpZGUgd2hldGhlciB0aGUgYnVmZmVyIGlzICBsYXJnZQorICAgICAgICAgICAgICAgICAgICAgICBlbm91Z2ggIHRvICBzcGxpdCAgaW50byAgdGhlIHBhcnQgZ2l2ZW4gdG8gdGhlIGNhbGxlciBhbmQgYQorICAgICAgICAgICAgICAgICAgICAgICBmcmVlIGJ1ZmZlciB0aGF0IHJlbWFpbnMgb24gdGhlIGZyZWUgbGlzdCwgb3IgIHdoZXRoZXIgIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmUgIGJ1ZmZlciAgc2hvdWxkICBiZSAgcmVtb3ZlZCAgZnJvbSB0aGUgZnJlZSBsaXN0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiB0byB0aGUgY2FsbGVyIGluIGl0cyBlbnRpcmV0eS4gICBXZSAgb25seSAgc3BsaXQgIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaWYgZW5vdWdoIHJvb20gcmVtYWlucyBmb3IgYSBoZWFkZXIgcGx1cyB0aGUgbWluaW11bQorICAgICAgICAgICAgICAgICAgICAgICBxdWFudHVtIG9mIGFsbG9jYXRpb24uICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChiLT5iaC5iYi5ic2l6ZSAtIChidWZzaXplKSBzaXplKSA+IChidWZzaXplKShTaXplUSArIChzaXplb2YoYmhlYWRfdCkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmhlYWRfdCAqYmEsICpibjsKKworICAgICAgICAgICAgICAgICAgICAgICAgYmEgPSBCSCgoKGNoYXIgKikgYikgKyAoYi0+YmguYmIuYnNpemUgLSAoYnVmc2l6ZSkgc2l6ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYm4gPSBCSCgoKGNoYXIgKikgYmEpICsgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYm4tPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VidHJhY3Qgc2l6ZSBmcm9tIGxlbmd0aCBvZiBmcmVlIGJsb2NrLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYi0+YmguYmIuYnNpemUgLT0gKGJ1ZnNpemUpIHNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpbmsgYWxsb2NhdGVkIGJ1ZmZlciB0byB0aGUgcHJldmlvdXMgZnJlZSBidWZmZXIuICovCisgICAgICAgICAgICAgICAgICAgICAgICBiYS0+YmIucHJldmZyZWUgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogUGx1ZyBuZWdhdGl2ZSBzaXplIGludG8gdXNlciBidWZmZXIuICovCisgICAgICAgICAgICAgICAgICAgICAgICBiYS0+YmIuYnNpemUgPSAtc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFyayB0aGlzIGJ1ZmZlciBhcyBvd25lZCBieSB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRDV19QVFIoYmEtPmJiLmJ0aHIsIHRoKTsgICAvLyBub3QgYW4gYWxsb2NhdGVkIGFkZHJlc3MgKGRvIG5vdCBtYXJrIGl0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFyayBidWZmZXIgYWZ0ZXIgdGhpcyBvbmUgbm90IHByZWNlZGVkIGJ5IGZyZWUgYmxvY2suICovCisgICAgICAgICAgICAgICAgICAgICAgICBibi0+YmIucHJldmZyZWUgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBvbGQgZnJlZWxpc3QsIGFuZCByZWluc2VydCBpdCBpbnRvIHRoZSBuZXcgZnJlZWxpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRociwgYiApOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICAgICAgICAgICAgICB0aHItPnRvdGFsbG9jICs9IChzaXplX3QpIHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHItPm51bWdldCsrOyAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiBiZ2V0KCkgY2FsbHMgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gKHZvaWQgKikgKCgoKGNoYXIgKikgYmEpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdClidWYpICUgU2l6ZVF1YW50ID09IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaGVhZF90ICpiYTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYmEgPSBCSCgoKGNoYXIgKikgYikgKyBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmEtPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGJ1ZmZlciBpc24ndCBiaWcgZW5vdWdoIHRvIHNwbGl0LiAgR2l2ZSAgdGhlICB3aG9sZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlYmFuZyB0byB0aGUgY2FsbGVyIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZnJlZSBsaXN0LiAqLworCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKyNpZiBCdWZTdGF0cworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBiLT5iaC5iYi5ic2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+bnVtZ2V0Kys7ICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJnZXQoKSBjYWxscyAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWdhdGUgc2l6ZSB0byBtYXJrIGJ1ZmZlciBhbGxvY2F0ZWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICBiLT5iaC5iYi5ic2l6ZSA9IC0oYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIHRoaXMgYnVmZmVyIGFzIG93bmVkIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgVENXX1BUUihiYS0+YmIuYnRociwgdGgpOyAgIC8vIG5vdCBhbiBhbGxvY2F0ZWQgYWRkcmVzcyAoZG8gbm90IG1hcmsgaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBaZXJvIHRoZSBiYWNrIHBvaW50ZXIgaW4gdGhlIG5leHQgYnVmZmVyIGluIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICBiYS0+YmIucHJldmZyZWUgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHVzZXIgYnVmZmVyIHN0YXJ0aW5nIGF0IHF1ZXVlIGxpbmtzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gICh2b2lkICopICYoYi0+cWwpOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGIgPSAoIHVzZV9ibGluayA/IGItPnFsLmJsaW5rIDogYi0+cWwuZmxpbmsgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFdlIGZhaWxlZCB0byBmaW5kIGEgYnVmZmVyLiAgSWYgdGhlcmUncyBhIGNvbXBhY3QgIGZ1bmN0aW9uCisgICAgICAgICAgIGRlZmluZWQsICBub3RpZnkgIGl0ICBvZiB0aGUgc2l6ZSByZXF1ZXN0ZWQuICBJZiBpdCByZXR1cm5zCisgICAgICAgICAgIFRSVUUsIHRyeSB0aGUgYWxsb2NhdGlvbiBhZ2Fpbi4gKi8KKworICAgICAgICBpZiAoKHRoci0+Y29tcGZjbiA9PSAwKSB8fCAoISgqdGhyLT5jb21wZmNuKShzaXplLCArK2NvbXBhY3RzZXEpKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBObyBidWZmZXIgYXZhaWxhYmxlIHdpdGggcmVxdWVzdGVkIHNpemUgZnJlZS4gKi8KKworICAgIC8qIERvbid0IGdpdmUgdXAgeWV0IC0tIGxvb2sgaW4gdGhlIHJlc2VydmUgc3VwcGx5LiAqLworCisgICAgaWYgKHRoci0+YWNxZmNuICE9IDApIHsKKyAgICAgICAgaWYgKHNpemUgPiAoYnVmc2l6ZSkgKHRoci0+ZXhwX2luY3IgLSBzaXplb2YoYmhlYWRfdCkpKSB7CisKKyAgICAgICAgICAgIC8qIFJlcXVlc3QgIGlzICB0b28gIGxhcmdlICB0byAgZml0IGluIGEgc2luZ2xlIGV4cGFuc2lvbgorICAgICAgICAgICAgICAgYmxvY2suICBUcnkgdG8gc2F0aXN5IGl0IGJ5IGEgZGlyZWN0IGJ1ZmZlciBhY3F1aXNpdGlvbi4gKi8KKworICAgICAgICAgICAgYmRoZWFkX3QgKmJkaDsKKworICAgICAgICAgICAgc2l6ZSArPSBzaXplb2YoYmRoZWFkX3QpIC0gc2l6ZW9mKGJoZWFkX3QpOworCisgICAgICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIE1BTExPQyggJWQgKVxuIiwgKGludCkgc2l6ZSApICk7CisKKyAgICAgICAgICAgIC8qIHJpY2hyeWFuICovCisgICAgICAgICAgICBiZGggPSBCREgoKCp0aHItPmFjcWZjbikoKGJ1ZnNpemUpIHNpemUpKTsKKyAgICAgICAgICAgIGlmIChiZGggIT0gTlVMTCkgeworCisgICAgICAgICAgICAgICAgLyogIE1hcmsgdGhlIGJ1ZmZlciBzcGVjaWFsIGJ5IHNldHRpbmcgdGhlIHNpemUgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgb2YgaXRzIGhlYWRlciB0byB6ZXJvLiAgKi8KKyAgICAgICAgICAgICAgICBiZGgtPmJoLmJiLmJzaXplID0gMDsKKworICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBidWZmZXIgYXMgb3duZWQgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgVENXX1BUUihiZGgtPmJoLmJiLmJ0aHIsIHRoKTsgIC8vIGRvbid0IG1hcmsgYnVmZmVyIGFzIGFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBkaXJlY3QgYnVmZmVyIG5ldmVyIGdvZXMgdG8gZnJlZSBsaXN0CisgICAgICAgICAgICAgICAgYmRoLT5iaC5iYi5wcmV2ZnJlZSA9IDA7CisgICAgICAgICAgICAgICAgYmRoLT50c2l6ZSA9IHNpemU7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgICAgICB0aHItPnRvdGFsbG9jICs9IChzaXplX3QpIHNpemU7CisgICAgICAgICAgICAgICAgdGhyLT5udW1nZXQrKzsgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYmdldCgpIGNhbGxzICovCisgICAgICAgICAgICAgICAgdGhyLT5udW1kZ2V0Kys7ICAgICAgIC8qIERpcmVjdCBiZ2V0KCkgY2FsbCBjb3VudCAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgYnVmID0gICh2b2lkICopIChiZGggKyAxKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdClidWYpICUgU2l6ZVF1YW50ID09IDAgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8qICBUcnkgdG8gb2J0YWluIGEgbmV3IGV4cGFuc2lvbiBibG9jayAqLworCisgICAgICAgICAgICB2b2lkICpuZXdwb29sOworCisgICAgICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIE1BTExPQ0IoICVkIClcbiIsIChpbnQpIHRoci0+ZXhwX2luY3IgKSApOworCisgICAgICAgICAgICAvKiByaWNocnlhbiAqLworICAgICAgICAgICAgbmV3cG9vbCA9ICgqdGhyLT5hY3FmY24pKChidWZzaXplKSB0aHItPmV4cF9pbmNyKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KW5ld3Bvb2wpICUgU2l6ZVF1YW50ID09IDAgKTsKKyAgICAgICAgICAgIGlmIChuZXdwb29sICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicG9vbCggdGgsIG5ld3Bvb2wsIHRoci0+ZXhwX2luY3IpOworICAgICAgICAgICAgICAgIGJ1ZiA9ICBiZ2V0KCB0aCwgcmVxdWVzdGVkX3NpemUpOyAgLyogVGhpcyBjYW4ndCwgSSBzYXksIGNhbid0IGdldCBpbnRvIGEgbG9vcC4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogIFN0aWxsIG5vIGJ1ZmZlciBhdmFpbGFibGUgKi8KKworICAgIHJldHVybiBOVUxMOworfQorCisvKiAgQkdFVFogIC0tICBBbGxvY2F0ZSBhIGJ1ZmZlciBhbmQgY2xlYXIgaXRzIGNvbnRlbnRzIHRvIHplcm8uICBXZSBjbGVhcgorICAgICAgICAgICAgICAgdGhlICBlbnRpcmUgIGNvbnRlbnRzICBvZiAgdGhlIGJ1ZmZlciB0byB6ZXJvLCBub3QganVzdCB0aGUKKyAgICAgICAgICAgICAgIHJlZ2lvbiByZXF1ZXN0ZWQgYnkgdGhlIGNhbGxlci4gKi8KKworc3RhdGljIHZvaWQgKgorYmdldHooICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSBzaXplICkKK3sKKyAgICBjaGFyICpidWYgPSAoY2hhciAqKSBiZ2V0KCB0aCwgc2l6ZSk7CisKKyAgICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICAgICAgYmhlYWRfdCAqYjsKKyAgICAgICAgYnVmc2l6ZSByc2l6ZTsKKworICAgICAgICBiID0gQkgoYnVmIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKyAgICAgICAgcnNpemUgPSAtKGItPmJiLmJzaXplKTsKKyAgICAgICAgaWYgKHJzaXplID09IDApIHsKKyAgICAgICAgICAgIGJkaGVhZF90ICpiZDsKKworICAgICAgICAgICAgYmQgPSBCREgoYnVmIC0gc2l6ZW9mKGJkaGVhZF90KSk7CisgICAgICAgICAgICByc2l6ZSA9IGJkLT50c2l6ZSAtIChidWZzaXplKSBzaXplb2YoYmRoZWFkX3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnNpemUgLT0gc2l6ZW9mKGJoZWFkX3QpOworICAgICAgICB9CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChyc2l6ZSA+PSBzaXplKTsKKworICAgICAgICAodm9pZCkgbWVtc2V0KGJ1ZiwgMCwgKGJ1ZnNpemUpIHJzaXplKTsKKyAgICB9CisgICAgcmV0dXJuICgodm9pZCAqKSBidWYpOworfQorCisvKiAgQkdFVFIgIC0tICBSZWFsbG9jYXRlIGEgYnVmZmVyLiAgVGhpcyBpcyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24sCisgICAgICAgICAgICAgICBzaW1wbHkgaW4gdGVybXMgb2YgYnJlbCgpICBhbmQgIGJnZXQoKS4gICBJdCAgY291bGQgIGJlCisgICAgICAgICAgICAgICBlbmhhbmNlZCB0byBhbGxvdyB0aGUgYnVmZmVyIHRvIGdyb3cgaW50byBhZGphY2VudCBmcmVlCisgICAgICAgICAgICAgICBibG9ja3MgYW5kIHRvIGF2b2lkIG1vdmluZyBkYXRhIHVubmVjZXNzYXJpbHkuICAqLworCitzdGF0aWMgdm9pZCAqCitiZ2V0ciggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYsIGJ1ZnNpemUgc2l6ZSkKK3sKKyAgICB2b2lkICpuYnVmOworICAgIGJ1ZnNpemUgb3NpemU7ICAgICAgICAgICAgICAgICAgICAvKiBPbGQgc2l6ZSBvZiBidWZmZXIgKi8KKyAgICBiaGVhZF90ICpiOworCisgICAgbmJ1ZiA9IGJnZXQoIHRoLCBzaXplICk7CisgICAgaWYgKCBuYnVmID09IE5VTEwgKSB7IC8qIEFjcXVpcmUgbmV3IGJ1ZmZlciAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCBidWYgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIG5idWY7CisgICAgfQorICAgIGIgPSBCSCgoKGNoYXIgKikgYnVmKSAtIHNpemVvZihiaGVhZF90KSk7CisgICAgb3NpemUgPSAtYi0+YmIuYnNpemU7CisgICAgaWYgKG9zaXplID09IDApIHsKKyAgICAgICAgLyogIEJ1ZmZlciBhY3F1aXJlZCBkaXJlY3RseSB0aHJvdWdoIGFjcWZjbi4gKi8KKyAgICAgICAgYmRoZWFkX3QgKmJkOworCisgICAgICAgIGJkID0gQkRIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJkaGVhZF90KSk7CisgICAgICAgIG9zaXplID0gYmQtPnRzaXplIC0gKGJ1ZnNpemUpIHNpemVvZihiZGhlYWRfdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3NpemUgLT0gc2l6ZW9mKGJoZWFkX3QpOworICAgIH07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKG9zaXplID4gMCk7CisKKyAgICAodm9pZCkgS01QX01FTUNQWSgoY2hhciAqKSBuYnVmLCAoY2hhciAqKSBidWYsIC8qIENvcHkgdGhlIGRhdGEgKi8KKyAgICAgICAgICAgICAoc2l6ZV90KSAoKHNpemUgPCBvc2l6ZSkgPyBzaXplIDogb3NpemUpKTsKKyAgICBicmVsKCB0aCwgYnVmICk7CisKKyAgICByZXR1cm4gbmJ1ZjsKK30KKworLyogIEJSRUwgIC0tICBSZWxlYXNlIGEgYnVmZmVyLiAgKi8KKworc3RhdGljIHZvaWQKK2JyZWwoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmICkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisgICAgYmZoZWFkX3QgKmIsICpibjsKKyAgICBrbXBfaW5mb190ICpidGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKGJ1ZiAhPSBOVUxMKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdClidWYpICUgU2l6ZVF1YW50ID09IDAgKTsKKworICAgIGIgPSBCRkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgaWYgKGItPmJoLmJiLmJzaXplID09IDApIHsgICAgICAgIC8qIERpcmVjdGx5LWFjcXVpcmVkIGJ1ZmZlcj8gKi8KKyAgICAgICAgYmRoZWFkX3QgKmJkaDsKKworICAgICAgICBiZGggPSBCREgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmRoZWFkX3QpKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5wcmV2ZnJlZSA9PSAwKTsKKyNpZiBCdWZTdGF0cworICAgICAgICB0aHItPnRvdGFsbG9jIC09IChzaXplX3QpIGJkaC0+dHNpemU7CisgICAgICAgIHRoci0+bnVtZHJlbCsrOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBkaXJlY3QgcmVsZWFzZXMgKi8KKyAgICAgICAgdGhyLT5udW1yZWwrKzsgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiBicmVsKCkgY2FsbHMgKi8KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICh2b2lkKSBtZW1zZXQoKGNoYXIgKikgYnVmLCAweDU1LAorICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoYmRoLT50c2l6ZSAtIHNpemVvZihiZGhlYWRfdCkpKTsKKyNlbmRpZiAvKiBGcmVlV2lwZSAqLworCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgRlJFRSggJXAgKVxuIiwgKHZvaWQgKikgYmRoICkgKTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHItPnJlbGZjbiAhPSAwICk7CisgICAgICAgICgqdGhyLT5yZWxmY24pKCh2b2lkICopIGJkaCk7ICAgICAgLyogUmVsZWFzZSBpdCBkaXJlY3RseS4gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJ0aCA9IChrbXBfaW5mb190ICopKCAoa21wX3VpbnRwdHJfdClUQ1JfUFRSKGItPmJoLmJiLmJ0aHIpICYgfjEgKTsgLy8gY2xlYXIgcG9zc2libGUgbWFyayBiZWZvcmUgY29tcGFyaXNvbgorICAgIGlmICggYnRoICE9IHRoICkgeworICAgICAgICAvKiBBZGQgdGhpcyBidWZmZXIgdG8gYmUgcmVsZWFzZWQgYnkgdGhlIG93bmluZyB0aHJlYWQgbGF0ZXIgKi8KKyAgICAgICAgX19rbXBfYmdldF9lbnF1ZXVlKCBidGgsIGJ1ZgorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkKKyNlbmRpZgorICAgICAgICApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQnVmZmVyIHNpemUgbXVzdCBiZSBuZWdhdGl2ZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaXMKKyAgICAgICBhbGxvY2F0ZWQuICovCisKKyAgICBpZiAoYi0+YmguYmIuYnNpemUgPj0gMCkgeworICAgICAgICBibiA9IE5VTEw7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgPCAwKTsKKworICAgIC8qICBCYWNrIHBvaW50ZXIgaW4gbmV4dCBidWZmZXIgbXVzdCBiZSB6ZXJvLCBpbmRpY2F0aW5nIHRoZQorICAgICAgICBzYW1lIHRoaW5nOiAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiIC0gYi0+YmguYmIuYnNpemUpLT5iYi5wcmV2ZnJlZSA9PSAwKTsKKworI2lmIEJ1ZlN0YXRzCisgICAgdGhyLT5udW1yZWwrKzsgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYnJlbCgpIGNhbGxzICovCisgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBiLT5iaC5iYi5ic2l6ZTsKKyNlbmRpZgorCisgICAgLyogSWYgdGhlIGJhY2sgbGluayBpcyBub256ZXJvLCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGZyZWUuICAqLworCisgICAgaWYgKGItPmJoLmJiLnByZXZmcmVlICE9IDApIHsKKyAgICAgICAgLyogVGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBmcmVlLiAgQ29uc29saWRhdGUgdGhpcyBidWZmZXIgIHdpdGggIGl0CisgICAgICAgICAgIGJ5ICBhZGRpbmcgIHRoZSAgbGVuZ3RoICBvZiAgdGhpcyAgYnVmZmVyICB0byB0aGUgcHJldmlvdXMgZnJlZQorICAgICAgICAgICBidWZmZXIuICBOb3RlIHRoYXQgd2Ugc3VidHJhY3QgdGhlIHNpemUgIGluICB0aGUgIGJ1ZmZlciAgYmVpbmcKKyAgICAgICAgICAgcmVsZWFzZWQsICBzaW5jZSAgaXQncyAgbmVnYXRpdmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzCisgICAgICAgICAgIGFsbG9jYXRlZC4gKi8KKworICAgICAgICByZWdpc3RlciBidWZzaXplIHNpemUgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAvKiBNYWtlIHRoZSBwcmV2aW91cyBidWZmZXIgdGhlIG9uZSB3ZSdyZSB3b3JraW5nIG9uLiAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgLSBiLT5iaC5iYi5wcmV2ZnJlZSktPmJiLmJzaXplID09IGItPmJoLmJiLnByZXZmcmVlKTsKKyAgICAgICAgYiA9IEJGSCgoKGNoYXIgKikgYikgLSBiLT5iaC5iYi5wcmV2ZnJlZSk7CisgICAgICAgIGItPmJoLmJiLmJzaXplIC09IHNpemU7CisKKyAgICAgICAgLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0ICovCisgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFRoZSBwcmV2aW91cyBidWZmZXIgaXNuJ3QgYWxsb2NhdGVkLiAgTWFyayB0aGlzIGJ1ZmZlcgorICAgICAgICAgICBzaXplIGFzIHBvc2l0aXZlIChpLmUuIGZyZWUpIGFuZCBmYWxsIHRocm91Z2ggdG8gcGxhY2UKKyAgICAgICAgICAgdGhlIGJ1ZmZlciBvbiB0aGUgZnJlZSBsaXN0IGFzIGFuIGlzb2xhdGVkIGZyZWUgYmxvY2suICovCisKKyAgICAgICAgYi0+YmguYmIuYnNpemUgPSAtYi0+YmguYmIuYnNpemU7CisgICAgfQorCisgICAgLyogaW5zZXJ0IGJ1ZmZlciBiYWNrIG9udG8gYSBuZXcgZnJlZWxpc3QgKi8KKyAgICBfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHIsIGIgKTsKKworCisgICAgLyogTm93IHdlIGxvb2sgYXQgdGhlIG5leHQgYnVmZmVyIGluIG1lbW9yeSwgbG9jYXRlZCBieSBhZHZhbmNpbmcgZnJvbQorICAgICAgIHRoZSAgc3RhcnQgIG9mICB0aGlzICBidWZmZXIgIGJ5IGl0cyBzaXplLCB0byBzZWUgaWYgdGhhdCBidWZmZXIgaXMKKyAgICAgICBmcmVlLiAgSWYgaXQgaXMsIHdlIGNvbWJpbmUgIHRoaXMgIGJ1ZmZlciAgd2l0aCAgdGhlICBuZXh0ICBvbmUgIGluCisgICAgICAgbWVtb3J5LCBkZWNoYWluaW5nIHRoZSBzZWNvbmQgYnVmZmVyIGZyb20gdGhlIGZyZWUgbGlzdC4gKi8KKworICAgIGJuID0gIEJGSCgoKGNoYXIgKikgYikgKyBiLT5iaC5iYi5ic2l6ZSk7CisgICAgaWYgKGJuLT5iaC5iYi5ic2l6ZSA+IDApIHsKKworICAgICAgICAvKiBUaGUgYnVmZmVyIGlzIGZyZWUuICBSZW1vdmUgaXQgZnJvbSB0aGUgZnJlZSBsaXN0IGFuZCBhZGQKKyAgICAgICAgICAgaXRzIHNpemUgdG8gdGhhdCBvZiBvdXIgYnVmZmVyLiAqLworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYm4gKyBibi0+YmguYmIuYnNpemUpLT5iYi5wcmV2ZnJlZSA9PSBibi0+YmguYmIuYnNpemUpOworCisgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGJuICk7CisKKyAgICAgICAgYi0+YmguYmIuYnNpemUgKz0gYm4tPmJoLmJiLmJzaXplOworCisgICAgICAgIC8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCwgYW5kIHJlaW5zZXJ0IGl0IGludG8gdGhlIG5ldyBmcmVlbGlzdCAqLworCisgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKyAgICAgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisKKyAgICAgICAgLyogRmluYWxseSwgIGFkdmFuY2UgIHRvICAgdGhlICBidWZmZXIgIHRoYXQgICBmb2xsb3dzICB0aGUgIG5ld2x5CisgICAgICAgICAgIGNvbnNvbGlkYXRlZCBmcmVlIGJsb2NrLiAgV2UgbXVzdCBzZXQgaXRzICBiYWNrcG9pbnRlciAgdG8gIHRoZQorICAgICAgICAgICBoZWFkICBvZiAgdGhlICBjb25zb2xpZGF0ZWQgZnJlZSBibG9jay4gIFdlIGtub3cgdGhlIG5leHQgYmxvY2sKKyAgICAgICAgICAgbXVzdCBiZSBhbiBhbGxvY2F0ZWQgYmxvY2sgYmVjYXVzZSB0aGUgcHJvY2VzcyBvZiByZWNvbWJpbmF0aW9uCisgICAgICAgICAgIGd1YXJhbnRlZXMgIHRoYXQgIHR3byAgZnJlZSAgYmxvY2tzIHdpbGwgbmV2ZXIgYmUgY29udGlndW91cyBpbgorICAgICAgICAgICBtZW1vcnkuICAqLworCisgICAgICAgIGJuID0gQkZIKCgoY2hhciAqKSBiKSArIGItPmJoLmJiLmJzaXplKTsKKyAgICB9CisjaWZkZWYgRnJlZVdpcGUKKyAgICAodm9pZCkgbWVtc2V0KCgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCksIDB4NTUsCisgICAgICAgICAgICAoc2l6ZV90KSAoYi0+YmguYmIuYnNpemUgLSBzaXplb2YoYmZoZWFkX3QpKSk7CisjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKGJuLT5iaC5iYi5ic2l6ZSA8IDApOworCisgICAgLyogVGhlIG5leHQgYnVmZmVyIGlzIGFsbG9jYXRlZC4gIFNldCB0aGUgYmFja3BvaW50ZXIgaW4gaXQgIHRvICBwb2ludAorICAgICAgIHRvIHRoaXMgYnVmZmVyOyB0aGUgcHJldmlvdXMgZnJlZSBidWZmZXIgaW4gbWVtb3J5LiAqLworCisgICAgYm4tPmJoLmJiLnByZXZmcmVlID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAvKiAgSWYgIGEgIGJsb2NrLXJlbGVhc2UgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoaXMgZnJlZSBidWZmZXIKKyAgICAgICAgY29uc3RpdHV0ZXMgdGhlIGVudGlyZSBibG9jaywgcmVsZWFzZSBpdC4gIE5vdGUgdGhhdCAgcG9vbF9sZW4KKyAgICAgICAgaXMgIGRlZmluZWQgIGluICBzdWNoIGEgd2F5IHRoYXQgdGhlIHRlc3Qgd2lsbCBmYWlsIHVubGVzcyBhbGwKKyAgICAgICAgcG9vbCBibG9ja3MgYXJlIHRoZSBzYW1lIHNpemUuICAqLworCisgICAgaWYgKHRoci0+cmVsZmNuICE9IDAgJiYKKyAgICAgICAgYi0+YmguYmIuYnNpemUgPT0gKGJ1ZnNpemUpKHRoci0+cG9vbF9sZW4gLSBzaXplb2YoYmhlYWRfdCkpKQorICAgIHsKKyNpZiBCdWZTdGF0cworICAgICAgICBpZiAodGhyLT5udW1wYmxrICE9IDEpIHsgICAgICAgIC8qIERvIG5vdCByZWxlYXNlIHRoZSBsYXN0IGJ1ZmZlciB1bnRpbCBmaW5hbGl6YXRpb24gdGltZSAqLworI2VuZGlmCisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIucHJldmZyZWUgPT0gMCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgKyBiLT5iaC5iYi5ic2l6ZSktPmJiLmJzaXplID09IEVTZW50KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiArIGItPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAvKiAgVW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgZnJlZSBsaXN0ICAqLworICAgICAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYiApOworCisgICAgICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopIGIgKSApOworCisgICAgICAgICAgICAoKnRoci0+cmVsZmNuKShiKTsKKyNpZiBCdWZTdGF0cworICAgICAgICAgICAgdGhyLT5udW1wcmVsKys7ICAgICAgICAgICAgICAgLyogTnIgb2YgZXhwYW5zaW9uIGJsb2NrIHJlbGVhc2VzICovCisgICAgICAgICAgICB0aHItPm51bXBibGstLTsgICAgICAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+bnVtcGJsayA9PSB0aHItPm51bXBnZXQgLSB0aHItPm51bXByZWwpOworCisgICAgICAgICAgICAvKiBhdm9pZCBsZWF2aW5nIHN0YWxlIGxhc3RfcG9vbCBwb2ludGVyIGFyb3VuZCBpZiBpdCBpcyBiZWluZyBkZWFsbG9jZWQgKi8KKyAgICAgICAgICAgIGlmICh0aHItPmxhc3RfcG9vbCA9PSBiKSB0aHItPmxhc3RfcG9vbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aHItPmxhc3RfcG9vbCA9IGI7CisgICAgICAgIH0KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworICAgIH0KK30KKworLyogIEJFQ1RMICAtLSAgRXN0YWJsaXNoIGF1dG9tYXRpYyBwb29sIGV4cGFuc2lvbiBjb250cm9sICAqLworCitzdGF0aWMgdm9pZAorYmVjdGwoICBrbXBfaW5mb190ICp0aCwgYmdldF9jb21wYWN0X3QgY29tcGFjdCwgYmdldF9hY3F1aXJlX3QgYWNxdWlyZSwgYmdldF9yZWxlYXNlX3QgcmVsZWFzZSwgYnVmc2l6ZSBwb29sX2luY3IpCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworCisgICAgdGhyLT5jb21wZmNuID0gY29tcGFjdDsKKyAgICB0aHItPmFjcWZjbiA9IGFjcXVpcmU7CisgICAgdGhyLT5yZWxmY24gPSByZWxlYXNlOworICAgIHRoci0+ZXhwX2luY3IgPSBwb29sX2luY3I7Cit9CisKKy8qICBCUE9PTCAgLS0gIEFkZCBhIHJlZ2lvbiBvZiBtZW1vcnkgdG8gdGhlIGJ1ZmZlciBwb29sLiAgKi8KKworc3RhdGljIHZvaWQKK2Jwb29sKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiwgYnVmc2l6ZSBsZW4pCit7CisvKiAgICBpbnQgYmluID0gMDsgKi8KKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoYnVmKTsKKyAgICBiaGVhZF90ICpibjsKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworCisjaWZkZWYgU2l6ZVF1YW50CisgICAgbGVuICY9IH4oU2l6ZVF1YW50IC0gMSk7CisjZW5kaWYKKyAgICBpZiAodGhyLT5wb29sX2xlbiA9PSAwKSB7CisgICAgICAgIHRoci0+cG9vbF9sZW4gPSBsZW47CisgICAgfSBlbHNlIGlmIChsZW4gIT0gdGhyLT5wb29sX2xlbikgeworICAgICAgICB0aHItPnBvb2xfbGVuID0gLTE7CisgICAgfQorI2lmIEJ1ZlN0YXRzCisgICAgdGhyLT5udW1wZ2V0Kys7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBibG9jayBhY3F1aXNpdGlvbnMgKi8KKyAgICB0aHItPm51bXBibGsrKzsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJsb2NrcyB0b3RhbCAqLworICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5udW1wYmxrID09IHRoci0+bnVtcGdldCAtIHRoci0+bnVtcHJlbCk7CisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworICAgIC8qIFNpbmNlIHRoZSBibG9jayBpcyBpbml0aWFsbHkgb2NjdXBpZWQgYnkgYSBzaW5nbGUgZnJlZSAgYnVmZmVyLAorICAgICAgIGl0ICBoYWQgIGJldHRlciAgbm90ICBiZSAgKG11Y2gpIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGJ1ZmZlcgorICAgICAgIHdob3NlIHNpemUgd2UgY2FuIHN0b3JlIGluIGJoZWFkLmJiLmJzaXplLiAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVChsZW4gLSBzaXplb2YoYmhlYWRfdCkgPD0gLSgoYnVmc2l6ZSkgRVNlbnQgKyAxKSk7CisKKyAgICAvKiBDbGVhciAgdGhlICBiYWNrcG9pbnRlciBhdCAgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayB0byBpbmRpY2F0ZSB0aGF0CisgICAgICAgdGhlcmUgIGlzICBubyAgZnJlZSAgYmxvY2sgIHByaW9yICB0byAgdGhpcyAgIG9uZS4gICAgVGhhdCAgIGJsb2NrcworICAgICAgIHJlY29tYmluYXRpb24gd2hlbiB0aGUgZmlyc3QgYmxvY2sgaW4gbWVtb3J5IGlzIHJlbGVhc2VkLiAqLworCisgICAgYi0+YmguYmIucHJldmZyZWUgPSAwOworCisgICAgLyogQ3JlYXRlIGEgZHVtbXkgYWxsb2NhdGVkIGJ1ZmZlciBhdCB0aGUgZW5kIG9mIHRoZSBwb29sLiAgVGhpcyBkdW1teQorICAgICAgIGJ1ZmZlciBpcyBzZWVuIHdoZW4gYSBidWZmZXIgYXQgdGhlIGVuZCBvZiB0aGUgcG9vbCBpcyByZWxlYXNlZCBhbmQKKyAgICAgICBibG9ja3MgIHJlY29tYmluYXRpb24gIG9mICB0aGUgbGFzdCBidWZmZXIgd2l0aCB0aGUgZHVtbXkgYnVmZmVyIGF0CisgICAgICAgdGhlIGVuZC4gIFRoZSBsZW5ndGggaW4gdGhlIGR1bW15IGJ1ZmZlciAgaXMgIHNldCAgdG8gIHRoZSAgbGFyZ2VzdAorICAgICAgIG5lZ2F0aXZlICBudW1iZXIgIHRvICBkZW5vdGUgIHRoZSAgZW5kICBvZiAgdGhlIHBvb2wgZm9yIGRpYWdub3N0aWMKKyAgICAgICByb3V0aW5lcyAodGhpcyBzcGVjaWZpYyB2YWx1ZSBpcyAgbm90ICBjb3VudGVkICBvbiAgYnkgIHRoZSAgYWN0dWFsCisgICAgICAgYWxsb2NhdGlvbiBhbmQgcmVsZWFzZSBmdW5jdGlvbnMpLiAqLworCisgICAgbGVuIC09IHNpemVvZihiaGVhZF90KTsKKyAgICBiLT5iaC5iYi5ic2l6ZSA9IChidWZzaXplKSBsZW47CisgICAgLyogU2V0IHRoZSBvd25lciBvZiB0aGlzIGJ1ZmZlciAqLworICAgIFRDV19QVFIoIGItPmJoLmJiLmJ0aHIsIChrbXBfaW5mb190KikoKGttcF91aW50cHRyX3QpdGggfCAxKSApOyAvLyBtYXJrIHRoZSBidWZmZXIgYXMgYWxsb2NhdGVkIGFkZHJlc3MKKworICAgIC8qIENoYWluIHRoZSBuZXcgYmxvY2sgdG8gdGhlIGZyZWUgbGlzdC4gKi8KKyAgICBfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHIsIGIgKTsKKworI2lmZGVmIEZyZWVXaXBlCisgICAgKHZvaWQpIG1lbXNldCgoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpLCAweDU1LAorICAgICAgICAgICAgIChzaXplX3QpIChsZW4gLSBzaXplb2YoYmZoZWFkX3QpKSk7CisjZW5kaWYKKyAgICBibiA9IEJIKCgoY2hhciAqKSBiKSArIGxlbik7CisgICAgYm4tPmJiLnByZXZmcmVlID0gKGJ1ZnNpemUpIGxlbjsKKyAgICAvKiBEZWZpbml0aW9uIG9mIEVTZW50IGFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudCEgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCAofjApID09IC0xICYmIChibiAhPSAwKSApOworCisgICAgYm4tPmJiLmJzaXplID0gRVNlbnQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgQkZSRUVEICAtLSAgRHVtcCB0aGUgZnJlZSBsaXN0cyBmb3IgdGhpcyB0aHJlYWQuICovCisKK3N0YXRpYyB2b2lkCitiZnJlZWQoICBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IGJpbiA9IDAsIGNvdW50ID0gMDsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICk7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworCisjaWYgQnVmU3RhdHMKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiX19rbXBfcHJpbnRwb29sOiBUIyVkIHRvdGFsPSUiIEtNUF9VSU5UNjRfU1BFQyAiIGdldD0lIiBLTVBfSU5UNjRfU1BFQyAiIHJlbD0lIiBcCisgICAgICAgICAgIEtNUF9JTlQ2NF9TUEVDICIgcGJsaz0lIiBLTVBfSU5UNjRfU1BFQyAiIHBnZXQ9JSIgS01QX0lOVDY0X1NQRUMgIiBwcmVsPSUiIEtNUF9JTlQ2NF9TUEVDIFwKKyAgICAgICAgICAgIiBkZ2V0PSUiIEtNUF9JTlQ2NF9TUEVDICIgZHJlbD0lIiBLTVBfSU5UNjRfU1BFQyAiXG4iLAorICAgICAgICAgICBndGlkLCAoa21wX3VpbnQ2NCkgdGhyLT50b3RhbGxvYywKKyAgICAgICAgICAgKGttcF9pbnQ2NCkgdGhyLT5udW1nZXQsICAoa21wX2ludDY0KSB0aHItPm51bXJlbCwKKyAgICAgICAgICAgKGttcF9pbnQ2NCkgdGhyLT5udW1wYmxrLAorICAgICAgICAgICAoa21wX2ludDY0KSB0aHItPm51bXBnZXQsIChrbXBfaW50NjQpIHRoci0+bnVtcHJlbCwKKyAgICAgICAgICAgKGttcF9pbnQ2NCkgdGhyLT5udW1kZ2V0LCAoa21wX2ludDY0KSB0aHItPm51bWRyZWwgKTsKKyNlbmRpZgorCisgICAgZm9yIChiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgICAgICBiZmhlYWRfdCAqYjsKKworICAgICAgICBmb3IgKGIgPSB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluazsgYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF07IGIgPSBiLT5xbC5mbGluaykgeworICAgICAgICAgICAgYnVmc2l6ZSBicyA9IGItPmJoLmJiLmJzaXplOworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5xbC5ibGluay0+cWwuZmxpbmsgPT0gYiApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+cWwuZmxpbmstPnFsLmJsaW5rID09IGIgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGJzID4gMCApOworCisgICAgICAgICAgICBjb3VudCArPSAxOworCisgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiX19rbXBfcHJpbnRwb29sOiBUIyVkIEZyZWUgYmxvY2s6IDB4JXAgc2l6ZSAlNmxkIGJ5dGVzLlxuIiwgZ3RpZCwgYiwgKGxvbmcpIGJzICk7CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICpsZXJyID0gKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KTsKKyAgICAgICAgICAgICAgICBpZiAoKGJzID4gc2l6ZW9mKGJmaGVhZF90KSkgJiYgKCgqbGVyciAhPSAweDU1KSB8fCAobWVtY21wKGxlcnIsIGxlcnIgKyAxLCAoc2l6ZV90KSAoYnMgLSAoc2l6ZW9mKGJmaGVhZF90KSArIDEpKSkgIT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiX19rbXBfcHJpbnRwb29sOiBUIyVkICAgICAoQ29udGVudHMgb2YgYWJvdmUgZnJlZSBibG9jayBoYXZlIGJlZW4gb3ZlcnN0b3JlZC4pXG4iLCBndGlkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCBObyBmcmVlIGJsb2Nrc1xuIiwgZ3RpZCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEtNUF9ERUJVRworCisjaWYgQnVmU3RhdHMKKworLyogIEJTVEFUUyAgLS0gIFJldHVybiBidWZmZXIgYWxsb2NhdGlvbiBmcmVlIHNwYWNlIHN0YXRpc3RpY3MuICAqLworCitzdGF0aWMgdm9pZAorYnN0YXRzKCAga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKmN1cmFsbG9jLCAgYnVmc2l6ZSAqdG90ZnJlZSwgIGJ1ZnNpemUgKm1heGZyZWUsIGxvbmcgKm5nZXQsIGxvbmcgKm5yZWwpCit7CisgICAgaW50IGJpbiA9IDA7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworCisgICAgKm5nZXQgPSB0aHItPm51bWdldDsKKyAgICAqbnJlbCA9IHRoci0+bnVtcmVsOworICAgICpjdXJhbGxvYyA9IChidWZzaXplKSB0aHItPnRvdGFsbG9jOworICAgICp0b3RmcmVlID0gMDsKKyAgICAqbWF4ZnJlZSA9IC0xOworCisgICAgZm9yIChiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgICAgICBiZmhlYWRfdCAqYiA9IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmZsaW5rOworCisgICAgICAgIHdoaWxlIChiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5ic2l6ZSA+IDApOworICAgICAgICAgICAgKnRvdGZyZWUgKz0gYi0+YmguYmIuYnNpemU7CisgICAgICAgICAgICBpZiAoYi0+YmguYmIuYnNpemUgPiAqbWF4ZnJlZSkgeworICAgICAgICAgICAgICAgICptYXhmcmVlID0gYi0+YmguYmIuYnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiID0gYi0+cWwuZmxpbms7ICAgICAgICAgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qICBCU1RBVFNFICAtLSAgUmV0dXJuIGV4dGVuZGVkIHN0YXRpc3RpY3MgICovCisKK3N0YXRpYyB2b2lkCitic3RhdHNlKCAga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKnBvb2xfaW5jciwgbG9uZyAqbnBvb2wsIGxvbmcgKm5wZ2V0LCBsb25nICpucHJlbCwgbG9uZyAqbmRnZXQsIGxvbmcgKm5kcmVsKQoreworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworICAgICpwb29sX2luY3IgPSAodGhyLT5wb29sX2xlbiA8IDApID8gLXRoci0+ZXhwX2luY3IgOiB0aHItPmV4cF9pbmNyOworICAgICpucG9vbCA9IHRoci0+bnVtcGJsazsKKyAgICAqbnBnZXQgPSB0aHItPm51bXBnZXQ7CisgICAgKm5wcmVsID0gdGhyLT5udW1wcmVsOworICAgICpuZGdldCA9IHRoci0+bnVtZGdldDsKKyAgICAqbmRyZWwgPSB0aHItPm51bWRyZWw7Cit9CisKKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisvKiAgQlVGRFVNUCAgLS0gIER1bXAgdGhlIGRhdGEgaW4gYSBidWZmZXIuICBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSAgdXNlcgorICAgICAgICAgICAgICAgICBkYXRhIHBvaW50ZXIsIGFuZCBiYWNrcyB1cCB0byB0aGUgYnVmZmVyIGhlYWRlci4gIEl0IHdpbGwKKyAgICAgICAgICAgICAgICAgZHVtcCBlaXRoZXIgYSBmcmVlIGJsb2NrIG9yIGFuIGFsbG9jYXRlZCBvbmUuICAqLworCitzdGF0aWMgdm9pZAorYnVmZHVtcCggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYgKQoreworICAgIGJmaGVhZF90ICpiOworICAgIHVuc2lnbmVkIGNoYXIgKmJkdW1wOworICAgIGJ1ZnNpemUgYmRsZW47CisKKyAgICBiID0gQkZIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplICE9IDApOworICAgIGlmIChiLT5iaC5iYi5ic2l6ZSA8IDApIHsKKyAgICAgICAgYmR1bXAgPSAodW5zaWduZWQgY2hhciAqKSBidWY7CisgICAgICAgIGJkbGVuID0gKC1iLT5iaC5iYi5ic2l6ZSkgLSAoYnVmc2l6ZSkgc2l6ZW9mKGJoZWFkX3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJkdW1wID0gKHVuc2lnbmVkIGNoYXIgKikgKCgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCkpOworICAgICAgICBiZGxlbiA9IGItPmJoLmJiLmJzaXplIC0gKGJ1ZnNpemUpIHNpemVvZihiZmhlYWRfdCk7CisgICAgfQorCisgICAgd2hpbGUgKGJkbGVuID4gMCkgeworICAgICAgICBpbnQgaSwgZHVwZXMgPSAwOworICAgICAgICBidWZzaXplIGwgPSBiZGxlbjsKKyAgICAgICAgY2hhciBiaGV4WzUwXSwgYmFzY2lpWzIwXTsKKworICAgICAgICBpZiAobCA+IDE2KSB7CisgICAgICAgICAgICBsID0gMTY7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICAgICAgICAodm9pZCkgS01QX1NOUFJJTlRGKGJoZXggKyBpICogMywgc2l6ZW9mKGJoZXgpIC0gaSAqIDMsICIlMDJYICIsIGJkdW1wW2ldKTsKKyAgICAgICAgICAgIGlmIChiZHVtcFtpXSA+IDB4MjAgJiYgYmR1bXBbaV0gPCAweDdGKQorICAgICAgICAgICAgICAgIGJhc2NpaVsgaSBdID0gYmR1bXBbIGkgXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYXNjaWlbIGkgXSA9ICcgJzsKKyAgICAgICAgfQorICAgICAgICBiYXNjaWlbaV0gPSAwOworICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soIiUtNDhzICAgJXNcbiIsIGJoZXgsIGJhc2NpaSk7CisgICAgICAgIGJkdW1wICs9IGw7CisgICAgICAgIGJkbGVuIC09IGw7CisgICAgICAgIHdoaWxlICgoYmRsZW4gPiAxNikgJiYgKG1lbWNtcCgoY2hhciAqKSAoYmR1bXAgLSAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBiZHVtcCwgMTYpID09IDApKSB7CisgICAgICAgICAgICBkdXBlcysrOworICAgICAgICAgICAgYmR1bXAgKz0gMTY7CisgICAgICAgICAgICBiZGxlbiAtPSAxNjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHVwZXMgPiAxKSB7CisgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soCisgICAgICAgICAgICAgICAgIiAgICAgKCVkIGxpbmVzIFslZCBieXRlc10gaWRlbnRpY2FsIHRvIGFib3ZlIGxpbmUgc2tpcHBlZClcbiIsCisgICAgICAgICAgICAgICAgZHVwZXMsIGR1cGVzICogMTYpOworICAgICAgICB9IGVsc2UgaWYgKGR1cGVzID09IDEpIHsKKyAgICAgICAgICAgIGJkdW1wIC09IDE2OworICAgICAgICAgICAgYmRsZW4gKz0gMTY7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qICBCUE9PTEQgIC0tICBEdW1wIGEgYnVmZmVyIHBvb2wuICBUaGUgYnVmZmVyIGhlYWRlcnMgYXJlIGFsd2F5cyBsaXN0ZWQuCisgICAgICAgICAgICAgICAgSWYgRFVNUEFMTE9DIGlzIG5vbnplcm8sIHRoZSBjb250ZW50cyBvZiBhbGxvY2F0ZWQgYnVmZmVycworICAgICAgICAgICAgICAgIGFyZSAgZHVtcGVkLiAgIElmICBEVU1QRlJFRSAgaXMgIG5vbnplcm8sICBmcmVlIGJsb2NrcyBhcmUKKyAgICAgICAgICAgICAgICBkdW1wZWQgYXMgd2VsbC4gIElmIEZyZWVXaXBlICBjaGVja2luZyAgaXMgIGVuYWJsZWQsICBmcmVlCisgICAgICAgICAgICAgICAgYmxvY2tzICB3aGljaCAgaGF2ZSAgYmVlbiBjbG9iYmVyZWQgd2lsbCBhbHdheXMgYmUgZHVtcGVkLiAqLworCitzdGF0aWMgdm9pZAorYnBvb2xkKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiwgaW50IGR1bXBhbGxvYywgaW50IGR1bXBmcmVlKQoreworICAgIGJmaGVhZF90ICpiID0gQkZIKCAoY2hhciopYnVmIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgIHdoaWxlIChiLT5iaC5iYi5ic2l6ZSAhPSBFU2VudCkgeworICAgICAgICBidWZzaXplIGJzID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgaWYgKGJzIDwgMCkgeworICAgICAgICAgICAgYnMgPSAtYnM7CisgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soIkFsbG9jYXRlZCBidWZmZXI6IHNpemUgJTZsZCBieXRlcy5cbiIsIChsb25nKSBicyk7CisgICAgICAgICAgICBpZiAoZHVtcGFsbG9jKSB7CisgICAgICAgICAgICAgICAgYnVmZHVtcCggdGgsICh2b2lkICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxlcnIgPSAiIjsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChicyA+IDApOworICAgICAgICAgICAgaWYgKChiLT5xbC5ibGluay0+cWwuZmxpbmsgIT0gYikgfHwgKGItPnFsLmZsaW5rLT5xbC5ibGluayAhPSBiKSkgeworICAgICAgICAgICAgICAgIGxlcnIgPSAiICAoQmFkIGZyZWUgbGlzdCBsaW5rcykiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCJGcmVlIGJsb2NrOiAgICAgICBzaXplICU2bGQgYnl0ZXMuJXNcbiIsCisgICAgICAgICAgICAgICAgKGxvbmcpIGJzLCBsZXJyKTsKKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAgICAgbGVyciA9ICgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCk7CisgICAgICAgICAgICBpZiAoKGJzID4gc2l6ZW9mKGJmaGVhZF90KSkgJiYgKCgqbGVyciAhPSAweDU1KSB8fAorICAgICAgICAgICAgICAgIChtZW1jbXAobGVyciwgbGVyciArIDEsCisgICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoYnMgLSAoc2l6ZW9mKGJmaGVhZF90KSArIDEpKSkgIT0gMCkpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICAgICAgICAiKENvbnRlbnRzIG9mIGFib3ZlIGZyZWUgYmxvY2sgaGF2ZSBiZWVuIG92ZXJzdG9yZWQuKVxuIik7CisgICAgICAgICAgICAgICAgYnVmZHVtcCggdGgsICh2b2lkICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICBpZiAoZHVtcGZyZWUpIHsKKyAgICAgICAgICAgICAgICBidWZkdW1wKCB0aCwgKHZvaWQgKikgKCgoY2hhciAqKSBiKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGIgPSBCRkgoKChjaGFyICopIGIpICsgYnMpOworICAgIH0KK30KKworLyogIEJQT09MViAgLS0gIFZhbGlkYXRlIGEgYnVmZmVyIHBvb2wuICovCisKK3N0YXRpYyBpbnQKK2Jwb29sdiggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYgKQoreworICAgIGJmaGVhZF90ICpiID0gQkZIKGJ1Zik7CisKKyAgICB3aGlsZSAoYi0+YmguYmIuYnNpemUgIT0gRVNlbnQpIHsKKyAgICAgICAgYnVmc2l6ZSBicyA9IGItPmJoLmJiLmJzaXplOworCisgICAgICAgIGlmIChicyA8IDApIHsKKyAgICAgICAgICAgIGJzID0gLWJzOworICAgICAgICB9IGVsc2UgeworI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICAgICBjaGFyICpsZXJyID0gIiI7CisjZW5kaWYKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChicyA+IDApOworICAgICAgICAgICAgaWYgKGJzIDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoYi0+cWwuYmxpbmstPnFsLmZsaW5rICE9IGIpIHx8IChiLT5xbC5mbGluay0+cWwuYmxpbmsgIT0gYikpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soIkZyZWUgYmxvY2s6IHNpemUgJTZsZCBieXRlcy4gIChCYWQgZnJlZSBsaXN0IGxpbmtzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIChsb25nKSBicyk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAgICAgbGVyciA9ICgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCk7CisgICAgICAgICAgICBpZiAoKGJzID4gc2l6ZW9mKGJmaGVhZF90KSkgJiYgKCgqbGVyciAhPSAweDU1KSB8fAorICAgICAgICAgICAgICAgIChtZW1jbXAobGVyciwgbGVyciArIDEsCisgICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoYnMgLSAoc2l6ZW9mKGJmaGVhZF90KSArIDEpKSkgIT0gMCkpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICAgICAgICAiKENvbnRlbnRzIG9mIGFib3ZlIGZyZWUgYmxvY2sgaGF2ZSBiZWVuIG92ZXJzdG9yZWQuKVxuIik7CisgICAgICAgICAgICAgICAgYnVmZHVtcCggdGgsICh2b2lkICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKDApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIEZyZWVXaXBlICovCisgICAgICAgIH0KKyAgICAgICAgYiA9IEJGSCgoKGNoYXIgKikgYikgKyBicyk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9pbml0aWFsaXplX2JnZXQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBTaXplUXVhbnQgPj0gc2l6ZW9mKCB2b2lkICogKSAmJiAodGggIT0gMCkgKTsKKworICAgIHNldF90aHJfZGF0YSggdGggKTsKKworICAgIGJlY3RsKCB0aCwgKGJnZXRfY29tcGFjdF90KSAwLCAoYmdldF9hY3F1aXJlX3QpIG1hbGxvYywgKGJnZXRfcmVsZWFzZV90KSBmcmVlLAorICAgICAgICAgICAoYnVmc2l6ZSkgX19rbXBfbWFsbG9jX3Bvb2xfaW5jciApOworfQorCit2b2lkCitfX2ttcF9maW5hbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyOworICAgIGJmaGVhZF90ICpiOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gMCApOworCisjaWYgQnVmU3RhdHMKKyAgICB0aHIgPSAodGhyX2RhdGFfdCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRociAhPSBOVUxMICk7CisgICAgYiA9IHRoci0+bGFzdF9wb29sOworCisgICAgLyogIElmICBhICBibG9jay1yZWxlYXNlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGlzIGZyZWUgYnVmZmVyCisgICAgICAgIGNvbnN0aXR1dGVzIHRoZSBlbnRpcmUgYmxvY2ssIHJlbGVhc2UgaXQuICBOb3RlIHRoYXQgIHBvb2xfbGVuCisgICAgICAgIGlzICBkZWZpbmVkICBpbiAgc3VjaCBhIHdheSB0aGF0IHRoZSB0ZXN0IHdpbGwgZmFpbCB1bmxlc3MgYWxsCisgICAgICAgIHBvb2wgYmxvY2tzIGFyZSB0aGUgc2FtZSBzaXplLiAgKi8KKworICAgIC8qIERlYWxsb2NhdGUgdGhlIGxhc3QgcG9vbCBpZiBvbmUgZXhpc3RzIGJlY2F1c2Ugd2Ugbm8gbG9uZ2VyIGRvIGl0IGluIGJyZWwoKSAqLworICAgIGlmICh0aHItPnJlbGZjbiAhPSAwICYmIGIgIT0gMCAmJiB0aHItPm51bXBibGsgIT0gMCAmJgorICAgICAgICBiLT5iaC5iYi5ic2l6ZSA9PSAoYnVmc2l6ZSkodGhyLT5wb29sX2xlbiAtIHNpemVvZihiaGVhZF90KSkpCisgICAgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLnByZXZmcmVlID09IDApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgKyBiLT5iaC5iYi5ic2l6ZSktPmJiLmJzaXplID09IEVTZW50KTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgLyogIFVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIGZyZWUgbGlzdCAgKi8KKyAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYiApOworCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgRlJFRSggJXAgKVxuIiwgKHZvaWQgKikgYiApICk7CisKKyAgICAgICAgKCp0aHItPnJlbGZjbikoYik7CisgICAgICAgIHRoci0+bnVtcHJlbCsrOyAgICAgICAgICAgICAgIC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgICAgICB0aHItPm51bXBibGstLTsgICAgICAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5udW1wYmxrID09IHRoci0+bnVtcGdldCAtIHRoci0+bnVtcHJlbCk7CisgICAgfQorI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKyAgICAvKiBEZWFsbG9jYXRlIGJnZXRfZGF0YSAqLworICAgIGlmICggdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICk7CisgICAgICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgPSBOVUxMOworICAgIH07IC8vIGlmCit9CisKK3ZvaWQKK2ttcGNfc2V0X3Bvb2xzaXplKCBzaXplX3Qgc2l6ZSApCit7CisgICAgYmVjdGwoIF9fa21wX2dldF90aHJlYWQoKSwgKGJnZXRfY29tcGFjdF90KSAwLCAoYmdldF9hY3F1aXJlX3QpIG1hbGxvYywKKyAgICAgICAgICAgKGJnZXRfcmVsZWFzZV90KSBmcmVlLCAoYnVmc2l6ZSkgc2l6ZSApOworfQorCitzaXplX3QKK2ttcGNfZ2V0X3Bvb2xzaXplKCB2b2lkICkKK3sKKyAgICB0aHJfZGF0YV90ICpwOworCisgICAgcCA9IGdldF90aHJfZGF0YSggX19rbXBfZ2V0X3RocmVhZCgpICk7CisKKyAgICByZXR1cm4gcC0+ZXhwX2luY3I7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X3Bvb2xtb2RlKCBpbnQgbW9kZSApCit7CisgICAgdGhyX2RhdGFfdCAqcDsKKworICAgIGlmIChtb2RlID09IGJnZXRfbW9kZV9maWZvIHx8IG1vZGUgPT0gYmdldF9tb2RlX2xpZm8gfHwgbW9kZSA9PSBiZ2V0X21vZGVfYmVzdCkgeworICAgICAgICBwID0gZ2V0X3Rocl9kYXRhKCBfX2ttcF9nZXRfdGhyZWFkKCkgKTsKKyAgICAgICAgcC0+bW9kZSA9IChiZ2V0X21vZGVfdCkgbW9kZTsKKyAgICB9Cit9CisKK2ludAora21wY19nZXRfcG9vbG1vZGUoIHZvaWQgKQoreworICAgIHRocl9kYXRhX3QgKnA7CisKKyAgICBwID0gZ2V0X3Rocl9kYXRhKCBfX2ttcF9nZXRfdGhyZWFkKCkgKTsKKworICAgIHJldHVybiBwLT5tb2RlOworfQorCit2b2lkCitrbXBjX2dldF9wb29sc3RhdCggc2l6ZV90ICptYXhtZW0sIHNpemVfdCAqYWxsbWVtICkKK3sKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX2dldF90aHJlYWQoKTsKKyAgICBidWZzaXplIGEsIGI7CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworICAgIGJjaGVjayggdGgsICZhLCAmYiApOworCisgICAgKm1heG1lbSA9IGE7CisgICAgKmFsbG1lbSA9IGI7Cit9CisKK3ZvaWQKK2ttcGNfcG9vbHByaW50KCB2b2lkICkKK3sKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX2dldF90aHJlYWQoKTsKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworCisgICAgYmZyZWVkKCB0aCApOworfQorCisjZW5kaWYgLy8gI2lmIEtNUF9VU0VfQkdFVAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqCitrbXBjX21hbGxvYyggc2l6ZV90IHNpemUgKQoreworICAgIHZvaWQgKiBwdHI7CisgICAgICAgIHB0ciA9IGJnZXQoIF9fa21wX2VudHJ5X3RocmVhZCgpLCAoYnVmc2l6ZSkgc2l6ZSApOworCisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitrbXBjX2NhbGxvYyggc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplICkKK3sKKyAgICB2b2lkICogcHRyOworICAgICAgICBwdHIgPSBiZ2V0eiggX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKSAobmVsZW0gKiBlbHNpemUpICk7CisKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICoKK2ttcGNfcmVhbGxvYyggdm9pZCAqIHB0ciwgc2l6ZV90IHNpemUgKQoreworICAgIHZvaWQgKiByZXN1bHQgPSBOVUxMOworCisgICAgICAgIGlmICggcHRyID09IE5VTEwgKSB7CisgICAgICAgICAgICAvLyBJZiBwb2ludGVyIGlzIE5VTEwsIHJlYWxsb2MgYmVoYXZlcyBsaWtlIG1hbGxvYy4KKyAgICAgICAgICAgIHJlc3VsdCA9IGJnZXQoIF9fa21wX2VudHJ5X3RocmVhZCgpLCAoYnVmc2l6ZSkgc2l6ZSApOworICAgICAgICB9IGVsc2UgaWYgKCBzaXplID09IDAgKSB7CisgICAgICAgICAgICAvLyBJZiBzaXplIGlzIDAsIHJlYWxsb2MgYmVoYXZlcyBsaWtlIGZyZWUuCisgICAgICAgICAgICAvLyBUaGUgdGhyZWFkIG11c3QgYmUgcmVnaXN0ZXJlZCBieSB0aGUgY2FsbCB0byBrbXBjX21hbGxvYygpIG9yIGttcGNfY2FsbG9jKCkgYmVmb3JlLgorICAgICAgICAgICAgLy8gU28gaXQgc2hvdWxkIGJlIHNhZmUgdG8gY2FsbCBfX2ttcF9nZXRfdGhyZWFkKCksIG5vdCBfX2ttcF9lbnRyeV90aHJlYWQoKS4KKyAgICAgICAgICAgIGJyZWwoIF9fa21wX2dldF90aHJlYWQoKSwgcHRyICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBiZ2V0ciggX19rbXBfZW50cnlfdGhyZWFkKCksIHB0ciwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIE5PVEU6IHRoZSBsaWJyYXJ5IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYnkgYSBwcmV2aW91cyBhbGxvY2F0ZSAqLworCit2b2lkCitrbXBjX2ZyZWUoIHZvaWQgKiBwdHIgKQoreworICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgaWYgKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZ2V0X3RocmVhZCgpOworICAgICAgICAgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisgICAgICAgICAgICBicmVsKCB0aCwgcHRyICk7CisgICAgfTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqCitfX19rbXBfdGhyZWFkX21hbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIHZvaWQgKiBwdHI7CisgICAgS0VfVFJBQ0UoIDMwLCAoCisgICAgICAgICItPiBfX2ttcF90aHJlYWRfbWFsbG9jKCAlcCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgdGgsCisgICAgICAgIChpbnQpIHNpemUKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICAgICAgcHRyID0gYmdldCggdGgsIChidWZzaXplKSBzaXplICk7CisgICAgS0VfVFJBQ0UoIDMwLCAoICI8LSBfX2ttcF90aHJlYWRfbWFsbG9jKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICoKK19fX2ttcF90aHJlYWRfY2FsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIHZvaWQgKiBwdHI7CisgICAgS0VfVFJBQ0UoIDMwLCAoCisgICAgICAgICItPiBfX2ttcF90aHJlYWRfY2FsbG9jKCAlcCwgJWQsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICAoaW50KSBuZWxlbSwKKyAgICAgICAgKGludCkgZWxzaXplCisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisgICAgICAgIHB0ciA9IGJnZXR6KCB0aCwgKGJ1ZnNpemUpIChuZWxlbSAqIGVsc2l6ZSkgKTsKKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9jYWxsb2MoKSByZXR1cm5zICVwXG4iLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgorX19fa21wX3RocmVhZF9yZWFsbG9jKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9yZWFsbG9jKCAlcCwgJXAsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICBwdHIsCisgICAgICAgIChpbnQpIHNpemUKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICAgICAgcHRyID0gYmdldHIoIHRoLCBwdHIsIChidWZzaXplKSBzaXplICk7CisgICAgS0VfVFJBQ0UoIDMwLCAoICI8LSBfX2ttcF90aHJlYWRfcmVhbGxvYygpIHJldHVybnMgJXBcbiIsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZAorX19fa21wX3RocmVhZF9mcmVlKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIEtFX1RSQUNFKCAzMCwgKAorICAgICAgICAiLT4gX19rbXBfdGhyZWFkX2ZyZWUoICVwLCAlcCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgcHRyCisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisgICAgaWYgKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworICAgICAgICAgICAgYnJlbCggdGgsIHB0ciApOworICAgIH0KKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9mcmVlKClcbiIgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAgICBJZiBMRUFLX01FTU9SWSBpcyBkZWZpbmVkLCBfX2ttcF9mcmVlKCkgd2lsbCAqbm90KiBmcmVlIG1lbW9yeS4gSXQgY2F1c2VzIG1lbW9yeSBsZWFrcywgYnV0IGl0CisgICAgbWF5IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG1lbW9yeSBjb3JydXB0aW9ucywgdXNlZCBmcmVlZCBwb2ludGVycywgZXRjLgorKi8KKy8qICNkZWZpbmUgTEVBS19NRU1PUlkgKi8KKworc3RydWN0IGttcF9tZW1fZGVzY3IgeyAgICAgIC8vIE1lbW9yeSBibG9jayBkZXNjcmlwdG9yLgorICAgIHZvaWQgKiBwdHJfYWxsb2NhdGVkOyAgIC8vIFBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCksIHN1YmplY3QgZm9yIGZyZWUoKS4KKyAgICBzaXplX3Qgc2l6ZV9hbGxvY2F0ZWQ7ICAvLyBTaXplIG9mIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2suCisgICAgdm9pZCAqIHB0cl9hbGlnbmVkOyAgICAgLy8gUG9pbnRlciB0byBhbGlnbmVkIG1lbW9yeSwgdG8gYmUgdXNlZCBieSBjbGllbnQgY29kZS4KKyAgICBzaXplX3Qgc2l6ZV9hbGlnbmVkOyAgICAvLyBTaXplIG9mIGFsaWduZWQgbWVtb3J5IGJsb2NrLgorfTsKK3R5cGVkZWYgc3RydWN0IGttcF9tZW1fZGVzY3Iga21wX21lbV9kZXNjcl90OworCisvKgorICAgIEFsbG9jYXRlIG1lbW9yeSBvbiByZXF1ZXN0ZWQgYm91bmRhcnksIGZpbGwgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIDB4MDAuCisgICAgTlVMTCBpcyBORVZFUiByZXR1cm5lZCwgX19rbXBfYWJvcnQoKSBpcyBjYWxsZWQgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEKKyAqLworc3RhdGljCit2b2lkICoKK19fX2ttcF9hbGxvY2F0ZV9hbGlnbiggc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgLyoKKyAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCkgYWxsb2NhdGVzIChieSBjYWxsIHRvIG1hbGxvYygpKSBiaWdnZXIgbWVtb3J5IGJsb2NrIHRoYW4gcmVxdWVzdGVkIHRvCisgICAgICAgIHJldHVybiBwcm9wZXJseSBhbGlnbmVkIHBvaW50ZXIuIE9yaWdpbmFsIHBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCkgYW5kIHNpemUgb2YgYWxsb2NhdGVkCisgICAgICAgIGJsb2NrIGlzIHNhdmVkIGluIGRlc2NyaXB0b3IganVzdCBiZWZvcmUgdGhlIGFsaWduZWQgcG9pbnRlci4gVGhpcyBpbmZvcm1hdGlvbiB1c2VkIGJ5CisgICAgICAgIF9fa21wX2ZyZWUoKSAtLSBpdCBoYXMgdG8gcGFzcyB0byBmcmVlKCkgb3JpZ2luYWwgcG9pbnRlciwgbm90IGFsaWduZWQgb25lLgorCisgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCisgICAgICAgICAgICB8IHBhZGRpbmcgfCBkZXNjcmlwdG9yIHwgICAgICAgICAgIGFsaWduZWQgYmxvY2sgICAgICAgICAgIHwgcGFkZGluZyB8CisgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCisgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICArLSBBbGlnbmVkIHBvaW50ZXIgcmV0dXJuZWQgdG8gY2FsbGVyCisgICAgICAgICAgICArLSBQb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYygpCisKKyAgICAgICAgQWxpZ25lZCBibG9jayBpcyBmaWxsZWQgd2l0aCB6ZXJvcywgcGFkZGluZ3MgYXJlIGZpbGxlZCB3aXRoIDB4RUYuCisgICAgKi8KKworICAgIGttcF9tZW1fZGVzY3JfdCAgZGVzY3I7CisgICAga21wX3VpbnRwdHJfdCAgICBhZGRyX2FsbG9jYXRlZDsgICAgICAgIC8vIEFkZHJlc3MgcmV0dXJuZWQgYnkgbWFsbG9jKCkuCisgICAga21wX3VpbnRwdHJfdCAgICBhZGRyX2FsaWduZWQ7ICAgICAgICAgIC8vIEFsaWduZWQgYWRkcmVzcyB0byByZXR1cm4gdG8gY2FsbGVyLgorICAgIGttcF91aW50cHRyX3QgICAgYWRkcl9kZXNjcjsgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIG1lbW9yeSBibG9jayBkZXNjcmlwdG9yLgorCisgICAgS0VfVFJBQ0UoIDI1LCAoCisgICAgICAgICItPiBfX19rbXBfYWxsb2NhdGVfYWxpZ24oICVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICAoaW50KSBzaXplLAorICAgICAgICAoaW50KSBhbGlnbm1lbnQKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFsaWdubWVudCA8IDMyICogMTAyNCApOyAvLyBBbGlnbm1lbnQgc2hvdWxkIG5vdCBiZSB0b28KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIHZvaWQgKiApIDw9IHNpemVvZigga21wX3VpbnRwdHJfdCApICk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBrbXBfdWludHB0cl90IGlzIGVub3VnaCB0byBzdG9yZSBhZGRyZXNzZXMuCisKKyAgICBkZXNjci5zaXplX2FsaWduZWQgPSBzaXplOworICAgIGRlc2NyLnNpemVfYWxsb2NhdGVkID0gZGVzY3Iuc2l6ZV9hbGlnbmVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIGFsaWdubWVudDsKKworICAgICNpZiBLTVBfREVCVUcKKyAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZCA9IF9tYWxsb2Nfc3JjX2xvYyggZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQsIF9maWxlXywgX2xpbmVfICk7CisgICAgI2Vsc2UKKyAgICBkZXNjci5wdHJfYWxsb2NhdGVkID0gbWFsbG9jX3NyY19sb2MoIGRlc2NyLnNpemVfYWxsb2NhdGVkIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICAjZW5kaWYKKyAgICBLRV9UUkFDRSggMTAsICgKKyAgICAgICAgIiAgIG1hbGxvYyggJWQgKSByZXR1cm5lZCAlcFxuIiwKKyAgICAgICAgKGludCkgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQsCisgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQKKyAgICApICk7CisgICAgaWYgKCBkZXNjci5wdHJfYWxsb2NhdGVkID09IE5VTEwgKSB7CisgICAgICAgIEtNUF9GQVRBTCggT3V0T2ZIZWFwTWVtb3J5ICk7CisgICAgfTsKKworICAgIGFkZHJfYWxsb2NhdGVkID0gKGttcF91aW50cHRyX3QpIGRlc2NyLnB0cl9hbGxvY2F0ZWQ7CisgICAgYWRkcl9hbGlnbmVkID0KKyAgICAgICAgKCBhZGRyX2FsbG9jYXRlZCArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgKyBhbGlnbm1lbnQgKQorICAgICAgICAmIH4gKCBhbGlnbm1lbnQgLSAxICk7CisgICAgYWRkcl9kZXNjciA9IGFkZHJfYWxpZ25lZCAtIHNpemVvZigga21wX21lbV9kZXNjcl90ICk7CisKKyAgICBkZXNjci5wdHJfYWxpZ25lZCA9ICh2b2lkICopIGFkZHJfYWxpZ25lZDsKKworICAgIEtFX1RSQUNFKCAyNiwgKAorICAgICAgICAiICAgX19fa21wX2FsbG9jYXRlX2FsaWduOiAiCisgICAgICAgICAgICAicHRyX2FsbG9jYXRlZD0lcCwgc2l6ZV9hbGxvY2F0ZWQ9JWQsICIKKyAgICAgICAgICAgICJwdHJfYWxpZ25lZD0lcCwgc2l6ZV9hbGlnbmVkPSVkXG4iLAorICAgICAgICBkZXNjci5wdHJfYWxsb2NhdGVkLAorICAgICAgICAoaW50KSBkZXNjci5zaXplX2FsbG9jYXRlZCwKKyAgICAgICAgZGVzY3IucHRyX2FsaWduZWQsCisgICAgICAgIChpbnQpIGRlc2NyLnNpemVfYWxpZ25lZAorICAgICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxsb2NhdGVkIDw9IGFkZHJfZGVzY3IgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2Rlc2NyICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSA9PSBhZGRyX2FsaWduZWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgKyBkZXNjci5zaXplX2FsaWduZWQgPD0gYWRkcl9hbGxvY2F0ZWQgKyBkZXNjci5zaXplX2FsbG9jYXRlZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCAlIGFsaWdubWVudCA9PSAwICk7CisKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIG1lbXNldCggZGVzY3IucHRyX2FsbG9jYXRlZCwgMHhFRiwgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICAgICAgICAgIC8vIEZpbGwgYWxsb2NhdGVkIG1lbW9yeSBibG9jayB3aXRoIDB4RUYuCisgICAgI2VuZGlmCisgICAgbWVtc2V0KCBkZXNjci5wdHJfYWxpZ25lZCwgMHgwMCwgZGVzY3Iuc2l6ZV9hbGlnbmVkICk7CisgICAgICAgIC8vIEZpbGwgdGhlIGFsaWduZWQgbWVtb3J5IGJsb2NrICh3aGljaCBpcyBpbnRlbmRlZCBmb3IgdXNpbmcgYnkgY2FsbGVyKSB3aXRoIDB4MDAuIERvIG5vdAorICAgICAgICAvLyBwdXQgdGhpcyBmaWxsaW5nIHVuZGVyIEtNUF9ERUJVRyBjb25kaXRpb24hIE1hbnkgY2FsbGVycyBleHBlY3QgemVyb2VkIG1lbW9yeS4gKFBhZGRpbmcKKyAgICAgICAgLy8gYnl0ZXMgcmVtYWluIGZpbGxlZCB3aXRoIDB4RUYgaW4gZGVidWdnaW5nIGxpYnJhcnkuKQorICAgICogKCAoa21wX21lbV9kZXNjcl90ICopIGFkZHJfZGVzY3IgKSA9IGRlc2NyOworCisgICAgS01QX01CKCk7CisKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fX2ttcF9hbGxvY2F0ZV9hbGlnbigpIHJldHVybnMgJXBcbiIsIGRlc2NyLnB0cl9hbGlnbmVkICkgKTsKKyAgICByZXR1cm4gZGVzY3IucHRyX2FsaWduZWQ7CisKK30gLy8gZnVuYyBfX19rbXBfYWxsb2NhdGVfYWxpZ24KKworCisvKgorICAgIEFsbG9jYXRlIG1lbW9yeSBvbiBjYWNoZSBsaW5lIGJvdW5kYXJ5LCBmaWxsIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCAweDAwLgorICAgIERvIG5vdCBjYWxsIHRoaXMgZnVuYyBkaXJlY3RseSEgVXNlIF9fa21wX2FsbG9jYXRlIG1hY3JvIGluc3RlYWQuCisgICAgTlVMTCBpcyBORVZFUiByZXR1cm5lZCwgX19rbXBfYWJvcnQoKSBpcyBjYWxsZWQgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEKKyAqLwordm9pZCAqCitfX19rbXBfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworCisgICAgdm9pZCAqIHB0cjsKKyAgICBLRV9UUkFDRSggMjUsICggIi0+IF9fa21wX2FsbG9jYXRlKCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLCAoaW50KSBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgICAgICBwdHIgPSBfX19rbXBfYWxsb2NhdGVfYWxpZ24oIHNpemUsIF9fa21wX2FsaWduX2FsbG9jIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2FsbG9jYXRlKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworCit9IC8vIGZ1bmMgX19fa21wX2FsbG9jYXRlCisKKyNpZiAoQlVJTERfTUVNT1JZPT1GSVJTVF9UT1VDSCkKK3ZvaWQgKgorX19rbXBfZnRfcGFnZV9hbGxvY2F0ZShzaXplX3Qgc2l6ZSkKK3sKKyAgdm9pZCAqYWRyLCAqYWFkcjsKKyNpZiBLTVBfT1NfTElOVVgKKyAgLyogVE9ETzogVXNlIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IHBhZ2Ugc2l6ZSBldmVyeXdoZXJlICovCisgIGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworI2Vsc2UKKyAgLyogVE9ETzogRmluZCB3aW5kb3dzIGZ1bmN0aW9uIHRvIGdldCBwYWdlIHNpemUgYW5kIHVzZSBpdCBldmVyeXdoZXJlICovCisgIGludCBwYWdlX3NpemUgPSBQQUdFX1NJWkU7CisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyAgYWRyID0gKHZvaWQgKikgX19rbXBfdGhyZWFkX21hbGxvYyggX19rbXBfZ2V0X3RocmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArIHBhZ2Vfc2l6ZSArIEtNUF9QVFJfU0tJUCk7CisgIGlmICggYWRyID09IDAgKQorICAgIEtNUF9GQVRBTCggT3V0T2ZIZWFwTWVtb3J5ICk7CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIGFkciBpcyBvbiBhIHBhZ2UgYm91bmRhcnkuICovCisgIGlmICggKCAoa21wX3VpbnRwdHJfdCkgYWRyICYgKHBhZ2Vfc2l6ZSAtIDEpKSA9PSAwKQorICAgIC8qIG5vdGhpbmcgdG8gZG8gaWYgYWRyIGlzIGFscmVhZHkgb24gYSBwYWdlIGJvdW5kYXJ5LiAqLworICAgIGFhZHIgPSBhZHI7CisgIGVsc2UKKyAgICAvKiBlbHNlIHNldCBhYWRyIHRvIHRoZSBmaXJzdCBwYWdlIGJvdW5kYXJ5IGluIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAqLworICAgIGFhZHIgPSAodm9pZCAqKSAoICggKGttcF91aW50cHRyX3QpIGFkciArIHBhZ2Vfc2l6ZSkgJiB+KHBhZ2Vfc2l6ZSAtIDEpICk7CisKKyAgLyogdGhlIGZpcnN0IHRvdWNoIGJ5IHRoZSBvd25lciB0aHJlYWQuICovCisgICooKHZvaWQqKilhYWRyKSA9IGFkcjsKKworICAvKiBza2lwIHRoZSBtZW1vcnkgc3BhY2UgdXNlZCBmb3Igc3RvcmluZyBhZHIgYWJvdmUuICovCisgIHJldHVybiAodm9pZCopKChjaGFyKilhYWRyICsgS01QX1BUUl9TS0lQKTsKK30KKyNlbmRpZgorCisvKgorICAgIEFsbG9jYXRlIG1lbW9yeSBvbiBwYWdlIGJvdW5kYXJ5LCBmaWxsIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCAweDAwLgorICAgIERvZXMgbm90IGNhbGwgdGhpcyBmdW5jIGRpcmVjdGx5ISBVc2UgX19rbXBfcGFnZV9hbGxvY2F0ZSBtYWNybyBpbnN0ZWFkLgorICAgIE5VTEwgaXMgTkVWRVIgcmV0dXJuZWQsIF9fa21wX2Fib3J0KCkgaXMgY2FsbGVkIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisgICAgTXVzdCB1c2UgX19rbXBfZnJlZSB3aGVuIGZyZWVpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIHJvdXRpbmUhCisgKi8KK3ZvaWQgKgorX19fa21wX3BhZ2VfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIGludCAgICBwYWdlX3NpemUgPSA4ICogMTAyNDsKKyAgICB2b2lkICogcHRyOworCisgICAgS0VfVFJBQ0UoIDI1LCAoCisgICAgICAgICItPiBfX2ttcF9wYWdlX2FsbG9jYXRlKCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICAoaW50KSBzaXplCisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisgICAgICAgIHB0ciA9IF9fX2ttcF9hbGxvY2F0ZV9hbGlnbiggc2l6ZSwgcGFnZV9zaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX3BhZ2VfYWxsb2NhdGUoICVkICkgcmV0dXJucyAlcFxuIiwgKGludCkgc2l6ZSwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfSAvLyBfX19rbXBfcGFnZV9hbGxvY2F0ZQorCisvKgorICAgIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBfX2ttcF9hbGxvY2F0ZSgpIGFuZCBfX2ttcF9wYWdlX2FsbG9jYXRlKCkuCisgICAgSW4gZGVidWcgbW9kZSwgZmlsbCB0aGUgbWVtb3J5IGJsb2NrIHdpdGggMHhFRiBiZWZvcmUgY2FsbCB0byBmcmVlKCkuCisqLwordm9pZAorX19fa21wX2ZyZWUoIHZvaWQgKiBwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisKKyAgICAgICAga21wX21lbV9kZXNjcl90IGRlc2NyOworICAgICAgICBrbXBfdWludHB0cl90ICAgYWRkcl9hbGxvY2F0ZWQ7ICAgICAgICAvLyBBZGRyZXNzIHJldHVybmVkIGJ5IG1hbGxvYygpLgorICAgICAgICBrbXBfdWludHB0cl90ICAgYWRkcl9hbGlnbmVkOyAgICAgICAgICAvLyBBbGlnbmVkIGFkZHJlc3MgcGFzc2VkIGJ5IGNhbGxlci4KKworICAgICAgICBLRV9UUkFDRSggMjUsICggIi0+IF9fa21wX2ZyZWUoICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsIHB0ciBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICAgICAgS01QX0FTU0VSVCggcHRyICE9IE5VTEwgKTsKKworICAgICAgICBkZXNjciA9ICogKCBrbXBfbWVtX2Rlc2NyX3QgKikgKCAoa21wX3VpbnRwdHJfdCkgcHRyIC0gc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSApOworCisgICAgICAgIEtFX1RSQUNFKCAyNiwgKCAiICAgX19rbXBfZnJlZTogICAgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwdHJfYWxsb2NhdGVkPSVwLCBzaXplX2FsbG9jYXRlZD0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgInB0cl9hbGlnbmVkPSVwLCBzaXplX2FsaWduZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci5wdHJfYWxsb2NhdGVkLCAoaW50KSBkZXNjci5zaXplX2FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLnB0cl9hbGlnbmVkLCAoaW50KSBkZXNjci5zaXplX2FsaWduZWQgKSk7CisKKyAgICAgICAgYWRkcl9hbGxvY2F0ZWQgPSAoa21wX3VpbnRwdHJfdCkgZGVzY3IucHRyX2FsbG9jYXRlZDsKKyAgICAgICAgYWRkcl9hbGlnbmVkICAgPSAoa21wX3VpbnRwdHJfdCkgZGVzY3IucHRyX2FsaWduZWQ7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICUgQ0FDSEVfTElORSA9PSAwICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGRlc2NyLnB0cl9hbGlnbmVkID09IHB0ciApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsbG9jYXRlZCArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgPD0gYWRkcl9hbGlnbmVkICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGRlc2NyLnNpemVfYWxpZ25lZCA8IGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCArIGRlc2NyLnNpemVfYWxpZ25lZCA8PSBhZGRyX2FsbG9jYXRlZCArIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgbWVtc2V0KCBkZXNjci5wdHJfYWxsb2NhdGVkLCAweEVGLCBkZXNjci5zaXplX2FsbG9jYXRlZCApOworICAgICAgICAgICAgICAgIC8vIEZpbGwgbWVtb3J5IGJsb2NrIHdpdGggMHhFRiwgaXQgaGVscHMgY2F0Y2ggdXNpbmcgZnJlZWQgbWVtb3J5LgorICAgICAgICAjZW5kaWYKKworICAgICAgICAjaWZuZGVmIExFQUtfTUVNT1JZCisgICAgICAgICAgICBLRV9UUkFDRSggMTAsICggIiAgIGZyZWUoICVwIClcbiIsIGRlc2NyLnB0cl9hbGxvY2F0ZWQgKSApOworICAgICAgICAjIGlmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgX2ZyZWVfc3JjX2xvYyggZGVzY3IucHRyX2FsbG9jYXRlZCwgX2ZpbGVfLCBfbGluZV8gKTsKKyAgICAgICAgIyBlbHNlCisgICAgICAgICAgICBmcmVlX3NyY19sb2MoIGRlc2NyLnB0cl9hbGxvY2F0ZWQgS01QX1NSQ19MT0NfUEFSTSApOworICAgICAgICAjIGVuZGlmCisgICAgICAgICNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2ZyZWUoKSByZXR1cm5zXG4iICkgKTsKKworfSAvLyBmdW5jIF9fX2ttcF9mcmVlCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBVU0VfRkFTVF9NRU1PUlkgPT0gMworLy8gQWxsb2NhdGUgZmFzdCBtZW1vcnkgYnkgZmlyc3Qgc2Nhbm5pbmcgdGhlIHRocmVhZCdzIGZyZWUgbGlzdHMKKy8vIElmIGEgY2h1bmsgdGhlIHJpZ2h0IHNpemUgZXhpc3RzLCBncmFiIGl0IG9mZiB0aGUgZnJlZSBsaXN0LgorLy8gT3RoZXJ3aXNlIGFsbG9jYXRlIG5vcm1hbGx5IHVzaW5nIGttcF90aHJlYWRfbWFsbG9jLgorCisvLyBBQzogSG93IHRvIGNob29zZSB0aGUgbGltaXQ/IEp1c3QgZ2V0IDE2IGZvciBub3cuLi4KKyNkZWZpbmUgS01QX0ZSRUVfTElTVF9MSU1JVCAxNgorCisvLyBBbHdheXMgdXNlIDEyOCBieXRlcyBmb3IgZGV0ZXJtaW5pbmcgYnVja2V0cyBmb3IgY2FjaGluZyBtZW1vcnkgYmxvY2tzCisjZGVmaW5lIERDQUNIRV9MSU5FICAxMjgKKwordm9pZCAqCitfX19rbXBfZmFzdF9hbGxvY2F0ZSgga21wX2luZm9fdCAqdGhpc190aHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIHZvaWQgICAgICAgICAgICAqIHB0cjsKKyAgICBpbnQgICAgICAgICAgICAgICBudW1fbGluZXM7CisgICAgaW50ICAgICAgICAgICAgICAgaWR4OworICAgIGludCAgICAgICAgICAgICAgIGluZGV4OworICAgIHZvaWQgICAgICAgICAgICAqIGFsbG9jX3B0cjsKKyAgICBzaXplX3QgICAgICAgICAgICBhbGxvY19zaXplOworICAgIGttcF9tZW1fZGVzY3JfdCAqIGRlc2NyOworCisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9mYXN0X2FsbG9jYXRlKCBUIyVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIChpbnQpIHNpemUgS01QX1NSQ19MT0NfUEFSTSApICk7CisKKyAgICBudW1fbGluZXMgPSAoIHNpemUgKyBEQ0FDSEVfTElORSAtIDEgKSAvIERDQUNIRV9MSU5FOworICAgIGlkeCA9IG51bV9saW5lcyAtIDE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggaWR4ID49IDAgKTsKKyAgICBpZiAoIGlkeCA8IDIgKSB7CisgICAgICAgIGluZGV4ID0gMDsgICAgICAgLy8gaWR4IGlzIFsgMCwgMSBdLCB1c2UgZmlyc3QgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDI7ICAgLy8gMSwgMiBjYWNoZSBsaW5lcyBvciBsZXNzIHRoYW4gY2FjaGUgbGluZQorICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAxOyAgICAgICAvLyBpZHggaXMgWyAyLCAzIF0sIHVzZSBzZWNvbmQgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDQ7ICAgLy8gMywgNCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAyOyAgICAgICAvLyBpZHggaXMgWyA0LCAxNSBdLCB1c2UgdGhpcmQgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDE2OyAgLy8gNSwgNiwgLi4uLCAxNiBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAzOyAgICAgICAvLyBpZHggaXMgWyAxNiwgNjMgXSwgdXNlIGZvdXJ0aCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gNjQ7ICAvLyAxNywgMTgsIC4uLiwgNjQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGFsbG9jX2NhbGw7IC8vIDY1IG9yIG1vcmUgY2FjaGUgbGluZXMgKCA+IDhLQiApLCBkb24ndCB1c2UgZnJlZSBsaXN0cworICAgIH0KKworICAgIHB0ciA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZjsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAvLyBwb3AgdGhlIGhlYWQgb2Ygbm8tc3luYyBmcmVlIGxpc3QKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmID0gKigodm9pZCAqKilwdHIpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PQorICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QgKikoIChrbXBfdWludHB0cl90KXB0ciAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICkpLT5wdHJfYWxpZ25lZCApOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OworICAgIHB0ciA9IFRDUl9TWU5DX1BUUiggdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgaWYgKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gbm8tc3luYyBmcmVlIGxpc3QgaXMgZW1wdHksIHVzZSBzeW5jIGZyZWUgbGlzdCAoZmlsbGVkIGluIGJ5IG90aGVyIHRocmVhZHMgb25seSkKKyAgICAgICAgLy8gcG9wIHRoZSBoZWFkIG9mIHRoZSBzeW5jIGZyZWUgbGlzdCwgcHVzaCBOVUxMIGluc3RlYWQKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAmdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jLCBwdHIsIE5VTEwgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIHB0ciA9IFRDUl9TWU5DX1BUUiggdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcHVzaCB0aGUgcmVzdCBvZiBjaGFpbiBpbnRvIG5vLXN5bmMgZnJlZSBsaXN0IChjYW4gYmUgTlVMTCBpZiB0aGVyZSB3YXMgdGhlIG9ubHkgYmxvY2spCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZiA9ICooKHZvaWQgKiopcHRyKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0KKyAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90ICopKCAoa21wX3VpbnRwdHJfdClwdHIgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApKS0+cHRyX2FsaWduZWQgKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgYWxsb2NfY2FsbDoKKyAgICAvLyBoYXZlbid0IGZvdW5kIGJsb2NrIGluIHRoZSBmcmVlIGxpc3RzLCB0aHVzIGFsbG9jYXRlIGl0CisgICAgc2l6ZSA9IG51bV9saW5lcyAqIERDQUNIRV9MSU5FOworCisgICAgYWxsb2Nfc2l6ZSA9IHNpemUgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICsgRENBQ0hFX0xJTkU7CisgICAgS0VfVFJBQ0UoIDI1LCAoICJfX2ttcF9mYXN0X2FsbG9jYXRlOiBUIyVkIENhbGxpbmcgX19rbXBfdGhyZWFkX21hbGxvYyB3aXRoIGFsbG9jX3NpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgYWxsb2Nfc2l6ZSApICk7CisgICAgYWxsb2NfcHRyID0gYmdldCggdGhpc190aHIsIChidWZzaXplKSBhbGxvY19zaXplICk7CisKKyAgICAvLyBhbGlnbiBwdHIgdG8gRENBQ0hFX0xJTkUKKyAgICBwdHIgPSAodm9pZCAqKSgoICgoa21wX3VpbnRwdHJfdClhbGxvY19wdHIpICsgc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKyBEQ0FDSEVfTElORSApICYgfiggRENBQ0hFX0xJTkUgLSAxICkpOworICAgIGRlc2NyID0gKGttcF9tZW1fZGVzY3JfdCAqKSggKChrbXBfdWludHB0cl90KXB0cikgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApOworCisgICAgZGVzY3ItPnB0cl9hbGxvY2F0ZWQgPSBhbGxvY19wdHI7ICAgICAgICAvLyByZW1lbWJlciBhbGxvY2F0ZWQgcG9pbnRlcgorICAgIC8vIHdlIGRvbid0IG5lZWQgc2l6ZV9hbGxvY2F0ZWQKKyAgICBkZXNjci0+cHRyX2FsaWduZWQgICA9ICh2b2lkICopdGhpc190aHI7IC8vIHJlbWVtYmVyIGFsbG9jYXRpbmcgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoaXQgaXMgYWxyZWFkeSBzYXZlZCBpbiBiZ2V0IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBtYXkgd2FudCB0byB1c2UgYW5vdGhlciBhbGxvY2F0b3IgaW4gZnV0dXJlKQorICAgIGRlc2NyLT5zaXplX2FsaWduZWQgID0gc2l6ZTsKKworICAgIGVuZDoKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2Zhc3RfYWxsb2NhdGUoIFQjJWQgKSByZXR1cm5zICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9IC8vIGZ1bmMgX19rbXBfZmFzdF9hbGxvY2F0ZQorCisvLyBGcmVlIGZhc3QgbWVtb3J5IGFuZCBwbGFjZSBpdCBvbiB0aGUgdGhyZWFkJ3MgZnJlZSBsaXN0IGlmIGl0IGlzIG9mCisvLyB0aGUgY29ycmVjdCBzaXplLgordm9pZAorX19fa21wX2Zhc3RfZnJlZSgga21wX2luZm9fdCAqdGhpc190aHIsIHZvaWQgKiBwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAga21wX21lbV9kZXNjcl90ICogZGVzY3I7CisgICAga21wX2luZm9fdCAgICAgICogYWxsb2NfdGhyOworICAgIHNpemVfdCAgICAgICAgICAgIHNpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgaWR4OworICAgIGludCAgICAgICAgICAgICAgIGluZGV4OworCisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9mYXN0X2ZyZWUoIFQjJWQsICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgcHRyIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgIEtNUF9BU1NFUlQoIHB0ciAhPSBOVUxMICk7CisKKyAgICBkZXNjciA9IChrbXBfbWVtX2Rlc2NyX3QgKikoICgoa21wX3VpbnRwdHJfdClwdHIpIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKTsKKworICAgIEtFX1RSQUNFKDI2LCAoIiAgIF9fa21wX2Zhc3RfZnJlZTogICAgIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpIGRlc2NyLT5zaXplX2FsaWduZWQgKSApOworCisgICAgc2l6ZSA9IGRlc2NyLT5zaXplX2FsaWduZWQ7IC8vIDIsIDQsIDE2LCA2NCwgNjUsIDY2LCAuLi4gY2FjaGUgbGluZXMKKworICAgIGlkeCA9IERDQUNIRV9MSU5FICogMjsgLy8gMiBjYWNoZSBsaW5lcyBpcyBtaW5pbWFsIHNpemUgb2YgYmxvY2sKKyAgICBpZiAoIGlkeCA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDA7ICAgICAgIC8vIDIgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA8PD0gMSApID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMTsgICAgICAgLy8gNCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4IDw8PSAyICkgPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAyOyAgICAgICAvLyAxNiBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4IDw8PSAyICkgPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAzOyAgICAgICAvLyA2NCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgPiBEQ0FDSEVfTElORSAqIDY0ICk7CisgICAgICAgIGdvdG8gZnJlZV9jYWxsOyAgLy8gNjUgb3IgbW9yZSBjYWNoZSBsaW5lcyAoID4gOEtCICkKKyAgICB9CisKKyAgICBhbGxvY190aHIgPSAoa21wX2luZm9fdCAqKWRlc2NyLT5wdHJfYWxpZ25lZDsgLy8gZ2V0IHRocmVhZCBvd25pbmcgdGhlIGJsb2NrCisgICAgaWYgKCBhbGxvY190aHIgPT0gdGhpc190aHIgKSB7CisgICAgICAgIC8vIHB1c2ggYmxvY2sgdG8gc2VsZiBuby1zeW5jIGZyZWUgbGlzdCwgbGlua2luZyBwcmV2aW91cyBoZWFkIChMSUZPKQorICAgICAgICAqKCh2b2lkICoqKXB0cikgPSB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGY7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZiA9IHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICB2b2lkICogaGVhZCA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXI7CisgICAgICAgIGlmICggaGVhZCA9PSBOVUxMICkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmcmVlIGxpc3QKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAgICAgICAqKCh2b2lkICoqKXB0cikgPSBOVUxMOyAgICAgICAgICAgICAvLyBtYXJrIHRoZSB0YWlsIG9mIHRoZSBsaXN0CisgICAgICAgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSAoc2l6ZV90KTE7ICAvLyBoZWFkIG9mIHRoZSBsaXN0IGtlZXBzIGl0cyBsZW5ndGgKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgZXhpc3RlZCAib3RoZXIiIGxpc3QncyBvd25lciB0aHJlYWQgYW5kIHNpemUgb2YgcXVldWUKKyAgICAgICAgICAgIGttcF9tZW1fZGVzY3JfdCAqIGRzYyAgPSAoa21wX21lbV9kZXNjcl90ICopKCAoY2hhciopaGVhZCAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICk7CisgICAgICAgICAgICBrbXBfaW5mb190ICAgICAgKiBxX3RoID0gKGttcF9pbmZvX3QgKikoZHNjLT5wdHJfYWxpZ25lZCk7IC8vIGFsbG9jYXRpbmcgdGhyZWFkLCBzYW1lIGZvciBhbGwgcXVldWUgbm9kZXMKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgIHFfc3ogPSBkc2MtPnNpemVfYWxsb2NhdGVkICsgMTsgICAgICAgICAgLy8gbmV3IHNpemUgaW4gY2FzZSB3ZSBhZGQgY3VycmVudCB0YXNrCisgICAgICAgICAgICBpZiAoIHFfdGggPT0gYWxsb2NfdGhyICYmIHFfc3ogPD0gS01QX0ZSRUVfTElTVF9MSU1JVCApIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gYWRkIGN1cnJlbnQgdGFzayB0byAib3RoZXIiIGxpc3QsIG5vIHN5bmMgbmVlZGVkCisgICAgICAgICAgICAgICAgKigodm9pZCAqKilwdHIpID0gaGVhZDsKKyAgICAgICAgICAgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSBxX3N6OworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGVpdGhlciBxdWV1ZSBibG9ja3Mgb3duZXIgaXMgY2hhbmdpbmcgb3Igc2l6ZSBsaW1pdCBleGNlZWRlZAorICAgICAgICAgICAgICAgIC8vIHJldHVybiBvbGQgcXVldWUgdG8gYWxsb2NhdGluZyB0aHJlYWQgKHFfdGgpIHN5bmNocm9uZW91c2x5LAorICAgICAgICAgICAgICAgIC8vIGFuZCBzdGFydCBuZXcgbGlzdCBmb3IgYWxsb2NfdGhyJ3MgdGFza3MKKyAgICAgICAgICAgICAgICB2b2lkICogb2xkX3B0cjsKKyAgICAgICAgICAgICAgICB2b2lkICogdGFpbCA9IGhlYWQ7CisgICAgICAgICAgICAgICAgdm9pZCAqIG5leHQgPSAqKCh2b2lkICoqKWhlYWQpOworICAgICAgICAgICAgICAgIHdoaWxlICggbmV4dCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgc2l6ZSBzaG91bGQgZGVjcmVhc2UgYnkgMSBlYWNoIHN0ZXAgdGhyb3VnaCB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QqKSgoY2hhciopbmV4dCAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpKSktPnNpemVfYWxsb2NhdGVkICsgMSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QqKSgoY2hhciopdGFpbCAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpKSktPnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgICAgICAgICAgICAgIHRhaWwgPSBuZXh0OyAgIC8vIHJlbWVtYmVyIHRhaWwgbm9kZQorICAgICAgICAgICAgICAgICAgICBuZXh0ID0gKigodm9pZCAqKiluZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcV90aCAhPSBOVUxMICk7CisgICAgICAgICAgICAgICAgLy8gcHVzaCBibG9jayB0byBvd25lcidzIHN5bmMgZnJlZSBsaXN0CisgICAgICAgICAgICAgICAgb2xkX3B0ciA9IFRDUl9QVFIoIHFfdGgtPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgICAgICAgICAgICAgLyogdGhlIG5leHQgcG9pbnRlciBtdXN0IGJlIHNldCBiZWZvcmUgc2V0dGluZyBmcmVlX2xpc3QgdG8gcHRyIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgZXhwb3NpbmcgYSBicm9rZW4gbGlzdCB0byBvdGhlciB0aHJlYWRzLCBldmVuIGZvciBhbiBpbnN0YW50LiAqLworICAgICAgICAgICAgICAgICooKHZvaWQgKiopdGFpbCkgPSBvbGRfcHRyOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAgICAgICAgICZxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYywKKyAgICAgICAgICAgICAgICAgICAgb2xkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgaGVhZCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkX3B0ciA9IFRDUl9QVFIoIHFfdGgtPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgICAgICAgICAgICAgICAgICooKHZvaWQgKiopdGFpbCkgPSBvbGRfcHRyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG5ldyBsaXN0IG9mIG5vdC1zZWx0IHRhc2tzCisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlciA9IHB0cjsKKyAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXB0cikgPSBOVUxMOworICAgICAgICAgICAgICAgIGRlc2NyLT5zaXplX2FsbG9jYXRlZCA9IChzaXplX3QpMTsgIC8vIGhlYWQgb2YgcXVldWUga2VlcHMgaXRzIGxlbmd0aAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGdvdG8gZW5kOworCisgICAgZnJlZV9jYWxsOgorICAgIEtFX1RSQUNFKDI1LCAoICJfX2ttcF9mYXN0X2ZyZWU6IFQjJWQgQ2FsbGluZyBfX2ttcF90aHJlYWRfZnJlZSBmb3Igc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociksIHNpemUgKSApOworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGhpc190aHIgKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworICAgIGJyZWwoIHRoaXNfdGhyLCBkZXNjci0+cHRyX2FsbG9jYXRlZCApOworCisgICAgZW5kOgorICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfZmFzdF9mcmVlKCkgcmV0dXJuc1xuIiApICk7CisKK30gLy8gZnVuYyBfX2ttcF9mYXN0X2ZyZWUKKworCisvLyBJbml0aWFsaXplIHRoZSB0aHJlYWQgZnJlZSBsaXN0cyByZWxhdGVkIHRvIGZhc3QgbWVtb3J5CisvLyBPbmx5IGRvIHRoaXMgd2hlbiBhIHRocmVhZCBpcyBpbml0aWFsbHkgY3JlYXRlZC4KK3ZvaWQKK19fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICkKK3sKKyAgICBLRV9UUkFDRSgxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeTogQ2FsbGVkIGZyb20gdGggJXBcbiIsIHRoaXNfdGhyICkgKTsKKworICAgIG1lbXNldCAoIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzLCAwLCBOVU1fTElTVFMgKiBzaXplb2YoIGttcF9mcmVlX2xpc3RfdCApICk7Cit9CisKKy8vIEZyZWUgdGhlIG1lbW9yeSBpbiB0aGUgdGhyZWFkIGZyZWUgbGlzdHMgcmVsYXRlZCB0byBmYXN0IG1lbW9yeQorLy8gT25seSBkbyB0aGlzIHdoZW4gYSB0aHJlYWQgaXMgYmVpbmcgcmVhcGVkIChkZXN0cm95ZWQpLgordm9pZAorX19rbXBfZnJlZV9mYXN0X21lbW9yeSgga21wX2luZm9fdCAqdGggKQoreworICAgIC8vIFN1cHBvc2Ugd2UgdXNlIEJHRVQgdW5kZXJseWluZyBhbGxvY2F0b3IsIHdhbGsgdGhyb3VnaCBpdHMgc3RydWN0dXJlcy4uLgorICAgIGludCAgICAgICAgICBiaW47CisgICAgdGhyX2RhdGFfdCAqIHRociA9IGdldF90aHJfZGF0YSggdGggKTsKKyAgICB2b2lkICAgICAgKiogbHN0ID0gTlVMTDsKKworICAgIEtFX1RSQUNFKDUsICggIl9fa21wX2ZyZWVfZmFzdF9tZW1vcnk6IENhbGxlZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8vIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzCisKKyAgICAvLyBEaWcgdGhyb3VnaCBmcmVlIGxpc3RzIGFuZCBleHRyYWN0IGFsbCBhbGxvY2F0ZWQgYmxvY2tzCisgICAgZm9yICggYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4gKSB7CisgICAgICAgIGJmaGVhZF90ICogYiA9IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmZsaW5rOworICAgICAgICB3aGlsZSAoIGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdICkgeworICAgICAgICAgICAgaWYgKCAoa21wX3VpbnRwdHJfdCliLT5iaC5iYi5idGhyICYgMSApIHsgICAvLyBpZiB0aGUgYnVmZmVyIGlzIGFuIGFsbG9jYXRlZCBhZGRyZXNzPworICAgICAgICAgICAgICAgICooKHZvaWQqKiliKSA9IGxzdDsgICAvLyBsaW5rIHRoZSBsaXN0IChvdmVycmlkZSBidGhyLCBidXQga2VlcCBmbGluayB5ZXQpCisgICAgICAgICAgICAgICAgbHN0ID0gKHZvaWQqKiliOyAgICAgIC8vIHB1c2ggYiBpbnRvIGxzdAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYiA9IGItPnFsLmZsaW5rOyAgICAgICAgICAvLyBnZXQgbmV4dCBidWZmZXIKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoIGxzdCAhPSBOVUxMICkgeworICAgICAgICB2b2lkICogbmV4dCA9ICpsc3Q7CisgICAgICAgIEtFX1RSQUNFKDEwLCAoICJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBmcmVlaW5nICVwLCBuZXh0PSVwIHRoICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbHN0LCBuZXh0LCB0aCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7CisgICAgICAgICgqdGhyLT5yZWxmY24pKGxzdCk7CisgICAgICAgICNpZiBCdWZTdGF0cworICAgICAgICAgICAgLy8gY291bnQgYmxvY2tzIHRvIHByZXZlbnQgcHJvYmxlbXMgaW4gX19rbXBfZmluYWxpemVfYmdldCgpCisgICAgICAgICAgICB0aHItPm51bXByZWwrKzsgICAgICAgLyogTnIgb2YgZXhwYW5zaW9uIGJsb2NrIHJlbGVhc2VzICovCisgICAgICAgICAgICB0aHItPm51bXBibGstLTsgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICAjZW5kaWYKKyAgICAgICAgbHN0ID0gKHZvaWQqKiluZXh0OworICAgIH0KKworICAgIEtFX1RSQUNFKDUsICggIl9fa21wX2ZyZWVfZmFzdF9tZW1vcnk6IEZyZWVkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApICkgKTsKK30KKworI2VuZGlmIC8vIFVTRV9GQVNUX01FTU9SWQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWQzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmMKQEAgLTAsMCArMSwyOTA3IEBACisvKgorICoga21wX2F0b21pYy5jIC0tIEFUT01JQyBpbXBsZW1lbnRhdGlvbiByb3V0aW5lcworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorI2luY2x1ZGUgImttcC5oIiAgICAgICAgICAgICAgICAgIC8vIFRSVUUsIGFzbSByb3V0aW5lcyBwcm90b3R5cGVzCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNob3J0OworCisvKiEKK0BkZWZncm91cCBBVE9NSUNfT1BTIEF0b21pYyBPcGVyYXRpb25zCitUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGltcGxlbWVudGluZyB0aGUgbWFueSBkaWZmZXJlbnQgdmFyaWV0aWVzIG9mIGF0b21pYyBvcGVyYXRpb25zLgorCitUaGUgY29tcGlsZXIgaXMgYXQgbGliZXJ0eSB0byBpbmxpbmUgYXRvbWljIG9wZXJhdGlvbnMgdGhhdCBhcmUgbmF0dXJhbGx5IHN1cHBvcnRlZAorYnkgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIEZvciBpbnN0YW5jZSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW4gYXRvbWljIGxpa2UgdGhpcyBjYW4gYmUgaW5saW5lZAorQGNvZGUKK3N0YXRpYyBpbnQgcyA9IDA7CisjcHJhZ21hIG9tcCBhdG9taWMKKyAgICBzKys7CitAZW5kY29kZQordXNpbmcgdGhlIHNpbmdsZSBpbnN0cnVjdGlvbjogYGxvY2s7IGluY2wgc2AKKworSG93ZXZlciB0aGUgcnVudGltZSBkb2VzIHByb3ZpZGUgZW50cnlwb2ludHMgZm9yIHRoZXNlIG9wZXJhdGlvbnMgdG8gc3VwcG9ydCBjb21waWxlcnMgdGhhdCBjaG9vc2UKK25vdCB0byBpbmxpbmUgdGhlbS4gKEZvciBpbnN0YW5jZSwgYF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZGAgY291bGQgYmUgdXNlZCB0byBwZXJmb3JtIHRoZQoraW5jcmVtZW50IGFib3ZlLikKKworVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGVuY29kZWQgYnkgdXNpbmcgdGhlIGRhdGEgdHlwZSBuYW1lIGFuZCB0aGUgb3BlcmF0aW9uIG5hbWUsIGFzIGluIHRoZXNlIHRhYmxlcy4KKworRGF0YSBUeXBlICB8IERhdGEgdHlwZSBlbmNvZGluZworLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tCitpbnQ4X3QgICAgIHwgYGZpeGVkMWAKK3VpbnQ4X3QgICAgfCBgZml4ZWQxdWAKK2ludDE2X3QgICAgfCBgZml4ZWQyYAordWludDE2X3QgICB8IGBmaXhlZDJ1YAoraW50MzJfdCAgICB8IGBmaXhlZDRgCit1aW50MzJfdCAgIHwgYGZpeGVkNHVgCitpbnQzMl90ICAgIHwgYGZpeGVkOGAKK3VpbnQzMl90ICAgfCBgZml4ZWQ4dWAKK2Zsb2F0ICAgICAgfCBgZmxvYXQ0YAorZG91YmxlICAgICB8IGBmbG9hdDhgCitmbG9hdCAxMCAoODA4NyBlaWdodHkgYml0IGZsb2F0KSAgfCBgZmxvYXQxMGAKK2NvbXBsZXg8ZmxvYXQ+ICAgfCAgYGNtcGx4NGAKK2NvbXBsZXg8ZG91YmxlPiAgfCBgY21wbHg4YAorY29tcGxleDxmbG9hdDEwPiB8IGBjbXBseDEwYAorPGJyPgorCitPcGVyYXRpb24gfCBPcGVyYXRpb24gZW5jb2RpbmcKKy0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLQorKyB8IGFkZAorLSB8IHN1YgorXCogfCBtdWwKKy8gfCBkaXYKKyYgfCBhbmRiCis8PCB8IHNobAorXD5cPiB8IHNocgorXHwgfCBvcmIKK14gIHwgeG9yCismJiB8IGFuZGwKK1x8XHwgfCBvcmwKK21heGltdW0gfCBtYXgKK21pbmltdW0gfCBtaW4KKy5lcXYuICAgfCBlcXYKKy5uZXF2LiAgfCBuZXF2CisKKzxicj4KK0ZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucywgYF9yZXZgIGNhbiBhbHNvIGJlIGFkZGVkIGZvciB0aGUgcmV2ZXJzZWQgb3BlcmF0aW9uLgorRm9yIHRoZSBmdW5jdGlvbnMgdGhhdCBjYXB0dXJlIHRoZSByZXN1bHQsIHRoZSBzdWZmaXggYF9jcHRgIGlzIGFkZGVkLgorCitVcGRhdGUgRnVuY3Rpb25zCis9PT09PT09PT09PT09PT09CitUaGUgZ2VuZXJhbCBmb3JtIG9mIGFuIGF0b21pYyBmdW5jdGlvbiB0aGF0IGp1c3QgcGVyZm9ybXMgYW4gdXBkYXRlICh3aXRob3V0IGEgYGNhcHR1cmVgKQorQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY188ZGF0YXR5cGU+XzxvcGVyYXRpb24+KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApOworQGVuZGNvZGUKK0BwYXJhbSBpZGVudF90ICBhIHBvaW50ZXIgdG8gc291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCAgdGhlIGdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBsaHMgICBhIHBvaW50ZXIgdG8gdGhlIGxlZnQgb3BlcmFuZAorQHBhcmFtIHJocyAgIHRoZSByaWdodCBvcGVyYW5kCisKK2BjYXB0dXJlYCBmdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT0KK1RoZSBjYXB0dXJlIGZ1bmN0aW9ucyBwZXJmb3JtIGFuIGF0b21pYyB1cGRhdGUgYW5kIHJldHVybiBhIHJlc3VsdCwgd2hpY2ggaXMgZWl0aGVyIHRoZSB2YWx1ZQorYmVmb3JlIHRoZSBjYXB0dXJlLCBvciB0aGF0IGFmdGVyLiBUaGV5IHRha2UgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB0byBkZXRlcm1pbmUgd2hpY2ggcmVzdWx0IGlzIHJldHVybmVkLgorVGhlaXIgZ2VuZXJhbCBmb3JtIGlzIHRoZXJlZm9yZQorQGNvZGUKK1RZUEUgX19rbXBjX2F0b21pY188ZGF0YXR5cGU+XzxvcGVyYXRpb24+X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIGludCBmbGFnICk7CitAZW5kY29kZQorQHBhcmFtIGlkZW50X3QgIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkICB0aGUgZ2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIGxocyAgIGEgcG9pbnRlciB0byB0aGUgbGVmdCBvcGVyYW5kCitAcGFyYW0gcmhzICAgdGhlIHJpZ2h0IG9wZXJhbmQKK0BwYXJhbSBmbGFnICBvbmUgaWYgdGhlIHJlc3VsdCBpcyB0byBiZSBjYXB0dXJlZCAqYWZ0ZXIqIHRoZSBvcGVyYXRpb24sIHplcm8gaWYgY2FwdHVyZWQgKmJlZm9yZSouCisKK1RoZSBvbmUgc2V0IG9mIGV4Y2VwdGlvbnMgdG8gdGhpcyBpcyB0aGUgYGNvbXBsZXg8ZmxvYXQ+YCB0eXBlIHdoZXJlIHRoZSB2YWx1ZSBpcyBub3QgcmV0dXJuZWQsCityYXRoZXIgYW4gZXh0cmEgYXJndW1lbnQgcG9pbnRlciBpcyBwYXNzZWQuCisKK1RoZXkgbG9vayBsaWtlCitAY29kZQordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF88b3A+X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyApOworQGVuZGNvZGUKKworUmVhZCBhbmQgV3JpdGUgT3BlcmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIE9wZW5NUDxzdXA+Kjwvc3VwPiBzdGFuZGFyZCBub3cgc3VwcG9ydHMgYXRvbWljIG9wZXJhdGlvbnMgdGhhdCBzaW1wbHkgZW5zdXJlIHRoYXQgdGhlCit2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4gYXRvbWljYWxseSwgd2l0aCBubyBtb2RpZmljYXRpb24KK3BlcmZvcm1lZC4gSW4gbWFueSBjYXNlcyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgdGhlc2Ugb3BlcmF0aW9ucyBjYW4gYmUgaW5saW5lZCBzaW5jZQordGhlIGFyY2hpdGVjdHVyZSBndWFyYW50ZWVzIHRoYXQgbm8gdGVhcmluZyBvY2N1cnMgb24gYWxpZ25lZCBvYmplY3RzCithY2Nlc3NlZCB3aXRoIGEgc2luZ2xlIG1lbW9yeSBvcGVyYXRpb24gb2YgdXAgdG8gNjQgYml0cyBpbiBzaXplLgorCitUaGUgZ2VuZXJhbCBmb3JtIG9mIHRoZSByZWFkIG9wZXJhdGlvbnMgaXMKK0Bjb2RlCitUWVBFIF9fa21wY19hdG9taWNfPHR5cGU+X3JkICggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxvYyApOworQGVuZGNvZGUKKworRm9yIHRoZSB3cml0ZSBvcGVyYXRpb25zIHRoZSBmb3JtIGlzCitAY29kZQordm9pZCBfX2ttcGNfYXRvbWljXzx0eXBlPl93ciAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICk7CitAZW5kY29kZQorCitGdWxsIGxpc3Qgb2YgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGxlYWRzIHRvIHRoZSBnZW5lcmF0aW9uIG9mIDM3NiBhdG9taWMgZnVuY3Rpb25zLCBhcyBmb2xsb3dzLgorCitGdW5jdG9ucyBmb3IgaW50ZWdlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlcmUgYXJlIHZlcnNpb25zIGhlcmUgZm9yIGludGVnZXJzIG9mIHNpemUgMSwyLDQgYW5kIDggYnl0ZXMgYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkICh3aGVyZSB0aGF0IG1hdHRlcnMpLgorQGNvZGUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldgorQGVuZGNvZGUKKworRnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlcmUgYXJlIHZlcnNpb25zIGhlcmUgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgb2Ygc2l6ZSA0LCA4LCAxMCBhbmQgMTYgYnl0ZXMuCisoVGVuIGJ5dGUgZmxvYXRzIGFyZSB1c2VkIGJ5IFg4NywgYnV0IGFyZSBub3cgcmFyZSkuCitAY29kZQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF93cgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF93cgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3dyCitAZW5kY29kZQorCitGdW5jdGlvbnMgZm9yIENvbXBsZXggdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnVuY3Rpb25zIGZvciBjb21wbGV4IHR5cGVzIHdob3NlIGNvbXBvbmVudCBmbG9hdGluZyBwb2ludCB2YXJpYWJsZXMgYXJlIG9mIHNpemUgNCw4LDEwIG9yIDE2IGJ5dGVzLgorVGhlIG5hbWVzIGhlcmUgYXJlIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wb25lbnQgZmxvYXQsICpub3QqIHRoZSBzaXplIG9mIHRoZSBjb21wbGV4IHR5cGUuIFNvCitgX19rbXBjX2F0b21jX2NtcGx4OF9hZGRgIGlzIGFuIG9wZXJhdGlvbiBvbiBhIGBjb21wbGV4PGRvdWJsZT5gIG9yIGBjb21wbGV4KGtpbmQ9OClgLCAqbm90KiBgY29tcGxleDxmbG9hdD5gLgorCitAY29kZQorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF93cgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2FkZAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfbXVsCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3dyCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfd3IKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IKK0BlbmRjb2RlCisqLworCisvKiEKK0Bpbmdyb3VwIEFUT01JQ19PUFMKK0B7CisqLworCisvKgorICogR2xvYmFsIHZhcnMKKyAqLworCisjaWZuZGVmIEtNUF9HT01QX0NPTVBBVAoraW50IF9fa21wX2F0b21pY19tb2RlID0gMTsgICAgICAvLyBJbnRlbCBwZXJmCisjZWxzZQoraW50IF9fa21wX2F0b21pY19tb2RlID0gMjsgICAgICAvLyBHT01QIGNvbXBhdGliaWxpdHkKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworS01QX0FMSUdOKDEyOCkKKwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2s7ICAgICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGluIEdudSBjb21wYXQgbW9kZSAgICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xaTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDEtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18yaTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDItYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180aTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDQtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180cjsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsMzIgZGF0YSB0eXBlICAgICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184aTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDgtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184cjsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsNjQgZGF0YSB0eXBlICAgICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184YzsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGNvbXBsZXggYnl0ZSBkYXRhIHR5cGUgICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xMHI7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGxvbmcgZG91YmxlIGRhdGEgdHlwZSAgICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xNnI7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIF9RdWFkIGRhdGEgdHlwZSAgICAgICAgICovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xNmM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGRvdWJsZSBjb21wbGV4IGRhdGEgdHlwZSovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18yMGM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGxvbmcgZG91YmxlIGNvbXBsZXggdHlwZSovCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18zMmM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIF9RdWFkIGNvbXBsZXggZGF0YSB0eXBlICovCisKKworLyoKKyAgMjAwNy0wMy0wMjoKKyAgV2l0aG91dCAidm9sYXRpbGUiIHNwZWNpZmllciBpbiBPUF9DTVBYQ0hHIGFuZCBNSU5fTUFYX0NNUFhDSEcgd2UgaGF2ZSBhCisgIGJ1ZyBvbiAqXzMyIGFuZCAqXzMyZS4gVGhpcyBpcyBqdXN0IGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtLgorICBJdCBzZWVtcyB0aGUgcmlnaHQgc29sdXRpb24gaXMgd3JpdGluZyBPUF9DTVBYQ0hHIGFuZCBNSU5fTUFYX0NNUFhDSEcKKyAgcm91dGluZXMgaW4gYXNzZW1ibGVyIGxhbmd1YWdlLgorKi8KKyNkZWZpbmUgS01QX0FUT01JQ19WT0xBVElMRSB2b2xhdGlsZQorCisjaWYgKCBLTVBfQVJDSF9YODYgKSAmJiBLTVBfSEFWRV9RVUFECisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKz0oIFF1YWRfYTRfdCAmIGxocywgUXVhZF9hNF90ICYgcmhzICkgeyBsaHMucSArPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLT0oIFF1YWRfYTRfdCAmIGxocywgUXVhZF9hNF90ICYgcmhzICkgeyBsaHMucSAtPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKj0oIFF1YWRfYTRfdCAmIGxocywgUXVhZF9hNF90ICYgcmhzICkgeyBsaHMucSAqPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLz0oIFF1YWRfYTRfdCAmIGxocywgUXVhZF9hNF90ICYgcmhzICkgeyBsaHMucSAvPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoIFF1YWRfYTRfdCAmIGxocywgUXVhZF9hNF90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPCByaHMucTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvciA+ICggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IHJldHVybiBsaHMucSA+IHJocy5xOyB9CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKz0oIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSAqPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLz0oIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvciA8ICggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xIDwgcmhzLnE7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3IgPiAoIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IHJldHVybiBsaHMucSA+IHJocy5xOyB9CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKz0oIGttcF9jbXBseDEyOF9hNF90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSAqPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLz0oIGttcF9jbXBseDEyOF9hNF90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKz0oIGttcF9jbXBseDEyOF9hMTZfdCAmIGxocywga21wX2NtcGx4MTI4X2ExNl90ICYgcmhzICkgeyBsaHMucSArPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLT0oIGttcF9jbXBseDEyOF9hMTZfdCAmIGxocywga21wX2NtcGx4MTI4X2ExNl90ICYgcmhzICkgeyBsaHMucSAtPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKj0oIGttcF9jbXBseDEyOF9hMTZfdCAmIGxocywga21wX2NtcGx4MTI4X2ExNl90ICYgcmhzICkgeyBsaHMucSAqPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLz0oIGttcF9jbXBseDEyOF9hMTZfdCAmIGxocywga21wX2NtcGx4MTI4X2ExNl90ICYgcmhzICkgeyBsaHMucSAvPSByaHMucTsgfTsKKworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQVRPTUlDIGltcGxlbWVudGF0aW9uIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBvbmUgcm91dGluZSBmb3IgZWFjaCBvcGVyYXRpb24gYW5kIG9wZXJhbmQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBBbGwgcm91dGluZXMgZGVjbGFyYXRpb25zIGxvb2tzIGxpa2UKKy8vIHZvaWQgX19rbXBjX2F0b21pY19SVFlQRV9PUCggaWRlbnRfdCosIGludCwgVFlQRSAqbGhzLCBUWVBFIHJocyApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgS01QX0NIRUNLX0dUSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggZ3RpZCA9PSBLTVBfR1RJRF9VTktOT1dOICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IC8vIGNoZWNrIGFuZCBnZXQgZ3RpZCB3aGVuIG5lZWRlZAorCisvLyBCZWdpbm5pbmcgb2YgYSBkZWZpbml0aW9uIChwcm92aWRlcyBuYW1lLCBwYXJhbWV0ZXJzLCBnZWJ1ZyB0cmFjZSkKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQqLCBmaXhlZCp1IGZvciBzaWduZWQsIHVuc2lnbmVkIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLCBSRVRfVFlQRSkgXAorUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvY2sgdmFyaWFibGVzIHVzZWQgZm9yIGNyaXRpY2FsIHNlY3Rpb25zIGZvciB2YXJpb3VzIHNpemUgb3BlcmFuZHMKKyNkZWZpbmUgQVRPTUlDX0xPQ0swICAgX19rbXBfYXRvbWljX2xvY2sgICAgICAgLy8gYWxsIHR5cGVzLCBmb3IgR251IGNvbXBhdAorI2RlZmluZSBBVE9NSUNfTE9DSzFpICBfX2ttcF9hdG9taWNfbG9ja18xaSAgICAvLyBjaGFyCisjZGVmaW5lIEFUT01JQ19MT0NLMmkgIF9fa21wX2F0b21pY19sb2NrXzJpICAgIC8vIHNob3J0CisjZGVmaW5lIEFUT01JQ19MT0NLNGkgIF9fa21wX2F0b21pY19sb2NrXzRpICAgIC8vIGxvbmcgaW50CisjZGVmaW5lIEFUT01JQ19MT0NLNHIgIF9fa21wX2F0b21pY19sb2NrXzRyICAgIC8vIGZsb2F0CisjZGVmaW5lIEFUT01JQ19MT0NLOGkgIF9fa21wX2F0b21pY19sb2NrXzhpICAgIC8vIGxvbmcgbG9uZyBpbnQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s4ciAgX19rbXBfYXRvbWljX2xvY2tfOHIgICAgLy8gZG91YmxlCisjZGVmaW5lIEFUT01JQ19MT0NLOGMgIF9fa21wX2F0b21pY19sb2NrXzhjICAgIC8vIGZsb2F0IGNvbXBsZXgKKyNkZWZpbmUgQVRPTUlDX0xPQ0sxMHIgX19rbXBfYXRvbWljX2xvY2tfMTByICAgLy8gbG9uZyBkb3VibGUKKyNkZWZpbmUgQVRPTUlDX0xPQ0sxNnIgX19rbXBfYXRvbWljX2xvY2tfMTZyICAgLy8gX1F1YWQKKyNkZWZpbmUgQVRPTUlDX0xPQ0sxNmMgX19rbXBfYXRvbWljX2xvY2tfMTZjICAgLy8gZG91YmxlIGNvbXBsZXgKKyNkZWZpbmUgQVRPTUlDX0xPQ0syMGMgX19rbXBfYXRvbWljX2xvY2tfMjBjICAgLy8gbG9uZyBkb3VibGUgY29tcGxleAorI2RlZmluZSBBVE9NSUNfTE9DSzMyYyBfX2ttcF9hdG9taWNfbG9ja18zMmMgICAvLyBfUXVhZCBjb21wbGV4CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMKE9QLExDS19JRCkgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpIE9QIChyaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvciBHTlUgY29tcGF0aWJpbGl0eSwgd2UgbWF5IG5lZWQgdG8gdXNlIGEgY3JpdGljYWwgc2VjdGlvbiwKKy8vIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCByZXF1aXJlZCBieSB0aGUgSVNBLgorLy8KKy8vIE9uIElBLTMyIGFyY2hpdGVjdHVyZSwgYWxsIGF0b21pYyBvcGVyYXRpb25zIGV4Y2VwdCBmb3IgZml4ZWQgNCBieXRlIGFkZCwKKy8vIHN1YiwgYW5kIGJpdHdpc2UgbG9naWNhbCBvcHMsIGFuZCAxICYgMiBieXRlIGxvZ2ljYWwgb3BzIHVzZSBhIGNvbW1vbgorLy8gY3JpdGljYWwgc2VjdGlvbi4gIE9uIEludGVsKFIpIDY0LCBhbGwgYXRvbWljIG9wZXJhdGlvbnMgYXJlIGRvbmUgd2l0aCBmZXRjaAorLy8gYW5kIGFkZCBvciBjb21wYXJlIGFuZCBleGNoYW5nZS4gIFRoZXJlZm9yZSwgdGhlIEZMQUcgcGFyYW1ldGVyIHRvIHRoaXMKKy8vIG1hY3JvIGlzIGVpdGhlciBLTVBfQVJDSF9YODYgb3IgMCAob3IgMSwgZm9yIEludGVsLXNwZWNpZmljIGV4dGVuc2lvbiB3aGljaAorLy8gcmVxdWlyZSBhIGNyaXRpY2FsIHNlY3Rpb24sIHdoZXJlIHdlIHByZWRpY3QgdGhhdCB0aGV5IHdpbGwgYmUgaW1wbGVtZW50ZWQKKy8vIGluIHRoZSBHbnUgY29kZWdlbiBieSBjYWxsaW5nIEdPTVBfYXRvbWljX3N0YXJ0KCkgLyBHT01QX2F0b21pY19lbmQoKSkuCisvLworLy8gV2hlbiB0aGUgT1BfR09NUF9DUklUSUNBTCBtYWNybyBpcyB1c2VkIGluIGEgKkNSSVRJQ0FMKiBtYWNybyBjb25zdHJ1Y3QsCisvLyB0aGUgRkxBRyBwYXJhbWV0ZXIgc2hvdWxkIGFsd2F5cyBiZSAxLiAgSWYgd2Uga25vdyB0aGF0IHdlIHdpbGwgYmUgdXNpbmcKKy8vIGEgY3JpdGljYWwgc2VjdGlvbiwgdGhlbiB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbiB0aGF0IHdlIHVzZSB0aGUgZ2VuZXJpYworLy8gbG9jayBfX2ttcF9hdG9taWNfbG9jayB0byBwcm90ZWN0IHRoZSBhdG9taWMgdXBkYXRlLCBhbmQgbm90IG9mIG9mIHRoZQorLy8gbG9ja3MgdGhhdCBhcmUgc3BlY2lhbGl6ZWQgYmFzZWQgdXBvbiB0aGUgc2l6ZSBvciB0eXBlIG9mIHRoZSBkYXRhLgorLy8KKy8vIElmIEZMQUcgaXMgMCwgdGhlbiB3ZSBhcmUgcmVseWluZyBvbiBkZWFkIGNvZGUgZWxpbWluYXRpb24gYnkgdGhlIGJ1aWxkCisvLyBjb21waWxlciB0byBnZXQgcmlkIG9mIHRoZSB1c2VsZXNzIGJsb2NrIG9mIGNvZGUsIGFuZCBzYXZlIGEgbmVlZGxlc3MKKy8vIGJyYW5jaCBhdCBydW50aW1lLgorLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorIyBkZWZpbmUgT1BfR09NUF9DUklUSUNBTChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjIGVsc2UKKyMgZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUwoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworI2lmIEtNUF9NSUMKKyMgZGVmaW5lIEtNUF9ET19QQVVTRSBfbW1fZGVsYXlfMzIoIDEgKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ET19QQVVTRSBLTVBfQ1BVX1BBVVNFKCkKKyNlbmRpZiAvKiBLTVBfTUlDICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorI2RlZmluZSBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSAqKFRZUEUgdm9sYXRpbGUgKilsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ET19QQVVTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9ICooVFlQRSB2b2xhdGlsZSAqKWxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIDIwMDctMDYtMjU6CisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisvLyBsaW5fMzIsIGxpbl8zMmUsIHdpbl8zMiBhbmQgd2luXzMyZSBhcmUgYWZmZWN0ZWQgKEkgdmVyaWZpZWQgdGhlIGFzbSkKKy8vIENvbXBpbGVyIGlnbm9yZXMgdGhlIHZvbGF0aWxlIHF1YWxpZmllciBvZiB0aGUgdGVtcF92YWwgaW4gdGhlIE9QX0NNUFhDSEcgbWFjcm8uCisvLyBUaGlzIGlzIGEgcHJvYmxlbSBvZiB0aGUgY29tcGlsZXIuCisvLyBSZWxhdGVkIHRyYWNrZXIgaXMgQzc2MDA1LCB0YXJnZXRlZCB0byAxMS4wLgorLy8gSSB2ZXJpZmllZCB0aGUgYXNtIG9mIHRoZSB3b3JrYXJvdW5kLgorI2RlZmluZSBPUF9DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgX3NzcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIFRZUEUgICAgICAgICAgICBjbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICBrbXBfaW50IyNCSVRTICAgKnZ2djsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cnVjdCBfc3NzIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlLnZ2diA9ICgga21wX2ludCMjQklUUyAqICkmb2xkX3ZhbHVlLmNtcDsgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUudnZ2ID0gKCBrbXBfaW50IyNCSVRTICogKSZuZXdfdmFsdWUuY21wOyAgICAgICAgICAgICAgICBcCisgICAgICAgICpvbGRfdmFsdWUudnZ2ID0gKiAoIHZvbGF0aWxlIGttcF9pbnQjI0JJVFMgKiApIGxoczsgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlLmNtcCA9IG9sZF92YWx1ZS5jbXAgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSBvbGRfdmFsdWUudnZ2LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopIG5ld192YWx1ZS52dnYgKSApICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAqb2xkX3ZhbHVlLnZ2diA9ICogKCB2b2xhdGlsZSBrbXBfaW50IyNCSVRTICogKSBsaHM7ICAgICAgICAgIFwKKwkgICAgbmV3X3ZhbHVlLmNtcCA9IG9sZF92YWx1ZS5jbXAgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisvLyBlbmQgb2YgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX0FERChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgICAgIFwKKyAgICBLTVBfVEVTVF9USEVOX0FERCMjQklUUyggbGhzLCBPUCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gZW5kIG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZW5kaWYKKworI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfRklYRURfQUREKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgXAorICAgICAgICBLTVBfVEVTVF9USEVOX0FERCMjQklUUyggbGhzLCBPUCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIRyhUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gZW5kIG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIDQtYnl0ZSBvcGVyYW5kcyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24KK0FUT01JQ19GSVhFRF9BREQoIGZpeGVkNCwgYWRkLCBrbXBfaW50MzIsICAzMiwgKywgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQKK0FUT01JQ19GSVhFRF9BREQoIGZpeGVkNCwgc3ViLCBrbXBfaW50MzIsICAzMiwgLSwgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWIKKworQVRPTUlDX0NNUFhDSEcoIGZsb2F0NCwgIGFkZCwga21wX3JlYWwzMiwgMzIsICssICA0ciwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZAorQVRPTUlDX0NNUFhDSEcoIGZsb2F0NCwgIHN1Yiwga21wX3JlYWwzMiwgMzIsIC0sICA0ciwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YgorCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIDgtYnl0ZSBvcGVyYW5kcyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24KK0FUT01JQ19GSVhFRF9BREQoIGZpeGVkOCwgYWRkLCBrbXBfaW50NjQsICA2NCwgKywgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQKK0FUT01JQ19GSVhFRF9BREQoIGZpeGVkOCwgc3ViLCBrbXBfaW50NjQsICA2NCwgLSwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIKKworQVRPTUlDX0NNUFhDSEcoIGZsb2F0OCwgIGFkZCwga21wX3JlYWw2NCwgNjQsICssICA4ciwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZAorQVRPTUlDX0NNUFhDSEcoIGZsb2F0OCwgIHN1Yiwga21wX3JlYWw2NCwgNjQsIC0sICA4ciwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKy8vICAgICBNQVNLICAgIC0gdXNlZCBmb3IgYWxpZ25tZW50IGNoZWNrCisKKy8vICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgIFRZUEUsICAgQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIGFkZCwga21wX2ludDgsICAgIDgsICssICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgYW5kYiwga21wX2ludDgsICAgIDgsICYsICAxaSwgMCwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBkaXYsIGttcF9pbnQ4LCAgICA4LCAvLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDF1LCBkaXYsIGttcF91aW50OCwgICA4LCAvLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgbXVsLCBrbXBfaW50OCwgICAgOCwgKiwgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgb3JiLCBrbXBfaW50OCwgICAgOCwgfCwgIDFpLCAwLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfb3JiCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgc2hsLCBrbXBfaW50OCwgICAgOCwgPDwsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgc2hyLCBrbXBfaW50OCwgICAgOCwgPj4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQxdSwgc2hyLCBrbXBfdWludDgsICAgOCwgPj4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHN1Yiwga21wX2ludDgsICAgIDgsIC0sICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1YgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHhvciwga21wX2ludDgsICAgIDgsIF4sICAxaSwgMCwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIGFkZCwga21wX2ludDE2LCAgMTYsICssICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgYW5kYiwga21wX2ludDE2LCAgMTYsICYsICAyaSwgMSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBkaXYsIGttcF9pbnQxNiwgIDE2LCAvLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDJ1LCBkaXYsIGttcF91aW50MTYsIDE2LCAvLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgbXVsLCBrbXBfaW50MTYsICAxNiwgKiwgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgb3JiLCBrbXBfaW50MTYsICAxNiwgfCwgIDJpLCAxLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JiCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgc2hsLCBrbXBfaW50MTYsICAxNiwgPDwsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgc2hyLCBrbXBfaW50MTYsICAxNiwgPj4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQydSwgc2hyLCBrbXBfdWludDE2LCAxNiwgPj4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHN1Yiwga21wX2ludDE2LCAgMTYsIC0sICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHhvciwga21wX2ludDE2LCAgMTYsIF4sICAyaSwgMSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgYW5kYiwga21wX2ludDMyLCAgMzIsICYsICA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBkaXYsIGttcF9pbnQzMiwgIDMyLCAvLCAgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDR1LCBkaXYsIGttcF91aW50MzIsIDMyLCAvLCAgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgbXVsLCBrbXBfaW50MzIsICAzMiwgKiwgIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgb3JiLCBrbXBfaW50MzIsICAzMiwgfCwgIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgc2hsLCBrbXBfaW50MzIsICAzMiwgPDwsIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgc2hyLCBrbXBfaW50MzIsICAzMiwgPj4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0dSwgc2hyLCBrbXBfdWludDMyLCAzMiwgPj4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIHhvciwga21wX2ludDMyLCAgMzIsIF4sICA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgYW5kYiwga21wX2ludDY0LCAgNjQsICYsICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBkaXYsIGttcF9pbnQ2NCwgIDY0LCAvLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDh1LCBkaXYsIGttcF91aW50NjQsIDY0LCAvLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgbXVsLCBrbXBfaW50NjQsICA2NCwgKiwgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgb3JiLCBrbXBfaW50NjQsICA2NCwgfCwgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfb3JiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgc2hsLCBrbXBfaW50NjQsICA2NCwgPDwsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgc2hyLCBrbXBfaW50NjQsICA2NCwgPj4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4dSwgc2hyLCBrbXBfdWludDY0LCA2NCwgPj4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIHhvciwga21wX2ludDY0LCAgNjQsIF4sICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcgorQVRPTUlDX0NNUFhDSEcoIGZsb2F0NCwgIGRpdiwga21wX3JlYWwzMiwgMzIsIC8sICA0ciwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZsb2F0NCwgIG11bCwga21wX3JlYWwzMiwgMzIsICosICA0ciwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bAorQVRPTUlDX0NNUFhDSEcoIGZsb2F0OCwgIGRpdiwga21wX3JlYWw2NCwgNjQsIC8sICA4ciwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZsb2F0OCwgIG11bCwga21wX3JlYWw2NCwgNjQsICosICA4ciwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bAorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUm91dGluZXMgZm9yIEMvQysrIFJlZHVjdGlvbiBvcGVyYXRvcnMgJiYgYW5kIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgJiYsIHx8IGJlY2F1c2UgdGhlcmUgaXMgbm8gY29tYmluZWQgYXNzaWdubWVudAorLy8gICBUT0RPOiBlbGltaW5hdGUgQVRPTUlDX0NSSVRfe0wsRVFWfSBtYWNyb3MgYXMgbm90IHVzZWQKKyNkZWZpbmUgQVRPTUlDX0NSSVRfTChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTCggPSAqbGhzIE9QLCBHT01QX0ZMQUcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTCggPSAqbGhzIE9QLCBMQ0tfSUQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfQ01QWF9MKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKCA9ICpsaHMgT1AsIEdPTVBfRkxBRyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWF9MKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKD0gKmxocyBPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKD0gKmxocyBPUCxMQ0tfSUQpICAvKiB1bmFsaWduZWQgLSB1c2UgY3JpdGljYWwgKi8gICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworQVRPTUlDX0NNUFhfTCggZml4ZWQxLCBhbmRsLCBjaGFyLCAgICAgICA4LCAmJiwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDEsICBvcmwsIGNoYXIsICAgICAgIDgsIHx8LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29ybAorQVRPTUlDX0NNUFhfTCggZml4ZWQyLCBhbmRsLCBzaG9ydCwgICAgIDE2LCAmJiwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDIsICBvcmwsIHNob3J0LCAgICAgMTYsIHx8LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29ybAorQVRPTUlDX0NNUFhfTCggZml4ZWQ0LCBhbmRsLCBrbXBfaW50MzIsIDMyLCAmJiwgNGksIDMsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDQsICBvcmwsIGttcF9pbnQzMiwgMzIsIHx8LCA0aSwgMywgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybAorQVRPTUlDX0NNUFhfTCggZml4ZWQ4LCBhbmRsLCBrbXBfaW50NjQsIDY0LCAmJiwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDgsICBvcmwsIGttcF9pbnQ2NCwgNjQsIHx8LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJvdXRpbmVzIGZvciBGb3J0cmFuIG9wZXJhdG9ycyB0aGF0IG1hdGNoZWQgbm8gb25lIGluIEM6ICAgICAgICAgICAgICAgICAgKi8KKy8qIE1BWCwgTUlOLCAuRVFWLiwgLk5FUVYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZXJhdG9ycyAuQU5ELiwgLk9SLiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGwsb3JsfSAgICAgICAgICAgKi8KKy8qIEludHJpbnNpY3MgSUFORCwgSU9SLCBJRU9SIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kYixvcmIseG9yfSAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTUlOIGFuZCBNQVggbmVlZCBzZXBhcmF0ZSBtYWNyb3MKKy8vIE9QIC0gb3BlcmF0b3IgdG8gY2hlY2sgaWYgd2UgbmVlZCBhbnkgYWN0aW9ucz8KKyNkZWZpbmUgTUlOX01BWF9DUklUU0VDVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICBcCisgICAgICAgICpsaHMgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKCBGTEFHICkgJiYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBNSU5fTUFYX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoIG9sZF92YWx1ZSBPUCByaHMgJiYgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgXAorICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJnJocyApICkgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMS1ieXRlLCAyLWJ5dGUgb3BlcmFuZHMgLSB1c2UgY3JpdGljYWwgc2VjdGlvbgorI2RlZmluZSBNSU5fTUFYX0NSSVRJQ0FMKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAvKiBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIE1JTl9NQVhfQ09NUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgTUlOX01BWF9DT01QWENIRyhUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1JTl9NQVhfQ01QWENIRyhUWVBFLEJJVFMsT1ApIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1QoT1AsTENLX0lEKSAgIC8qIHVuYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkMSwgIG1heCwgY2hhciwgICAgICAgIDgsIDwsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkMSwgIG1pbiwgY2hhciwgICAgICAgIDgsID4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkMiwgIG1heCwgc2hvcnQsICAgICAgMTYsIDwsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkMiwgIG1pbiwgc2hvcnQsICAgICAgMTYsID4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkNCwgIG1heCwga21wX2ludDMyLCAgMzIsIDwsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkNCwgIG1pbiwga21wX2ludDMyLCAgMzIsID4sIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkOCwgIG1heCwga21wX2ludDY0LCAgNjQsIDwsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkOCwgIG1pbiwga21wX2ludDY0LCAgNjQsID4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZsb2F0NCwgIG1heCwga21wX3JlYWwzMiwgMzIsIDwsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZsb2F0NCwgIG1pbiwga21wX3JlYWwzMiwgMzIsID4sIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZsb2F0OCwgIG1heCwga21wX3JlYWw2NCwgNjQsIDwsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZsb2F0OCwgIG1pbiwga21wX3JlYWw2NCwgNjQsID4sIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW4KKyNpZiBLTVBfSEFWRV9RVUFECitNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtYXgsICAgICBRVUFEX0xFR0FDWSwgICAgICA8LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heAorTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWluLCAgICAgUVVBRF9MRUdBQ1ksICAgICAgPiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4KKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWF4X2ExNiwgUXVhZF9hMTZfdCwgICAgIDwsIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNgorICAgIE1JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1pbl9hMTYsIFF1YWRfYTE2X3QsICAgICA+LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYKKyNlbmRpZgorI2VuZGlmCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5lZWQgc2VwYXJhdGUgbWFjcm9zIGZvciAuRVFWLiBiZWNhdXNlIG9mIHRoZSBuZWVkIG9mIGNvbXBsZW1lbnQgKH4pCisvLyBPUCBpZ25vcmVkIGZvciBjcml0aWNhbCBzZWN0aW9ucywgXj1+IHVzZWQgaW5zdGVhZAorI2RlZmluZSBBVE9NSUNfQ1JJVF9FUVYoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKF49fixHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKF49fixMQ0tfSUQpICAgIC8qIHNlbmQgYXNzaWdubWVudCBhbmQgY29tcGxlbWVudCAqLyAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19DTVBYX0VRVihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoXj1+LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYX0VRVihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoXj1+LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoXj1+LExDS19JRCkgICAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitBVE9NSUNfQ01QWENIRyggIGZpeGVkMSwgbmVxdiwga21wX2ludDgsICAgOCwgICBeLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbmVxdgorQVRPTUlDX0NNUFhDSEcoICBmaXhlZDIsIG5lcXYsIGttcF9pbnQxNiwgMTYsICAgXiwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQ0LCBuZXF2LCBrbXBfaW50MzIsIDMyLCAgIF4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2CitBVE9NSUNfQ01QWENIRyggIGZpeGVkOCwgbmVxdiwga21wX2ludDY0LCA2NCwgICBeLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbmVxdgorQVRPTUlDX0NNUFhfRVFWKCBmaXhlZDEsIGVxdiwgIGttcF9pbnQ4LCAgIDgsICBefiwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdgorQVRPTUlDX0NNUFhfRVFWKCBmaXhlZDIsIGVxdiwgIGttcF9pbnQxNiwgMTYsICBefiwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2VxdgorQVRPTUlDX0NNUFhfRVFWKCBmaXhlZDQsIGVxdiwgIGttcF9pbnQzMiwgMzIsICBefiwgNGksIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdgorQVRPTUlDX0NNUFhfRVFWKCBmaXhlZDgsIGVxdiwgIGttcF9pbnQ2NCwgNjQsICBefiwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgXAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBhZGQsIGxvbmcgZG91YmxlLCAgICAgKywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGQKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgc3ViLCBsb25nIGRvdWJsZSwgICAgIC0sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIG11bCwgbG9uZyBkb3VibGUsICAgICAqLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bAorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBkaXYsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXYKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBhZGQsIFFVQURfTEVHQUNZLCAgICAgKywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgc3ViLCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIG11bCwgUVVBRF9MRUdBQ1ksICAgICAqLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bAorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBkaXYsIFFVQURfTEVHQUNZLCAgICAgLywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBhZGRfYTE2LCBRdWFkX2ExNl90LCArLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIHN1Yl9hMTYsIFF1YWRfYTE2X3QsIC0sIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgbXVsX2ExNiwgUXVhZF9hMTZfdCwgKiwgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBkaXZfYTE2LCBRdWFkX2ExNl90LCAvLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTYKKyNlbmRpZgorI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworCisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKCBjbXBseDQsIGFkZCwga21wX2NtcGx4MzIsIDY0LCArLCA4YywgNywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKCBjbXBseDQsIHN1Yiwga21wX2NtcGx4MzIsIDY0LCAtLCA4YywgNywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKCBjbXBseDQsIG11bCwga21wX2NtcGx4MzIsIDY0LCAqLCA4YywgNywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKCBjbXBseDQsIGRpdiwga21wX2NtcGx4MzIsIDY0LCAvLCA4YywgNywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2CisvLyBlbmQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2Vsc2UKK0FUT01JQ19DUklUSUNBTCggY21wbHg0LCAgYWRkLCBrbXBfY21wbHgzMiwgICAgICssICA4YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHg0LCAgc3ViLCBrbXBfY21wbHgzMiwgICAgIC0sICA4YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHg0LCAgbXVsLCBrbXBfY21wbHgzMiwgICAgICosICA4YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHg0LCAgZGl2LCBrbXBfY21wbHgzMiwgICAgIC8sICA4YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYKKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKworQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDgsICBhZGQsIGttcF9jbXBseDY0LCAgICAgKywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDgsICBzdWIsIGttcF9jbXBseDY0LCAgICAgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDgsICBtdWwsIGttcF9jbXBseDY0LCAgICAgKiwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDgsICBkaXYsIGttcF9jbXBseDY0LCAgICAgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2RpdgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBhZGQsIGttcF9jbXBseDgwLCAgICAgKywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgc3ViLCBrbXBfY21wbHg4MCwgICAgIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIG11bCwga21wX2NtcGx4ODAsICAgICAqLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBkaXYsIGttcF9jbXBseDgwLCAgICAgLywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIGFkZCwgQ1BMWDEyOF9MRUcsICAgICArLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBzdWIsIENQTFgxMjhfTEVHLCAgICAgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgbXVsLCBDUExYMTI4X0xFRywgICAgICosIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIGRpdiwgQ1BMWDEyOF9MRUcsICAgICAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2RpdgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIGFkZF9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgKywgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgc3ViX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBtdWxfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsICosIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIGRpdl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNgorI2VuZGlmCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHggPSBleHByIGJpbm9wIHggZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorLy8gU3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfUkVWKE9QLExDS19JRCkgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfUkVWKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisvLyBCZWdpbm5pbmcgb2YgYSBkZWZpbml0aW9uIChwcm92aWRlcyBuYW1lLCBwYXJhbWV0ZXJzLCBnZWJ1ZyB0cmFjZSkKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQqLCBmaXhlZCp1IGZvciBzaWduZWQsIHVuc2lnbmVkIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSwgUkVUX1RZUEUpIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCMjX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIl9yZXY6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1JFVihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTl9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyaWVzIGRlZmluaXRpb24gZm9yIGludGVnZXIgb3BlcmFuZHMKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQ0LCBmbG9hdDQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmQgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yICh1c2VkIGluIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisKKy8vICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgIFRZUEUsICAgQklUUyxPUCxMQ0tfSUQsR09NUF9GTEFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgaW50ZWdlciBvcGVyYW5kcywgb3RoZXIgb3BlcmF0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgQklUUywgT1AsIExDS19JRCwgR09NUF9GTEFHCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIGRpdiwga21wX2ludDgsICAgIDgsIC8sICAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxdSwgZGl2LCBrbXBfdWludDgsICAgOCwgLywgIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgc2hsLCBrbXBfaW50OCwgICAgOCwgPDwsIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBzaHIsIGttcF9pbnQ4LCAgICA4LCA+PiwgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMXUsIHNociwga21wX3VpbnQ4LCAgIDgsID4+LCAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIHN1Yiwga21wX2ludDgsICAgIDgsIC0sICAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBkaXYsIGttcF9pbnQxNiwgIDE2LCAvLCAgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMnUsIGRpdiwga21wX3VpbnQxNiwgMTYsIC8sICAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIHNobCwga21wX2ludDE2LCAgMTYsIDw8LCAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgc2hyLCBrbXBfaW50MTYsICAxNiwgPj4sIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDJ1LCBzaHIsIGttcF91aW50MTYsIDE2LCA+PiwgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBzdWIsIGttcF9pbnQxNiwgIDE2LCAtLCAgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgZGl2LCBrbXBfaW50MzIsICAzMiwgLywgIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDR1LCBkaXYsIGttcF91aW50MzIsIDMyLCAvLCAgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBzaGwsIGttcF9pbnQzMiwgIDMyLCA8PCwgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIHNociwga21wX2ludDMyLCAgMzIsID4+LCA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0dSwgc2hyLCBrbXBfdWludDMyLCAzMiwgPj4sIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgc3ViLCBrbXBfaW50MzIsICAzMiwgLSwgIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIGRpdiwga21wX2ludDY0LCAgNjQsIC8sICA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4dSwgZGl2LCBrbXBfdWludDY0LCA2NCwgLywgIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgc2hsLCBrbXBfaW50NjQsICA2NCwgPDwsIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBzaHIsIGttcF9pbnQ2NCwgIDY0LCA+PiwgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOHUsIHNociwga21wX3VpbnQ2NCwgNjQsID4+LCA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIHN1Yiwga21wX2ludDY0LCAgNjQsIC0sICA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDQsICBkaXYsIGttcF9yZWFsMzIsIDMyLCAvLCAgNHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZsb2F0NCwgIHN1Yiwga21wX3JlYWwzMiwgMzIsIC0sICA0ciwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDgsICBkaXYsIGttcF9yZWFsNjQsIDY0LCAvLCAgOHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZsb2F0OCwgIHN1Yiwga21wX3JlYWw2NCwgNjQsIC0sICA4ciwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXYKKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgIEJJVFMsT1AsTENLX0lELCBHT01QX0ZMQUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX1JFVihPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxMCwgc3ViLCBsb25nIGRvdWJsZSwgICAgIC0sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxMCwgZGl2LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBzdWIsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBkaXYsIFFVQURfTEVHQUNZLCAgICAgLywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTYsIHN1Yl9hMTYsIFF1YWRfYTE2X3QsIC0sIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBkaXZfYTE2LCBRdWFkX2ExNl90LCAvLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfcmV2CisjZW5kaWYKKyNlbmRpZgorCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg0LCAgc3ViLCBrbXBfY21wbHgzMiwgICAgIC0sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDQsICBkaXYsIGttcF9jbXBseDMyLCAgICAgLywgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4OCwgIHN1Yiwga21wX2NtcGx4NjQsICAgICAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg4LCAgZGl2LCBrbXBfY21wbHg2NCwgICAgIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDEwLCBzdWIsIGttcF9jbXBseDgwLCAgICAgLSwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDEwLCBkaXYsIGttcF9jbXBseDgwLCAgICAgLywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgc3ViLCBDUExYMTI4X0xFRywgICAgIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgZGl2LCBDUExYMTI4X0xFRywgICAgIC8sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDE2LCBzdWJfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC0sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgZGl2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X3JldgorI2VuZGlmCisjZW5kaWYKKworCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyBFbmQgb2YgT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgbWl4ZWQgdHlwZXMgb2YgTEhTIGFuZCBSSFMsIHdoZW4gUkhTIGlzICJsYXJnZXIiICAgICAgICAgICAgKi8KKy8qIE5vdGU6IGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgdG90YWwgbnVtYmVyIG9mIHR5cGVzIGNvbWJpbmF0aW9ucyAgICAgICAgICAqLworLyogICAgICAgaXQgaXMgc3VwcG9zZWQgdGhhdCBjb21waWxlciBjb252ZXJ0cyBSSFMgdG8gbG9uZ2VzdCBmbG9hdGluZyB0eXBlLCovCisvKiAgICAgICB0aGF0IGlzIF9RdWFkLCBiZWZvcmUgY2FsbCB0byBhbnkgb2YgdGhlc2Ugcm91dGluZXMgICAgICAgICAgICAgICAgKi8KKy8qIENvbnZlcnNpb24gdG8gX1F1YWQgd2lsbCBiZSBkb25lIGJ5IHRoZSBjb21waWxlciBkdXJpbmcgY2FsY3VsYXRpb24sICAgICAqLworLyogICAgY29udmVyc2lvbiBiYWNrIHRvIFRZUEUgLSBiZWZvcmUgdGhlIGFzc2lnbm1lbnQsIGxpa2U6ICAgICAgICAgICAgICAgICovCisvKiAgICAqbGhzID0gKFRZUEUpKCAoX1F1YWQpKCpsaHMpIE9QIHJocyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBlcmZvcm1hbmNlIHBlbmFsdHkgZXhwZWN0ZWQgYmVjYXVzZSBvZiBTVyBlbXVsYXRpb24gdXNlICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQjI18jI1JUWVBFX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBSVFlQRSByaHMgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICJfIiAjUlRZUEVfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfRlAoVFlQRV9JRCxUWVBFLE9QX0lELE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19NSVgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIFJIUz1mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCBjaGFyLCAgICAgICBtdWwsICA4LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgY2hhciwgICAgICAgZGl2LCAgOCwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsIHNob3J0LCAgICAgIG11bCwgMTYsICosIGZsb2F0OCwga21wX3JlYWw2NCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCBzaG9ydCwgICAgICBkaXYsIDE2LCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwga21wX2ludDMyLCAgbXVsLCAzMiwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsIGttcF9pbnQzMiwgIGRpdiwgMzIsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCBrbXBfaW50NjQsICBtdWwsIDY0LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwga21wX2ludDY0LCAgZGl2LCA2NCwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIGFkZCwgMzIsICssIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBzdWIsIDMyLCAtLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwga21wX3JlYWwzMiwgbXVsLCAzMiwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIGRpdiwgMzIsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgKKworLy8gUkhTPWZsb2F0MTYgKGRlcHJlY2F0ZWQsIHRvIGJlIHJlbW92ZWQgd2hlbiB3ZSBhcmUgc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3QgdXNlIHRoZW0pCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBhZGQsICA4LCArLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgc3ViLCAgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIG11bCwgIDgsICosIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBkaXYsICA4LCAvLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxdSwgdWNoYXIsICAgICAgZGl2LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIGFkZCwgMTYsICssIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBzdWIsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgbXVsLCAxNiwgKiwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIGRpdiwgMTYsIC8sIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDJ1LCB1c2hvcnQsICAgICBkaXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgYWRkLCAzMiwgKywgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIHN1YiwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBtdWwsIDMyLCAqLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgZGl2LCAzMiwgLywgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNHUsIGttcF91aW50MzIsIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBhZGQsIDY0LCArLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgc3ViLCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBkaXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4dSwga21wX3VpbnQ2NCwgZGl2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIGFkZCwgMzIsICssIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBzdWIsIDMyLCAtLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgbXVsLCAzMiwgKiwgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIGFkZCwgNjQsICssIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBzdWIsIDY0LCAtLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgbXVsLCA2NCwgKiwgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9mcAorCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBhZGQsICssIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfZnAKK0FUT01JQ19DUklUSUNBTF9GUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsICAgIHN1YiwgLSwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcAorQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgbXVsLCAqLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2ZwCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBkaXYsIC8sIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NNUExYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gZW5kIG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZWxzZQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DTVBMWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DTVBMWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIGFkZCwgNjQsICssIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jbXBseDgKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBzdWIsIDY0LCAtLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4CitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgbXVsLCA2NCwgKiwgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NtcGx4OAorQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIGRpdiwgNjQsIC8sIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgKKworLy8gUkVBRCwgV1JJVEUsIENBUFRVUkUgYXJlIHN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdG9taWMgUkVBRCByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLCBSRVRfVFlQRSkgXAorUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbG9jICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmVfcmV0IiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBzdGlsbCBuZWNlc3NhcnkKKy8vIFJldHVybiBvbGQgdmFsdWUgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdWx0IG9mICJjb21wYXJlICYgc3dhcCMgb3BlcmF0aW9uCisKKyNkZWZpbmUgT1BfQ01QWENIR19SRUFEKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5pb24gZl9pX3VuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVFlQRSBmX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBrbXBfaW50IyNCSVRTIGlfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bmlvbiBmX2lfdW5pb24gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxvYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlLmZfdmFsID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUuaV92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsb2MsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUuaV92YWwsICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZS5pX3ZhbCApOyBcCisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZS5mX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX1JFQUQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9ICgqbG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9SRUFEKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfRklYRURfUkVBRChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3ZhbHVlID0gS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxvYywgT1AgMCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19SRUFEKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX1JFQUQoT1AsTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaXggZm9yIGNtcGx4NCByZWFkIChDUTIyMDM2MSkgb24gV2luZG93cyogT1MuIFJlZ3VsYXIgcm91dGluZSB3aXRoIHJldHVybiB2YWx1ZSBkb2Vzbid0IHdvcmsuCisvLyBMZXQncyByZXR1cm4gdGhlIHJlYWQgdmFsdWUgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisKKyNpZiAoIEtNUF9PU19XSU5ET1dTICkKKworI2RlZmluZSBPUF9DUklUSUNBTF9SRUFEX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKm91dCkgPSAoKmxvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfUkVBRF9XUksoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRF9XUksoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQkVHSU5fUkVBRF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSBcCit2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggVFlQRSAqIG91dCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxvYyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFQURfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQURfV1JLKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRUFEX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgIFwKK30KKworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgIE9QLCBHT01QX0ZMQUcKK0FUT01JQ19GSVhFRF9SRUFEKCBmaXhlZDQsIHJkLCBrbXBfaW50MzIsICAzMiwgKywgMCAgICAgICAgICAgICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZAorQVRPTUlDX0ZJWEVEX1JFQUQoIGZpeGVkOCwgcmQsIGttcF9pbnQ2NCwgIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkCitBVE9NSUNfQ01QWENIR19SRUFEKCBmbG9hdDQsIHJkLCBrbXBfcmVhbDMyLCAzMiwgKywgS01QX0FSQ0hfWDg2ICkgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZsb2F0OCwgcmQsIGttcF9yZWFsNjQsIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9yZAorCisvLyAhISEgVE9ETzogUmVtb3ZlIGxvY2sgb3BlcmF0aW9ucyBmb3IgImNoYXIiIHNpbmNlIGl0IGNhbid0IGJlIG5vbi1hdG9taWMKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZpeGVkMSwgIHJkLCBrbXBfaW50OCwgICAgOCwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9yZAorQVRPTUlDX0NNUFhDSEdfUkVBRCggZml4ZWQyLCAgcmQsIGttcF9pbnQxNiwgIDE2LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3JkCisKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBmbG9hdDEwLCByZCwgbG9uZyBkb3VibGUsICssIDEwciwgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfcmQKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfUkVBRCggZmxvYXQxNiwgcmQsIFFVQURfTEVHQUNZLCArLCAxNnIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3JkCisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisvLyBGaXggZm9yIENRMjIwMzYxIG9uIFdpbmRvd3MqIE9TCisjaWYgKCBLTVBfT1NfV0lORE9XUyApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQURfV1JLKCBjbXBseDQsICByZCwga21wX2NtcGx4MzIsICssICA4YywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyNlbHNlCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4NCwgIHJkLCBrbXBfY21wbHgzMiwgKywgIDhjLCAxICkgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyNlbmRpZgorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4OCwgIHJkLCBrbXBfY21wbHg2NCwgKywgMTZjLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3JkCitBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHgxMCwgcmQsIGttcF9jbXBseDgwLCArLCAyMGMsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3JkCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4MTYsIHJkLCBDUExYMTI4X0xFRywgKywgMzJjLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9yZAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVBRCggZmxvYXQxNiwgYTE2X3JkLCBRdWFkX2ExNl90LCArLCAxNnIsIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfcmQKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHgxNiwgYTE2X3JkLCBrbXBfY21wbHgxMjhfYTE2X3QsICssIDMyYywgMSApIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfcmQKKyNlbmRpZgorI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdG9taWMgV1JJVEUgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19YQ0hHX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX1hDSEdfRklYRUQjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfWENIR19GTE9BVF9XUihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9YQ0hHX1JFQUwjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX1dSKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1dSKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9XUihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AsTENLX0lEKSAgICAgICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQVRPTUlDX1hDSEdfV1IoIGZpeGVkMSwgIHdyLCBrbXBfaW50OCwgICAgOCwgPSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV93cgorQVRPTUlDX1hDSEdfV1IoIGZpeGVkMiwgIHdyLCBrbXBfaW50MTYsICAxNiwgPSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl93cgorQVRPTUlDX1hDSEdfV1IoIGZpeGVkNCwgIHdyLCBrbXBfaW50MzIsICAzMiwgPSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF93cgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ01QWENIR19XUiggZml4ZWQ4LCAgd3IsIGttcF9pbnQ2NCwgIDY0LCA9LCAgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF93cgorI2Vsc2UKKyAgICBBVE9NSUNfWENIR19XUiggZml4ZWQ4LCAgd3IsIGttcF9pbnQ2NCwgIDY0LCA9LCAgS01QX0FSQ0hfWDg2ICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF93cgorI2VuZGlmCisKK0FUT01JQ19YQ0hHX0ZMT0FUX1dSKCBmbG9hdDQsIHdyLCBrbXBfcmVhbDMyLCAzMiwgPSwgS01QX0FSQ0hfWDg2ICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF93cgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ01QWENIR19XUiggZmxvYXQ4LCAgd3IsIGttcF9yZWFsNjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF93cgorI2Vsc2UKKyAgICBBVE9NSUNfWENIR19GTE9BVF9XUiggZmxvYXQ4LCAgd3IsIGttcF9yZWFsNjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF93cgorI2VuZGlmCisKK0FUT01JQ19DUklUSUNBTF9XUiggZmxvYXQxMCwgd3IsIGxvbmcgZG91YmxlLCA9LCAxMHIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3dyCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1dSKCBmbG9hdDE2LCB3ciwgUVVBRF9MRUdBQ1ksID0sIDE2ciwgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IKKyNlbmRpZgorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDQsICB3ciwga21wX2NtcGx4MzIsID0sICA4YywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF93cgorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDgsICB3ciwga21wX2NtcGx4NjQsID0sIDE2YywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF93cgorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDEwLCB3ciwga21wX2NtcGx4ODAsID0sIDIwYywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfd3IKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4MTYsIHdyLCBDUExYMTI4X0xFRywgPSwgMzJjLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl93cgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfV1IoIGZsb2F0MTYsIGExNl93ciwgUXVhZF9hMTZfdCwgICAgICAgICA9LCAxNnIsIDEgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3dyCisgICAgQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDE2LCBhMTZfd3IsIGttcF9jbXBseDEyOF9hMTZfdCwgPSwgMzJjLCAxICkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl93cgorI2VuZGlmCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF0b21pYyBDQVBUVVJFIHJvdXRpbmVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsUkVUX1RZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgaW50IGZsYWcgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVCggT1AjIz0sIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX0FERF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSBLTVBfVEVTVF9USEVOX0FERCMjQklUUyggbGhzLCBPUCByaHMgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkNCwgYWRkX2NwdCwga21wX2ludDMyLCAgMzIsICssIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ0LCBzdWJfY3B0LCBrbXBfaW50MzIsICAzMiwgLSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHQKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDgsIGFkZF9jcHQsIGttcF9pbnQ2NCwgIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdAorQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkOCwgc3ViX2NwdCwga21wX2ludDY0LCAgNjQsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0CisKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ0LCBhZGRfY3B0LCBrbXBfcmVhbDMyLCAzMiwgKywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ0LCBzdWJfY3B0LCBrbXBfcmVhbDMyLCAzMiwgLSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ4LCBhZGRfY3B0LCBrbXBfcmVhbDY0LCA2NCwgKywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ4LCBzdWJfY3B0LCBrbXBfcmVhbDY0LCA2NCwgLSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyaWVzIGRlZmluaXRpb24gZm9yIGludGVnZXIgb3BlcmFuZHMKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQ0LCBmbG9hdDQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmQgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yICh1c2VkIGluIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsR09NUF9GTEFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgaW50ZWdlciBvcGVyYW5kcywgb3RoZXIgb3BlcmF0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBhZGRfY3B0LCBrbXBfaW50OCwgICAgOCwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgYW5kYl9jcHQsIGttcF9pbnQ4LCAgICA4LCAmLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIGRpdl9jcHQsIGttcF9pbnQ4LCAgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxdSwgZGl2X2NwdCwga21wX3VpbnQ4LCAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgbXVsX2NwdCwga21wX2ludDgsICAgIDgsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBvcmJfY3B0LCBrbXBfaW50OCwgICAgOCwgfCwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHNobF9jcHQsIGttcF9pbnQ4LCAgICA4LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgc2hyX2NwdCwga21wX2ludDgsICAgIDgsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDF1LCBzaHJfY3B0LCBrbXBfdWludDgsICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBzdWJfY3B0LCBrbXBfaW50OCwgICAgOCwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHhvcl9jcHQsIGttcF9pbnQ4LCAgICA4LCBeLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgYWRkX2NwdCwga21wX2ludDE2LCAgMTYsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsIGFuZGJfY3B0LCBrbXBfaW50MTYsICAxNiwgJiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBkaXZfY3B0LCBrbXBfaW50MTYsICAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMnUsIGRpdl9jcHQsIGttcF91aW50MTYsIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIG11bF9jcHQsIGttcF9pbnQxNiwgIDE2LCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgb3JiX2NwdCwga21wX2ludDE2LCAgMTYsIHwsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBzaGxfY3B0LCBrbXBfaW50MTYsICAxNiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHNocl9jcHQsIGttcF9pbnQxNiwgIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQydSwgc2hyX2NwdCwga21wX3VpbnQxNiwgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgc3ViX2NwdCwga21wX2ludDE2LCAgMTYsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICB4b3JfY3B0LCBrbXBfaW50MTYsICAxNiwgXiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgYW5kYl9jcHQsIGttcF9pbnQzMiwgIDMyLCAmLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIGRpdl9jcHQsIGttcF9pbnQzMiwgIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0dSwgZGl2X2NwdCwga21wX3VpbnQzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgbXVsX2NwdCwga21wX2ludDMyLCAgMzIsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBvcmJfY3B0LCBrbXBfaW50MzIsICAzMiwgfCwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIHNobF9jcHQsIGttcF9pbnQzMiwgIDMyLCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgc2hyX2NwdCwga21wX2ludDMyLCAgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDR1LCBzaHJfY3B0LCBrbXBfdWludDMyLCAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICB4b3JfY3B0LCBrbXBfaW50MzIsICAzMiwgXiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgYW5kYl9jcHQsIGttcF9pbnQ2NCwgIDY0LCAmLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIGRpdl9jcHQsIGttcF9pbnQ2NCwgIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4dSwgZGl2X2NwdCwga21wX3VpbnQ2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgbXVsX2NwdCwga21wX2ludDY0LCAgNjQsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBvcmJfY3B0LCBrbXBfaW50NjQsICA2NCwgfCwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIHNobF9jcHQsIGttcF9pbnQ2NCwgIDY0LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgc2hyX2NwdCwga21wX2ludDY0LCAgNjQsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDh1LCBzaHJfY3B0LCBrbXBfdWludDY0LCA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICB4b3JfY3B0LCBrbXBfaW50NjQsICA2NCwgXiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgIGRpdl9jcHQsIGttcF9yZWFsMzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ0LCAgbXVsX2NwdCwga21wX3JlYWwzMiwgMzIsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsICBkaXZfY3B0LCBrbXBfcmVhbDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgIG11bF9jcHQsIGttcF9yZWFsNjQsIDY0LCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9jcHQKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBDL0MrKyBSZWR1Y3Rpb24gb3BlcmF0b3JzICYmIGFuZCB8fAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9MX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9MX0NQVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yICYmLCB8fCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbWJpbmVkIGFzc2lnbm1lbnQKKyNkZWZpbmUgQVRPTUlDX0NNUFhfTF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKCA9ICpsaHMgT1AsIEdPTVBfRkxBRyApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDEsIGFuZGxfY3B0LCBjaGFyLCAgICAgICA4LCAmJiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQxLCAgb3JsX2NwdCwgY2hhciwgICAgICAgOCwgfHwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQyLCBhbmRsX2NwdCwgc2hvcnQsICAgICAxNiwgJiYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMiwgIG9ybF9jcHQsIHNob3J0LCAgICAgMTYsIHx8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkNCwgYW5kbF9jcHQsIGttcF9pbnQzMiwgMzIsICYmLCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDQsICBvcmxfY3B0LCBrbXBfaW50MzIsIDMyLCB8fCwgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDgsIGFuZGxfY3B0LCBrbXBfaW50NjQsIDY0LCAmJiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ4LCAgb3JsX2NwdCwga21wX2ludDY0LCA2NCwgfHwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEZvcnRyYW4gb3BlcmF0b3JzIHRoYXQgbWF0Y2hlZCBubyBvbmUgaW4gQzoKKy8vIE1BWCwgTUlOLCAuRVFWLiwgLk5FUVYuCisvLyBPcGVyYXRvcnMgLkFORC4sIC5PUi4gYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRsLG9ybH1fY3B0CisvLyBJbnRyaW5zaWNzIElBTkQsIElPUiwgSUVPUiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGIsb3JiLHhvcn1fY3B0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1JTiBhbmQgTUFYIG5lZWQgc2VwYXJhdGUgbWFjcm9zCisvLyBPUCAtIG9wZXJhdG9yIHRvIGNoZWNrIGlmIHdlIG5lZWQgYW55IGFjdGlvbnM/CisjZGVmaW5lIE1JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqbGhzID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIGZsYWcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoIEZMQUcgKSAmJiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUX0NQVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBNSU5fTUFYX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKlRZUEUgb2xkX3ZhbHVlOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoIG9sZF92YWx1ZSBPUCByaHMgJiYgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgXAorICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJnJocyApICkgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggZmxhZyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMS1ieXRlLCAyLWJ5dGUgb3BlcmFuZHMgLSB1c2UgY3JpdGljYWwgc2VjdGlvbgorI2RlZmluZSBNSU5fTUFYX0NSSVRJQ0FMX0NQVChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlLCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAvKiBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIE1JTl9NQVhfQ09NUFhDSEdfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWUsIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMSwgIG1heF9jcHQsIGNoYXIsICAgICAgICA4LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQxLCAgbWluX2NwdCwgY2hhciwgICAgICAgIDgsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDIsICBtYXhfY3B0LCBzaG9ydCwgICAgICAxNiwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMiwgIG1pbl9jcHQsIHNob3J0LCAgICAgIDE2LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ0LCAgbWF4X2NwdCwga21wX2ludDMyLCAgMzIsIDwsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDQsICBtaW5fY3B0LCBrbXBfaW50MzIsICAzMiwgPiwgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkOCwgIG1heF9jcHQsIGttcF9pbnQ2NCwgIDY0LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ4LCAgbWluX2NwdCwga21wX2ludDY0LCAgNjQsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDQsICBtYXhfY3B0LCBrbXBfcmVhbDMyLCAzMiwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0NCwgIG1pbl9jcHQsIGttcF9yZWFsMzIsIDMyLCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ4LCAgbWF4X2NwdCwga21wX3JlYWw2NCwgNjQsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDgsICBtaW5fY3B0LCBrbXBfcmVhbDY0LCA2NCwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKK01JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtYXhfY3B0LCBRVUFEX0xFR0FDWSwgICAgPCwgMTZyLCAgIDEgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQKK01JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtaW5fY3B0LCBRVUFEX0xFR0FDWSwgICAgPiwgMTZyLCAgIDEgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1heF9hMTZfY3B0LCBRdWFkX2ExNl90LCA8LCAxNnIsICAxICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2X2NwdAorICAgIE1JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtaW5fYTE2X2NwdCwgUXVhZF9hMTZfdCwgPiwgMTZyLCAgMSApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWl4X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9FUVZfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoXj1+LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDEsIG5lcXZfY3B0LCBrbXBfaW50OCwgICA4LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDIsIG5lcXZfY3B0LCBrbXBfaW50MTYsIDE2LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDQsIG5lcXZfY3B0LCBrbXBfaW50MzIsIDMyLCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDgsIG5lcXZfY3B0LCBrbXBfaW50NjQsIDY0LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDEsIGVxdl9jcHQsICBrbXBfaW50OCwgICA4LCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Vxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkMiwgZXF2X2NwdCwgIGttcF9pbnQxNiwgMTYsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQ0LCBlcXZfY3B0LCAga21wX2ludDMyLCAzMiwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDgsIGVxdl9jcHQsICBrbXBfaW50NjQsIDY0LCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Vxdl9jcHQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUKE9QIyM9LExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1dSSyhPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9XUksoIE9QIyM9LCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19CRUdJTl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgVFlQRSAqIG91dCwgaW50IGZsYWcgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyhUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU5fV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9XUksoT1AjIz0sTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgYWRkX2NwdCwgbG9uZyBkb3VibGUsICAgICArLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIHN1Yl9jcHQsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBtdWxfY3B0LCBsb25nIGRvdWJsZSwgICAgICosIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgZGl2X2NwdCwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgYWRkX2NwdCwgUVVBRF9MRUdBQ1ksICAgICArLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIHN1Yl9jcHQsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtdWxfY3B0LCBRVUFEX0xFR0FDWSwgICAgICosIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgZGl2X2NwdCwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgYWRkX2ExNl9jcHQsIFF1YWRfYTE2X3QsICssIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBzdWJfYTE2X2NwdCwgUXVhZF9hMTZfdCwgLSwgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG11bF9hMTZfY3B0LCBRdWFkX2ExNl90LCAqLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgZGl2X2ExNl9jcHQsIFF1YWRfYTE2X3QsIC8sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisKKy8vIGNtcGx4NCByb3V0aW5lcyB0byByZXR1cm4gdm9pZAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIGFkZF9jcHQsIGttcF9jbXBseDMyLCArLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIHN1Yl9jcHQsIGttcF9jbXBseDMyLCAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIG11bF9jcHQsIGttcF9jbXBseDMyLCAqLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIGRpdl9jcHQsIGttcF9jbXBseDMyLCAvLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdAorCitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBhZGRfY3B0LCBrbXBfY21wbHg2NCwgKywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIHN1Yl9jcHQsIGttcF9jbXBseDY0LCAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgbXVsX2NwdCwga21wX2NtcGx4NjQsICosIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBkaXZfY3B0LCBrbXBfY21wbHg2NCwgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIGFkZF9jcHQsIGttcF9jbXBseDgwLCArLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIHN1Yl9jcHQsIGttcF9jbXBseDgwLCAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIG11bF9jcHQsIGttcF9jbXBseDgwLCAqLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIGRpdl9jcHQsIGttcF9jbXBseDgwLCAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBhZGRfY3B0LCBDUExYMTI4X0xFRywgKywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBzdWJfY3B0LCBDUExYMTI4X0xFRywgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBtdWxfY3B0LCBDUExYMTI4X0xFRywgKiwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBkaXZfY3B0LCBDUExYMTI4X0xFRywgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGFkZF9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsICssIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBzdWJfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgbXVsX2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgKiwgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGRpdl9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB2ID0geCA9IGV4cHIgYmlub3AgeDsgeyB2ID0geDsgeCA9IGV4cHIgYmlub3AgeDsgfSB7IHggPSBleHByIGJpbm9wIHg7IHYgPSB4OyB9ICBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qdGVtcF92YWwgPSAoKmxocyk7Ki9cCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTtcCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVYoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX0NQVF9SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFRfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFRfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgZGl2X2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDF1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQ4LCAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBzaGxfY3B0X3Jldiwga21wX2ludDgsICAgIDgsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIHNocl9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxdSwgc2hyX2NwdF9yZXYsIGttcF91aW50OCwgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgc3ViX2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBkaXZfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMnUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDE2LCAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIHNobF9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgc2hyX2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDJ1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQxNiwgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBzdWJfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIGRpdl9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0dSwgZGl2X2NwdF9yZXYsIGttcF91aW50MzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgc2hsX2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBzaHJfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNHUsIHNocl9jcHRfcmV2LCBrbXBfdWludDMyLCAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgZGl2X2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDh1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQ2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBzaGxfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIHNocl9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4dSwgc2hyX2NwdF9yZXYsIGttcF91aW50NjQsIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgc3ViX2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDQsICBkaXZfY3B0X3Jldiwga21wX3JlYWwzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0NCwgIHN1Yl9jcHRfcmV2LCBrbXBfcmVhbDMyLCAzMiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ4LCAgZGl2X2NwdF9yZXYsIGttcF9yZWFsNjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDgsICBzdWJfY3B0X3Jldiwga21wX3JlYWw2NCwgNjQsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qcHJpbnRmKCJfX2ttcF9hdG9taWNfbW9kZSA9ICVkXG4iLCBfX2ttcF9hdG9taWNfbW9kZSk7Ki9cCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUX1JFVihPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDEwLCBzdWJfY3B0X3JldiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxMCwgZGl2X2NwdF9yZXYsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgc3ViX2NwdF9yZXYsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIGRpdl9jcHRfcmV2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIHN1Yl9hMTZfY3B0X3JldiwgUXVhZF9hMTZfdCwgLSwgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgZGl2X2ExNl9jcHRfcmV2LCBRdWFkX2ExNl90LCAvLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gVGhlIGVuZCBvZiB3b3JrYXJvdW5kIGZvciBjbXBseDQKKworCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byByZXR1cm4gdm9pZCBmb3IgY21wbHg0IHJvdXRpbmVzCisvLyBjbXBseDQgcm91dGluZXMgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWX1dSSyggY21wbHg0LCAgc3ViX2NwdF9yZXYsIGttcF9jbXBseDMyLCAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWX1dSSyggY21wbHg0LCAgZGl2X2NwdF9yZXYsIGttcF9jbXBseDMyLCAvLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYKKworQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4OCwgIHN1Yl9jcHRfcmV2LCBrbXBfY21wbHg2NCwgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHg4LCAgZGl2X2NwdF9yZXYsIGttcF9jbXBseDY0LCAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDEwLCBzdWJfY3B0X3Jldiwga21wX2NtcGx4ODAsIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDEwLCBkaXZfY3B0X3Jldiwga21wX2NtcGx4ODAsIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgc3ViX2NwdF9yZXYsIENQTFgxMjhfTEVHLCAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgZGl2X2NwdF9yZXYsIENQTFgxMjhfTEVHLCAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBzdWJfYTE2X2NwdF9yZXYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgZGl2X2ExNl9jcHRfcmV2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2CisjZW5kaWYKKyNlbmRpZgorCisvLyAgIE9wZW5NUCA0LjAgQ2FwdHVyZS13cml0ZSAoc3dhcCk6IHt2ID0geDsgeCA9IGV4cHI7fQorCisjZGVmaW5lIEFUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitUWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfc3dwOiBUIyVkXG4iLCBndGlkICkpOworCisjZGVmaW5lIENSSVRJQ0FMX1NXUChMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2xkX3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gb2xkX3ZhbHVlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1AoRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1JJVElDQUxfU1dQKCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQKEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworI2RlZmluZSBBVE9NSUNfWENIR19TV1AoVFlQRV9JRCxUWVBFLEJJVFMsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2xkX3ZhbHVlID0gS01QX1hDSEdfRklYRUQjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19YQ0hHX0ZMT0FUX1NXUChUWVBFX0lELFRZUEUsQklUUyxHT01QX0ZMQUcpICAgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSBLTVBfWENIR19SRUFMIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBDTVBYQ0hHX1NXUChUWVBFLEJJVFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19TV1AoVFlQRV9JRCxUWVBFLEJJVFMsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ01QWENIR19TV1AoVFlQRSxCSVRTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQVRPTUlDX1hDSEdfU1dQKCBmaXhlZDEsIGttcF9pbnQ4LCAgICA4LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3dwCitBVE9NSUNfWENIR19TV1AoIGZpeGVkMiwga21wX2ludDE2LCAgMTYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AKK0FUT01JQ19YQ0hHX1NXUCggZml4ZWQ0LCBrbXBfaW50MzIsICAzMiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cAorCitBVE9NSUNfWENIR19GTE9BVF9TV1AoIGZsb2F0NCwga21wX3JlYWwzMiwgMzIsIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3dwCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NNUFhDSEdfU1dQKCBmaXhlZDgsIGttcF9pbnQ2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgQVRPTUlDX0NNUFhDSEdfU1dQKCBmbG9hdDgsIGttcF9yZWFsNjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisjZWxzZQorICAgIEFUT01JQ19YQ0hHX1NXUCggICAgICAgZml4ZWQ4LCBrbXBfaW50NjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorICAgIEFUT01JQ19YQ0hHX0ZMT0FUX1NXUCggZmxvYXQ4LCBrbXBfcmVhbDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cAorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfU1dQKFRZUEVfSUQsVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENSSVRJQ0FMX1NXUChMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gISEhIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gcmV0dXJuIHZvaWQgZm9yIGNtcGx4NCByb3V0aW5lcworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0LiBSZWd1bGFyIHJvdXRpbmVzIHdpdGggcmV0dXJuIHZhbHVlIGRvbid0IHdvcmsKKy8vIG9uIFdpbl8zMmUuIExldCdzIHJldHVybiBjYXB0dXJlZCB2YWx1ZXMgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1NXUF9XUksoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI19zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBUWVBFICogb3V0ICkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl9zd3A6IFQjJWRcbiIsIGd0aWQgKSk7CisKKworI2RlZmluZSBDUklUSUNBTF9TV1BfV1JLKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcCA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gKHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKm91dCkgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUF9XUksoRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDUklUSUNBTF9TV1BfV1JLKCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1BfV1JLKEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfU1dQX1dSSyhUWVBFX0lELCBUWVBFLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQX1dSSyhUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQX1dSSyhHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1JJVElDQUxfU1dQX1dSSyhMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIFRoZSBlbmQgb2Ygd29ya2Fyb3VuZCBmb3IgY21wbHg0CisKKworQVRPTUlDX0NSSVRJQ0FMX1NXUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsIDEwciwgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfU1dQKCBmbG9hdDE2LCBRVUFEX0xFR0FDWSwgMTZyLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cAorI2VuZGlmCisvLyBjbXBseDQgcm91dGluZSB0byByZXR1cm4gdm9pZAorQVRPTUlDX0NSSVRJQ0FMX1NXUF9XUksoIGNtcGx4NCwga21wX2NtcGx4MzIsICA4YywgICAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorCisvL0FUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4NCwga21wX2NtcGx4MzIsICA4YywgICAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorCisKK0FUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4OCwgIGttcF9jbXBseDY0LCAxNmMsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AKK0FUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4MTAsIGttcF9jbXBseDgwLCAyMGMsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHgxNiwgQ1BMWDEyOF9MRUcsIDMyYywgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zd3AKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1NXUCggZmxvYXQxNl9hMTYsIFF1YWRfYTE2X3QsICAgICAgICAgMTZyLCAxICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfc3dwCisgICAgQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHgxNl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgMzJjLCAxICkgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfc3dwCisjZW5kaWYKKyNlbmRpZgorCisKKy8vIEVuZCBvZiBPcGVuTVAgNC4wIENhcHR1cmUKKworI2VuZGlmIC8vT01QXzQwX0VOQUJMRUQKKworI2VuZGlmIC8vS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisKKyN1bmRlZiBPUF9DUklUSUNBTAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEdlbmVyaWMgYXRvbWljIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wY19hdG9taWNfMSggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKAorI2lmIEtNUF9BUkNIX1g4NiAmJiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgdXNlIGxvY2sgKi8KKyNlbHNlCisgICAgICAgIFRSVUUKKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKwlvbGRfdmFsdWUgPSAqKGttcF9pbnQ4ICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4ICggKGttcF9pbnQ4ICopIGxocywKKwkJICAgIAkJKihrbXBfaW50OCAqKSAmb2xkX3ZhbHVlLCAqKGttcF9pbnQ4ICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50OCAqKSBsaHM7CisJICAgICgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCX0KKworCXJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEFsbCAxLWJ5dGUgZGF0YSBpcyBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKyAgICAgICAgLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMWksIGd0aWQgKTsKKworCSgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMWksIGd0aWQgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBpZiAoCisjaWYgS01QX0FSQ0hfWDg2ICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgbG9jayAqLworI2VsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCVRSVUUJCQkJCS8qIG5vIGFsaWdubWVudCBwcm9ibGVtcyAqLworI2Vsc2UKKwkhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4MSkJCS8qIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIDItYnl0ZSBhbGlnbmVkICovCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQxNiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDE2ICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNiAoIChrbXBfaW50MTYgKikgbGhzLAorCQkgICAgCQkqKGttcF9pbnQxNiAqKSAmb2xkX3ZhbHVlLCAqKGttcF9pbnQxNiAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDE2ICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxsIDItYnl0ZSBkYXRhIGlzIG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yaSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yaSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY180KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAoCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBPbiBJQS0zMiBhcmNoaXRlY3R1cmUsIGdjYyB1c2VzIGNtcHhjaGcgb25seSBmb3IgNC1ieXRlIGludHMuCisgICAgICAgIC8vIEdvbXAgY29tcGF0aWJpbGl0eSBpcyBicm9rZW4gaWYgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZmxvYXRzLgorICAgICAgICAvLworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKwlUUlVFCQkJCQkvKiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKyNlbHNlCisJISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweDMpCQkvKiBtYWtlIHN1cmUgYWRkcmVzcyBpcyA0LWJ5dGUgYWxpZ25lZCAqLworI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKwlvbGRfdmFsdWUgPSAqKGttcF9pbnQzMiAqKSBsaHM7CisJKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisJd2hpbGUgKCAhICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIgKCAoa21wX2ludDMyICopIGxocywKKwkJICAgIAkJKihrbXBfaW50MzIgKikgJm9sZF92YWx1ZSwgKihrbXBfaW50MzIgKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQzMiAqKSBsaHM7CisJICAgICgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCX0KKworCXJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBfX2ttcF9hdG9taWNfbG9ja180aSBmb3IgYWxsIDQtYnl0ZSBkYXRhLAorICAgICAgICAvLyBldmVuIGlmIGl0IGlzbid0IG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180aSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180aSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY184KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgaWYgKAorCisjaWYgS01QX0FSQ0hfWDg2ICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgbG9jayAqLworI2VsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCVRSVUUJCQkJCS8qIG5vIGFsaWdubWVudCBwcm9ibGVtcyAqLworI2Vsc2UKKwkhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4NykJCS8qIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIDgtYnl0ZSBhbGlnbmVkICovCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDY0ICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisJd2hpbGUgKCAhICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQgKCAoa21wX2ludDY0ICopIGxocywKKwkJCQkJICAgICAgICooa21wX2ludDY0ICopICZvbGRfdmFsdWUsCisJCQkJCSAgICAgICAqKGttcF9pbnQ2NCAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDY0ICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBfX2ttcF9hdG9taWNfbG9ja184aSBmb3IgYWxsIDgtYnl0ZSBkYXRhLAorICAgICAgICAvLyBldmVuIGlmIGl0IGlzbid0IG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184aSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184aSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY18xMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzEwciwgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzEwciwgZ3RpZCApOworfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzE2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTZjLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTZjLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMjAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yMGMsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yMGMsIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBjX2F0b21pY18zMiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzMyYywgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzMyYywgZ3RpZCApOworfQorCisvLyBBQzogc2FtZSB0d28gcm91dGluZXMgYXMgR09NUF9hdG9taWNfc3RhcnQvZW5kLCBidXQgd2lsbCBiZSBjYWxsZWQgYnkgb3VyIGNvbXBpbGVyCisvLyAgICAgZHVwbGljYXRlZCBpbiBvcmRlciB0byBub3QgdXNlIDMtcGFydHkgbmFtZXMgaW4gcHVyZSBJbnRlbCBjb2RlCisvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgR1RJRCBwYXJhbWV0ZXIgYWZ0ZXIgY29uc3VsdGF0aW9uIHdpdGggRXJuZXN0by9YaW5taW4uCit2b2lkCitfX2ttcGNfYXRvbWljX3N0YXJ0KHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2F0b21pY19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworCit2b2lkCitfX2ttcGNfYXRvbWljX2VuZCh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfYXRvbWljX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIQorQH0KKyovCisKKy8vIGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliN2IwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuaApAQCAtMCwwICsxLDEwNDUgQEAKKy8qCisgKiBrbXBfYXRvbWljLmggLSBBVE9NSUMgaGVhZGVyIGZpbGUKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfQVRPTUlDX0gKKyNkZWZpbmUgS01QX0FUT01JQ19ICisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorI2VuZGlmCisKKy8vIEMrKyBidWlsZCBwb3J0LgorLy8gSW50ZWwgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBfQ29tcGxleCBkYXRhdHlwZSBvbiB3aW4uCisvLyBJbnRlbCBjb21waWxlciBzdXBwb3J0cyBfQ29tcGxleCBkYXRhdHlwZSBvbiBsaW4gYW5kIG1hYy4KKy8vIE9uIHRoZSBvdGhlciBzaWRlLCB0aGVyZSBpcyBhIHByb2JsZW0gb2Ygc3RhY2sgYWxpZ25tZW50IG9uIGxpbl8zMiBhbmQgbWFjXzMyCisvLyBpZiB0aGUgcmhzIGlzIGNtcGx4ODAgb3IgY21wbHgxMjggdHlwZWRlZidlZCBkYXRhdHlwZS4KKy8vIFRoZSBkZWNpc2lvbiBpczogdG8gdXNlIGNvbXBpbGVyIHN1cHBvcnRlZCBfQ29tcGxleCB0eXBlIG9uIGxpbiBhbmQgbWFjLAorLy8gICAgICAgICAgICAgICAgICB0byB1c2UgdHlwZWRlZidlZCB0eXBlcyBvbiB3aW4uCisvLyBDb25kaXRpb24gZm9yIFdJTjY0IHdhcyBtb2RpZmllZCBpbiBhbnRpY2lwYXRpb24gb2YgMTAuMSBidWlsZCBjb21waWxlci4KKworI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkgJiYgKCBLTVBfT1NfV0lORE9XUyApCisgICAgLy8gY3JlYXRlIHNob3J0Y3V0cyBmb3IgYzk5IGNvbXBsZXggdHlwZXMKKworICAgIC8vIFZpc3VhbCBTdHVkaW8gY2Fubm90IGhhdmUgZnVuY3Rpb24gcGFyYW1ldGVycyB0aGF0IGhhdmUgdGhlCisgICAgLy8gYWxpZ24gX19kZWNsc3BlYyBhdHRyaWJ1dGUsIHNvIHdlIG11c3QgcmVtb3ZlIGl0LiAoQ29tcGlsZXIgRXJyb3IgQzI3MTkpCisgICAgI2lmIEtNUF9DT01QSUxFUl9NU1ZDCisgICAgIyB1bmRlZiBLTVBfRE9fQUxJR04KKyAgICAjIGRlZmluZSBLTVBfRE9fQUxJR04oYWxpZ25tZW50KSAvKiBOb3RoaW5nICovCisgICAgI2VuZGlmCisKKyAgICAjaWYgKF9NU0NfVkVSIDwgMTYwMCkgJiYgZGVmaW5lZChfREVCVUcpCisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtIG9mIF9EZWJ1Z0hlYXBUYWcgdW5yZXNvbHZlZCBleHRlcm5hbC4KKyAgICAgICAgLy8gVGhpcyBwcm9ibGVtIHByZXZlbnRlZCB0byB1c2Ugb3VyIHN0YXRpYyBkZWJ1ZyBsaWJyYXJ5IGZvciBDIHRlc3RzCisgICAgICAgIC8vIGNvbXBpbGVkIHdpdGggL01EZCBvcHRpb24gKHRoZSBsaWJyYXJ5IGl0c2VsZiBidWlsdCB3aXRoIC9NVGQpLAorICAgICAgICAjdW5kZWYgX0RFQlVHCisgICAgICAgICNkZWZpbmUgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICNlbmRpZgorCisgICAgI2luY2x1ZGUgPGNvbXBsZXg+CisKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgdHlwZV9saHMsIHR5cGVuYW1lIHR5cGVfcmhzID4KKyAgICBzdGQ6OmNvbXBsZXg8IHR5cGVfbGhzID4gX19rbXBfbGhzX2Rpdl9yaHMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PCB0eXBlX2xocyA+JiBsaHMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PCB0eXBlX3JocyA+JiByaHMgKSB7CisgICAgdHlwZV9saHMgYSA9IGxocy5yZWFsKCk7CisgICAgdHlwZV9saHMgYiA9IGxocy5pbWFnKCk7CisgICAgdHlwZV9yaHMgYyA9IHJocy5yZWFsKCk7CisgICAgdHlwZV9yaHMgZCA9IHJocy5pbWFnKCk7CisgICAgdHlwZV9yaHMgZGVuID0gYypjICsgZCpkOworICAgIHR5cGVfcmhzIHIgPSAoIGEqYyArIGIqZCApOworICAgIHR5cGVfcmhzIGkgPSAoIGIqYyAtIGEqZCApOworICAgIHN0ZDo6Y29tcGxleDwgdHlwZV9saHMgPiByZXQoIHIvZGVuLCBpL2RlbiApOworICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gY29tcGxleDgKKyAgICBzdHJ1Y3QgX19rbXBfY21wbHg2NF90IDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiB7CisKKyAgICBfX2ttcF9jbXBseDY0X3QoKSA6IHN0ZDo6Y29tcGxleDwgZG91YmxlID4gKCkge30KKworICAgIF9fa21wX2NtcGx4NjRfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBkb3VibGUgPiYgY2QgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiAoIGNkICkge30KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBfX2ttcF9jbXBseDY0X3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDY0X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IF9fa21wX2NtcGx4NjRfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDY0X3Qga21wX2NtcGx4NjQ7CisKKyAgICAvLyBjb21wbGV4NAorICAgIHN0cnVjdCBfX2ttcF9jbXBseDMyX3QgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4geworCisgICAgX19rbXBfY21wbHgzMl90KCkgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gKCkge30KKworICAgIF9fa21wX2NtcGx4MzJfdCggY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgY2YgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBmbG9hdCA+ICggY2YgKSB7fQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICsgKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIGIgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IHJocyA9IGI7CisgICAgICAgIHJldHVybiAoIGxocyArIHJocyApOworICAgIH0KKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgLSAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgYiApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gcmhzID0gYjsKKyAgICAgICAgcmV0dXJuICggbGhzIC0gcmhzICk7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAqICggY29uc3QgX19rbXBfY21wbHgzMl90JiBiICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiByaHMgPSBiOworICAgICAgICByZXR1cm4gKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDY0JiBiICkgeworICAgICAgICBrbXBfY21wbHg2NCB0ID0ga21wX2NtcGx4NjQoICp0aGlzICkgKyBiOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGQoIHQgKTsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGYoIGQgKTsKKyAgICAgICAgX19rbXBfY21wbHgzMl90IHIoIGYgKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4NjQmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDY0IHQgPSBrbXBfY21wbHg2NCggKnRoaXMgKSAtIGI7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gZCggdCApOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gZiggZCApOworICAgICAgICBfX2ttcF9jbXBseDMyX3QgciggZiApOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICogKCBjb25zdCBrbXBfY21wbHg2NCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4NjQgdCA9IGttcF9jbXBseDY0KCAqdGhpcyApICogYjsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBkKCB0ICk7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBmKCBkICk7CisgICAgICAgIF9fa21wX2NtcGx4MzJfdCByKCBmICk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHgzMl90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBrbXBfY21wbHg2NCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC8gKCBjb25zdCBrbXBfY21wbHg2NCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDMyX3Qga21wX2NtcGx4MzI7CisKKyAgICAvLyBjb21wbGV4MTAKKyAgICBzdHJ1Y3QgS01QX0RPX0FMSUdOKCAxNiApICBfX2ttcF9jbXBseDgwX3QgOiBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4geworCisgICAgICAgICAgICBfX2ttcF9jbXBseDgwX3QoKSA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiAoKSB7fQorCisgICAgICAgICAgICBfX2ttcF9jbXBseDgwX3QoIGNvbnN0IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiYgY2xkICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiAoIGNsZCApIHt9CisKKyAgICAgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4ODBfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9jbXBseDgwX3Qgb3BlcmF0b3IgLyAoIGNvbnN0IF9fa21wX2NtcGx4ODBfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIEtNUF9ET19BTElHTiggMTYgKSAgc3RydWN0IF9fa21wX2NtcGx4ODBfdCBrbXBfY21wbHg4MDsKKworICAgIC8vIGNvbXBsZXgxNgorICAgICNpZiBLTVBfSEFWRV9RVUFECisgICAgc3RydWN0IF9fa21wX2NtcGx4MTI4X3QgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4geworCisgICAgICAgICAgICBfX2ttcF9jbXBseDEyOF90KCkgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gKCkge30KKworICAgICAgICAgICAgX19rbXBfY21wbHgxMjhfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBfUXVhZCA+JiBjcSApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gKCBjcSApIHt9CisKKyAgICAgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4MTI4X3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBfUXVhZCA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfY21wbHgxMjhfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHgxMjhfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDEyOF90IGttcF9jbXBseDEyODsKKyAgICAjZW5kaWYgLyogS01QX0hBVkVfUVVBRCAqLworCisgICAgI2lmZGVmIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyAgICAgICAgI3VuZGVmIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyAgICAgICAgLy8gU2V0IGl0IGJhY2sgbm93CisgICAgICAgICNkZWZpbmUgX0RFQlVHIDEKKyAgICAjZW5kaWYKKworI2Vsc2UKKyAgICAvLyBjcmVhdGUgc2hvcnRjdXRzIGZvciBjOTkgY29tcGxleCB0eXBlcworICAgIHR5cGVkZWYgZmxvYXQgX0NvbXBsZXggICAgICAga21wX2NtcGx4MzI7CisgICAgdHlwZWRlZiBkb3VibGUgX0NvbXBsZXggICAgICBrbXBfY21wbHg2NDsKKyAgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9Db21wbGV4IGttcF9jbXBseDgwOworICAgICNpZiBLTVBfSEFWRV9RVUFECisgICAgdHlwZWRlZiBfUXVhZCBfQ29tcGxleCAgICAgICBrbXBfY21wbHgxMjg7CisgICAgI2VuZGlmCisjZW5kaWYKKworLy8gQ29tcGlsZXIgMTIuMCBjaGFuZ2VkIGFsaWdubWVudCBvZiAxNiBhbmQgMzItYnl0ZSBhcmd1bWVudHMgKGxpa2UgX1F1YWQKKy8vIGFuZCBrbXBfY21wbHgxMjgpIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gVGhlIGZvbGxvd2luZyBhbGlnbmVkIHN0cnVjdHVyZXMKKy8vIGFyZSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IHRoZSBvbGQgYWxpZ25tZW50IGluIDEwLjEsIDExLjAsIDExLjEgYW5kIAorLy8gaW50cm9kdWNlIHRoZSBuZXcgYWxpZ25tZW50IGluIDEyLjAuIFNlZSBDUTg4NDA1LgorI2lmIEtNUF9BUkNIX1g4NiAmJiBLTVBfSEFWRV9RVUFECisKKyAgICAvLyA0LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCisgICAgI3ByYWdtYSBwYWNrKCBwdXNoLCA0ICkKKworICAgIAorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDQgKSBRdWFkX2E0X3QgeworICAgICAgICBfUXVhZCBxOworCisgICAgICAgIFF1YWRfYTRfdCggICkgOiBxKCAgKSB7fQorICAgICAgICBRdWFkX2E0X3QoIGNvbnN0IF9RdWFkICYgY3EgKSA6IHEgKCBjcSApIHt9CisKKyAgICAgICAgUXVhZF9hNF90IG9wZXJhdG9yICsgKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyArIHJocyApOworICAgIH0KKworICAgIFF1YWRfYTRfdCBvcGVyYXRvciAtICggY29uc3QgUXVhZF9hNF90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2E0X3QpKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAgUXVhZF9hNF90IG9wZXJhdG9yICogKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyAqIHJocyApOworICAgIH0KKworICAgIFF1YWRfYTRfdCBvcGVyYXRvciAvICggY29uc3QgUXVhZF9hNF90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzIC8gcmhzICk7CisgICAgfQorCisgICAgfTsKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDQgKSBrbXBfY21wbHgxMjhfYTRfdCB7CisgICAgICAgIGttcF9jbXBseDEyOCBxOworCisgICAga21wX2NtcGx4MTI4X2E0X3QoKSA6IHEgKCkge30KKworICAgIGttcF9jbXBseDEyOF9hNF90KCBjb25zdCBrbXBfY21wbHgxMjggJiBjMTI4ICkgOiBxICggYzEyOCApIHt9CisKKyAgICAgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzICsgcmhzICk7CisgICAgfQorICAgICAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzIC8gcmhzICk7CisgICAgfQorCisgICAgfTsKKworICAgICNwcmFnbWEgcGFjayggcG9wICkKKworICAgIC8vIE5ldyAxNi1ieXRlIGFsaWduZWQgc3RydWN0dXJlcyBmb3IgMTIuMCBjb21waWxlci4KKyAgICBzdHJ1Y3QgS01QX0RPX0FMSUdOKCAxNiApIFF1YWRfYTE2X3QgeworICAgICAgICBfUXVhZCBxOworCisgICAgICAgIFF1YWRfYTE2X3QoICApIDogcSggICkge30KKyAgICAgICAgUXVhZF9hMTZfdCggY29uc3QgX1F1YWQgJiBjcSApIDogcSAoIGNxICkge30KKworICAgICAgICBRdWFkX2ExNl90IG9wZXJhdG9yICsgKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzICsgcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hMTZfdCBvcGVyYXRvciAtICggY29uc3QgUXVhZF9hMTZfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hMTZfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yICogKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hMTZfdCBvcGVyYXRvciAvICggY29uc3QgUXVhZF9hMTZfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkga21wX2NtcGx4MTI4X2ExNl90IHsKKyAgICAgICAga21wX2NtcGx4MTI4IHE7CisKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QoKSA6IHEgKCkge30KKworICAgIGttcF9jbXBseDEyOF9hMTZfdCggY29uc3Qga21wX2NtcGx4MTI4ICYgYzEyOCApIDogcSAoIGMxMjggKSB7fQorCisgICAgICAga21wX2NtcGx4MTI4X2ExNl90IG9wZXJhdG9yICsgKCBjb25zdCBrbXBfY21wbHgxMjhfYTE2X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2ExNl90KSggbGhzICsgcmhzICk7CisgICAgfQorICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisgICAgfTsKKworI2VuZGlmCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgI2RlZmluZSBRVUFEX0xFR0FDWSBRdWFkX2E0X3QKKyAgICAjZGVmaW5lIENQTFgxMjhfTEVHIGttcF9jbXBseDEyOF9hNF90CisjZWxzZQorICAgICNkZWZpbmUgUVVBRF9MRUdBQ1kgX1F1YWQKKyAgICAjZGVmaW5lIENQTFgxMjhfTEVHIGttcF9jbXBseDEyOAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBpbnQgX19rbXBfYXRvbWljX21vZGU7CisKKy8vCisvLyBBdG9taWMgbG9ja3MgY2FuIGVhc2lseSBiZWNvbWUgY29udGVuZGVkLCBzbyB3ZSB1c2UgcXVldWluZyBsb2NrcyBmb3IgdGhlbS4KKy8vCisKK3R5cGVkZWYga21wX3F1ZXVpbmdfbG9ja190IGttcF9hdG9taWNfbG9ja190OworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2F0b21pYykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfYXRvbWljKSgKKyAgICAgICAgICAgIChvbXB0X3dhaXRfaWRfdCkgbGNrKTsKKyAgICB9CisjZW5kaWYKKworICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiAKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYykoCisgICAgICAgICAgICAob21wdF93YWl0X2lkX3QpIGxjayk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYykoCisgICAgICAgICAgICAob21wdF93YWl0X2lkX3QpIGxjayk7CisgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKKy8vIEdsb2JhbCBMb2NrcworCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2s7ICAgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgaW4gR251IGNvbXBhdCBtb2RlICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xaTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDEtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMmk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAyLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgNC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180cjsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsMzIgZGF0YSB0eXBlICAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA4LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWw2NCBkYXRhIHR5cGUgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184YzsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGNvbXBsZXggYnl0ZSBkYXRhIHR5cGUgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTByOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBkYXRhIHR5cGUgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgZGF0YSB0eXBlICAgICAgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xNmM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGRvdWJsZSBjb21wbGV4IGRhdGEgdHlwZSovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMjBjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBjb21wbGV4IHR5cGUqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzMyYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgY29tcGxleCBkYXRhIHR5cGUgKi8KKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFVQREFURSBhcmUgbGlzdGVkCisvLworCisvLyAxLWJ5dGUKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKKy8vIDItYnl0ZQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3hvciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisvLyA0LWJ5dGUgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7CisvLyA4LWJ5dGUgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyA0LWJ5dGUgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKKy8vIDgtYnl0ZSBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworLy8gMS0sIDItLCA0LSwgOC1ieXRlIGxvZ2ljYWwgKCYmLCB8fCkKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gTUlOIC8gTUFYCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeTsgSUEtMzIgYXJjaGl0ZWN0dXJlIG9ubHkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisvLyAuTkVRVi4gKHNhbWUgYXMgeG9yKQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIC5FUVYuIChzYW1lIGFzIH54b3IpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gbG9uZyBkb3VibGUgdHlwZQordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisvLyBfUXVhZCB0eXBlCisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworI2VuZGlmCisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKy8vIHJvdXRpbmVzIGZvciBtaXhlZCB0eXBlcworCisvLyBSSFM9ZmxvYXQ4Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworCisvLyBSSFM9ZmxvYXQxNiAoZGVwcmVjYXRlZCwgdG8gYmUgcmVtb3ZlZCB3aGVuIHdlIGFyZSBzdXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCB1c2UgdGhlbSkKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7CisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisvLyBSSFM9Y21wbHg4Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKKworLy8gZ2VuZXJpYyBhdG9taWMgcm91dGluZXMKK3ZvaWQgX19rbXBjX2F0b21pY18xKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY184KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMTAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzE2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18yMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMzIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOworCisvLyBSRUFELCBXUklURSwgQ0FQVFVSRSBhcmUgc3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFJFQUQgYXJlIGxpc3RlZAorLy8KKworY2hhciAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICAgKiBsb2MgKTsKK3Nob3J0ICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAgICogbG9jICk7CitrbXBfaW50MzIgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICAqIGxvYyApOwora21wX2ludDY0ICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAgKiBsb2MgKTsKK2ttcF9yZWFsMzIgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgICogbG9jICk7CitrbXBfcmVhbDY0ICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICAqIGxvYyApOworbG9uZyBkb3VibGUgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsb2MgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSAgX19rbXBjX2F0b21pY19mbG9hdDE2X3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxvYyApOworI2VuZGlmCisvLyBGaXggZm9yIENRMjIwMzYxOiBjbXBseDQgUkVBRCB3aWxsIHJldHVybiB2b2lkIG9uIFdpbmRvd3MqIE9TOyByZWFkIHZhbHVlIHdpbGwgYmUKKy8vIHJldHVybmVkIHRocm91Z2ggYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIKKyNpZiAoIEtNUF9PU19XSU5ET1dTICkKKyAgICB2b2lkICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZCggIGttcF9jbXBseDMyICogb3V0LCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxvYyApOworI2Vsc2UKKyAgICBrbXBfY21wbHgzMiAgX19rbXBjX2F0b21pY19jbXBseDRfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxvYyApOworI2VuZGlmCitrbXBfY21wbHg2NCAgX19rbXBjX2F0b21pY19jbXBseDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxvYyApOwora21wX2NtcGx4ODAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsb2MgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxvYyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIFF1YWRfYTE2X3QgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAgICAgICAgICogbG9jICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfcmQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsb2MgKTsKKyNlbmRpZgorI2VuZGlmCisKKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFdSSVRFIGFyZSBsaXN0ZWQKKy8vCisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxocywgY2hhciAgICAgICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsaHMsIHNob3J0ICAgICAgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbGhzLCBrbXBfaW50MzIgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICAqIGxocywga21wX2ludDY0ICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAgKiBsaHMsIGttcF9yZWFsMzIgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgICogbGhzLCBrbXBfcmVhbDY0ICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF93ciggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3dyKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAgICAgICAgICogbGhzLCBRdWFkX2ExNl90ICAgICAgICAgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgQ0FQVFVSRSBhcmUgbGlzdGVkCisvLworCisvLyAxLWJ5dGUKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworLy8gMi1ieXRlCitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZmxvYXQKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmaXhlZAora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmbG9hdAora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisvLyA0LWJ5dGUgZml4ZWQKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX3VpbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBmaXhlZAora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGZsb2F0CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBmbG9hdAora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisvLyAxLSwgMi0sIDQtLCA4LWJ5dGUgbG9naWNhbCAoJiYsIHx8KQorY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK2NoYXIgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICogbGhzLCBjaGFyICAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyBNSU4gLyBNQVgKK2NoYXIgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK2NoYXIgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDY0ICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworI2VuZGlmCisvLyAuTkVRVi4gKHNhbWUgYXMgeG9yKQorY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICogbGhzLCBzaG9ydCAgICAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKKy8vIC5FUVYuIChzYW1lIGFzIH54b3IpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gbG9uZyBkb3VibGUgdHlwZQorbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKKyNpZiBLTVBfSEFWRV9RVUFECisvLyBfUXVhZCB0eXBlCitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYSB0aGUgYXJndW1lbnQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7CisKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcpOwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcpOworQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworICAgIGttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworI2VuZGlmCisjZW5kaWYKKwordm9pZCBfX2ttcGNfYXRvbWljX3N0YXJ0KHZvaWQpOwordm9pZCBfX2ttcGNfYXRvbWljX2VuZCh2b2lkKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHYgPSB4ID0gZXhwciBiaW5vcCB4OyB7IHYgPSB4OyB4ID0gZXhwciBiaW5vcCB4OyB9IHsgeCA9IGV4cHIgYmlub3AgeDsgdiA9IHg7IH0gIGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKworY2hhcgkgICAgICAgCV9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnICk7CitjaGFyCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAJX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcgKTsKK2NoYXIgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICwgaW50IGZsYWcpOworY2hhcgkJX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIGNoYXIgCV9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnICk7CitzaG9ydCAJCV9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgc2hvcnQgCV9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBzaG9ydCAJX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0ICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50NjQgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyApOworZmxvYXQgCQlfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMsIGludCBmbGFnICk7CitmbG9hdCAJCV9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocywgaW50IGZsYWcgKTsKK2RvdWJsZSAJCV9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworZG91YmxlIAkJX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSAJX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworbG9uZyBkb3VibGUgCV9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnICk7CitRVUFEX0xFR0FDWQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnICk7CisjZW5kaWYKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NCByb3V0aW5lcyAtIHJldHVybiB2b2lkOyBjYXB0dXJlZCB2YWx1ZSBpcyByZXR1cm5lZCB2aWEgdGhlIGFyZ3VtZW50Cit2b2lkICAgICAJX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK3ZvaWQgCSAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnICk7CitrbXBfY21wbHg2NCAJX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyApOwora21wX2NtcGx4ODAgCV9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcgKTsKK2ttcF9jbXBseDgwIAlfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnICk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgIAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnICk7CitDUExYMTI4X0xFRyAgCV9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgUXVhZF9hMTZfdCAJCV9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcgKTsKKyAgICBRdWFkX2ExNl90CQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworICAgIGttcF9jbXBseDEyOF9hMTZfdCAJX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vICAgT3Blbk1QIDQuMCBDYXB0dXJlLXdyaXRlIChzd2FwKToge3YgPSB4OyB4ID0gZXhwcjt9CitjaGFyIAkJX19rbXBjX2F0b21pY19maXhlZDFfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICAgKiBsaHMsIGNoYXIgICAgICAgIHJocyApOworc2hvcnQgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAgICogbGhzLCBzaG9ydCAgICAgICByaHMgKTsKK2ttcF9pbnQzMiAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICAqIGxocywga21wX2ludDMyICAgcmhzICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgICogbGhzLCBrbXBfaW50NjQgICByaHMgKTsKK2Zsb2F0IAkJX19rbXBjX2F0b21pY19mbG9hdDRfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgICAgICAgKiBsaHMsIGZsb2F0ICByaHMgKTsKK2RvdWJsZQkJX19rbXBjX2F0b21pY19mbG9hdDhfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICAgICAgKiBsaHMsIGRvdWJsZSAgcmhzICk7Citsb25nIGRvdWJsZQlfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgICAgCV9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgorLy8gISEhIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgYSB3b3JrYXJvdW5kIGhlcmUKK3ZvaWQgICAgICAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCApOworLy9rbXBfY21wbHgzMiAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7CisKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7CitrbXBfY21wbHg4MAlfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgCV9fa21wY19hdG9taWNfY21wbHgxNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgUXVhZF9hMTZfdAkJX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisvLyBFbmQgb2YgT3Blbk1QIDQuMCBjYXB0dXJlCisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9BVE9NSUNfSCAqLworCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2JhcnJpZXIuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2JhcnJpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzczMjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYmFycmllci5jcHAKQEAgLTAsMCArMSwxNzQyIEBACisvKgorICoga21wX2JhcnJpZXIuY3BwCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9vcy5oIgorCisKKyNpZiBLTVBfTUlDCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFVTRV9OR09fU1RPUkVTIDEKKyNlbmRpZiAvLyBLTVBfTUlDCisKKyNpZiBLTVBfTUlDICYmIFVTRV9OR09fU1RPUkVTCisvLyBJQ1YgY29weWluZworI2RlZmluZSBuZ29fbG9hZChzcmMpICAgICAgICAgICAgX19tNTEyZCBWdCA9IF9tbTUxMl9sb2FkX3BkKCh2b2lkICopKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9pY3ZzKGRzdCwgc3JjKSBfbW01MTJfc3RvcmVucm5nb19wZCgodm9pZCAqKShkc3QpLCBWdCkKKyNkZWZpbmUgbmdvX3N0b3JlX2dvKGRzdCwgc3JjKSAgIF9tbTUxMl9zdG9yZW5ybmdvX3BkKCh2b2lkICopKGRzdCksIFZ0KQorI2RlZmluZSBuZ29fc3luYygpICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoImxvY2s7IGFkZGwgJDAsMCglJXJzcCkiIDo6OiAibWVtb3J5IikKKyNlbHNlCisjZGVmaW5lIG5nb19sb2FkKHNyYykgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgbmdvX3N0b3JlX2ljdnMoZHN0LCBzcmMpIGNvcHlfaWN2cygoZHN0KSwgKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9nbyhkc3QsIHNyYykgICBLTVBfTUVNQ1BZKChkc3QpLCAoc3JjKSwgQ0FDSEVfTElORSkKKyNkZWZpbmUgbmdvX3N5bmMoKSAgICAgICAgICAgICAgICgodm9pZCkwKQorI2VuZGlmIC8qIEtNUF9NSUMgJiYgVVNFX05HT19TVE9SRVMgKi8KKwordm9pZCBfX2ttcF9wcmludF9zdHJ1Y3R1cmUodm9pZCk7IC8vIEZvcndhcmQgZGVjbGFyYXRpb24KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCYXJyaWVyIEFsZ29yaXRobXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBMaW5lYXIgQmFycmllcgorc3RhdGljIHZvaWQKK19fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soS01QX2xpbmVhcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgICBpZihfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmCisgICAgLy8gV2Ugbm93IHBlcmZvcm0gYSBsaW5lYXIgcmVkdWN0aW9uIHRvIHNpZ25hbCB0aGF0IGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlIGFycml2ZWQuCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpIgorICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKDAsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIDAsICZ0aHJfYmFyLT5iX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIC8vIE1hcmsgYXJyaXZhbCB0byBtYXN0ZXIgdGhyZWFkCisgICAgICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSwgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQKKyAgICAgICAgICAgYW55IG1vcmUgLSBpdCBjb3VsZCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBhdCBhbnkgdGltZS4gKi8KKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkLCBvdGhlcl90aHJlYWRzWzBdKTsKKyAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVnaXN0ZXIga21wX2JhbGlnbl90ZWFtX3QgKnRlYW1fYmFyID0gJnRlYW0tPnQudF9iYXJbYnRdOworICAgICAgICByZWdpc3RlciBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICAgIC8vIERvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2xlZXAgYml0IGhlcmUgb3IgYXRvbWljIHNpbmNlIHRlYW0gc2V0dGluZworICAgICAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZSA9IHRlYW1fYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworCisgICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSB3b3JrZXIgdGVhbSBtZW1iZXIgdGhyZWFkcy4KKyAgICAgICAgZm9yIChpPTE7IGk8bnByb2M7ICsraSkgeworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgYXJyaXZlZCBjb3VudAorICAgICAgICAgICAgaWYgKGkrMSA8IG5wcm9jKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tpKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfYXJyaXZlZCk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoaSwgdGVhbSksIHRlYW0tPnQudF9pZCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworCisgICAgICAgICAgICAvLyBXYWl0IGZvciB3b3JrZXIgdGhyZWFkIHRvIGFycml2ZQorICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQsIG5ld19zdGF0ZSk7CisgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgdGhlIG90aGVyIHRocmVhZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX21pbl90aW1lKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGksIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGkpKTsKKyAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzbGVlcCBiaXQgaGVyZSBvciBhdG9taWMgc2luY2UgdGVhbSBzZXR0aW5nCisgICAgICAgIHRlYW1fYmFyLT5iX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsICZ0ZWFtX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3BhZ2F0ZV9pY3ZzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfbGluZWFyX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHM7CisKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIG1hc3RlciBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworCisgICAgICAgIGlmIChucHJvYyA+IDEpIHsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhVU0VSX2ljdl9jb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbmdvX2xvYWQoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTxucHJvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1tpXSwgdGVhbSwgaSwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgbmdvX3N0b3JlX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW2ldLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmdvX3N5bmMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgICAgICAgICAgLy8gTm93LCByZWxlYXNlIGFsbCBvZiB0aGUgd29ya2VyIHRocmVhZHMKKyAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAgICAgLy8gUHJlZmV0Y2ggbmV4dCB0aHJlYWQncyBnbyBmbGFnCisgICAgICAgICAgICAgICAgaWYgKGkrMSA8IG5wcm9jKQorICAgICAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbaSsxXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbyglcCk6ICV1ID0+ICV1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgdGVhbS0+dC50X2lkLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnRdLmJiLmJfZ28sIG90aGVyX3RocmVhZHNbaV0pOworICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gV2FpdCBmb3IgdGhlIE1BU1RFUiB0aHJlYWQgdG8gcmVsZWFzZSB1cworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkIHdhaXQgZ28oJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBJbiBhIGZvcmsgYmFycmllcjsgY2Fubm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5IChvciBJVFROT1RJRlkgaXMgZGlzYWJsZWQpCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmICggYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisjZW5kaWYKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIFRyZWUgYmFycmllcgorc3RhdGljIHZvaWQKK19fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfdHJlZV9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2J0XTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBjaGlsZF90aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQ2NCBuZXdfc3RhdGU7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8vIFBlcmZvcm0gdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwgdGhyZWFkcyBoYXZlIGFycml2ZWQ7IHJlZHVjZSBhbnkgcmVxdWlyZWQgZGF0YSBhcyB3ZSBnbworICAgIGNoaWxkX3RpZCA9ICh0aWQgPDwgYnJhbmNoX2JpdHMpICsgMTsKKyAgICBpZiAoY2hpbGRfdGlkIDwgbnByb2MpIHsKKyAgICAgICAgLy8gUGFyZW50IHRocmVhZHMgd2FpdCBmb3IgYWxsIHRoZWlyIGNoaWxkcmVuIHRvIGFycml2ZQorICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBjaGlsZCA9IDE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbY2hpbGRfdGlkKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfYXJyaXZlZCk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBjaGlsZCB0byBhcnJpdmUKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHdyaXRlIG1pbiBvZiB0aGUgdGhyZWFkIHRpbWUgYW5kIGEgY2hpbGQgdGltZSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gS01QX01JTih0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3Roci0+dGgudGhfYmFyX21pbl90aW1lKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZCsrOworICAgICAgICAgICAgY2hpbGRfdGlkKys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGNoaWxkIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnByb2MpOworICAgIH0KKworICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBXb3JrZXIgdGhyZWFkcworICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgcGFyZW50X3RpZCA9ICh0aWQgLSAxKSA+PiBicmFuY2hfYml0czsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKworICAgICAgICAvLyBNYXJrIGFycml2YWwgdG8gcGFyZW50IHRocmVhZAorICAgICAgICAvKiBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUsIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkCisgICAgICAgICAgIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICAqLworICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQsIG90aGVyX3RocmVhZHNbcGFyZW50X3RpZF0pOworICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIGlmIChucHJvYyA+IDEpIC8vIE5ldyB2YWx1ZSB3YXMgYWxyZWFkeSBjb21wdXRlZCBhYm92ZQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkID0gbmV3X3N0YXRlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKz0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkKSk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF90cmVlX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF07CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfZmFjdG9yID0gMSA8PCBicmFuY2hfYml0czsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGRfdGlkOworCisgICAgLy8gUGVyZm9ybSBhIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIEhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldAorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCB3YWl0IGdvKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAvLyBXYWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgdXMKKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCk7CisgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwpIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIC8vIEluIGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkgKG9yIElUVE5PVElGWSBpcyBkaXNhYmxlZCkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAwLCAtMSk7CisgICAgICAgICAgICAvLyBDYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKGl0dF9zeW5jX29iaik7CisKKyAgICAgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICAgICAgICAgICAgLy8gQ2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgfQorICAgIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgY2hpbGRfdGlkID0gKHRpZCA8PCBicmFuY2hfYml0cykgKyAxOworCisgICAgaWYgKGNoaWxkX3RpZCA8IG5wcm9jKSB7CisgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgIGNoaWxkID0gMTsKKyAgICAgICAgLy8gUGFyZW50IHRocmVhZHMgcmVsZWFzZSBhbGwgdGhlaXIgY2hpbGRyZW4KKyAgICAgICAgZG8geworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbY2hpbGRfdGlkKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKFVTRVJfaWN2X2NvcHkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cykgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbSwgY2hpbGRfdGlkLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbY2hpbGRfdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiV1KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyCisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX3Rocik7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGNoaWxkKys7CisgICAgICAgICAgICBjaGlsZF90aWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY2hpbGQgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBucHJvYyk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworCisvLyBIeXBlciBCYXJyaWVyCitzdGF0aWMgdm9pZAorX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9oeXBlcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZSA9IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG51bV90aHJlYWRzID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2J0XTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgb2Zmc2V0OworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbGV2ZWw7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8qIFBlcmZvcm0gYSBoeXBlcmN1YmUtZW1iZWRkZWQgdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZQorICAgICAgIGFycml2ZWQsIGFuZCByZWR1Y2UgYW55IHJlcXVpcmVkIGRhdGEgYXMgd2UgZ28uICAqLworICAgIGttcF9mbGFnXzY0IHBfZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkKTsKKyAgICBmb3IgKGxldmVsPTAsIG9mZnNldD0xOyBvZmZzZXQ8bnVtX3RocmVhZHM7IGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpCisgICAgeworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkX3RpZDsKKworICAgICAgICBpZiAoKCh0aWQgPj4gbGV2ZWwpICYgKGJyYW5jaF9mYWN0b3IgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2ludDMyIHBhcmVudF90aWQgPSB0aWQgJiB+KCgxIDw8IChsZXZlbCArIGJyYW5jaF9iaXRzKSkgLTEpOworCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAlbGx1ID0+ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgLy8gTWFyayBhcnJpdmFsIHRvIHBhcmVudCB0aHJlYWQKKyAgICAgICAgICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSAoaW4gdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBlbmNsb3NpbmcgZm9yIGxvb3ApLAorICAgICAgICAgICAgICAgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQgYW55IG1vcmUgLSBpdCBjb3VsZCBiZQorICAgICAgICAgICAgICAgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICAqLworICAgICAgICAgICAgcF9mbGFnLnNldF93YWl0ZXIob3RoZXJfdGhyZWFkc1twYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBwX2ZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJlbnQgdGhyZWFkcyB3YWl0IGZvciBjaGlsZHJlbiB0byBhcnJpdmUKKyAgICAgICAgaWYgKG5ld19zdGF0ZSA9PSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEUpCisgICAgICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBmb3IgKGNoaWxkPTEsIGNoaWxkX3RpZD10aWQrKDEgPDwgbGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxIDw8IGxldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbmV4dF9jaGlsZF90aWQgPSBjaGlsZF90aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDwgYnJhbmNoX2ZhY3RvciAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tuZXh0X2NoaWxkX3RpZF0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGNoaWxkIHRvIGFycml2ZQorICAgICAgICAgICAga21wX2ZsYWdfNjQgY19mbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICAgIGNfZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgYSBjaGlsZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIGlmIChuZXdfc3RhdGUgPT0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFKQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICs9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQsIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCkpOworICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIFRoZSByZXZlcnNlIHZlcnNpb25zIHNlZW0gdG8gYmVhdCB0aGUgZm9yd2FyZCB2ZXJzaW9ucyBvdmVyYWxsCisjZGVmaW5lIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorc3RhdGljIHZvaWQKK19fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfaHlwZXJfcmVsZWFzZSk7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBudW1fdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfYml0cyAgID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBidCBdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBvZmZzZXQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbGV2ZWw7CisKKyAgICAvKiBQZXJmb3JtIGEgaHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkLgorICAgICAgIElmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUiBpcyBkZWZpbmVkIChkZWZhdWx0KSB0aGUgdGhyZWFkcyBhcmUgcmVsZWFzZWQgaW4gdGhlIHJldmVyc2UKKyAgICAgICBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBnYXRoZXIsIG90aGVyd2lzZSB0aHJlYWRzIGFyZSByZWxlYXNlZCBpbiB0aGUgc2FtZSBvcmRlci4gKi8KKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBtYXN0ZXIKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsgLy8gbWFzdGVyIGFscmVhZHkgaGFzIElDVnMgaW4gZmluYWwgZGVzdGluYXRpb247IGNvcHkKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlICB7IC8vIEhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldAorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcGFyZW50IHRocmVhZCB0byByZWxlYXNlIHVzCisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBJbiBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKyAgICBudW1fdGhyZWFkcyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgIG90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworI2lmZGVmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgIC8vIENvdW50IHVwIHRvIGNvcnJlY3QgbGV2ZWwgZm9yIHBhcmVudAorICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkcyAmJiAoKCh0aWQ+PmxldmVsKSAmIChicmFuY2hfZmFjdG9yLTEpKSA9PSAwKTsKKyAgICAgICAgIGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpOworCisgICAgLy8gTm93IGdvIGRvd24gZnJvbSB0aGVyZQorICAgIGZvciAobGV2ZWwtPWJyYW5jaF9iaXRzLCBvZmZzZXQ+Pj1icmFuY2hfYml0czsgb2Zmc2V0ICE9IDA7CisgICAgICAgICBsZXZlbC09YnJhbmNoX2JpdHMsIG9mZnNldD4+PWJyYW5jaF9iaXRzKQorI2Vsc2UKKyAgICAvLyBHbyBkb3duIHRoZSB0cmVlLCBsZXZlbCBieSBsZXZlbAorICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkczsgbGV2ZWwrPWJyYW5jaF9iaXRzLCBvZmZzZXQ8PD1icmFuY2hfYml0cykKKyNlbmRpZiAvLyBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICB7CisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIC8qIE5vdyBnbyBpbiByZXZlcnNlIG9yZGVyIHRocm91Z2ggdGhlIGNoaWxkcmVuLCBoaWdoZXN0IHRvIGxvd2VzdC4KKyAgICAgICAgICAgSW5pdGlhbCBzZXR0aW5nIG9mIGNoaWxkIGlzIGNvbnNlcnZhdGl2ZSBoZXJlLiAqLworICAgICAgICBjaGlsZCA9IG51bV90aHJlYWRzID4+ICgobGV2ZWw9PTApP2xldmVsOmxldmVsLTEpOworICAgICAgICBmb3IgKGNoaWxkPShjaGlsZDxicmFuY2hfZmFjdG9yLTEpID8gY2hpbGQgOiBicmFuY2hfZmFjdG9yLTEsIGNoaWxkX3RpZD10aWQrKGNoaWxkPDxsZXZlbCk7CisgICAgICAgICAgICAgY2hpbGQ+PTE7IGNoaWxkLS0sIGNoaWxkX3RpZC09KDE8PGxldmVsKSkKKyNlbHNlCisgICAgICAgIGlmICgoKHRpZCA+PiBsZXZlbCkgJiAoYnJhbmNoX2ZhY3RvciAtIDEpKSAhPSAwKQorICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBnbyBsb3dlciB0aGFuIHRoaXMsIHNpbmNlIHRoaXMgaXMgdGhlIGxldmVsIHBhcmVudCB3b3VsZCBiZSBub3RpZmllZAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBjaGlsZHJlbiBvbiB0aGlzIGxldmVsIG9mIHRoZSB0cmVlCisgICAgICAgIGZvciAoY2hpbGQ9MSwgY2hpbGRfdGlkPXRpZCsoMTw8bGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxPDxsZXZlbCkpCisjZW5kaWYgLy8gS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGlsZF90aWQgPj0gbnVtX3RocmVhZHMpIGNvbnRpbnVlOyAgLy8gQ2hpbGQgZG9lc24ndCBleGlzdCBzbyBrZWVwIGdvaW5nCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIG5leHRfY2hpbGRfdGlkID0gY2hpbGRfdGlkIC0gKDEgPDwgbGV2ZWwpOworICAgICAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyMgaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLTEgPj0gMSAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorIyBlbHNlCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkKzEgPCBicmFuY2hfZmFjdG9yICYmIG5leHRfY2hpbGRfdGlkIDwgbnVtX3RocmVhZHMpCisjIGVuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgICAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbbmV4dF9jaGlsZF90aWRdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICAgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzKSAvLyBwdXNoIG15IGZpeGVkIElDVnMgdG8gbXkgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZjaGlsZF9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDoldSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyCisgICAgICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzICYmICFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIGNvcHkgSUNWcyBsb2NhbGx5IHRvIGZpbmFsIGRlc3QKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgfQorI2VuZGlmCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gSGllcmFyY2hpY2FsIEJhcnJpZXIKKworLy8gSW5pdGlhbGl6ZSB0aHJlYWQgYmFycmllciBkYXRhCisvKiBJbml0aWFsaXplcy9yZS1pbml0aWFsaXplcyB0aGUgaGllcmFyY2hpY2FsIGJhcnJpZXIgZGF0YSBzdG9yZWQgb24gYSB0aHJlYWQuICBQZXJmb3JtcyB0aGUKKyAgIG1pbmltdW0gYW1vdW50IG9mIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJhc2VkIG9uIGhvdyB0aGUgdGVhbSBoYXMgY2hhbmdlZC4gIFJldHVybnMgdHJ1ZSBpZgorICAgbGVhZiBjaGlsZHJlbiB3aWxsIHJlcXVpcmUgYm90aCBvbi1jb3JlIGFuZCB0cmFkaXRpb25hbCB3YWtlLXVwIG1lY2hhbmlzbXMuICBGb3IgZXhhbXBsZSwgaWYgdGhlCisgICB0ZWFtIHNpemUgaW5jcmVhc2VzLCB0aHJlYWRzIGFscmVhZHkgaW4gdGhlIHRlYW0gd2lsbCByZXNwb25kIHRvIG9uLWNvcmUgd2FrZXVwIG9uIHRoZWlyIHBhcmVudAorICAgdGhyZWFkLCBidXQgdGhyZWFkcyBuZXdseSBhZGRlZCB0byB0aGUgdGVhbSB3aWxsIG9ubHkgYmUgbGlzdGVuaW5nIG9uIHRoZSB0aGVpciBsb2NhbCBiX2dvLiAqLworc3RhdGljIGJvb2wKK19fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfYnN0YXRlX3QgKnRocl9iYXIsIGttcF91aW50MzIgbnByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwga21wX3RlYW1fdCAqdGVhbSkKK3sKKyAgICAvLyBDaGVja3MgdG8gZGV0ZXJtaW5lIGlmIChyZS0paW5pdGlhbGl6YXRpb24gaXMgbmVlZGVkCisgICAgYm9vbCB1bmluaXRpYWxpemVkID0gdGhyX2Jhci0+dGVhbSA9PSBOVUxMOworICAgIGJvb2wgdGVhbV9jaGFuZ2VkID0gdGVhbSAhPSB0aHJfYmFyLT50ZWFtOworICAgIGJvb2wgdGVhbV9zel9jaGFuZ2VkID0gbnByb2MgIT0gdGhyX2Jhci0+bnByb2M7CisgICAgYm9vbCB0aWRfY2hhbmdlZCA9IHRpZCAhPSB0aHJfYmFyLT5vbGRfdGlkOworICAgIGJvb2wgcmV0dmFsID0gZmFsc2U7CisKKyAgICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX3N6X2NoYW5nZWQpIHsKKyAgICAgICAgX19rbXBfZ2V0X2hpZXJhcmNoeShucHJvYywgdGhyX2Jhcik7CisgICAgfQorCisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9zel9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gdGhyX2Jhci0+ZGVwdGgtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgICAgIHRocl9iYXItPnBhcmVudF90aWQgPSAtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBpZiBub3QgbWFzdGVyLCBmaW5kIHBhcmVudCB0aHJlYWQgaW4gaGllcmFyY2h5CisgICAgICAgICAgICBrbXBfdWludDMyIGQ9MDsKKyAgICAgICAgICAgIHdoaWxlIChkPHRocl9iYXItPmRlcHRoKSB7IC8vIGZpbmQgcGFyZW50IGJhc2VkIG9uIGxldmVsIG9mIHRocmVhZCBpbiBoaWVyYXJjaHksIGFuZCBub3RlIGxldmVsCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiByZW07CisgICAgICAgICAgICAgICAgaWYgKGQgPT0gdGhyX2Jhci0+ZGVwdGgtMikgeyAvLyByZWFjaGVkIGxldmVsIHJpZ2h0IGJlbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+cGFyZW50X3RpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChyZW0gPSB0aWQldGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSkgIT0gMCkgeyAvLyBUT0RPOiBjYW4gd2UgbWFrZSB0aGlzIG9wIGZhc3Rlcj8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkIGlzIG5vdCBhIHN1YnRyZWUgcm9vdCBhdCBuZXh0IGxldmVsLCBzbyB0aGlzIGlzIG1heAorICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5wYXJlbnRfdGlkID0gdGlkIC0gcmVtOworICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5teV9sZXZlbCA9IGQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyX2Jhci0+b2Zmc2V0ID0gNy0odGlkLXRocl9iYXItPnBhcmVudF90aWQtMSk7CisgICAgICAgIHRocl9iYXItPm9sZF90aWQgPSB0aWQ7CisgICAgICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgICAgICB0aHJfYmFyLT50ZWFtID0gdGVhbTsKKyAgICAgICAgdGhyX2Jhci0+cGFyZW50X2JhciA9ICZ0ZWFtLT50LnRfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICB9CisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgICAgIHRocl9iYXItPnRlYW0gPSB0ZWFtOworICAgICAgICB0aHJfYmFyLT5wYXJlbnRfYmFyID0gJnRlYW0tPnQudF90aHJlYWRzW3Rocl9iYXItPnBhcmVudF90aWRdLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICByZXR2YWwgPSB0cnVlOworICAgIH0KKyAgICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX3N6X2NoYW5nZWQgfHwgdGlkX2NoYW5nZWQpIHsKKyAgICAgICAgdGhyX2Jhci0+bnByb2MgPSBucHJvYzsKKyAgICAgICAgdGhyX2Jhci0+bGVhZl9raWRzID0gdGhyX2Jhci0+YmFzZV9sZWFmX2tpZHM7CisgICAgICAgIGlmICh0aHJfYmFyLT5teV9sZXZlbCA9PSAwKSB0aHJfYmFyLT5sZWFmX2tpZHM9MDsKKyAgICAgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcyAmJiAoa21wX3VpbnQzMil0aWQrdGhyX2Jhci0+bGVhZl9raWRzKzEgPiBucHJvYykKKyAgICAgICAgICAgIHRocl9iYXItPmxlYWZfa2lkcyA9IG5wcm9jIC0gdGlkIC0gMTsKKyAgICAgICAgdGhyX2Jhci0+bGVhZl9zdGF0ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTx0aHJfYmFyLT5sZWFmX2tpZHM7ICsraSkgKChjaGFyICopJih0aHJfYmFyLT5sZWFmX3N0YXRlKSlbNy1pXSA9IDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLCB2b2lkICgqcmVkdWNlKSAodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfaGllcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgIHJlZ2lzdGVyIGttcF91aW50NjQgbmV3X3N0YXRlOworCisgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKG90aGVyX3RocmVhZHNbMF0tPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgICAgLy8gYXJlIHdlIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0PworICAgICAgICBpZiAodGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSkKKyAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl9tYXN0ZXJzCisjZW5kaWYKKyAgICBpZiAobGV2ZWwgPT0gMSkgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyID0gMTsKKyAgICBlbHNlIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDA7IC8vIERvIG5vdCB1c2Ugb25jb3JlIGJhcnJpZXIgd2hlbiBuZXN0ZWQKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHIgPT0gb3RoZXJfdGhyZWFkc1t0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWRdKTsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHNhdmUgYXJyaXZlIHRpbWUgdG8gdGhlIHRocmVhZAorICAgIGlmKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorCisgICAgKHZvaWQpX19rbXBfaW5pdF9oaWVyYXJjaGljYWxfYmFycmllcl90aHJlYWQoYnQsIHRocl9iYXIsIG5wcm9jLCBndGlkLCB0aWQsIHRlYW0pOworCisgICAgaWYgKHRocl9iYXItPm15X2xldmVsKSB7IC8vIG5vdCBhIGxlYWYgKG15X2xldmVsPT0wIG1lYW5zIGxlYWYpCisgICAgICAgIHJlZ2lzdGVyIGttcF9pbnQzMiBjaGlsZF90aWQ7CisgICAgICAgIG5ld19zdGF0ZSA9IChrbXBfdWludDY0KXRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJiB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIGlmICh0aHJfYmFyLT5sZWFmX2tpZHMpIHsgLy8gRmlyc3QsIHdhaXQgZm9yIGxlYWYgY2hpbGRyZW4gdG8gY2hlY2staW4gb24gbXkgYl9hcnJpdmVkIGZsYWcKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0IGxlYWZfc3RhdGUgPSBLTVBfTUFTVEVSX1RJRCh0aWQpID8gdGhyX2Jhci0+Yl9hcnJpdmVkIHwgdGhyX2Jhci0+bGVhZl9zdGF0ZSA6IHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCB8IHRocl9iYXItPmxlYWZfc3RhdGU7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0aW5nIGZvciBsZWFmIGtpZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCkpOworICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfYXJyaXZlZCwgbGVhZl9zdGF0ZSk7CisgICAgICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrMTsgY2hpbGRfdGlkPD10aWQrdGhyX2Jhci0+bGVhZl9raWRzOyArK2NoaWxkX3RpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgKz0gVCMlZCglZDolZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVkdWNlKSh0aGlzX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEsIG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXS0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh2b2lkKSBLTVBfVEVTVF9USEVOX0FORDY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKikmdGhyX2Jhci0+Yl9hcnJpdmVkLCB+KHRocl9iYXItPmxlYWZfc3RhdGUpKTsgLy8gY2xlYXIgbGVhZl9zdGF0ZSBiaXRzCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOZXh0LCB3YWl0IGZvciBoaWdoZXIgbGV2ZWwgY2hpbGRyZW4gb24gZWFjaCBjaGlsZCdzIGJfYXJyaXZlZCBmbGFnCisgICAgICAgICAgICBmb3IgKGttcF91aW50MzIgZD0xOyBkPHRocl9iYXItPm15X2xldmVsOyArK2QpIHsgLy8gZ2F0aGVyIGxvd2VzdCBsZXZlbCB0aHJlYWRzIGZpcnN0LCBidXQgc2tpcCAwCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBsYXN0ID0gdGlkK3Rocl9iYXItPnNraXBfcGVyX2xldmVsW2QrMV0sIHNraXAgPSB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkXTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCA+IG5wcm9jKSBsYXN0ID0gbnByb2M7CisgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGlkK3NraXA7IGNoaWxkX3RpZDwoaW50KWxhc3Q7IGNoaWxkX3RpZCs9c2tpcCkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPT0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIEJsb2NrdGltZSBpcyBub3QgaW5maW5pdGUKKyAgICAgICAgICAgIGZvciAoa21wX3VpbnQzMiBkPTA7IGQ8dGhyX2Jhci0+bXlfbGV2ZWw7ICsrZCkgeyAvLyBHYXRoZXIgbG93ZXN0IGxldmVsIHRocmVhZHMgZmlyc3QKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxhc3QgPSB0aWQrdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSwgc2tpcCA9IHRocl9iYXItPnNraXBfcGVyX2xldmVsW2RdOworICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gbnByb2MpIGxhc3QgPSBucHJvYzsKKyAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrc2tpcDsgY2hpbGRfdGlkPChpbnQpbGFzdDsgY2hpbGRfdGlkKz1za2lwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLCBjaGlsZF90aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBBbGwgc3Vib3JkaW5hdGVzIGFyZSBnYXRoZXJlZDsgbm93IHJlbGVhc2UgcGFyZW50IGlmIG5vdCBtYXN0ZXIgdGhyZWFkCisKKyAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gd29ya2VyIHRocmVhZHMgcmVsZWFzZSBwYXJlbnQgaW4gaGllcmFyY2h5CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICVsbHUgPT4gJWxsdVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aHJfYmFyLT5wYXJlbnRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCB0aHJfYmFyLT5wYXJlbnRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkK0tNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgLyogTWFyayBhcnJpdmFsIHRvIHBhcmVudDogQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHdyaXRlLCBhIHdvcmtlciB0aHJlYWQgbWF5IG5vdCBhc3N1bWUgdGhhdAorICAgICAgICAgICB0aGUgdGVhbSBpcyB2YWxpZCBhbnkgbW9yZSAtIGl0IGNvdWxkIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGF0IGFueSB0aW1lLiAqLworICAgICAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwgfHwgX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUKKyAgICAgICAgICAgIHx8ICF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsgLy8gUGFyZW50IGlzIHdhaXRpbmcgb24gbXkgYl9hcnJpdmVkIGZsYWc7IHJlbGVhc2UgaXQKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfYXJyaXZlZCwgb3RoZXJfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gTGVhZiBkb2VzIHNwZWNpYWwgcmVsZWFzZSBvbiB0aGUgIm9mZnNldCIgYml0cyBvZiBwYXJlbnQncyBiX2Fycml2ZWQgZmxhZworICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPm9mZnNldCk7CisgICAgICAgICAgICBmbGFnLnNldF93YWl0ZXIob3RoZXJfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIE1hc3RlciB0aHJlYWQgbmVlZHMgdG8gdXBkYXRlIHRoZSB0ZWFtJ3MgYl9hcnJpdmVkIHZhbHVlCisgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCBhcnJpdmVkKCVwKSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkKSk7CisgICAgfQorICAgIC8vIElzIHRoZSB0ZWFtIGFjY2VzcyBiZWxvdyB1bnNhZmUgb3IganVzdCB0ZWNobmljYWxseSBpbnZhbGlkPworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGd0aWQsIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9oaWVyX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2M7CisgICAgYm9vbCB0ZWFtX2NoYW5nZSA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgb24tY29yZSBiYXJyaWVyIHNob3VsZG4ndCBiZSB1c2VkCisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXJlZCBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgfQorICAgIGVsc2UgeyAvLyBXb3JrZXIgdGhyZWFkcworICAgICAgICAvLyBXYWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgbWUKKyAgICAgICAgaWYgKCF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgfHwgX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUKKyAgICAgICAgICAgIHx8IHRocl9iYXItPm15X2xldmVsICE9IDAgfHwgdGhyX2Jhci0+dGVhbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBVc2UgdHJhZGl0aW9uYWwgbWV0aG9kIG9mIHdhaXRpbmcgb24gbXkgb3duIGJfZ28gZmxhZworICAgICAgICAgICAgdGhyX2Jhci0+d2FpdF9mbGFnID0gS01QX0JBUlJJRVJfT1dOX0ZMQUc7CisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIFRDV184KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOyAvLyBSZXNldCBteSBiX2dvIGZsYWcgZm9yIG5leHQgdGltZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBUaHJlYWQgYmFycmllciBkYXRhIGlzIGluaXRpYWxpemVkLCB0aGlzIGlzIGEgbGVhZiwgYmxvY2t0aW1lIGlzIGluZmluaXRlLCBub3QgbmVzdGVkCisgICAgICAgICAgICAvLyBXYWl0IG9uIG15ICJvZmZzZXQiIGJpdHMgb24gcGFyZW50J3MgYl9nbyBmbGFnCisgICAgICAgICAgICB0aHJfYmFyLT53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRzsKKyAgICAgICAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QLCB0aHJfYmFyLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidCwgdGhpc190aHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRSk7CisgICAgICAgICAgICBpZiAodGhyX2Jhci0+d2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1NXSVRDSElORykgeyAvLyBUaHJlYWQgd2FzIHN3aXRjaGVkIHRvIG93biBiX2dvCisgICAgICAgICAgICAgICAgVENXXzgodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7IC8vIFJlc2V0IG15IGJfZ28gZmxhZyBmb3IgbmV4dCB0aW1lCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLy8gUmVzZXQgbXkgYml0cyBvbiBwYXJlbnQncyBiX2dvIGZsYWcKKyAgICAgICAgICAgICAgICAoKGNoYXIqKSYodGhyX2Jhci0+cGFyZW50X2Jhci0+Yl9nbykpW3Rocl9iYXItPm9mZnNldF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKworICAgIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7ICAgIC8vIGFyZSB3ZSBpbnNpZGUgdGhlIHRlYW1zIGNvbnN0cnVjdD8KKyAgICAgICAgaWYgKHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYgdGhpc190aHItPnRoLnRoX3RlYW1zX2xldmVsID09IGxldmVsKQorICAgICAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX3dvcmtlcnMKKyAgICAgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEgKQorICAgICAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX21hc3RlcnMKKyAgICB9CisjZW5kaWYKKyAgICBpZiAobGV2ZWwgPT0gMSkgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyID0gMTsKKyAgICBlbHNlIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDA7IC8vIERvIG5vdCB1c2Ugb25jb3JlIGJhcnJpZXIgd2hlbiBuZXN0ZWQKKworICAgIC8vIElmIHRoZSB0ZWFtIHNpemUgaGFzIGluY3JlYXNlZCwgd2Ugc3RpbGwgY29tbXVuaWNhdGUgd2l0aCBvbGQgbGVhdmVzIHZpYSBvbmNvcmUgYmFycmllci4KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgb2xkX2xlYWZfa2lkcyA9IHRocl9iYXItPmxlYWZfa2lkczsKKyAgICBrbXBfdWludDY0IG9sZF9sZWFmX3N0YXRlID0gdGhyX2Jhci0+bGVhZl9zdGF0ZTsKKyAgICB0ZWFtX2NoYW5nZSA9IF9fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGJ0LCB0aHJfYmFyLCBucHJvYywgZ3RpZCwgdGlkLCB0ZWFtKTsKKyAgICAvLyBCdXQgaWYgdGhlIGVudGlyZSB0ZWFtIGNoYW5nZXMsIHdlIHdvbid0IHVzZSBvbmNvcmUgYmFycmllciBhdCBhbGwKKyAgICBpZiAodGVhbV9jaGFuZ2UpIG9sZF9sZWFmX2tpZHMgPSAwOworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIG1hc3RlciBhbHJlYWR5IGhhcyBjb3B5IGluIGZpbmFsIGRlc3RpbmF0aW9uOyBjb3B5CisgICAgICAgICAgICBjb3B5X2ljdnMoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICYmIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllcikgeyAvLyBvcHRpbWl6YXRpb24gZm9yIGluZiBibG9ja3RpbWUKKyAgICAgICAgICAgIGlmICghdGhyX2Jhci0+bXlfbGV2ZWwpIC8vIEknbSBhIGxlYWYgaW4gdGhlIGhpZXJhcmNoeSAobXlfbGV2ZWw9PTApCisgICAgICAgICAgICAgICAgLy8gbGVhdmVzIChvbi1jb3JlIGNoaWxkcmVuKSBwdWxsIHBhcmVudCdzIGZpeGVkIElDVnMgZGlyZWN0bHkgdG8gbG9jYWwgSUNWIHN0b3JlCisgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5wYXJlbnRfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgICAgIC8vIG5vbi1sZWF2ZXMgd2lsbCBnZXQgSUNWcyBwaWdneWJhY2tlZCB3aXRoIGJfZ28gdmlhIE5HTyBzdG9yZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBibG9ja3RpbWUgaXMgbm90IGluZmluaXRlOyBwdWxsIElDVnMgZnJvbSBwYXJlbnQncyBmaXhlZCBJQ1ZzCisgICAgICAgICAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIC8vIG5vdCBhIGxlYWY7IGNvcHkgSUNWcyB0byBteSBmaXhlZCBJQ1ZzIGNoaWxkIGNhbiBhY2Nlc3MKKyAgICAgICAgICAgICAgICBjb3B5X2ljdnMoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT5wYXJlbnRfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgICAgIGVsc2UgLy8gbGVhdmVzIGNvcHkgcGFyZW50J3MgZml4ZWQgSUNWcyBkaXJlY3RseSB0byBsb2NhbCBJQ1Ygc3RvcmUKKyAgICAgICAgICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPnBhcmVudF9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisKKyAgICAvLyBOb3csIHJlbGVhc2UgbXkgY2hpbGRyZW4KKyAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIHsgLy8gbm90IGEgbGVhZgorICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgY2hpbGRfdGlkOworICAgICAgICBrbXBfdWludDMyIGxhc3Q7CisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJiB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIGRvIGEgZmxhdCByZWxlYXNlCisgICAgICAgICAgICAgICAgLy8gU2V0IGxvY2FsIGJfZ28gdG8gYnVtcCBjaGlsZHJlbiB2aWEgTkdPIHN0b3JlIG9mIHRoZSBjYWNoZSBsaW5lIGNvbnRhaW5pbmcgSVZDcyBhbmQgYl9nby4KKyAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2dvID0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgICAgICAgICAvLyBVc2UgbmdvIHN0b3JlcyBpZiBhdmFpbGFibGU7IGJfZ28gcGlnZ3liYWNrcyBpbiB0aGUgbGFzdCA4IGJ5dGVzIG9mIHRoZSBjYWNoZSBsaW5lCisgICAgICAgICAgICAgICAgbmdvX2xvYWQoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9vcHMgb3ZlciBhbGwgdGhlIHRocmVhZHMgc2tpcHBpbmcgb25seSB0aGUgbGVhZiBub2RlcyBpbiB0aGUgaGllcmFyY2h5CisgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbMV07IGNoaWxkX3RpZDwoaW50KW5wcm9jOyBjaGlsZF90aWQrPXRocl9iYXItPnNraXBfcGVyX2xldmVsWzFdKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJnRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF0tPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIG5nbyBzdG9yZSAoaWYgYXZhaWxhYmxlKSB0byBib3RoIHN0b3JlIElDVnMgYW5kIHJlbGVhc2UgY2hpbGQgdmlhIGNoaWxkJ3MgYl9nbworICAgICAgICAgICAgICAgICAgICBuZ29fc3RvcmVfZ28oJmNoaWxkX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZ29fc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVENXXzgodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7IC8vIFJlc2V0IG15IGJfZ28gZmxhZyBmb3IgbmV4dCB0aW1lCisgICAgICAgICAgICAvLyBOb3csIHJlbGVhc2UgbGVhZiBjaGlsZHJlbgorICAgICAgICAgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcykgeyAvLyBpZiB0aGVyZSBhcmUgYW55CisgICAgICAgICAgICAgICAgLy8gV2UgdGVzdCB0ZWFtX2NoYW5nZSBvbiB0aGUgb2ZmLWNoYW5jZSB0aGF0IHRoZSBsZXZlbCAxIHRlYW0gY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBpZiAodGVhbV9jaGFuZ2UgfHwgb2xkX2xlYWZfa2lkcyA8IHRocl9iYXItPmxlYWZfa2lkcykgeyAvLyBzb21lIG9sZCBsZWFmX2tpZHMsIHNvbWUgbmV3CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRfbGVhZl9raWRzKSB7IC8vIHJlbGVhc2Ugb2xkIGxlYWYga2lkcworICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9nbyB8PSBvbGRfbGVhZl9zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIG5ldyBsZWFmIGtpZHMKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHRpZCt0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFsxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykgbGFzdCA9IG5wcm9jOworICAgICAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrMStvbGRfbGVhZl9raWRzOyBjaGlsZF90aWQ8KGludClsYXN0OyArK2NoaWxkX3RpZCkgeyAvLyBza2lwX3Blcl9sZXZlbFswXT0xCisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKmNoaWxkX3RociA9IHRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVCMlZCglZDolZCkgZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBjaGlsZCB1c2luZyBjaGlsZCdzIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7IC8vIFJlbGVhc2UgYWxsIGNoaWxkcmVuIGF0IG9uY2Ugd2l0aCBsZWFmX3N0YXRlIGJpdHMgb24gbXkgb3duIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2dvIHw9IHRocl9iYXItPmxlYWZfc3RhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBCbG9ja3RpbWUgaXMgbm90IGluZmluaXRlOyBkbyBhIHNpbXBsZSBoaWVyYXJjaGljYWwgcmVsZWFzZQorICAgICAgICAgICAgZm9yIChpbnQgZD10aHJfYmFyLT5teV9sZXZlbC0xOyBkPj0wOyAtLWQpIHsgLy8gUmVsZWFzZSBoaWdoZXN0IGxldmVsIHRocmVhZHMgZmlyc3QKKyAgICAgICAgICAgICAgICBsYXN0ID0gdGlkK3Rocl9iYXItPnNraXBfcGVyX2xldmVsW2QrMV07CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBza2lwID0gdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZF07CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykgbGFzdCA9IG5wcm9jOworICAgICAgICAgICAgICAgIGZvciAoY2hpbGRfdGlkPXRpZCtza2lwOyBjaGlsZF90aWQ8KGludClsYXN0OyBjaGlsZF90aWQrPXNraXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICpjaGlsZF90aHIgPSB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBjaGlsZCB1c2luZyBjaGlsZCdzIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX3Rocik7CisgICAgICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cyAmJiAhS01QX01BU1RFUl9USUQodGlkKSkgLy8gbm9uLWxlYXZlcyBjb3B5IElDVnMgZnJvbSBmaXhlZCBJQ1ZzIHRvIGxvY2FsIGRlc3QKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9mIEJhcnJpZXIgQWxnb3JpdGhtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGRvIGEgYmFycmllci4KKy8qIElmIGlzX3NwbGl0IGlzIHRydWUsIGRvIGEgc3BsaXQgYmFycmllciwgb3RoZXJ3aXNlLCBkbyBhIHBsYWluIGJhcnJpZXIKKyAgIElmIHJlZHVjZSBpcyBub24tTlVMTCwgZG8gYSBzcGxpdCByZWR1Y3Rpb24gYmFycmllciwgb3RoZXJ3aXNlLCBkbyBhIHNwbGl0IGJhcnJpZXIKKyAgIFJldHVybnMgMCBpZiBtYXN0ZXIgdGhyZWFkLCAxIGlmIHdvcmtlciB0aHJlYWQuICAqLworaW50CitfX2ttcF9iYXJyaWVyKGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCwgaW50IGlzX3NwbGl0LCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikpCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9iYXJyaWVyKTsKKyAgICByZWdpc3RlciBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgIHJlZ2lzdGVyIGludCBzdGF0dXMgPSAwOworICAgIGlkZW50X3QgKmxvYyA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50OworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBoYXMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyNpZiBPTVBUX0JMQU1FCisgICAgICAgIG15X3Rhc2tfaWQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgIG15X3BhcmFsbGVsX2lkID0gdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9zaW5nbGUpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19lbmQpKSB7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4pKAorICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8vIEl0IGlzIE9LIHRvIHJlcG9ydCB0aGUgYmFycmllciBzdGF0ZSBhZnRlciB0aGUgYmFycmllciBiZWdpbiBjYWxsYmFjay4KKyAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBPTVBUIHNwZWNpZmljYXRpb24sIGEgY29tcGxpYW50IGltcGxlbWVudGF0aW9uIG1heQorICAgICAgICAvLyBldmVuIGRlbGF5IHJlcG9ydGluZyB0aGlzIHN0YXRlIHVudGlsIHRoZSBiYXJyaWVyIGJlZ2lucyB0byB3YWl0LgorICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCEgdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIGluIGl0dCBub3RpZnkgZXZlbnRzIGJlbG93LgorICAgICAgICB2b2lkICppdHRfc3luY19vYmogPSBOVUxMOworIyBpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnQsIDEpOworIyBlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIF9fa21wX3Rhc2tpbmdfYmFycmllcih0ZWFtLCB0aGlzX3RociwgZ3RpZCk7CisgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBwYXN0IHRhc2tpbmcgYmFycmllclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29weSB0aGUgYmxvY2t0aW1lIGluZm8gdG8gdGhlIHRocmVhZCwgd2hlcmUgX19rbXBfd2FpdF90ZW1wbGF0ZSgpIGNhbiBhY2Nlc3MgaXQgd2hlbgorICAgICAgICAgICB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3QuICovCisgICAgICAgIC8vIFNlZSBub3RlIGFib3V0IHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gX19rbXBfam9pbl9iYXJyaWVyKCkgYmVpbmcgcGVyZm9ybWFuY2UtY3JpdGljYWwuCisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X2ludGVydmFsczsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgIC8vIExldCB0aGUgZGVidWdnZXIga25vdzogdGhlIHRocmVhZCBhcnJpdmVkIHRvIHRoZSBiYXJyaWVyIGFuZCB3YWl0aW5nLgorICAgICAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBNYXN0ZXIgY291bnRlciBpcyBzdG9yZWQgaW4gdGVhbSBzdHJ1Y3R1cmUuCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX21hc3Rlcl9hcnJpdmVkICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYi5iX3dvcmtlcl9hcnJpdmVkICs9IDE7CisgICAgICAgIH0gLy8gaWYKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKyAgICAgICAgaWYgKHJlZHVjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvL0tNUF9ERUJVR19BU1NFUlQoIGlzX3NwbGl0ID09IFRSVUUgKTsgIC8vICNDNjk5NTYKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSA9IHJlZHVjZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkgJiYgX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpCisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhpc190aHIsIHRlYW0sIDApOyAvLyB1c2UgMCB0byBvbmx5IHNldHVwIHRoZSBjdXJyZW50IHRlYW0gaWYgbnRocmVhZHMgPiAxCisKKyAgICAgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2J0XSkgeworICAgICAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tidF0pOyAvLyBkb24ndCBzZXQgYnJhbmNoIGJpdHMgdG8gMDsgdXNlIGxpbmVhcgorICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tidF0pOyAvLyBkb24ndCBzZXQgYnJhbmNoIGJpdHMgdG8gMDsgdXNlIGxpbmVhcgorICAgICAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcihidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcihidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KHRoaXNfdGhyLCB0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgfQorI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgLy8gTGV0IHRoZSBkZWJ1Z2dlciBrbm93OiBBbGwgdGhyZWFkcyBhcmUgYXJyaXZlZCBhbmQgc3RhcnRpbmcgbGVhdmluZyB0aGUgYmFycmllci4KKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfdGVhbV9hcnJpdmVkICs9IDE7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIC8qIFRPRE86IEluIGNhc2Ugb2Ygc3BsaXQgcmVkdWN0aW9uIGJhcnJpZXIsIG1hc3RlciB0aHJlYWQgbWF5IHNlbmQgYWNxdWlyZWQgZXZlbnQgZWFybHksCisgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGZpbmFsIHN1bW1hdGlvbiBpbnRvIHRoZSBzaGFyZWQgdmFyaWFibGUgaXMgZG9uZSAoZmluYWwgc3VtbWF0aW9uIGNhbiBiZSBhCisgICAgICAgICAgICAgICBsb25nIG9wZXJhdGlvbiBmb3IgYXJyYXkgcmVkdWN0aW9ucykuICAqLworICAgICAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIC0gcmVwb3J0IGZyYW1lIGVuZCAob25seSBpZiBhY3RpdmVfbGV2ZWwgPT0gMSkKKyAgICAgICAgICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgIGludCBucHJvYyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIHN3aXRjaChfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSA9IGN1cl90aW1lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IC8vIEFDIDIwMTUtMDEtMTk6IGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIGZvciBoaWVyYXJjaGljYWwgKHRvIGJlIGZpeGVkKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsIGN1cl90aW1lLCAxLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBpZiggX19pdHRfbWV0YWRhdGFfYWRkX3B0ciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBtYXN0ZXIncyB3YWl0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZGVsdGEgPSBjdXJfdGltZSAtIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTxucHJvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKz0gKCBjdXJfdGltZSAtIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZShndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIGRlbHRhLCAoa21wX3VpbnQ2NCkoIHJlZHVjZSAhPSBOVUxMKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSA9IGN1cl90aW1lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gMTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gMSB8fCAhIGlzX3NwbGl0KSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2J0XSkgeworICAgICAgICAgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICAgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgICAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICAgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmModGhpc190aHIsIHRlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8qIEdFSDogVE9ETzogTW92ZSB0aGlzIHVuZGVyIGlmLWNvbmRpdGlvbiBhYm92ZSBhbmQgYWxzbyBpbmNsdWRlIGluCisgICAgICAgICAgIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyKCkuIFRoaXMgd2lsbCBtb3JlIGFjY3VyYXRlbHkgcmVwcmVzZW50IHRoZSBhY3R1YWwgcmVsZWFzZSB0aW1lCisgICAgICAgICAgIG9mIHRoZSB0aHJlYWRzIGZvciBzcGxpdCBiYXJyaWVycy4gICovCisgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIH0gZWxzZSB7IC8vIFRlYW0gaXMgc2VyaWFsaXplZC4KKyAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAgICAgICAgIGlmICggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZvaWQgKml0dF9zeW5jX29iaiA9IE5VTEw7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJ0LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgPT0gVFJVRSk7CisgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3dhaXQodGhpc190aHIsIHRlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3NldHVwKHRoaXNfdGhyLCB0ZWFtLCAwKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIC8vIFRoZSB0YXNrIHRlYW0gc2hvdWxkIGJlIE5VTEwgZm9yIHNlcmlhbGl6ZWQgY29kZSAodGFza3Mgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSkKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0gPT0gTlVMTCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBpcyBsZWF2aW5nIHdpdGggcmV0dXJuIHZhbHVlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgc3RhdHVzKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9CTEFNRQorICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfZW5kKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfZW5kKSgKKyAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZAorX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfZW5kX3NwbGl0X2JhcnJpZXIpOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgICBpZiAoIXRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgICAgIGlmIChLTVBfTUFTVEVSX0dUSUQoZ3RpZCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnRdKSB7CisgICAgICAgICAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2J0XSk7CisgICAgICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgICAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICAgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc3luYyh0aGlzX3RociwgdGVhbSk7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZAorX19rbXBfam9pbl9iYXJyaWVyKGludCBndGlkKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfam9pbl9iYXJyaWVyKTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfdWludCBucHJvYzsKKyAgICBrbXBfaW5mb190ICptYXN0ZXJfdGhyZWFkOworICAgIGludCB0aWQ7CisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IHRlYW1faWQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKml0dF9zeW5jX29iaiA9IE5VTEw7CisjIGlmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAvLyBEb24ndCBjYWxsIHJvdXRpbmUgd2l0aG91dCBuZWVkCisgICAgICAgIC8vIEdldCBvYmplY3QgY3JlYXRlZCBhdCBmb3JrX2JhcnJpZXIKKyAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworIyBlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBLTVBfTUIoKTsKKworICAgIC8vIEdldCBjdXJyZW50IGluZm8KKyAgICB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICBLTVBfREVCVUdfQVNTRVJUKChpbnQpbnByb2MgPT0gdGVhbS0+dC50X25wcm9jKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworI2lmZGVmIEtNUF9ERUJVRworICAgIHRlYW1faWQgPSB0ZWFtLT50LnRfaWQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgbWFzdGVyX3RocmVhZCA9IHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3RlcjsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpZiAobWFzdGVyX3RocmVhZCAhPSB0ZWFtLT50LnRfdGhyZWFkc1swXSkgeworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmUoKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXJfdGhyZWFkID09IHRlYW0tPnQudF90aHJlYWRzWzBdKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8vIFZlcmlmeSBzdGF0ZQorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3RlYW0pKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3Jvb3QpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IHRlYW0tPnQudF90aHJlYWRzW3RpZF0pOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgYXJyaXZlZCBhdCBqb2luIGJhcnJpZXJcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworCisjaWYgT01QVF9TVVBQT1JUIAorI2lmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbikoCisgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKyAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyOworI2VuZGlmCisKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllcikgeworICAgICAgICBfX2ttcF90YXNraW5nX2JhcnJpZXIodGVhbSwgdGhpc190aHIsIGd0aWQpOworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIHBhc3QgdGFraW5nIGJhcnJpZXJcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworICAgIH0KKyMgaWZkZWYgS01QX0RFQlVHCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoICJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQsIG9sZCB0ZWFtID0gJWQsIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0ZWFtX2lkLCB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSkpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPT0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0pOworICAgIH0KKyMgZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAvKiBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgY2FuIGFjY2VzcyBpdCB3aGVuIHRoZQorICAgICAgIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LiBEb2luZyB0aGVzZSBsb2FkcyBjYXVzZXMgYSBjYWNoZSBtaXNzIHNsb3dzCisgICAgICAgZG93biBFUENDIHBhcmFsbGVsIGJ5IDJ4LiBBcyBhIHdvcmthcm91bmQsIHdlIGRvIG5vdCBwZXJmb3JtIHRoZSBjb3B5IGlmIGJsb2NrdGltZT1pbmZpbml0ZSwKKyAgICAgICBzaW5jZSB0aGUgdmFsdWVzIGFyZSBub3QgdXNlZCBieSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgaW4gdGhhdCBjYXNlLiAqLworICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfaW50ZXJ2YWxzOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfc2V0OworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2JzX2Zvcmtqb2luX2JhcnJpZXJdKSB7CisgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgIF9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcihic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJwX3RyZWVfYmFyOiB7CisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcihic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgfQorICAgIH0KKworICAgIC8qIEZyb20gdGhpcyBwb2ludCBvbiwgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUgbWF5IGJlIGRlYWxsb2NhdGVkIGF0IGFueSB0aW1lIGJ5IHRoZQorICAgICAgIG1hc3RlciB0aHJlYWQgLSBpdCBpcyB1bnNhZmUgdG8gcmVmZXJlbmNlIGl0IGluIGFueSBvZiB0aGUgd29ya2VyIHRocmVhZHMuIEFueSBwZXItdGVhbQorICAgICAgIGRhdGEgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIHJlZmVyZW5jZWQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGJhcnJpZXIgc2hvdWxkIGJlIG1vdmVkIHRvCisgICAgICAgdGhlIGttcF90YXNrX3RlYW1fdCBzdHJ1Y3RzLiAgKi8KKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgIC8vIE1hc3RlciBzaG91bGRuJ3QgY2FsbCBkZWNyZWFzZV9sb2FkKCkuICAgICAgICAgLy8gVE9ETzogZW5hYmxlIG1hc3RlciB0aHJlYWRzLgorICAgICAgICAgICAgLy8gTWFzdGVyIHNob3VsZCBoYXZlIHRoX21heV9kZWNyZWFzZV9sb2FkID09IDAuICAvLyBUT0RPOiBlbmFibGUgbWFzdGVyIHRocmVhZHMuCisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3RociwgdGVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyMgaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBKb2luIGJhcnJpZXIgLSByZXBvcnQgZnJhbWUgZW5kCisgICAgICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbWljcm90YXNrID09IE5VTEwgJiYKKyNlbmRpZgorICAgICAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfdWludDY0IGN1cl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICAgICAgaWRlbnRfdCAqIGxvYyA9IHRlYW0tPnQudF9pZGVudDsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3dpdGNoKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSwgY3VyX3RpbWUsIDEsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmKCBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggbWFzdGVyJ3Mgd2FpdCB0aW1lCisgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZGVsdGEgPSBjdXJfdGltZSAtIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICs9ICggY3VyX3RpbWUgLSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgZGVsdGEsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgMCwgbG9jLCBucHJvYyk7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSBjdXJfdGltZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIyBlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKGd0aWQsIGl0dF9zeW5jX29iaik7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIEtNUF9ERUJVRworICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgc2F5cyBhbGwgJWQgdGVhbSB0aHJlYWRzIGFycml2ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbV9pZCwgdGlkLCBucHJvYykpOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIC8vIFRPRE8gbm93LCBtYXJrIHdvcmtlciB0aHJlYWRzIGFzIGRvbmUgc28gdGhleSBtYXkgYmUgZGlzYmFuZGVkCisgICAgS01QX01CKCk7IC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGxlYXZpbmdcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfQkxBTUUKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2VuZCkpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2VuZCkoCisgICAgICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvLyByZXR1cm4gdG8gZGVmYXVsdCBzdGF0ZQorICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgfQorI2VuZGlmCit9CisKKworLy8gVE9ETyByZWxlYXNlIHdvcmtlciB0aHJlYWRzJyBmb3JrIGJhcnJpZXJzIGFzIHdlIGFyZSByZWFkeSBpbnN0ZWFkIG9mIGFsbCBhdCBvbmNlCit2b2lkCitfX2ttcF9mb3JrX2JhcnJpZXIoaW50IGd0aWQsIGludCB0aWQpCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9mb3JrX2JhcnJpZXIpOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gKHRpZCA9PSAwKSA/IHRoaXNfdGhyLT50aC50aF90ZWFtIDogTlVMTDsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IE5VTEw7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkOiVkKSBoYXMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsICh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEsIHRpZCkpOworCisgICAgLy8gdGhfdGVhbSBwb2ludGVyIG9ubHkgdmFsaWQgZm9yIG1hc3RlciB0aHJlYWQgaGVyZQorICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBpdHQgYmFycmllciBvYmplY3QKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMSk7CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsgIC8vIENhbGwgYWNxdWlyZWQvcmVsZWFzaW5nCisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHN0YXRlCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIGZvcihpPTE7IGk8dGVhbS0+dC50X25wcm9jOyArK2kpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDUwMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6MCkgY2hlY2tpbmcgVCMlZCglZDolZCkgZm9yayBnbyA9PSAldS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc190aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIuYl9nbykpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoVENSXzQob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJiLmJfZ28pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIH4oS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGVhbSA9PSB0ZWFtKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhpc190aHIsIHRlYW0sIDApOyAgLy8gMCBpbmRpY2F0ZXMgc2V0dXAgY3VycmVudCB0YXNrIHRlYW0gaWYgbnRocmVhZHMgPiAxCisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgbWFzdGVyIHRocmVhZCBtYXkgaGF2ZSBjaGFuZ2VkIGl0cyBibG9ja3RpbWUgYmV0d2VlbiB0aGUgam9pbiBiYXJyaWVyIGFuZCB0aGUKKyAgICAgICAgICAgZm9yayBiYXJyaWVyLiBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgY2FuCisgICAgICAgICAgIGFjY2VzcyBpdCB3aGVuIHRoZSB0ZWFtIHN0cnVjdCBpcyBub3QgZ3VhcmFudGVlZCB0byBleGlzdC4gKi8KKyAgICAgICAgLy8gU2VlIG5vdGUgYWJvdXQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIoKSBiZWluZyBwZXJmb3JtYW5jZS1jcml0aWNhbAorICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfc2V0OworICAgICAgICB9CisgICAgfSAvLyBtYXN0ZXIKKworICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnNfZm9ya2pvaW5fYmFycmllcl0pIHsKKyAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgfQorICAgIH0KKworICAgIC8vIEVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZChndGlkLCBpdHRfc3luY19vYmopOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQgaXMgbGVhdmluZyBlYXJseVxuIiwgZ3RpZCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogV2UgY2FuIG5vdyBhc3N1bWUgdGhhdCBhIHZhbGlkIHRlYW0gc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIGFuZAorICAgICAgIHByb3BhZ2F0ZWQgdG8gYWxsIHdvcmtlciB0aHJlYWRzLiBUaGUgY3VycmVudCB0aHJlYWQsIGhvd2V2ZXIsIG1heSBub3QgYmUgcGFydCBvZiB0aGUKKyAgICAgICB0ZWFtLCBzbyB3ZSBjYW4ndCBibGluZGx5IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIHBvaW50ZXIgaXMgbm9uLW51bGwuICAqLworICAgIHRlYW0gPSAoa21wX3RlYW1fdCAqKVRDUl9QVFIodGhpc190aHItPnRoLnRoX3RlYW0pOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorICAgIC8qIE1hc3RlciB0aHJlYWQncyBjb3B5IG9mIHRoZSBJQ1ZzIHdhcyBzZXQgdXAgb24gdGhlIGltcGxpY2l0IHRhc2tkYXRhIGluCisgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0uIF9fa21wX2ZvcmtfY2FsbCgpIGFzc3VtZXMgdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrIGhhcworICAgICAgIHRoaXMgZGF0YSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIFdlIGNhbm5vdCBtb2RpZnkgX19rbXBfZm9ya19jYWxsKCkgdG8gbG9vayBhdAorICAgICAgIHRoZSBmaXhlZCBJQ1ZzIGluIHRoZSBtYXN0ZXIncyB0aHJlYWQgc3RydWN0LCBiZWNhdXNlIGl0IGlzIG5vdCBhbHdheXMgdGhlIGNhc2UgdGhhdCB0aGUKKyAgICAgICB0aHJlYWRzIGFycmF5cyBoYXZlIGJlZW4gYWxsb2NhdGVkIHdoZW4gX19rbXBfZm9ya19jYWxsKCkgaXMgZXhlY3V0ZWQuICovCisgICAgeworICAgICAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soVVNFUl9pY3ZfY29weSk7CisgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAgLy8gbWFzdGVyIHRocmVhZCBhbHJlYWR5IGhhcyBJQ1ZzCisgICAgICAgICAgICAvLyBDb3B5IHRoZSBpbml0aWFsIElDVnMgZnJvbSB0aGUgbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdCB0byB0aGUgaW1wbGljaXQgdGFzayBmb3IgdGhpcyB0aWQuCisgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQpIGlzIFBVTExpbmcgSUNWc1xuIiwgZ3RpZCwgdGlkKSk7CisgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1t0aWRdLCB0ZWFtLCB0aWQsIEZBTFNFKTsKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJiLnRoX2ZpeGVkX2ljdnMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmModGhpc190aHIsIHRlYW0pOworICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGVhbS0+dC50X3Byb2NfYmluZDsKKyAgICBpZiAocHJvY19iaW5kID09IHByb2NfYmluZF9pbnRlbCkgeworI2VuZGlmCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAvLyBDYWxsIGR5bmFtaWMgYWZmaW5pdHkgc2V0dGluZ3MKKyAgICAgICAgaWYoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9iYWxhbmNlZCAmJiB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkKSB7CisgICAgICAgICAgICBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSh0aWQsIHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIH0KKyAgICBlbHNlIGlmIChwcm9jX2JpbmQgIT0gcHJvY19iaW5kX2ZhbHNlKSB7CisgICAgICAgIGlmICh0aGlzX3Roci0+dGgudGhfbmV3X3BsYWNlID09IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkIGFscmVhZHkgaW4gY29ycmVjdCBwbGFjZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGd0aWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAgICAgLy8gR2V0IGNvcnJlY3QgYmFycmllciBvYmplY3QKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyKTsKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7ICAvLyBXb3JrZXJzIGNhbGwgYWNxdWlyZWQKKyAgICAgICAgfSAvLyAocHJlcGFyZSBjYWxsZWQgaW5zaWRlIGJhcnJpZXJfcmVsZWFzZSkKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCglZDolZCkgaXMgbGVhdmluZ1xuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQpKTsKK30KKworCit2b2lkCitfX2ttcF9zZXR1cF9pY3ZfY29weShrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbmV3X25wcm9jLCBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soS01QX3NldHVwX2ljdl9jb3B5KTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAmJiBuZXdfbnByb2MgJiYgbmV3X2ljdnMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgfHwgbmV3X2ljdnMtPm5wcm9jKTsKKworICAgIC8qIE1hc3RlciB0aHJlYWQncyBjb3B5IG9mIHRoZSBJQ1ZzIHdhcyBzZXQgdXAgb24gdGhlIGltcGxpY2l0IHRhc2tkYXRhIGluCisgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0uIF9fa21wX2ZvcmtfY2FsbCgpIGFzc3VtZXMgdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrIGhhcworICAgICAgIHRoaXMgZGF0YSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICovCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVTEwKKyAgICAvKiBDb3B5IElDVnMgdG8gbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdHVyZSBpbnRvIHRoX2ZpeGVkX2ljdnMgKHdoaWNoIHJlbWFpbnMgdW50b3VjaGVkKSwgd2hlcmUKKyAgICAgICBhbGwgb2YgdGhlIHdvcmtlciB0aHJlYWRzIGNhbiBhY2Nlc3MgdGhlbSBhbmQgbWFrZSB0aGVpciBvd24gY29waWVzIGFmdGVyIHRoZSBiYXJyaWVyLiAqLworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbMF0pOyAgLy8gVGhlIHRocmVhZHMgYXJyYXlzIHNob3VsZCBiZSBhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludAorICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi50aF9maXhlZF9pY3ZzLCBuZXdfaWN2cyk7CisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0dXBfaWN2X2NvcHk6IFBVTEw6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7CisjZWxpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgIC8vIFRoZSBJQ1ZzIHdpbGwgYmUgcHJvcGFnYXRlZCBpbiB0aGUgZm9yayBiYXJyaWVyLCBzbyBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgaGVyZS4KKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogUFVTSDogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgMCwgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0pKTsKKyNlbHNlCisgICAgLy8gQ29weSB0aGUgSUNWcyB0byBlYWNoIG9mIHRoZSBub24tbWFzdGVyIHRocmVhZHMuICBUaGlzIHRha2VzIE8obnRocmVhZHMpIHRpbWUuCisgICAgbmdvX2xvYWQobmV3X2ljdnMpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbMF0pOyAgLy8gVGhlIHRocmVhZHMgYXJyYXlzIHNob3VsZCBiZSBhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludAorICAgIGZvciAoaW50IGY9MTsgZjxuZXdfbnByb2M7ICsrZikgeyAvLyBTa2lwIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIC8vIFRPRE86IEdFSCAtIHBhc3MgaW4gYmV0dGVyIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHNpbmNlIHVzdWFsbHkgTlVMTCBoZXJlCisgICAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBMSU5FQVI6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSkpOworICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sobG9jLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSwgZiwgRkFMU0UpOworICAgICAgICBuZ29fc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbZl0udGRfaWN2cywgbmV3X2ljdnMpOworICAgICAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogTElORUFSOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZiwgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0pKTsKKyAgICB9CisgICAgbmdvX3N5bmMoKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2NhbmNlbC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWViMDBjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2NhbmNlbC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBhY3RpdmF0ZWQgYW5kIHRoZSBleGVjdXRpb24gdGhyZWFkCituZWVkcyB0byBwcm9jZWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNhbmNlbGVkIHJlZ2lvbi4KKworUmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgdGhlIGJpbmRpbmcgT3Blbk1QIHJlZ2lvbi4KKyovCitrbXBfaW50MzIgX19rbXBjX2NhbmNlbChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCkgeworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICAKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NhbmNlbDogVCMlZCByZXF1ZXN0ICVkIE9NUF9DQU5DRUxMQVRJT049JWRcbiIsIGd0aWQsIGNuY2xfa2luZCwgX19rbXBfb21wX2NhbmNlbGxhdGlvbikgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kICE9IGNhbmNlbF9ub3JlcSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgPT0gY2FuY2VsX3BhcmFsbGVsIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfbG9vcCB8fCAKKyAgICAgICAgICAgICAgICAgICAgIGNuY2xfa2luZCA9PSBjYW5jZWxfc2VjdGlvbnMgfHwgY25jbF9raW5kID09IGNhbmNlbF90YXNrZ3JvdXApOyAKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgb2xkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpLCBjYW5jZWxfbm9yZXEsIGNuY2xfa2luZCk7CisgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSBjYW5jZWxfbm9yZXEgfHwgb2xkID09IGNuY2xfa2luZCkgeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiX19rbXBjX2NhbmNlbDogdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3Q9JWQgQCAlcFxuIiwgCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0LCAmKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaW4gdGhpcyB0ZWFtIG9yIHdlIGRvIGhhdmUgb25lCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCByZXF1ZXN0IC0+IGNhbmNlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBhIHRhc2sgZ3JvdXAKKyAgICAgICAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRhc2tncm91cCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2RhdGFfdCogIHRhc2s7IAorICAgICAgICAgICAgICAgIGttcF90YXNrZ3JvdXBfdCogdGFza2dyb3VwOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2sgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0YXNrZ3JvdXAgPSB0YXNrLT50ZF90YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tncm91cCkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgb2xkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYodGFza2dyb3VwLT5jYW5jZWxfcmVxdWVzdCksIGNhbmNlbF9ub3JlcSwgY25jbF9raW5kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSBjYW5jZWxfbm9yZXEgfHwgb2xkID09IGNuY2xfa2luZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBpbiB0aGlzIHRhc2tncm91cCBvciB3ZSBkbyBoYXZlIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHJlcXVlc3QgLT4gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IG5lZWRzIHRvIGhhcHBlbiBoZXJlPworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3BlY2lmaWNhdGlvbiBkaXNhbGxvd3MgY2FuY2VsbGF0aW9uIHcvbyB0YXNrZ3JvdXBzCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIG1pZ2h0IGRvIGFueXRoaW5nIGhlcmUsIGxldCdzIGFib3J0IGZvciBub3cKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCAvKiBmYWxzZSAqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElDViBPTVBfQ0FOQ0VMTEFUSU9OPWZhbHNlLCBzbyB3ZSBpZ25vcmVkIHRoaXMgY2FuY2VsIHJlcXVlc3QKKyAgICBLTVBfREVCVUdfQVNTRVJUKCFfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKTsKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworLyohCitAaW5ncm91cCBDQU5DRUxMQVRJT04KK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gY25jbF9raW5kIENhbmNlbGxhdGlvbiBraW5kIChwYXJhbGxlbCwgZm9yLCBzZWN0aW9ucywgdGFza2dyb3VwKQorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGZsYWdnZWQgaW4gdGhlIFJUTCBhbmQgdGhlIAorZW5jb3VudGVyaW5nIHRocmVhZCBoYXMgdG8gY2FuY2VsLi4KKworQ2FuY2VsbGF0aW9uIHBvaW50IGZvciB0aGUgZW5jb3VudGVyaW5nIHRocmVhZC4KKyovCitrbXBfaW50MzIgX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50KGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKSB7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jYW5jZWxsYXRpb25wb2ludDogVCMlZCByZXF1ZXN0ICVkIE9NUF9DQU5DRUxMQVRJT049JWRcbiIsIGd0aWQsIGNuY2xfa2luZCwgX19rbXBfb21wX2NhbmNlbGxhdGlvbikgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kICE9IGNhbmNlbF9ub3JlcSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgPT0gY2FuY2VsX3BhcmFsbGVsIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfbG9vcCB8fCAKKyAgICAgICAgICAgICAgICAgICAgIGNuY2xfa2luZCA9PSBjYW5jZWxfc2VjdGlvbnMgfHwgY25jbF9raW5kID09IGNhbmNlbF90YXNrZ3JvdXApOyAKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNuY2xfa2luZCA9PSB0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgaW4gdGhlIHRlYW0gc3RydWN0dXJlIG1hdGNoZXMgdGhlIHR5cGUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiBwb2ludCBzbyB3ZSBjYW4gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgLyogZmFsc2UgKi8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBwZW5kaW5nLCBzbyB3ZSBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGNhbmNlbGxhdGlvbiBwb2ludAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmb3IgYSB0YXNrIGdyb3VwCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0YXNrZ3JvdXAgc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QqICB0YXNrOyAKKyAgICAgICAgICAgICAgICBrbXBfdGFza2dyb3VwX3QqIHRhc2tncm91cDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGFza2dyb3VwID0gdGFzay0+dGRfdGFza2dyb3VwOworICAgICAgICAgICAgICAgIGlmICh0YXNrZ3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gZm9yIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgLy8gdGFza2dyb3VwCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGNhbmNlbGxhdGlvbiBwb2ludCBpcyBlbmNvdW50ZXJlZCBieSBhIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gYSB0YXNrZ3JvdXAsIGl0IGlzIE9LCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElDViBPTVBfQ0FOQ0VMTEFUSU9OPWZhbHNlLCBzbyB3ZSBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiBwb2ludAorICAgIEtNUF9ERUJVR19BU1NFUlQoIV9fa21wX29tcF9jYW5jZWxsYXRpb24pOworICAgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZSBSVEwgYW5kIHRoZSAKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK0JhcnJpZXIgd2l0aCBjYW5jZWxsYXRpb24gcG9pbnQgdG8gc2VuZCB0aHJlYWRzIGZyb20gdGhlIGJhcnJpZXIgdG8gdGhlCitlbmQgb2YgdGhlIHBhcmFsbGVsIHJlZ2lvbi4gIE5lZWRzIGEgc3BlY2lhbCBjb2RlIHBhdHRlcm4gYXMgZG9jdW1lbnRlZCAKK2luIHRoZSBkZXNpZ24gZG9jdW1lbnQgZm9yIHRoZSBjYW5jZWxsYXRpb24gZmVhdHVyZS4KKyovCitrbXBfaW50MzIKK19fa21wY19jYW5jZWxfYmFycmllcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgICAgaW50IHJldCA9IDAgLyogZmFsc2UgKi87CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9nZXRfZ3RpZCgpID09IGd0aWQpOworCisgICAgLy8gY2FsbCBpbnRvIHRoZSBzdGFuZGFyZCBiYXJyaWVyCisgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKworICAgIC8vIGlmIGNhbmNlbGxhdGlvbiBpcyBhY3RpdmUsIGNoZWNrIGNhbmNlbGxhdGlvbiBmbGFnCisgICAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHdoaWNoIGNvbnN0cnVjdCB0byBjYW5jZWwsIGNoZWNrIHRoZSBmbGFnIGFuZAorICAgICAgICAvLyByZXNldCB0aGUgZmxhZworICAgICAgICBzd2l0Y2ggKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAgICAgICAvLyB0aGUgbmV4dCBiYXJyaWVyIGlzIHRoZSBmb3JrL2pvaW4gYmFycmllciwgd2hpY2gKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplcyB0aGUgdGhyZWFkcyBsZWF2aW5nIGhlcmUgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY2FuY2VsX2xvb3A6CisgICAgICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB0aGUgdGhyZWFkcyBhZ2FpbiB0byBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgIC8vIGRvIG5vdCBoYXZlIGFueSBydW4tYXdheSB0aHJlYWRzIHRoYXQgY2F1c2UgYSByYWNlCisgICAgICAgICAgICAvLyBvbiB0aGUgY2FuY2VsbGF0aW9uIGZsYWcKKyAgICAgICAgICAgIF9fa21wY19iYXJyaWVyKGxvYywgZ3RpZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBub3Qgb2NjdXIKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKDAgLyogZmFsc2UgKi8gKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNhbmNlbF9ub3JlcToKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVCAoIDAgLyogZmFsc2UgKi8pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiByZXQ7Cit9CisKKy8qIQorQGluZ3JvdXAgQ0FOQ0VMTEFUSU9OCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGZsYWdnZWQgaW4gdGhlIFJUTCBhbmQgdGhlIAorZW5jb3VudGVyaW5nIHRocmVhZCBoYXMgdG8gY2FuY2VsLi4KKworUXVlcnkgZnVuY3Rpb24gdG8gcXVlcnkgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cy4KK0NhbiBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHBhdHRlcm46CisgCitpZiAoa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGttcF9jYW5jZWxfcGFyYWxsZWwpKSB7CisgICAgcGVyZm9ybV9jbGVhbnVwKCk7CisgICAgI3ByYWdtYSBvbXAgY2FuY2VsbGF0aW9uIHBvaW50IHBhcmFsbGVsICAgICAgCit9CisqLworaW50IF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGludCBjYW5jZWxfa2luZCkgeworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKGNhbmNlbF9raW5kKSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPT0gY2FuY2VsX2tpbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2RhdGFfdCogIHRhc2s7IAorICAgICAgICAgICAgICAgIGttcF90YXNrZ3JvdXBfdCogdGFza2dyb3VwOworICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFza2dyb3VwICYmIHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfY29uZmlnLmguY21ha2UgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY29uZmlnLmguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhYzZmMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9jb25maWcuaC5jbWFrZQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIGttcF9jb25maWcuaCAtLSBGZWF0dXJlIG1hY3JvcworICovCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBLTVBfQ09ORklHX0gKKyNkZWZpbmUgS01QX0NPTkZJR19ICisKKyNpbmNsdWRlICJrbXBfcGxhdGZvcm0uaCIKKworLy8gY21ha2VkZWZpbmUwMSBNQUNSTyB3aWxsIGRlZmluZSBNQUNSTyBhcyBlaXRoZXIgMCBvciAxCisvLyBjbWFrZWRlZmluZSBNQUNSTyAxIHdpbGwgZGVmaW5lIE1BQ1JPIGFzIDEgb3IgbGVhdmUgdW5kZWZpbmVkCisjY21ha2VkZWZpbmUwMSBERUJVR19CVUlMRAorI2NtYWtlZGVmaW5lMDEgUkVMV0lUSERFQklORk9fQlVJTEQKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfSVRUX05PVElGWQorI2RlZmluZSBVU0VfSVRUX05PVElGWSBMSUJPTVBfVVNFX0lUVF9OT1RJRlkKKyNpZiAhIExJQk9NUF9VU0VfSVRUX05PVElGWQorIyBkZWZpbmUgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2VuZGlmCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworI2lmIExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisjIGRlZmluZSBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworI2VuZGlmCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURQorI2RlZmluZSBLTVBfSEFWRV9XRUFLX0FUVFJJQlVURSBMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURQorI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfUFNBUEkKKyNkZWZpbmUgS01QX0hBVkVfUFNBUEkgTElCT01QX0hBVkVfUFNBUEkKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9TVEFUUworI2RlZmluZSBLTVBfU1RBVFNfRU5BQkxFRCBMSUJPTVBfU1RBVFMKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9IQVZFX1g4NklOVFJJTl9ICisjZGVmaW5lIEtNUF9IQVZFX1g4NklOVFJJTl9IIExJQk9NUF9IQVZFX1g4NklOVFJJTl9ICisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUgorI2RlZmluZSBLTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUiBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUgorI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfX19SRFRTQworI2RlZmluZSBLTVBfSEFWRV9fX1JEVFNDIExJQk9NUF9IQVZFX19fUkRUU0MKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfREVCVUdHRVIKKyNkZWZpbmUgVVNFX0RFQlVHR0VSIExJQk9NUF9VU0VfREVCVUdHRVIKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX0RFQlVHCisjZGVmaW5lIE9NUFRfREVCVUcgTElCT01QX09NUFRfREVCVUcKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX1NVUFBPUlQKKyNkZWZpbmUgT01QVF9TVVBQT1JUIExJQk9NUF9PTVBUX1NVUFBPUlQKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX0JMQU1FCisjZGVmaW5lIE9NUFRfQkxBTUUgTElCT01QX09NUFRfQkxBTUUKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX1RSQUNFCisjZGVmaW5lIE9NUFRfVFJBQ0UgTElCT01QX09NUFRfVFJBQ0UKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNkZWZpbmUgS01QX1VTRV9BREFQVElWRV9MT0NLUyBMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjZGVmaW5lIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUyAwCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQKKyNkZWZpbmUgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UIExJQk9NUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVAorI2NtYWtlZGVmaW5lMDEgTElCT01QX0VOQUJMRV9BU1NFUlRJT05TCisjZGVmaW5lIEtNUF9VU0VfQVNTRVJUIExJQk9NUF9FTkFCTEVfQVNTRVJUSU9OUworI2NtYWtlZGVmaW5lMDEgU1RVQlNfTElCUkFSWQorI2NtYWtlZGVmaW5lMDEgTElCT01QX1VTRV9IV0xPQworI2RlZmluZSBLTVBfVVNFX0hXTE9DIExJQk9NUF9VU0VfSFdMT0MKKyNkZWZpbmUgS01QX0FSQ0hfU1RSICJATElCT01QX0xFR0FMX0FSQ0hAIgorI2RlZmluZSBLTVBfTElCUkFSWV9GSUxFICJATElCT01QX0xJQl9GSUxFQCIKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgQExJQk9NUF9WRVJTSU9OX01BSk9SQAorI2RlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiBATElCT01QX1ZFUlNJT05fTUlOT1JACisjZGVmaW5lIExJQk9NUF9PTVBfVkVSU0lPTiBATElCT01QX09NUF9WRVJTSU9OQAorI2RlZmluZSBPTVBfNTBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDUwKQorI2RlZmluZSBPTVBfNDFfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDQxKQorI2RlZmluZSBPTVBfNDBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDQwKQorI2RlZmluZSBPTVBfMzBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDMwKQorCisvLyBDb25maWd1cmVkIGNhY2hlIGxpbmUgYmFzZWQgb24gYXJjaGl0ZWN0dXJlCisjaWYgS01QX0FSQ0hfUFBDNjQKKyMgZGVmaW5lIENBQ0hFX0xJTkUgMTI4CisjZWxzZQorIyBkZWZpbmUgQ0FDSEVfTElORSA2NAorI2VuZGlmCisKKyNpZiAhIEtNUF8zMl9CSVRfQVJDSAorIyBkZWZpbmUgQlVJTERfSTggMQorI2VuZGlmCisKKyNkZWZpbmUgS01QX0RZTkFNSUNfTElCIDEKKyNkZWZpbmUgS01QX05FU1RFRF9IT1RfVEVBTVMgMQorI2RlZmluZSBLTVBfQURKVVNUX0JMT0NLVElNRSAxCisjZGVmaW5lIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgMQorI2RlZmluZSBLTVBfQVNNX0lOVFJJTlMgMQorI2RlZmluZSBVU0VfSVRUX0JVSUxEIExJQk9NUF9VU0VfSVRUX05PVElGWQorI2RlZmluZSBJTlRFTF9JVFROT1RJRllfUFJFRklYIF9fa21wX2l0dF8KKyNpZiAhIEtNUF9NSUMKKyMgZGVmaW5lIFVTRV9MT0FEX0JBTEFOQ0UgMQorI2VuZGlmCisjaWYgISAoS01QX09TX1dJTkRPV1MgfHwgS01QX09TX0RBUldJTikKKyMgZGVmaW5lIEtNUF9UREFUQV9HVElEIDEKKyNlbmRpZgorI2lmIFNUVUJTX0xJQlJBUlkKKyMgZGVmaW5lIEtNUF9TVFVCIDEKKyNlbmRpZgorI2lmIERFQlVHX0JVSUxEIHx8IFJFTFdJVEhERUJJTkZPX0JVSUxECisjIGRlZmluZSBLTVBfREVCVUcgMQorI2VuZGlmCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBkZWZpbmUgS01QX1dJTl9DREVDTAorI2Vsc2UKKyMgZGVmaW5lIEJVSUxEX1RWCisjIGRlZmluZSBLTVBfR09NUF9DT01QQVQKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0NPTkZJR19ICmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfY3N1cHBvcnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9jc3VwcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjlkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY3N1cHBvcnQuYwpAQCAtMCwwICsxLDMwNTUgQEAKKy8qCisgKiBrbXBfY3N1cHBvcnQuYyAtLSBrZnJvbnQgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvbXAuaCIgICAgICAgIC8qIGV4dGVybiAiQyIgZGVjbGFyYXRpb25zIG9mIHVzZXItdmlzaWJsZSByb3V0aW5lcyAqLworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9NRVNTQUdFIDUxMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgZmxhZ3Mgd2lsbCBiZSB1c2VkIGluIGZ1dHVyZSwgZS5nLiwgdG8gaW1wbGVtZW50ICovCisvKiAgb3Blbm1wX3N0cmljdCBsaWJyYXJ5IHJlc3RyaWN0aW9ucyAgICAgICAgICAgICAgICovCisKKy8qIQorICogQGluZ3JvdXAgU1RBUlRVUF9TSFVURE9XTgorICogQHBhcmFtIGxvYyAgIGluICAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgKiBAcGFyYW0gZmxhZ3MgaW4gICBmb3IgZnV0dXJlIHVzZSAoY3VycmVudGx5IGlnbm9yZWQpCisgKgorICogSW5pdGlhbGl6ZSB0aGUgcnVudGltZSBsaWJyYXJ5LiBUaGlzIGNhbGwgaXMgb3B0aW9uYWw7IGlmIGl0IGlzIG5vdCBtYWRlIHRoZW4KKyAqIGl0IHdpbGwgYmUgaW1wbGljaXRseSBjYWxsZWQgYnkgYXR0ZW1wdHMgdG8gdXNlIG90aGVyIGxpYnJhcnkgZnVuY3Rpb25zLgorICoKKyAqLwordm9pZAorX19rbXBjX2JlZ2luKGlkZW50X3QgKmxvYywga21wX2ludDMyIGZsYWdzKQoreworICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBfaWdub3JlX21wcGJlZygpIHJldHVybnMgVFJVRS4KKyAgICBpZiAoX19rbXBfaWdub3JlX21wcGJlZygpID09IEZBTFNFKSB7CisgICAgICAgIF9fa21wX2ludGVybmFsX2JlZ2luKCk7CisKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19iZWdpbjogY2FsbGVkXG4iICkgKTsKKyAgICB9Cit9CisKKy8qIQorICogQGluZ3JvdXAgU1RBUlRVUF9TSFVURE9XTgorICogQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBTaHV0ZG93biB0aGUgcnVudGltZSBsaWJyYXJ5LiBUaGlzIGlzIGFsc28gb3B0aW9uYWwsIGFuZCBldmVuIGlmIGNhbGxlZCB3aWxsIG5vdAorICogZG8gYW55dGhpbmcgdW5sZXNzIHRoZSBgS01QX0lHTk9SRV9NUFBFTkRgIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byB6ZXJvLgorICAqLwordm9pZAorX19rbXBjX2VuZChpZGVudF90ICpsb2MpCit7CisgICAgLy8gQnkgZGVmYXVsdCwgX19rbXBfaWdub3JlX21wcGVuZCgpIHJldHVybnMgVFJVRSB3aGljaCBtYWtlcyBfX2ttcGNfZW5kKCkgY2FsbCBuby1vcC4KKyAgICAvLyBIb3dldmVyLCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggS01QX0lHTk9SRV9NUFBFTkQgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgLy8gSWYgS01QX0lHTk9SRV9NUFBFTkQgaXMgMCwgX19rbXBfaWdub3JlX21wcGVuZCgpIHJldHVybnMgRkFMU0UgYW5kIF9fa21wY19lbmQoKQorICAgIC8vIHdpbGwgdW5yZWdpc3RlciB0aGlzIHJvb3QgKGl0IGNhbiBjYXVzZSBsaWJyYXJ5IHNodXQgZG93bikuCisgICAgaWYgKF9fa21wX2lnbm9yZV9tcHBlbmQoKSA9PSBGQUxTRSkgeworICAgICAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZDogY2FsbGVkXG4iICkgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDMwLCAoIl9fa21wY19lbmRcbiIgKSk7CisKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggLTEgKTsKKyAgICB9Cit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIFRoZSBnbG9iYWwgdGhyZWFkIGluZGV4IG9mIHRoZSBhY3RpdmUgdGhyZWFkLgorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gYW55IGNvbnRleHQuCisKK0lmIHRoZSBydW50aW1lIGhhcyBvbnkgYmVlbiBlbnRlcmVkIGF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwgZnJvbSBhCitzaW5nbGUgKG5lY2Vzc2FyaWx5IG5vbi1PcGVuTVA8c3VwPio8L3N1cD4pIHRocmVhZCwgdGhlbiB0aGUgdGhyZWFkIG51bWJlciBpcyB0aGF0Cit3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieSBvbXBfZ2V0X3RocmVhZF9udW0oKSBpbiB0aGUgb3V0ZXJtb3N0CithY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LiAoT3IgemVybyBpZiB0aGVyZSBpcyBubyBhY3RpdmUgcGFyYWxsZWwKK2NvbnN0cnVjdCwgc2luY2UgdGhlIG1hc3RlciB0aHJlYWQgaXMgbmVjZXNzYXJpbHkgdGhyZWFkIHplcm8pLgorCitJZiBtdWx0aXBsZSBub24tT3Blbk1QIHRocmVhZHMgYWxsIGVudGVyIGFuIE9wZW5NUCBjb25zdHJ1Y3QgdGhlbiB0aGlzCit3aWxsIGJlIGEgdW5pcXVlIHRocmVhZCBpZGVudGlmaWVyIGFtb25nIGFsbCB0aGUgdGhyZWFkcyBjcmVhdGVkIGJ5Cit0aGUgT3Blbk1QIHJ1bnRpbWUgKGJ1dCB0aGUgdmFsdWUgY2Fubm90ZSBiZSBkZWZpbmVkIGluIHRlcm1zIG9mCitPcGVuTVAgdGhyZWFkIGlkcyByZXR1cm5lZCBieSBvbXBfZ2V0X3RocmVhZF9udW0oKSkuCisKKyovCitrbXBfaW50MzIKK19fa21wY19nbG9iYWxfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAga21wX2ludDMyIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtOiBUIyVkXG4iLCBndGlkICkgKTsKKworICAgIHJldHVybiBndGlkOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgY29udHJvbCBvZiB0aGUgT3Blbk1QPHN1cD4qPC9zdXA+IHJ1bnRpbWUKKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorSXQgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIE9wZW5NUCBydW50aW1lLiBUaGF0IGlzCitub3QgYSBudW1iZXIgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBhbnkgT3Blbk1QIHN0YW5kYXJkIGNhbGxzLCBzaW5jZSB0aGUgbGlicmFyeSBtYXkgYmUKK2NhbGxlZCBmcm9tIG1vcmUgdGhhbiBvbmUgbm9uLU9wZW5NUCB0aHJlYWQsIGFuZCB0aGlzIHJlZmxlY3RzIHRoZSB0b3RhbCBvdmVyIGFsbCBzdWNoIGNhbGxzLgorU2ltaWxhcmx5IHRoZSBydW50aW1lIG1haW50YWlucyB1bmRlcmx5aW5nIHRocmVhZHMgZXZlbiB3aGVuIHRoZXkgYXJlIG5vdCBhY3RpdmUgKHNpbmNlIHRoZSBjb3N0CitvZiBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBPUyB0aHJlYWRzIGlzIGhpZ2gpLCB0aGlzIGNhbGwgY291bnRzIGFsbCBzdWNoIHRocmVhZHMgZXZlbiBpZiB0aGV5IGFyZSBub3QKK3dhaXRpbmcgZm9yIHdvcmsuCisqLwora21wX2ludDMyCitfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzKGlkZW50X3QgKmxvYykKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkczogbnVtX3RocmVhZHMgPSAlZFxuIiwgX19rbXBfbnRoICkgKTsKKworICAgIHJldHVybiBUQ1JfNChfX2ttcF9udGgpOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgdGhyZWFkIG51bWJlciBvZiB0aGUgY2FsbGluZyB0aHJlYWQgaW4gdGhlIGlubmVybW9zdCBhY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LgorCisqLwora21wX2ludDMyCitfX2ttcGNfYm91bmRfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF90aHJlYWRfbnVtOiBjYWxsZWRcbiIgKSApOworICAgIHJldHVybiBfX2ttcF90aWRfZnJvbV9ndGlkKCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBpbm5lcm1vc3QgYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCitrbXBfaW50MzIKK19fa21wY19ib3VuZF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF9udW1fdGhyZWFkczogY2FsbGVkXG4iICkgKTsKKworICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKK30KKworLyohCisgKiBAaW5ncm91cCBERVBSRUNBVEVECisgKiBAcGFyYW0gbG9jIGxvY2F0aW9uIGRlc2NyaXB0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBuZWVkIG5vdCBiZSBjYWxsZWQuIEl0IGFsd2F5cyByZXR1cm5zIFRSVUUuCisgKi8KK2ttcF9pbnQzMgorX19rbXBjX29rX3RvX2ZvcmsoaWRlbnRfdCAqbG9jKQoreworI2lmbmRlZiBLTVBfREVCVUcKKworICAgIHJldHVybiBUUlVFOworCisjZWxzZQorCisgICAgY29uc3QgY2hhciAqc2VtaTI7CisgICAgY29uc3QgY2hhciAqc2VtaTM7CisgICAgaW50IGxpbmVfbm87CisKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlID09IDApIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHNlbWkyID0gbG9jLT5wc291cmNlOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBzZW1pMiA9IHN0cmNocihzZW1pMiwgJzsnKTsKKyAgICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgc2VtaTIgPSBzdHJjaHIoc2VtaTIgKyAxLCAnOycpOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lWzBdKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzZW1pMiAtIDE7CisgICAgICAgIHdoaWxlICgobmFtZSA+IGxvYy0+cHNvdXJjZSkgJiYgKCpuYW1lICE9ICcvJykgJiYgKCpuYW1lICE9ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCpuYW1lID09ICcvJykgfHwgKCpuYW1lID09ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWUsIG5hbWUsIHNlbWkyIC0gbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgICAgICB9CisgICAgfQorICAgIHNlbWkzID0gc3RyY2hyKHNlbWkyICsgMSwgJzsnKTsKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbMF0pIHsKKyAgICAgICAgaWYgKChzZW1pMyAhPSBOVUxMKSAmJiAoc2VtaTMgPiBzZW1pMikKKyAgICAgICAgICAmJiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZSwgc2VtaTIgKyAxLCBzZW1pMyAtIHNlbWkyIC0gMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlIDwgMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoS01QX1NTQ0FORihzZW1pMyArIDEsICIlZCIsICZsaW5lX25vKSA9PSAxKSB7CisgICAgICAgIGlmICgobGluZV9ubyA+PSBfX2ttcF9wYXJfcmFuZ2VfbGIpICYmIChsaW5lX25vIDw9IF9fa21wX3Bhcl9yYW5nZV91YikpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIDEgaWYgdGhpcyB0aHJlYWQgaXMgZXhlY3V0aW5nIGluc2lkZSBhbiBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uLCB6ZXJvIGlmIG5vdC4KKyovCitrbXBfaW50MzIKK19fa21wY19pbl9wYXJhbGxlbCggaWRlbnRfdCAqbG9jICkKK3sKKyAgICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdGhyZWFkcyBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoaXMgcGFyYWxsZWwgY29uc3RydWN0CisKK1NldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgbmV4dCBmb3JrIHNwYXduZWQgYnkgdGhpcyB0aHJlYWQuCitUaGlzIGNhbGwgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0IGhhcyBhIGBudW1fdGhyZWFkc2AgY2xhdXNlLgorKi8KK3ZvaWQKK19fa21wY19wdXNoX251bV90aHJlYWRzKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdGhyZWFkcyApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wdXNoX251bV90aHJlYWRzOiBlbnRlciBUIyVkIG51bV90aHJlYWRzPSVkXG4iLAorICAgICAgZ2xvYmFsX3RpZCwgbnVtX3RocmVhZHMgKSApOworCisgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcyggbG9jLCBnbG9iYWxfdGlkLCBudW1fdGhyZWFkcyApOworfQorCit2b2lkCitfX2ttcGNfcG9wX251bV90aHJlYWRzKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcGNfcG9wX251bV90aHJlYWRzOiBlbnRlclxuIiApICk7CisKKyAgICAvKiB0aGUgbnVtX3RocmVhZHMgYXJlIGF1dG9tYXRpY2FsbHkgcG9wcGVkICovCit9CisKKworI2lmIE9NUF80MF9FTkFCTEVECisKK3ZvaWQKK19fa21wY19wdXNoX3Byb2NfYmluZChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgcHJvY19iaW5kICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3B1c2hfcHJvY19iaW5kOiBlbnRlciBUIyVkIHByb2NfYmluZD0lZFxuIiwKKyAgICAgIGdsb2JhbF90aWQsIHByb2NfYmluZCApICk7CisKKyAgICBfX2ttcF9wdXNoX3Byb2NfYmluZCggbG9jLCBnbG9iYWxfdGlkLCAoa21wX3Byb2NfYmluZF90KXByb2NfYmluZCApOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBhcmdjICB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBlbGxpcHNpcworQHBhcmFtIG1pY3JvdGFzayAgcG9pbnRlciB0byBjYWxsYmFjayByb3V0aW5lIGNvbnNpc3Rpbmcgb2Ygb3V0bGluZWQgcGFyYWxsZWwgY29uc3RydWN0CitAcGFyYW0gLi4uICBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlbid0IGdsb2JhbAorCitEbyB0aGUgYWN0dWFsIGZvcmsgYW5kIGNhbGwgdGhlIG1pY3JvdGFzayBpbiB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIHRocmVhZHMuCisqLwordm9pZAorX19rbXBjX2ZvcmtfY2FsbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBhcmdjLCBrbXBjX21pY3JvIG1pY3JvdGFzaywgLi4uKQoreworICBpbnQgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisjaWYgKEtNUF9TVEFUU19FTkFCTEVEKSAgCisgIGludCBpblBhcmFsbGVsID0gX19rbXBjX2luX3BhcmFsbGVsKGxvYyk7CisgIGlmIChpblBhcmFsbGVsKQorICB7CisgICAgICBLTVBfQ09VTlRfQkxPQ0soT01QX05FU1RFRF9QQVJBTExFTCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgICBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihPTVBfc2VyaWFsKTsKKyAgICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfUEFSQUxMRUwpOworICB9CisjZW5kaWYKKworICAvLyBtYXliZSB0byBzYXZlIHRocl9zdGF0ZSBpcyBlbm91Z2ggaGVyZQorICB7CisgICAgdmFfbGlzdCAgICAgYXA7CisgICAgdmFfc3RhcnQoICAgYXAsIG1pY3JvdGFzayApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfaW5mb190ICptYXN0ZXJfdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAqcGFyZW50X3RlYW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLgorICAgICAgICAgICBvbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfRk9SS0lORygpOworI2VuZGlmCisgICAgX19rbXBfZm9ya19jYWxsKCBsb2MsIGd0aWQsIGZvcmtfY29udGV4dF9pbnRlbCwKKyAgICAgICAgICAgIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKHZvaWQgKikgbWljcm90YXNrLCAgICAgIC8vICJ1bndyYXBwZWQiIHRhc2sKKyNlbmRpZgorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChtaWNyb3Rhc2tfdCkgbWljcm90YXNrLCAvLyAid3JhcHBlZCIgdGFzaworICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChsYXVuY2hfdCkgICAgX19rbXBfaW52b2tlX3Rhc2tfZnVuYywKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgJmFwCisjZWxzZQorICAgICAgICAgICAgYXAKKyNlbmRpZgorICAgICAgICAgICAgKTsKKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgIFNTQ19NQVJLX0pPSU5JTkcoKTsKKyNlbmRpZgorICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICwgZm9ya19jb250ZXh0X2ludGVsCisjZW5kaWYKKyAgICApOworCisgICAgdmFfZW5kKCBhcCApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS4KKyAgICAgICAgICAgIG9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IDA7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZiAoS01QX1NUQVRTX0VOQUJMRUQpICAKKyAgaWYgKCFpblBhcmFsbGVsKQorICAgICAgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKE9NUF9zZXJpYWwpOworI2VuZGlmCit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcGFyYW0gbnVtX3RlYW1zIG51bWJlciBvZiB0ZWFtcyByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKK0BwYXJhbSBudW1fdGhyZWFkcyBudW1iZXIgb2YgdGhyZWFkcyBwZXIgdGVhbSByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKworU2V0IHRoZSBudW1iZXIgb2YgdGVhbXMgdG8gYmUgdXNlZCBieSB0aGUgdGVhbXMgY29uc3RydWN0LgorVGhpcyBjYWxsIGlzIG9ubHkgcmVxdWlyZWQgaWYgdGhlIHRlYW1zIGNvbnN0cnVjdCBoYXMgYSBgbnVtX3RlYW1zYCBjbGF1c2UKK29yIGEgYHRocmVhZF9saW1pdGAgY2xhdXNlIChvciBib3RoKS4KKyovCit2b2lkCitfX2ttcGNfcHVzaF9udW1fdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90ZWFtcywga21wX2ludDMyIG51bV90aHJlYWRzICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3B1c2hfbnVtX3RlYW1zOiBlbnRlciBUIyVkIG51bV90ZWFtcz0lZCBudW1fdGhyZWFkcz0lZFxuIiwKKyAgICAgIGdsb2JhbF90aWQsIG51bV90ZWFtcywgbnVtX3RocmVhZHMgKSApOworCisgICAgX19rbXBfcHVzaF9udW1fdGVhbXMoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3RlYW1zLCBudW1fdGhyZWFkcyApOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBhcmdjICB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBlbGxpcHNpcworQHBhcmFtIG1pY3JvdGFzayAgcG9pbnRlciB0byBjYWxsYmFjayByb3V0aW5lIGNvbnNpc3Rpbmcgb2Ygb3V0bGluZWQgdGVhbXMgY29uc3RydWN0CitAcGFyYW0gLi4uICBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlbid0IGdsb2JhbAorCitEbyB0aGUgYWN0dWFsIGZvcmsgYW5kIGNhbGwgdGhlIG1pY3JvdGFzayBpbiB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIHRocmVhZHMuCisqLwordm9pZAorX19rbXBjX2ZvcmtfdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLikKK3sKKyAgICBpbnQgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHZhX2xpc3QgICAgIGFwOworICAgIHZhX3N0YXJ0KCAgIGFwLCBtaWNyb3Rhc2sgKTsKKworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfVEVBTVMpOworCisgICAgLy8gcmVtZW1iZXIgdGVhbXMgZW50cnkgcG9pbnQgYW5kIG5lc3RpbmcgbGV2ZWwKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbWljcm90YXNrID0gbWljcm90YXNrOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtc19sZXZlbCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7IC8vIEFDOiBjYW4gYmUgPjAgb24gaG9zdAorCisjaWYgT01QVF9TVVBQT1JUCisgICAga21wX3RlYW1fdCAqcGFyZW50X3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0uCisgICAgICAgICAgIG9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gY2hlY2sgaWYgX19rbXBjX3B1c2hfbnVtX3RlYW1zIGNhbGxlZCwgc2V0IGRlZmF1bHQgbnVtYmVyIG9mIHRlYW1zIG90aGVyd2lzZQorICAgIGlmICggdGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID09IDAgKSB7CisgICAgICAgIF9fa21wX3B1c2hfbnVtX3RlYW1zKCBsb2MsIGd0aWQsIDAsIDAgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfc2V0X25wcm9jID49IDEpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID49IDEpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUubnRoID49IDEpOworCisgICAgX19rbXBfZm9ya19jYWxsKCBsb2MsIGd0aWQsIGZvcmtfY29udGV4dF9pbnRlbCwKKyAgICAgICAgICAgIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKHZvaWQgKikgbWljcm90YXNrLCAgICAgICAgICAgICAgIC8vICJ1bndyYXBwZWQiIHRhc2sKKyNlbmRpZgorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChtaWNyb3Rhc2tfdCkgX19rbXBfdGVhbXNfbWFzdGVyLCAvLyAid3JhcHBlZCIgdGFzaworICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChsYXVuY2hfdCkgICAgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciwKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICZhcAorI2Vsc2UKKyAgICAgICAgICAgIGFwCisjZW5kaWYKKyAgICAgICAgICAgICk7CisgICAgX19rbXBfam9pbl9jYWxsKCBsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgLCBmb3JrX2NvbnRleHRfaW50ZWwKKyNlbmRpZgorICAgICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLgorICAgICAgICAgICBvbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IE5VTEw7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX2xldmVsID0gMDsKKyAgICAqKGttcF9pbnQ2NCopKCZ0aGlzX3Roci0+dGgudGhfdGVhbXNfc2l6ZSkgPSAwTDsKKyAgICB2YV9lbmQoIGFwICk7Cit9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvLworLy8gSSBkb24ndCB0aGluayB0aGlzIGZ1bmN0aW9uIHNob3VsZCBldmVyIGhhdmUgYmVlbiBleHBvcnRlZC4KKy8vIFRoZSBfX2ttcGNfIHByZWZpeCB3YXMgbWlzYXBwbGllZC4gIEknbSBmYWlybHkgY2VydGFpbiB0aGF0IG5vIGdlbmVyYXRlZAorLy8gb3Blbm1wIGNvZGUgZXZlciBjYWxsZWQgaXQsIGJ1dCBpdCdzIGJlZW4gZXhwb3J0ZWQgZnJvbSB0aGUgUlRMIGZvciBzbworLy8gbG9uZyB0aGF0IEknbSBhZnJhaWQgdG8gcmVtb3ZlIHRoZSBkZWZpbml0aW9uLgorLy8KK2ludAorX19rbXBjX2ludm9rZV90YXNrX2Z1bmMoIGludCBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfaW52b2tlX3Rhc2tfZnVuYyggZ3RpZCApOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorCitFbnRlciBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgY29uc3RydWN0LiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGhhbmRsZSBhCitjb25kaXRpb25hbCBwYXJhbGxlbCByZWdpb24sIGxpa2UgdGhpcywKK0Bjb2RlCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAoY29uZGl0aW9uKQorQGVuZGNvZGUKK3doZW4gdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4KKyovCit2b2lkCitfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIF9fa21wX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBnbG9iYWxfdGlkKTsgLyogVGhlIGltcGxlbWVudGF0aW9uIGlzIG5vdyBpbiBrbXBfcnVudGltZS5jIHNvIHRoYXQgaXQgY2FuIHNoYXJlIHN0YXRpYyBmdW5jdGlvbnMgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoga21wX2ZvcmtfY2FsbCBzaW5jZSB0aGUgdGFza3MgdG8gYmUgZG9uZSBhcmUgc2ltaWxhciBpbiBlYWNoIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKKworTGVhdmUgYSBzZXJpYWxpemVkIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICp0b3A7CisgICAga21wX2luZm9fdCAqdGhpc190aHI7CisgICAga21wX3RlYW1fdCAqc2VyaWFsX3RlYW07CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsOiBjYWxsZWQgYnkgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvKiBza2lwIGFsbCB0aGlzIGNvZGUgZm9yIGF1dG9wYXIgc2VyaWFsaXplZCBsb29wcyBzaW5jZSBpdCByZXN1bHRzIGluCisgICAgICAgdW5hY2NlcHRhYmxlIG92ZXJoZWFkICovCisgICAgaWYoIGxvYyAhPSBOVUxMICYmIChsb2MtPmZsYWdzICYgS01QX0lERU5UX0FVVE9QQVIgKSApCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE5vdCBhdXRvcGFyIGNvZGUKKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgdGhpc190aHIgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAgc2VyaWFsX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW07CisKKyAgICNpZiBPTVBfNDFfRU5BQkxFRAorICAga21wX3Rhc2tfdGVhbV90ICogICB0YXNrX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtOworCisgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBwcm94eSB0YXNrcyBiZWZvcmUgZmluaXNoaW5nIHRoZSB0aHJlYWQKKyAgIGlmICggdGFza190ZWFtICE9IE5VTEwgJiYgdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyApCisgICAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KHRoaXNfdGhyLCBzZXJpYWxfdGVhbSBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSApOyAvLyBpcyBhbiBJVFQgb2JqZWN0IG5lZWRlZCBoZXJlPworICAgI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSApOworICAgIEtNUF9BU1NFUlQoICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfdGVhbSA9PSBzZXJpYWxfdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtICE9IHRoaXNfdGhyLT50aC50aF9yb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkc1swXSA9PSB0aGlzX3RociApOworCisgICAgLyogSWYgbmVjZXNzYXJ5LCBwb3AgdGhlIGludGVybmFsIGNvbnRyb2wgc3RhY2sgdmFsdWVzIGFuZCByZXBsYWNlIHRoZSB0ZWFtIHZhbHVlcyAqLworICAgIHRvcCA9IHNlcmlhbF90ZWFtIC0+IHQudF9jb250cm9sX3N0YWNrX3RvcDsKKyAgICBpZiAoIHRvcCAmJiB0b3AgLT4gc2VyaWFsX25lc3RpbmdfbGV2ZWwgPT0gc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIGNvcHlfaWN2cyggJnNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzWzBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLCB0b3AgKTsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wID0gdG9wIC0+IG5leHQ7CisgICAgICAgIF9fa21wX2ZyZWUodG9wKTsKKyAgICB9CisKKyAgICAvL2lmKCBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCA+IDEgKQorICAgIHNlcmlhbF90ZWFtIC0+IHQudF9sZXZlbC0tOworCisgICAgLyogcG9wIGRpc3BhdGNoIGJ1ZmZlcnMgc3RhY2sgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyKTsKKyAgICB7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICogZGlzcF9idWZmZXIgPSBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlcjsKKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPQorICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXItPm5leHQ7CisgICAgICAgIF9fa21wX2ZyZWUoIGRpc3BfYnVmZmVyICk7CisgICAgfQorCisgICAgLS0gc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgaWYgKCBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCA9PSAwICkgeworCisgICAgICAgIC8qIHJldHVybiB0byB0aGUgcGFyYWxsZWwgc2VjdGlvbiAqLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgICBpZiAoIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCAmJiBzZXJpYWxfdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgICAgICAgICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCAmc2VyaWFsX3RlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICAgICAgX19rbXBfbG9hZF9teGNzciggJnNlcmlhbF90ZWFtLT50LnRfbXhjc3IgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtICAgICAgICAgICA9IHNlcmlhbF90ZWFtIC0+IHQudF9wYXJlbnQ7CisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfdGlkID0gc2VyaWFsX3RlYW0gLT4gdC50X21hc3Rlcl90aWQ7CisKKyAgICAgICAgLyogcmVzdG9yZSB2YWx1ZXMgY2FjaGVkIGluIHRoZSB0aHJlYWQgKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9ucHJvYyAgICAgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50IC0+IHQudF9ucHJvYzsgICAgICAgICAgLyogIEpQSCAqLworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX21hc3RlciAgICA9IHNlcmlhbF90ZWFtIC0+IHQudF9wYXJlbnQgLT4gdC50X3RocmVhZHNbMF07ICAgICAvKiBKUEggKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9zZXJpYWxpemVkID0gdGhpc190aHIgLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKworICAgICAgICAvKiBUT0RPIHRoZSBiZWxvdyBzaG91bGRuJ3QgbmVlZCB0byBiZSBhZGp1c3RlZCBmb3Igc2VyaWFsaXplZCB0ZWFtcyAqLworICAgICAgICB0aGlzX3RociAtPiB0aC50aF9kaXNwYXRjaCAgICAgICA9ICYgdGhpc190aHIgLT4gdGgudGhfdGVhbSAtPgorICAgICAgICAgICAgdC50X2Rpc3BhdGNoWyBzZXJpYWxfdGVhbSAtPiB0LnRfbWFzdGVyX3RpZCBdOworCisgICAgICAgIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoIHRoaXNfdGhyICk7CisKKyAgICAgICAgS01QX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPSAxOworCisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAvLyBDb3B5IHRoZSB0YXNrIHRlYW0gZnJvbSB0aGUgbmV3IGNoaWxkIC8gb2xkIHBhcmVudCB0ZWFtIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdOworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmVzdG9yaW5nIHRhc2tfdGVhbSAlcCAvIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGhpc190aHIgLT4gdGgudGhfdGFza190ZWFtLCB0aGlzX3RociAtPiB0aC50aF90ZWFtICkgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCBkZWNyZWFzaW5nIG5lc3RpbmcgZGVwdGggb2Ygc2VyaWFsIHRlYW0gJXAgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0sIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0IGN1cl90aW1lID0gMDsKKyNpZiAgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X2dldF90aW1lc3RhbXBfcHRyICkgeworICAgICAgICBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9OT1RJRlkgKi8KKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWwgPT0gMAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICYmIHRoaXNfdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTAorI2VuZGlmCisgICAgKSB7CisgICAgICAgIC8vIFJlcG9ydCB0aGUgYmFycmllcgorICAgICAgICB0aGlzX3Roci0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgIGlmICggKCBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDEgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGdsb2JhbF90aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lX3NlcmlhbGl6ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdGltZSwgMCwgbG9jLCB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYywgMCApOworICAgICAgICAgICAgaWYgKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBiYXJyaWVyIGZyYW1lIGZvciBzZXJpYWxpemVkIHJlZ2lvbiBpcyBlcXVhbCB0byB0aGUgcmVnaW9uIHdlIHVzZSB0aGUgc2FtZSBiZWdpbiB0aW1lc3RhbXAgYXMgZm9yIHRoZSBiYXJyaWVyLgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtLT50LnRfcmVnaW9uX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RpbWUsIDAsIGxvYywgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MsIDIgKTsKKyAgICAgICAgfSBlbHNlIGlmICggKCBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgISBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgKQorICAgICAgICAgICAgLy8gTWFyayB0aGUgZW5kIG9mIHRoZSAicGFyYWxsZWwiIHJlZ2lvbiBmb3IgVlR1bmUuIE9ubHkgdXNlIG9uZSBvZiBmcmFtZSBub3RpZmljYXRpb24gc2NoZW1lIGF0IHRoZSBtb21lbnQuCisgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZCggZ2xvYmFsX3RpZCwgMSApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9wYXJhbGxlbCggZ2xvYmFsX3RpZCwgTlVMTCApOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorCitFeGVjdXRlIDx0dD5mbHVzaDwvdHQ+LiBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGEgZnVsbCBtZW1vcnkgZmVuY2UuIChUaG91Z2gKK2RlcGVuZGluZyBvbiB0aGUgbWVtb3J5IG9yZGVyaW5nIGNvbnZlbnRpb24gb2JleWVkIGJ5IHRoZSBjb21waWxlcgorZXZlbiB0aGF0IG1heSBub3QgYmUgbmVjZXNzYXJ5KS4KKyovCit2b2lkCitfX2ttcGNfZmx1c2goaWRlbnRfdCAqbG9jKQoreworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZmx1c2g6IGNhbGxlZFxuIiApICk7CisKKyAgICAvKiBuZWVkIGV4cGxpY2l0IF9fbWYoKSBoZXJlIHNpbmNlIHVzZSB2b2xhdGlsZSBpbnN0ZWFkIGluIGxpYnJhcnkgKi8KKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICNpZiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKQorICAgICAgICAjaWYgS01QX01JQworICAgICAgICAgICAgLy8gZmVuY2Utc3R5bGUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBleGlzdCwgYnV0IGxvY2s7IHhhZGRsICQwLCglcnNwKSBjYW4gYmUgdXNlZC4KKyAgICAgICAgICAgIC8vIFdlIHNob3VsZG4ndCBuZWVkIGl0LCB0aG91Z2gsIHNpbmNlIHRoZSBBQkkgcnVsZXMgcmVxdWlyZSB0aGF0CisgICAgICAgICAgICAvLyAqIElmIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgTkdPIHN0b3JlcyBpdCBhbHNvIGdlbmVyYXRlcyB0aGUgZmVuY2UKKyAgICAgICAgICAgIC8vICogSWYgdXNlcnMgaGFuZC1jb2RlIE5HTyBzdG9yZXMgdGhleSBzaG91bGQgaW5zZXJ0IHRoZSBmZW5jZQorICAgICAgICAgICAgLy8gdGhlcmVmb3JlIG5vIGluY29tcGxldGUgdW5vcmRlcmVkIHN0b3JlcyBzaG91bGQgYmUgdmlzaWJsZS4KKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIC8vIEM3NDQwNAorICAgICAgICAgICAgLy8gVGhpcyBpcyB0byBhZGRyZXNzIG5vbi10ZW1wb3JhbCBzdG9yZSBpbnN0cnVjdGlvbnMgKHNmZW5jZSBuZWVkZWQpLgorICAgICAgICAgICAgLy8gVGhlIGNsZmx1c2ggaW5zdHJ1Y3Rpb24gaXMgYWRkcmVzc2VkIGVpdGhlciAobWZlbmNlIG5lZWRlZCkuCisgICAgICAgICAgICAvLyBQcm9iYWJseSB0aGUgbm9uLXRlbXBvcmFsIGxvYWQgbW9udnRkcWEgaW5zdHJ1Y3Rpb24gc2hvdWxkIGFsc28gYmUgYWRkcmVzc2VkLgorICAgICAgICAgICAgLy8gbWZlbmNlIGlzIGEgU1NFMiBpbnN0cnVjdGlvbi4gRG8gbm90IGV4ZWN1dGUgaXQgaWYgQ1BVIGlzIG5vdCBTU0UyLgorICAgICAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uaW5pdGlhbGl6ZWQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICYgX19rbXBfY3B1aW5mbyApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLnNzZTIgKSB7CisgICAgICAgICAgICAgICAgLy8gQ1BVIGNhbm5vdCBleGVjdXRlIFNTRTIgaW5zdHJ1Y3Rpb25zLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAjaWYgS01QX0NPTVBJTEVSX0lDQyAKKyAgICAgICAgICAgICAgICBfbW1fbWZlbmNlKCk7CisgICAgICAgICAgICAgICAgI2VsaWYgS01QX0NPTVBJTEVSX01TVkMKKyAgICAgICAgICAgICAgICBNZW1vcnlCYXJyaWVyKCk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0NPTVBJTEVSX0lDQworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgI2VuZGlmIC8vIEtNUF9NSUMKKyAgICAjZWxpZiAoS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIC8vIE5vdGhpbmcgdG8gc2VlIGhlcmUgbW92ZSBhbG9uZworICAgICNlbGlmIEtNUF9BUkNIX1BQQzY0CisgICAgICAgIC8vIE5vdGhpbmcgbmVlZGVkIGhlcmUgKHdlIGhhdmUgYSByZWFsIE1CIGFib3ZlKS4KKyAgICAgICAgI2lmIEtNUF9PU19DTksKKyAgICAgICAgLy8gVGhlIGZsdXNoaW5nIHRocmVhZCBuZWVkcyB0byB5aWVsZCBoZXJlOyB0aGlzIHByZXZlbnRzIGEKKyAgICAgICAvLyBidXN5LXdhaXRpbmcgdGhyZWFkIGZyb20gc2F0dXJhdGluZyB0aGUgcGlwZWxpbmUuIGZsdXNoIGlzCisgICAgICAgICAgLy8gb2Z0ZW4gdXNlZCBpbiBsb29wcyBsaWtlIHRoaXM6CisgICAgICAgICAgIC8vIHdoaWxlICghZmxhZykgeworICAgICAgICAgICAvLyAgICNwcmFnbWEgb21wIGZsdXNoKGZsYWcpCisgICAgICAgICAgIC8vIH0KKyAgICAgICAvLyBhbmQgYWRkaW5nIHRoZSB5aWVsZCBoZXJlIGlzIGdvb2QgZm9yIGF0IGxlYXN0IGEgMTB4IHNwZWVkdXAKKyAgICAgICAgICAvLyB3aGVuIHJ1bm5pbmcgPjIgdGhyZWFkcyBwZXIgY29yZSAob24gdGhlIE5BUyBMVSBiZW5jaG1hcmspLgorICAgICAgICAgICAgX19rbXBfeWllbGQoVFJVRSk7CisgICAgICAgICNlbmRpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorICAgICNlbmRpZgorCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorCitFeGVjdXRlIGEgYmFycmllci4KKyovCit2b2lkCitfX2ttcGNfYmFycmllcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfQkFSUklFUik7CisgICAgS01QX1RJTUVfQkxPQ0soT01QX2JhcnJpZXIpOworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOyAvLyA/Pz8gV2hhdCBkb2VzIGl0IG1lYW4gZm9yIHRoZSB1c2VyPworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoIGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyApOworICAgIH0KKworICAgIF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXS0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgLy8gVE9ETzogZXhwbGljaXQgYmFycmllcl93YWl0X2lkOgorICAgIC8vICAgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiAnYmFycmllcicgZGlyZWN0aXZlIGlzIHByZXNlbnQgb3IKKyAgICAvLyAgIGltcGxpY2l0IGJhcnJpZXIgYXQgdGhlIGVuZCBvZiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdC4KKyAgICAvLyAxKSBiZXR0ZXIgdG8gYWRkIGEgcGVyLXRocmVhZCBiYXJyaWVyIGNvdW50ZXIgdG8gYSB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUKKyAgICAvLyAyKSBzZXQgdG8gMCB3aGVuIGEgbmV3IHRlYW0gaXMgY3JlYXRlZAorICAgIC8vIDQpIG5vIHN5bmMgaXMgcmVxdWlyZWQKKworICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7Cit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIE1BU1RFUiBzZWN0aW9uIGlzIGFsd2F5cyBleHBsaWNpdCAgICovCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0ByZXR1cm4gMSBpZiB0aGlzIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgPHR0Pm1hc3RlcjwvdHQ+IGJsb2NrLCAwIG90aGVyd2lzZS4KKyovCitrbXBfaW50MzIKK19fa21wY19tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX01BU1RFUik7CisgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkgeworICAgICAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX21hc3Rlcik7CisgICAgICAgIHN0YXR1cyA9IDE7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9tYXN0ZXJfYmVnaW4pKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICAqdGhpc190aHIgICAgICAgID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgICAgICAgICAga21wX3RlYW1fdCAgKnRlYW0gICAgICAgICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisKKyAgICAgICAgICAgIGludCAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbikoCisgICAgICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCwgMCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ttcF9jaGVja19zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCwgMCApOworI2Vsc2UKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19rbXBfY2hlY2tfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwgKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorCitNYXJrIHRoZSBlbmQgb2YgYSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgdGhyZWFkCit0aGF0IGV4ZWN1dGVzIHRoZSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLgorKi8KK3ZvaWQKK19fa21wY19lbmRfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSk7CisgICAgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoT01QX21hc3Rlcik7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGttcF9pbmZvX3QgICp0aGlzX3RociAgICAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAga21wX3RlYW1fdCAgKnRlYW0gICAgICAgICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbWFzdGVyX2VuZCkpIHsKKyAgICAgICAgaW50ICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9tYXN0ZXJfZW5kKSgKKyAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBnbG9iYWxfdGlkIDwgMCApCisgICAgICAgICAgICBLTVBfV0FSTklORyggVGhyZWFkSWRlbnRJbnZhbGlkICk7CisKKyAgICAgICAgaWYoIEtNUF9NQVNURVJfR1RJRCggZ2xvYmFsX3RpZCApKQorICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jICk7CisgICAgfQorfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGd0aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorCitTdGFydCBleGVjdXRpb24gb2YgYW4gPHR0Pm9yZGVyZWQ8L3R0PiBjb25zdHJ1Y3QuCisqLwordm9pZAorX19rbXBjX29yZGVyZWQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgY2lkID0gMDsKKyAgICBrbXBfaW5mb190ICp0aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19vcmRlcmVkOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X29yZGVyZWRfcHJlcCggZ3RpZCApOworICAgIC8vIFRPRE86IG9yZGVyZWRfd2FpdF9pZAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8qIE9NUFQgc3RhdGUgdXBkYXRlICovCisgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAodWludDY0X3QpIGxvYzsKKyAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dhaXRfb3JkZXJlZDsKKworICAgICAgICAvKiBPTVBUIGV2ZW50IGNhbGxiYWNrICovCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCkoCisgICAgICAgICAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiAhPSAwICkKKyAgICAgICAgKCp0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24pKCAmIGd0aWQsICYgY2lkLCBsb2MgKTsKKyAgICBlbHNlCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2RlbyggJiBndGlkLCAmIGNpZCwgbG9jICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLyogT01QVCBzdGF0ZSB1cGRhdGUgKi8KKyAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworCisgICAgICAgIC8qIE9NUFQgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX29yZGVyZWQpKAorICAgICAgICAgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X29yZGVyZWRfc3RhcnQoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCisKK0VuZCBleGVjdXRpb24gb2YgYW4gPHR0Pm9yZGVyZWQ8L3R0PiBjb25zdHJ1Y3QuCisqLwordm9pZAorX19rbXBjX2VuZF9vcmRlcmVkKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IGNpZCA9IDA7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9vcmRlcmVkOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCApICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X29yZGVyZWRfZW5kKCBndGlkICk7CisgICAgLy8gVE9ETzogb3JkZXJlZF93YWl0X2lkCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gIT0gMCApCisgICAgICAgICgqdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuKSggJiBndGlkLCAmIGNpZCwgbG9jICk7CisgICAgZWxzZQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9keG8oICYgZ3RpZCwgJiBjaWQsIGxvYyApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKAorICAgICAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCk7CisgICAgfQorI2VuZGlmCit9CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGttcF9jcml0aWNhbF9uYW1lICogY3JpdCwgaWRlbnRfdCBjb25zdCAqIGxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QgdGFnKQoreworICAgIC8vIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBpbmRpcmVjdCBsb2NrIGlzIHdyaXR0ZW4gdG8gY3JpdCwgd2hpbGUgaW5kZXhpbmcgaXMgaWdub3JlZC4KKyAgICB2b2lkICppZHg7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqKmxjazsKKyAgICBsY2sgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKiljcml0OworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IF9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2soJmlkeCwgZ3RpZCwgdGFnKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMoaWxrLCBpbml0KShpbGstPmxvY2spOworICAgIEtNUF9TRVRfSV9MT0NLX0xPQ0FUSU9OKGlsaywgbG9jKTsKKyAgICBLTVBfU0VUX0lfTE9DS19GTEFHUyhpbGssIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyOiBpbml0aWFsaXplZCBpbmRpcmVjdCBsb2NrICMlZFxuIiwgdGFnKSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZyhpbGstPmxvY2ssIGxvYyk7CisjZW5kaWYKKyAgICBpbnQgc3RhdHVzID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihsY2ssIDAsIGlsayk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKGlsay0+bG9jayk7CisjZW5kaWYKKyAgICAgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gZGVzdHJveSB0aGUgdW5jbGFpbWVkIGxvY2sgaGVyZSBzaW5jZSBpdCB3aWxsIGJlIGNsZWFuZWQgdXAgYXQgcHJvZ3JhbSBleGl0LgorICAgICAgICAvL0tNUF9EX0xPQ0tfRlVOQygmaWR4LCBkZXN0cm95KSgoa21wX2R5bmFfbG9ja190ICopJmlkeCk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoKmxjayAhPSBOVUxMKTsKK30KKworLy8gRmFzdC1wYXRoIGFjcXVpcmUgdGFzIGxvY2sKKyNkZWZpbmUgS01QX0FDUVVJUkVfVEFTX0xPQ0sobG9jaywgZ3RpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF90YXNfbG9ja190ICpsID0gKGttcF90YXNfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGwtPmxrLnBvbGwgIT0gS01QX0xPQ0tfRlJFRSh0YXMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykpKSB7ICAgICAgXAorICAgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKGwtPmxrLnBvbGwgIT0gS01QX0xPQ0tfRlJFRSh0YXMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSkpIHsgICBcCisgICAgICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBGYXN0LXBhdGggdGVzdCB0YXMgbG9jaworI2RlZmluZSBLTVBfVEVTVF9UQVNfTE9DSyhsb2NrLCBndGlkLCByYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfdGFzX2xvY2tfdCAqbCA9IChrbXBfdGFzX2xvY2tfdCAqKWxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmMgPSBsLT5say5wb2xsID09IEtNUF9MT0NLX0ZSRUUodGFzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykpOyAgIFwKK30KKworLy8gRmFzdC1wYXRoIHJlbGVhc2UgdGFzIGxvY2sKKyNkZWZpbmUgS01QX1JFTEVBU0VfVEFTX0xPQ0sobG9jaywgZ3RpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRDV180KCgoa21wX3Rhc19sb2NrX3QgKilsb2NrKS0+bGsucG9sbCwgS01QX0xPQ0tfRlJFRSh0YXMpKTsgICBcCisgICAgS01QX01CKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9VU0VfRlVURVgKKworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyMgaWZuZGVmIEZVVEVYX1dBSVQKKyMgIGRlZmluZSBGVVRFWF9XQUlUIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEZVVEVYX1dBS0UKKyMgIGRlZmluZSBGVVRFWF9XQUtFIDEKKyMgZW5kaWYKKworLy8gRmFzdC1wYXRoIGFjcXVpcmUgZnV0ZXggbG9jaworI2RlZmluZSBLTVBfQUNRVUlSRV9GVVRFWF9MT0NLKGxvY2ssIGd0aWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2Z1dGV4X2xvY2tfdCAqZnR4ID0gKGttcF9mdXRleF9sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgZ3RpZF9jb2RlID0gKGd0aWQrMSkgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0ZTWU5DX1BSRVBBUkUoZnR4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgcG9sbF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICgocG9sbF92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoJihmdHgtPmxrLnBvbGwpLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTE9DS19CVVNZKGd0aWRfY29kZSwgZnV0ZXgpKSkgIT0gS01QX0xPQ0tfRlJFRShmdXRleCkpIHsgICAgIFwKKyAgICAgICAga21wX2ludDMyIGNvbmQgPSBLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWNvbmQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMigmKGZ0eC0+bGsucG9sbCksIHBvbGxfdmFsLCBwb2xsX3ZhbCB8IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpKSkgeyAgICAgIFwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwb2xsX3ZhbCB8PSBLTVBfTE9DS19CVVNZKDEsIGZ1dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfaW50MzIgcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgocmMgPSBzeXNjYWxsKF9fTlJfZnV0ZXgsICYoZnR4LT5say5wb2xsKSwgRlVURVhfV0FJVCwgcG9sbF92YWwsIE5VTEwsIE5VTEwsIDApKSAhPSAwKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGd0aWRfY29kZSB8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChmdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEZhc3QtcGF0aCB0ZXN0IGZ1dGV4IGxvY2sKKyNkZWZpbmUgS01QX1RFU1RfRlVURVhfTE9DSyhsb2NrLCBndGlkLCByYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF9mdXRleF9sb2NrX3QgKmZ0eCA9IChrbXBfZnV0ZXhfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgZnV0ZXgpIDw8IDEpKSB7ICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGZ0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByYyA9IFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmMgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEZhc3QtcGF0aCByZWxlYXNlIGZ1dGV4IGxvY2sKKyNkZWZpbmUgS01QX1JFTEVBU0VfRlVURVhfTE9DSyhsb2NrLCBndGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2Z1dGV4X2xvY2tfdCAqZnR4ID0gKGttcF9mdXRleF9sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGZ0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2ludDMyIHBvbGxfdmFsID0gS01QX1hDSEdfRklYRUQzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3lzY2FsbChfX05SX2Z1dGV4LCAmKGZ0eC0+bGsucG9sbCksIEZVVEVYX1dBS0UsIEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpLCBOVUxMLCBOVUxMLCAwKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSk7ICAgICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKK3N0YXRpYyBrbXBfdXNlcl9sb2NrX3AKK19fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0cigga21wX2NyaXRpY2FsX25hbWUgKiBjcml0LCBpZGVudF90IGNvbnN0ICogbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VzZXJfbG9ja19wICpsY2tfcHAgPSAoa21wX3VzZXJfbG9ja19wICopY3JpdDsKKworICAgIC8vCisgICAgLy8gQmVjYXVzZSBvZiB0aGUgZG91YmxlLWNoZWNrLCB0aGUgZm9sbG93aW5nIGxvYWQKKyAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgdm9sYXRpbGUuCisgICAgLy8KKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrID0gKGttcF91c2VyX2xvY2tfcClUQ1JfUFRSKCAqbGNrX3BwICk7CisKKyAgICBpZiAoIGxjayA9PSBOVUxMICkgeworICAgICAgICB2b2lkICogaWR4OworCisgICAgICAgIC8vIEFsbG9jYXRlICYgaW5pdGlhbGl6ZSB0aGUgbG9jay4KKyAgICAgICAgLy8gUmVtZW1iZXIgYWxsb2NhdGVkIGxvY2tzIGluIHRhYmxlIGluIG9yZGVyIHRvIGZyZWUgdGhlbSBpbiBfX2ttcF9jbGVhbnVwKCkKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCAmaWR4LCBndGlkLCBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiApOworICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrICk7CisgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGxjaywgbG9jICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGxjayApOworICAgICAgICAgICAgLy8gX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCkgc2hvdWxkIGJlIGNhbGxlZCAqYmVmb3JlKiB0aGUgZmlyc3QgdXNhZ2Ugb2YgdW5kZXJseWluZworICAgICAgICAgICAgLy8gbG9jay4gSXQgaXMgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2UgY2FuIGd1YXJhbnRlZSBpdC4gVGhlcmUgYXJlIGNoYW5jZXMgdGhlIGxvY2sgd2lsbAorICAgICAgICAgICAgLy8gZGVzdHJveWVkIHdpdGggbm8gdXNhZ2UsIGJ1dCBpdCBpcyBub3QgYSBwcm9ibGVtLCBiZWNhdXNlIHRoaXMgaXMgbm90IHJlYWwgZXZlbnQgc2VlbgorICAgICAgICAgICAgLy8gYnkgdXNlciBidXQgcmF0aGVyIHNldHRpbmcgbmFtZSBmb3Igb2JqZWN0IChsb2NrKS4gU2VlIG1vcmUgZGV0YWlscyBpbiBrbXBfaXR0LmguCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBhIGNtcHhjaGcgaW5zdHJ1Y3Rpb24gdG8gc2xhbSB0aGUgc3RhcnQgb2YgdGhlIGNyaXRpY2FsCisgICAgICAgIC8vIHNlY3Rpb24gd2l0aCB0aGUgbG9jayBwb2ludGVyLiAgSWYgYW5vdGhlciB0aHJlYWQgYmVhdCB1cworICAgICAgICAvLyB0byBpdCwgZGVhbGxvY2F0ZSB0aGUgbG9jaywgYW5kIHVzZSB0aGUgbG9jayB0aGF0IHRoZSBvdGhlcgorICAgICAgICAvLyB0aHJlYWQgYWxsb2NhdGVkLgorICAgICAgICAvLworICAgICAgICBpbnQgc3RhdHVzID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUiggbGNrX3BwLCAwLCBsY2sgKTsKKworICAgICAgICBpZiAoIHN0YXR1cyA9PSAwICkgeworICAgICAgICAgICAgLy8gRGVhbGxvY2F0ZSB0aGUgbG9jayBhbmQgcmVsb2FkIHRoZSB2YWx1ZS4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAvLyBMZXQgSVRUIGtub3cgdGhlIGxvY2sgaXMgZGVzdHJveWVkIGFuZCB0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb24gbWF5IGJlIHJldXNlZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBhbm90aGVyIHB1cnBvc2UuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjayApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUoICZpZHgsIGd0aWQsIGxjayApOworICAgICAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcClUQ1JfUFRSKCAqbGNrX3BwICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsY2s7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0BwYXJhbSBjcml0IGlkZW50aXR5IG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGEgcG9pbnRlciB0byBhIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjcml0aWNhbCBzZWN0aW9uLCBvcgorc29tZSBvdGhlciBzdWl0YWJseSB1bmlxdWUgdmFsdWUuCisKK0VudGVyIGNvZGUgcHJvdGVjdGVkIGJ5IGEgYGNyaXRpY2FsYCBjb25zdHJ1Y3QuCitUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCB0aGUgZXhlY3V0aW5nIHRocmVhZCBjYW4gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24uCisqLwordm9pZAorX19rbXBjX2NyaXRpY2FsKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiBjcml0ICkKK3sKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQobG9jLCBnbG9iYWxfdGlkLCBjcml0LCBvbXBfbG9ja19oaW50X25vbmUpOworI2Vsc2UKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0NSSVRJQ0FMKTsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jcml0aWNhbDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgLy9UT0RPOiBhZGQgVEhSX09WSERfU1RBVEUKKworICAgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfQ1JJVElDQUxfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7IC8vIHRpY2tldCwgcXVldWluZyBvciBkcmRwYQorICAgICAgICBsY2sgPSBfX2ttcF9nZXRfY3JpdGljYWxfc2VjdGlvbl9wdHIoIGNyaXQsIGxvYywgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2sgKTsKKworICAgIC8qIHNpbmNlIHRoZSBjcml0aWNhbCBkaXJlY3RpdmUgYmluZHMgdG8gYWxsIHRocmVhZHMsIG5vdCBqdXN0CisgICAgICogdGhlIGN1cnJlbnQgdGVhbSB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMgZXZlbiBpZiB3ZSBhcmUgaW4gYQorICAgICAqIHNlcmlhbGl6ZWQgdGVhbSAqLworICAgIC8qIGFsc28sIGV2ZW4gaWYgd2UgYXJlIHRoZSB1YmVyIHRocmVhZCwgd2Ugc3RpbGwgaGF2ZSB0byBjb25kdWN0IHRoZSBsb2NrLAorICAgICAqIGFzIHdlIGhhdmUgdG8gY29udGVuZCB3aXRoIHNpYmxpbmcgdGhyZWFkcyAqLworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZGlyZWN0aXZlLgorICAgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEtBX1RSQUNFKCAxNSwgKCJfX2ttcGNfY3JpdGljYWw6IGRvbmUgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLy8gQ29udmVydHMgdGhlIGdpdmVuIGhpbnQgdG8gYW4gaW50ZXJuYWwgbG9jayBpbXBsZW1lbnRhdGlvbgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2R5bmFfbG9ja3NlcV90CitfX2ttcF9tYXBfaGludF90b19sb2NrKHVpbnRwdHJfdCBoaW50KQoreworI2lmIEtNUF9VU0VfVFNYCisjIGRlZmluZSBLTVBfVFNYX0xPQ0soc2VxKSBsb2Nrc2VxXyMjc2VxCisjZWxzZQorIyBkZWZpbmUgS01QX1RTWF9MT0NLKHNlcSkgX19rbXBfdXNlcl9sb2NrX3NlcQorI2VuZGlmCisgICAgLy8gSGludHMgdGhhdCBkbyBub3QgcmVxdWlyZSBmdXJ0aGVyIGxvZ2ljCisgICAgaWYgKGhpbnQgJiBrbXBfbG9ja19oaW50X2hsZSkKKyAgICAgICAgcmV0dXJuIEtNUF9UU1hfTE9DSyhobGUpOworICAgIGlmIChoaW50ICYga21wX2xvY2tfaGludF9ydG0pCisgICAgICAgIHJldHVybiAoX19rbXBfY3B1aW5mby5ydG0pPyBLTVBfVFNYX0xPQ0socnRtKTogX19rbXBfdXNlcl9sb2NrX3NlcTsKKyAgICBpZiAoaGludCAmIGttcF9sb2NrX2hpbnRfYWRhcHRpdmUpCisgICAgICAgIHJldHVybiAoX19rbXBfY3B1aW5mby5ydG0pPyBLTVBfVFNYX0xPQ0soYWRhcHRpdmUpOiBfX2ttcF91c2VyX2xvY2tfc2VxOworCisgICAgLy8gUnVsZSBvdXQgY29uZmxpY3RpbmcgaGludHMgZmlyc3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0IGxvY2sKKyAgICBpZiAoKGhpbnQgJiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCkgJiYgKGhpbnQgJiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkKSkKKyAgICAgICAgcmV0dXJuIF9fa21wX3VzZXJfbG9ja19zZXE7CisgICAgaWYgKChoaW50ICYgb21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSkgJiYgKGhpbnQgJiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlKSkKKyAgICAgICAgcmV0dXJuIF9fa21wX3VzZXJfbG9ja19zZXE7CisKKyAgICAvLyBEbyBub3QgZXZlbiBjb25zaWRlciBzcGVjdWxhdGlvbiB3aGVuIGl0IGFwcGVhcnMgdG8gYmUgY29udGVuZGVkCisgICAgaWYgKGhpbnQgJiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCkKKyAgICAgICAgcmV0dXJuIGxvY2tzZXFfcXVldWluZzsKKworICAgIC8vIFVuY29udGVuZGVkIGxvY2sgd2l0aG91dCBzcGVjdWxhdGlvbgorICAgIGlmICgoaGludCAmIG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQpICYmICEoaGludCAmIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpKQorICAgICAgICByZXR1cm4gbG9ja3NlcV90YXM7CisKKyAgICAvLyBITEUgbG9jayBmb3Igc3BlY3VsYXRpb24KKyAgICBpZiAoaGludCAmIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpCisgICAgICAgIHJldHVybiBLTVBfVFNYX0xPQ0soaGxlKTsKKworICAgIHJldHVybiBfX2ttcF91c2VyX2xvY2tfc2VxOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorQHBhcmFtIGNyaXQgaWRlbnRpdHkgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sCitvciBzb21lIG90aGVyIHN1aXRhYmx5IHVuaXF1ZSB2YWx1ZS4KK0BwYXJhbSBoaW50IHRoZSBsb2NrIGhpbnQuCisKK0VudGVyIGNvZGUgcHJvdGVjdGVkIGJ5IGEgYGNyaXRpY2FsYCBjb25zdHJ1Y3Qgd2l0aCBhIGhpbnQuIFRoZSBoaW50IHZhbHVlIGlzIHVzZWQgdG8gc3VnZ2VzdCBhIGxvY2sgaW1wbGVtZW50YXRpb24uCitUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCB0aGUgZXhlY3V0aW5nIHRocmVhZCBjYW4gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdW5sZXNzIHRoZSBoaW50IHN1Z2dlc3RzIHVzZSBvZgorc3BlY3VsYXRpdmUgZXhlY3V0aW9uIGFuZCB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQuCisqLwordm9pZAorX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCwgdWludHB0cl90IGhpbnQgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfQ1JJVElDQUwpOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBrbXBfZHluYV9sb2NrX3QgKmxrID0gKGttcF9keW5hX2xvY2tfdCAqKWNyaXQ7CisgICAgLy8gQ2hlY2sgaWYgaXQgaXMgaW5pdGlhbGl6ZWQuCisgICAgaWYgKCpsayA9PSAwKSB7CisgICAgICAgIGttcF9keW5hX2xvY2tzZXFfdCBsY2tzZXEgPSBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpOworICAgICAgICBpZiAoS01QX0lTX0RfTE9DSyhsY2tzZXEpKSB7CisgICAgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKWNyaXQsIDAsIEtNUF9HRVRfRF9UQUcobGNrc2VxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGNyaXQsIGxvYywgZ2xvYmFsX3RpZCwgS01QX0dFVF9JX1RBRyhsY2tzZXEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBCcmFuY2ggZm9yIGFjY2Vzc2luZyB0aGUgYWN0dWFsIGxvY2sgb2JqZWN0IGFuZCBzZXQgb3BlcmF0aW9uLiBUaGlzIGJyYW5jaGluZyBpcyBpbmV2aXRhYmxlIHNpbmNlCisgICAgLy8gdGhpcyBsb2NrIGluaXRpYWxpemF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgbm9ybWFsIGRpc3BhdGNoIHBhdGggKGxvY2sgdGFibGUgaXMgbm90IHVzZWQpLgorICAgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyhsaykgIT0gMCkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWxrOworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYywgbGNrLCBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKKyAgICAgICAgfQorIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcobGNrKTsKKyMgZW5kaWYKKyMgaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgICAgICBpZiAoX19rbXBfdXNlcl9sb2NrX3NlcSA9PSBsb2Nrc2VxX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9UQVNfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICAgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV9mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9GVVRFWF9MT0NLKGxjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0gZWxzZQorIyBlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBLTVBfRF9MT0NLX0ZVTkMobGssIHNldCkobGssIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKilsayk7CisgICAgICAgIGxjayA9IGlsay0+bG9jazsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7CisgICAgICAgIH0KKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKGxjayk7CisjIGVuZGlmCisgICAgICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIHNldCkobGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLQV9UUkFDRSggMTUsICgiX19rbXBjX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7Cit9IC8vIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorQHBhcmFtIGNyaXQgaWRlbnRpdHkgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sIG9yCitzb21lIG90aGVyIHN1aXRhYmx5IHVuaXF1ZSB2YWx1ZS4KKworTGVhdmUgYSBjcml0aWNhbCBzZWN0aW9uLCByZWxlYXNpbmcgYW55IGxvY2sgdGhhdCB3YXMgaGVsZCBkdXJpbmcgaXRzIGV4ZWN1dGlvbi4KKyovCit2b2lkCitfX2ttcGNfZW5kX2NyaXRpY2FsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpjcml0KQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9jcml0aWNhbDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGlmIChLTVBfSVNfRF9MT0NLKF9fa21wX3VzZXJfbG9ja19zZXEpKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICAgICAgS01QX0FTU0VSVChsY2sgIT0gTlVMTCk7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MpOworICAgICAgICB9CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyggbGNrICk7CisjIGVuZGlmCisjIGlmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICAgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV90YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgS01QX1JFTEVBU0VfVEFTX0xPQ0sobGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfSBlbHNlCisjIGVsaWYgS01QX1VTRV9JTkxJTkVEX0ZVVEVYCisgICAgICAgIGlmIChfX2ttcF91c2VyX2xvY2tfc2VxID09IGxvY2tzZXFfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgS01QX1JFTEVBU0VfRlVURVhfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9IGVsc2UKKyMgZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0RfTE9DS19GVU5DKGxjaywgdW5zZXQpKChrbXBfZHluYV9sb2NrX3QgKilsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilUQ1JfUFRSKCooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopY3JpdCkpOworICAgICAgICBLTVBfQVNTRVJUKGlsayAhPSBOVUxMKTsKKyAgICAgICAgbGNrID0gaWxrLT5sb2NrOworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jKTsKKyAgICAgICAgfQorIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGxjayApOworIyBlbmRpZgorICAgICAgICBLTVBfSV9MT0NLX0ZVTkMoaWxrLCB1bnNldCkobGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0NSSVRJQ0FMX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsgLy8gdGlja2V0LCBxdWV1aW5nIG9yIGRyZHBhCisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIFRDUl9QVFIoKigoa21wX3VzZXJfbG9ja19wICopY3JpdCkpOworICAgIH0KKworICAgIEtNUF9BU1NFUlQobGNrICE9IE5VTEwpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZGlyZWN0aXZlLgorICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwpKAorICAgICAgICAgICAgKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIEtBX1RSQUNFKCAxNSwgKCJfX2ttcGNfZW5kX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorQHJldHVybiBvbmUgaWYgdGhlIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgbWFzdGVyIGJsb2NrLCB6ZXJvIG90aGVyd2lzZQorCitTdGFydCBleGVjdXRpb24gb2YgYSBjb21iaW5lZCBiYXJyaWVyIGFuZCBtYXN0ZXIuIFRoZSBiYXJyaWVyIGlzIGV4ZWN1dGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorKi8KK2ttcF9pbnQzMgorX19rbXBjX2JhcnJpZXJfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoIGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyApOworCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgIHN0YXR1cyA9IF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIFRSVUUsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIHJldHVybiAoc3RhdHVzICE9IDApID8gMCA6IDE7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorCitDb21wbGV0ZSB0aGUgZXhlY3V0aW9uIG9mIGEgY29tYmluZWQgYmFycmllciBhbmQgbWFzdGVyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgdGhlIDx0dD5tYXN0ZXI8L3R0PiBjb2RlLiBPdGhlciB0aHJlYWRzIHdpbGwKK3N0aWxsIGJlIHdhaXRpbmcgYXQgdGhlIGJhcnJpZXIgYW5kIHRoaXMgY2FsbCByZWxlYXNlcyB0aGVtLgorKi8KK3ZvaWQKK19fa21wY19lbmRfYmFycmllcl9tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciAoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCitAcmV0dXJuIG9uZSBpZiB0aGUgdGhyZWFkIHNob3VsZCBleGVjdXRlIHRoZSBtYXN0ZXIgYmxvY2ssIHplcm8gb3RoZXJ3aXNlCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhIGNvbWJpbmVkIGJhcnJpZXIgYW5kIG1hc3Rlcihub3dhaXQpIGNvbnN0cnVjdC4KK1RoZSBiYXJyaWVyIGlzIGV4ZWN1dGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorVGhlcmUgaXMgbm8gZXF1aXZhbGVudCAiZW5kIiBmdW5jdGlvbiwgc2luY2UgdGhlCisqLwora21wX2ludDMyCitfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0KCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAga21wX2ludDMyIHJldDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0OiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsb2MgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDb25zdHJ1Y3RJZGVudEludmFsaWQgKTsgLy8gPz8/IFdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgdXNlcj8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9jaGVja19iYXJyaWVyKCBnbG9iYWxfdGlkLCBjdF9iYXJyaWVyLCBsb2MgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIHJldCA9IF9fa21wY19tYXN0ZXIgKGxvYywgZ2xvYmFsX3RpZCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgLyogIHRoZXJlJ3Mgbm8gX19rbXBjX2VuZF9tYXN0ZXIgY2FsbGVkOyBzbyB0aGUgKHN0YXRzKSAqLworICAgICAgICAvKiAgYWN0aW9ucyBvZiBfX2ttcGNfZW5kX21hc3RlciBhcmUgZG9uZSBoZXJlICAgICAgICAgICovCisKKyAgICAgICAgaWYgKCBnbG9iYWxfdGlkIDwgMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBUaHJlYWRJZGVudEludmFsaWQgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAvKiBvbmx5IG9uZSB0aHJlYWQgc2hvdWxkIGRvIHRoZSBwb3Agc2luY2Ugb25seSAqLworICAgICAgICAgICAgLyogb25lIGRpZCB0aGUgcHVzaCAoc2VlIF9fa21wY19tYXN0ZXIoKSkgICAgICAgKi8KKworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHJldCk7Cit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIFNJTkdMRSBwcm9jZXNzIHNlY3Rpb24gaXMgYWx3YXlzIGV4cGxpY2l0ICAgKi8KKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHJldHVybiBPbmUgaWYgdGhpcyB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIHNpbmdsZSBjb25zdHJ1Y3QsIHplcm8gb3RoZXJ3aXNlLgorCitUZXN0IHdoZXRoZXIgdG8gZXhlY3V0ZSBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuCitUaGVyZSBhcmUgbm8gaW1wbGljaXQgYmFycmllcnMgaW4gdGhlIHR3byAic2luZ2xlIiBjYWxscywgcmF0aGVyIHRoZSBjb21waWxlciBzaG91bGQKK2ludHJvZHVjZSBhbiBleHBsaWNpdCBiYXJyaWVyIGlmIGl0IGlzIHJlcXVpcmVkLgorKi8KKwora21wX2ludDMyCitfX2ttcGNfc2luZ2xlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9TSU5HTEUpOworICAgIGttcF9pbnQzMiByYyA9IF9fa21wX2VudGVyX3NpbmdsZSggZ2xvYmFsX3RpZCwgbG9jLCBUUlVFICk7CisgICAgaWYocmMgPT0gVFJVRSkgeworICAgICAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3NpbmdsZSk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociAgICAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4pKAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ubWljcm90YXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbikpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbikoCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9zaW5nbGU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByYzsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK01hcmsgdGhlIGVuZCBvZiBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuICBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IGV4ZWN1dGVkIHRoZSBibG9jayBvZiBjb2RlIHByb3RlY3RlZAorYnkgdGhlIGBzaW5nbGVgIGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3NpbmdsZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIF9fa21wX2V4aXRfc2luZ2xlKCBnbG9iYWxfdGlkICk7CisgICAgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoT01QX3NpbmdsZSk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyICAgICAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtICAgICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCkoCisgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBHbG9iYWwgdGhyZWFkIGlkCisKK01hcmsgdGhlIGVuZCBvZiBhIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfZmluaSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2ZpbmkgY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9lbmQpKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgICAgICBrbXBfdGVhbV90ICp0ZWFtICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisgICAgICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfZW5kKSgKKyAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF9wZG8sIGxvYyApOworfQorCisvKgorICogVXNlciByb3V0aW5lcyB3aGljaCB0YWtlIEMtc3R5bGUgYXJndW1lbnRzIChjYWxsIGJ5IHZhbHVlKQorICogZGlmZmVyZW50IGZyb20gdGhlIEZvcnRyYW4gZXF1aXZhbGVudCByb3V0aW5lcworICovCisKK3ZvaWQKK29tcGNfc2V0X251bV90aHJlYWRzKCBpbnQgYXJnICkKK3sKKy8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgICAgX19rbXBfc2V0X251bV90aHJlYWRzKCBhcmcsIF9fa21wX2VudHJ5X2d0aWQoKSApOworfQorCit2b2lkCitvbXBjX3NldF9keW5hbWljKCBpbnQgZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgc2V0X19keW5hbWljKCB0aHJlYWQsIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKK30KKwordm9pZAorb21wY19zZXRfbmVzdGVkKCBpbnQgZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX25lc3RlZCggdGhyZWFkLCBmbGFnID8gVFJVRSA6IEZBTFNFICk7Cit9CisKK3ZvaWQKK29tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgbWF4X2FjdGl2ZV9sZXZlbHMgKQoreworICAgIC8qIFRPIERPICovCisgICAgLyogd2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKworICAgIC8qIEZvciB0aGUgcGVyLXRocmVhZCBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpLCBtYXhfYWN0aXZlX2xldmVscyApOworfQorCit2b2lkCitvbXBjX3NldF9zY2hlZHVsZSggb21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkKK3sKKy8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgICAgX19rbXBfc2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksICgga21wX3NjaGVkX3QgKSBraW5kLCBtb2RpZmllciApOworfQorCitpbnQKK29tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIGludCBsZXZlbCApCit7CisgICAgcmV0dXJuIF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBfX2ttcF9lbnRyeV9ndGlkKCksIGxldmVsICk7Cit9CisKK2ludAorb21wY19nZXRfdGVhbV9zaXplKCBpbnQgbGV2ZWwgKQoreworICAgIHJldHVybiBfX2ttcF9nZXRfdGVhbV9zaXplKCBfX2ttcF9lbnRyeV9ndGlkKCksIGxldmVsICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApCit7CisgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIGFyZyApOworfQorCit2b2lkCitrbXBjX3NldF9zdGFja3NpemVfcyggc2l6ZV90IGFyZyApCit7CisgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIGFyZyApOworfQorCit2b2lkCitrbXBjX3NldF9ibG9ja3RpbWUoIGludCBhcmcgKQoreworICAgIGludCBndGlkLCB0aWQ7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICBfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSggYXJnLCB0aHJlYWQsIHRpZCApOworfQorCit2b2lkCitrbXBjX3NldF9saWJyYXJ5KCBpbnQgYXJnICkKK3sKKyAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIChlbnVtIGxpYnJhcnlfdHlwZSlhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfZGVmYXVsdHMoIGNoYXIgY29uc3QgKiBzdHIgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggc3RyLCBLTVBfU1RSTEVOKCBzdHIgKSApOworfQorCitpbnQKK2ttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworaW50CitrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIHByb2MsIG1hc2sgKTsKKyNlbmRpZgorfQorCitpbnQKK2ttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAaW5ncm91cCBUSFJFQURQUklWQVRFCitAcGFyYW0gbG9jICAgICAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGd0aWQgICAgICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIGNweV9zaXplICBzaXplIG9mIHRoZSBjcHlfZGF0YSBidWZmZXIKK0BwYXJhbSBjcHlfZGF0YSAgcG9pbnRlciB0byBkYXRhIHRvIGJlIGNvcGllZAorQHBhcmFtIGNweV9mdW5jICBoZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBmb3IgY29weWluZyBkYXRhCitAcGFyYW0gZGlkaXQgICAgIGZsYWcgdmFyaWFibGU6IDE9c2luZ2xlIHRocmVhZDsgMD1ub3Qgc2luZ2xlIHRocmVhZAorCitfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgcHJpdmF0ZSBkYXRhIGJyb2FkY2FzdCBuZWVkZWQgZm9yCit0aGUgY29weXByaXZhdGUgY2xhdXNlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSByZWdpb24gaW4gYW4gT3Blbk1QPHN1cD4qPC9zdXA+IHByb2dyYW0gKGJvdGggQyBhbmQgRm9ydHJhbikuCitBbGwgdGhyZWFkcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBwYXJhbGxlbCByZWdpb24gY2FsbCB0aGlzIHJvdXRpbmUuCitPbmUgb2YgdGhlIHRocmVhZHMgKGNhbGxlZCB0aGUgc2luZ2xlIHRocmVhZCkgc2hvdWxkIGhhdmUgdGhlIDx0dD5kaWRpdDwvdHQ+IHZhcmlhYmxlIHNldCB0byAxCithbmQgYWxsIG90aGVyIHRocmVhZHMgc2hvdWxkIGhhdmUgdGhhdCB2YXJpYWJsZSBzZXQgdG8gMC4KK0FsbCB0aHJlYWRzIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBidWZmZXIgKGNweV9kYXRhKSB0aGF0IHRoZXkgaGF2ZSBidWlsdC4KKworVGhlIE9wZW5NUCBzcGVjaWZpY2F0aW9uIGZvcmJpZHMgdGhlIHVzZSBvZiBub3dhaXQgb24gdGhlIHNpbmdsZSByZWdpb24gd2hlbiBhIGNvcHlwcml2YXRlCitjbGF1c2UgaXMgcHJlc2VudC4gSG93ZXZlciwgQHJlZiBfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyBhIGJhcnJpZXIgaW50ZXJuYWxseSB0byBhdm9pZAorcmFjZSBjb25kaXRpb25zLCBzbyB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciB0aGUgc2luZ2xlIHJlZ2lvbiBzaG91bGQgYXZvaWQgZ2VuZXJhdGluZyBhIGJhcnJpZXIKK2FmdGVyIHRoZSBjYWxsIHRvIEByZWYgX19rbXBjX2NvcHlwcml2YXRlLgorCitUaGUgPHR0Pmd0aWQ8L3R0PiBwYXJhbWV0ZXIgaXMgdGhlIGdsb2JhbCB0aHJlYWQgaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK1RoZSA8dHQ+bG9jPC90dD4gcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCisKK0ludGVybmFsIGltcGxlbWVudGF0aW9uOiBUaGUgc2luZ2xlIHRocmVhZCB3aWxsIGZpcnN0IGNvcHkgaXRzIGRlc2NyaXB0b3IgYWRkcmVzcyAoY3B5X2RhdGEpCit0byBhIHRlYW0tcHJpdmF0ZSBsb2NhdGlvbiwgdGhlbiB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGVhY2ggY2FsbCB0aGUgZnVuY3Rpb24gcG9pbnRlZCB0byBieQordGhlIHBhcmFtZXRlciBjcHlfZnVuYywgd2hpY2ggY2FycmllcyBvdXQgdGhlIGNvcHkgYnkgY29weWluZyB0aGUgZGF0YSB1c2luZyB0aGUgY3B5X2RhdGEgYnVmZmVyLgorCitUaGUgY3B5X2Z1bmMgcm91dGluZSB1c2VkIGZvciB0aGUgY29weSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIGFyZWEgZGVmaW5lZCBieSBjcHlfZGF0YQorYW5kIGNweV9zaXplIG1heSBiZSBidWlsdCBpbiBhbnkgZmFzaGlvbiB0aGF0IHdpbGwgYWxsb3cgdGhlIGNvcHkgdG8gYmUgZG9uZS4gRm9yIGluc3RhbmNlLAordGhlIGNweV9kYXRhIGJ1ZmZlciBjYW4gaG9sZCB0aGUgYWN0dWFsIGRhdGEgdG8gYmUgY29waWVkIG9yIGl0IG1heSBob2xkIGEgbGlzdCBvZiBwb2ludGVycwordG8gdGhlIGRhdGEuIFRoZSBjcHlfZnVuYyByb3V0aW5lIG11c3QgaW50ZXJwcmV0IHRoZSBjcHlfZGF0YSBidWZmZXIgYXBwcm9wcmlhdGVseS4KKworVGhlIGludGVyZmFjZSB0byBjcHlfZnVuYyBpcyBhcyBmb2xsb3dzOgorQGNvZGUKK3ZvaWQgY3B5X2Z1bmMoIHZvaWQgKmRlc3RpbmF0aW9uLCB2b2lkICpzb3VyY2UgKQorQGVuZGNvZGUKK3doZXJlIHZvaWQgKmRlc3RpbmF0aW9uIGlzIHRoZSBjcHlfZGF0YSBwb2ludGVyIGZvciB0aGUgdGhyZWFkIGJlaW5nIGNvcGllZCB0bworYW5kIHZvaWQgKnNvdXJjZSBpcyB0aGUgY3B5X2RhdGEgcG9pbnRlciBmb3IgdGhlIHRocmVhZCBiZWluZyBjb3BpZWQgZnJvbS4KKyovCit2b2lkCitfX2ttcGNfY29weXByaXZhdGUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHNpemVfdCBjcHlfc2l6ZSwgdm9pZCAqY3B5X2RhdGEsIHZvaWQoKmNweV9mdW5jKSh2b2lkKix2b2lkKiksIGttcF9pbnQzMiBkaWRpdCApCit7CisgICAgdm9pZCAqKmRhdGFfcHRyOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jb3B5cHJpdmF0ZTogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICBLTVBfTUIoKTsKKworICAgIGRhdGFfcHRyID0gJiBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApLT50LnRfY29weXByaXZfZGF0YTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVG9EbzogT3B0aW1pemUgdGhlIGZvbGxvd2luZyB0d28gYmFycmllcnMgaW50byBzb21lIGtpbmQgb2Ygc3BsaXQgYmFycmllciAqLworCisgICAgaWYgKGRpZGl0KSAqZGF0YV9wdHIgPSBjcHlfZGF0YTsKKworICAgIC8qIFRoaXMgYmFycmllciBpcyBub3QgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSAqLworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIGlmICghIGRpZGl0KSAoKmNweV9mdW5jKSggY3B5X2RhdGEsICpkYXRhX3B0ciApOworCisgICAgLyogQ29uc2lkZXIgbmV4dCBiYXJyaWVyIHRoZSB1c2VyLXZpc2libGUgYmFycmllciBmb3IgYmFycmllciByZWdpb24gYm91bmRhcmllcyAqLworICAgIC8qIE5lc3RpbmcgY2hlY2tzIGFyZSBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHNpbmdsZSBjb25zdHJ1Y3QgY2hlY2tzICovCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOyAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBuZWVkZWQgKGUuZy4gdGFza3MgY2FuIG92ZXJ3cml0ZSB0aGUgbG9jYXRpb24pCisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBJTklUX0xPQ0sgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIElOSVRfTkVTVEVEX0xPQ0sgICAgICAgICAgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIEFDUVVJUkVfTE9DSyAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgQUNRVUlSRV9MT0NLX1RJTUVEICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLX1RJTUVEIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBSRUxFQVNFX0xPQ0sgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFJFTEVBU0VfTkVTVEVEX0xPQ0sgICAgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFRFU1RfTE9DSyAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgVEVTVF9ORVNURURfTE9DSyAgICAgICAgICBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgREVTVFJPWV9MT0NLICAgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBERVNUUk9ZX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworCisKKy8qCisgKiBUT0RPOiBNYWtlIGNoZWNrIGFib3J0IG1lc3NhZ2VzIHVzZSBsb2NhdGlvbiBpbmZvICYgcGFzcyBpdAorICogaW50byB3aXRoX2NoZWNrcyByb3V0aW5lcworICovCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBpbnRlcm5hbCBsb2NrIGluaXRpYWxpemVyCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywgdm9pZCAqKmxvY2ssIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpCit7CisgICAgaWYgKEtNUF9JU19EX0xPQ0soc2VxKSkgeworICAgICAgICBLTVBfSU5JVF9EX0xPQ0sobG9jaywgc2VxKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKChrbXBfdXNlcl9sb2NrX3ApbG9jaywgTlVMTCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfSU5JVF9JX0xPQ0sobG9jaywgc2VxKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyhpbGstPmxvY2ssIGxvYyk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8vIGludGVybmFsIG5lc3QgbG9jayBpbml0aWFsaXplcgorc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywgdm9pZCAqKmxvY2ssIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpCit7CisjaWYgS01QX1VTRV9UU1gKKyAgICAvLyBEb24ndCBoYXZlIG5lc3RlZCBsb2NrIGltcGxlbWVudGF0aW9uIGZvciBzcGVjdWxhdGl2ZSBsb2NrcworICAgIGlmIChzZXEgPT0gbG9ja3NlcV9obGUgfHwgc2VxID09IGxvY2tzZXFfcnRtIHx8IHNlcSA9PSBsb2Nrc2VxX2FkYXB0aXZlKQorICAgICAgICBzZXEgPSBfX2ttcF91c2VyX2xvY2tfc2VxOworI2VuZGlmCisgICAgc3dpdGNoIChzZXEpIHsKKyAgICAgICAgY2FzZSBsb2Nrc2VxX3RhczoKKyAgICAgICAgICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3RhczsKKyAgICAgICAgICAgIGJyZWFrOworI2lmIEtNUF9VU0VfRlVURVgKKyAgICAgICAgY2FzZSBsb2Nrc2VxX2Z1dGV4OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfZnV0ZXg7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIGxvY2tzZXFfdGlja2V0OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfdGlja2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbG9ja3NlcV9xdWV1aW5nOgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfcXVldWluZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGxvY2tzZXFfZHJkcGE6CisgICAgICAgICAgICBzZXEgPSBsb2Nrc2VxX25lc3RlZF9kcmRwYTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfcXVldWluZzsKKyAgICB9CisgICAgS01QX0lOSVRfSV9MT0NLKGxvY2ssIHNlcSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKGlsay0+bG9jaywgbG9jKTsKKyNlbmRpZgorfQorCisvKiBpbml0aWFsaXplIHRoZSBsb2NrIHdpdGggYSBoaW50ICovCit2b2lkCitfX2ttcGNfaW5pdF9sb2NrX3dpdGhfaGludChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCAib21wX2luaXRfbG9ja193aXRoX2hpbnQiKTsKKyAgICB9CisKKyAgICBfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayB3aXRoIGEgaGludCAqLwordm9pZAorX19rbXBjX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCAib21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCIpOworICAgIH0KKworICAgIF9fa21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkCitfX2ttcGNfaW5pdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiB1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgIm9tcF9pbml0X2xvY2siKTsKKyAgICB9CisgICAgX19rbXBfaW5pdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2luaXRfbG9jayI7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdXNlcl9sb2NrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggdXNlcl9sb2NrLCBndGlkLCAwICk7CisgICAgfQorICAgIElOSVRfTE9DSyggbGNrICk7CisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrLCBsb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW5pdF9sb2NrKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW5pdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9IC8vIF9fa21wY19pbml0X2xvY2sKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX2luaXRfbmVzdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgdXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsICJvbXBfaW5pdF9uZXN0X2xvY2siKTsKKyAgICB9CisgICAgX19rbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF91c2VyX2xvY2tfc2VxKTsKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfaW5pdF9uZXN0X2xvY2siOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHVzZXJfbG9jayA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB1c2VyX2xvY2ssIGd0aWQsIDAgKTsKKyAgICB9CisKKyAgICBJTklUX05FU1RFRF9MT0NLKCBsY2sgKTsKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2ssIGxvYyApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbml0X25lc3RfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9IC8vIF9fa21wY19pbml0X25lc3RfbG9jaworCit2b2lkCitfX2ttcGNfZGVzdHJveV9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworIyBpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBpZiAoS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKSA9PSAwKSB7CisgICAgICAgIGxjayA9ICgoa21wX2luZGlyZWN0X2xvY2tfdCAqKUtNUF9MT09LVVBfSV9MT0NLKHVzZXJfbG9jaykpLT5sb2NrOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyAgICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQobGNrKTsKKyMgZW5kaWYKKyAgICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCBkZXN0cm95KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrKTsKKyNlbHNlCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9sb2NrIiApOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgREVTVFJPWV9MT0NLKCBsY2sgKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19mcmVlKCB1c2VyX2xvY2ssIGd0aWQsIGxjayApOworICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfZGVzdHJveV9sb2NrCisKKy8qIGRlc3Ryb3kgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY19kZXN0cm95X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKHVzZXJfbG9jayk7CisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKGlsay0+bG9jayk7CisjIGVuZGlmCisgICAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgZGVzdHJveSkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jayk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBERVNUUk9ZX05FU1RFRF9MT0NLKCBsY2sgKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19mcmVlKCB1c2VyX2xvY2ssIGd0aWQsIGxjayApOworICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2sKKwordm9pZAorX19rbXBjX3NldF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9zZXRfbG9jayk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgdGFnID0gS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsgLy8gaXR0IGZ1bmN0aW9uIHdpbGwgZ2V0IHRvIHRoZSByaWdodCBsb2NrIG9iamVjdC4KKyMgZW5kaWYKKyMgaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgIGlmICh0YWcgPT0gbG9ja3RhZ190YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfQUNRVUlSRV9UQVNfTE9DSyh1c2VyX2xvY2ssIGd0aWQpOworICAgIH0gZWxzZQorIyBlbGlmIEtNUF9VU0VfSU5MSU5FRF9GVVRFWAorICAgIGlmICh0YWcgPT0gbG9ja3RhZ19mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9BQ1FVSVJFX0ZVVEVYX0xPQ0sodXNlcl9sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyMgZW5kaWYKKyAgICB7CisgICAgICAgIF9fa21wX2RpcmVjdF9zZXRbdGFnXSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyAgICB9CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF9zZXRfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBBQ1FVSVJFX0xPQ0soIGxjaywgZ3RpZCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2spKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCit2b2lkCitfX2ttcGNfc2V0X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisgICAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgc2V0KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIG1pc3Npbmcgc3VwcG9ydCBoZXJlOiBuZWVkIHRvIGtub3cgd2hldGhlciBhY3F1aXJlZCBmaXJzdCBvciBub3QKKyAgICB9CisjZW5kaWYKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgYWNxdWlyZV9zdGF0dXM7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3NldF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgQUNRVUlSRV9ORVNURURfTE9DSyggbGNrLCBndGlkLCAmYWNxdWlyZV9zdGF0dXMgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChhY3F1aXJlX3N0YXR1cyA9PSBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVCkgeworICAgICAgICAgICBpZihvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0KSkKKyAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCkoKHVpbnQ2NF90KSBsY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBpZihvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQpKQorICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQpKCh1aW50NjRfdCkgbGNrKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKwordm9pZAorX19rbXBjX3Vuc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBpbnQgdGFnID0gS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisjIGlmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICBpZiAodGFnID09IGxvY2t0YWdfdGFzICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgS01QX1JFTEVBU0VfVEFTX0xPQ0sodXNlcl9sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICBpZiAodGFnID09IGxvY2t0YWdfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfUkVMRUFTRV9GVVRFWF9MT0NLKHVzZXJfbG9jaywgZ3RpZCk7CisgICAgfSBlbHNlCisjIGVuZGlmCisgICAgeworICAgICAgICBfX2ttcF9kaXJlY3RfdW5zZXRbdGFnXSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworICAgIC8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIC8vICJmYXN0IiBwYXRoIGltcGxlbWVudGVkIHRvIGZpeCBjdXN0b21lciBwZXJmb3JtYW5jZSBpc3N1ZQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgVENXXzQoKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKS0+dGFzLmxrLnBvbGwsIDApOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuOworI2Vsc2UKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisjZW5kaWYKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF91bnNldF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIFJFTEVBU0VfTE9DSyggbGNrLCBndGlkICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaykoKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLyogcmVsZWFzZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCB1bnNldCkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICAgICAgLy8gImZhc3QiIHBhdGggaW1wbGVtZW50ZWQgdG8gZml4IGN1c3RvbWVyIHBlcmZvcm1hbmNlIGlzc3VlCisgICAgICAgIGttcF90YXNfbG9ja190ICp0bCA9IChrbXBfdGFzX2xvY2tfdCopdXNlcl9sb2NrOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgaWYgKCAtLSh0bC0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICAgICAgVENXXzQodGwtPmxrLnBvbGwsIDApOworICAgICAgICB9CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm47CisjZWxzZQorICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyNlbmRpZgorICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF91bnNldF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgaW50IHJlbGVhc2Vfc3RhdHVzOworICAgIHJlbGVhc2Vfc3RhdHVzID0gUkVMRUFTRV9ORVNURURfTE9DSyggbGNrLCBndGlkICk7CisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChyZWxlYXNlX3N0YXR1cyA9PSBLTVBfTE9DS19SRUxFQVNFRCkgeworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0KSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0KSgKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSBsY2spOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2KSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYpKAorICAgICAgICAgICAgICAgICh1aW50NjRfdCkgbGNrKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLyogdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgKi8KK2ludAorX19rbXBjX3Rlc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF90ZXN0X2xvY2spOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgcmM7CisgICAgaW50IHRhZyA9IEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jayk7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworIyBlbmRpZgorIyBpZiBLTVBfVVNFX0lOTElORURfVEFTCisgICAgaWYgKHRhZyA9PSBsb2NrdGFnX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9URVNUX1RBU19MT0NLKHVzZXJfbG9jaywgZ3RpZCwgcmMpOworICAgIH0gZWxzZQorIyBlbGlmIEtNUF9VU0VfSU5MSU5FRF9GVVRFWAorICAgIGlmICh0YWcgPT0gbG9ja3RhZ19mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9URVNUX0ZVVEVYX0xPQ0sodXNlcl9sb2NrLCBndGlkLCByYyk7CisgICAgfSBlbHNlCisjIGVuZGlmCisgICAgeworICAgICAgICByYyA9IF9fa21wX2RpcmVjdF90ZXN0W3RhZ10oKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisgICAgfQorICAgIGlmIChyYykgeworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICAgICAgcmV0dXJuIEZUTl9UUlVFOworICAgIH0gZWxzZSB7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfY2FuY2VsbGVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICAgICAgcmV0dXJuIEZUTl9GQUxTRTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGludCAgICAgICAgICByYzsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdGVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHJjID0gVEVTVF9MT0NLKCBsY2ssIGd0aWQgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCByYyApIHsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCggbGNrICk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICByZXR1cm4gKCByYyA/IEZUTl9UUlVFIDogRlROX0ZBTFNFICk7CisKKyAgICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisvKiB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayAqLworaW50CitfX2ttcGNfdGVzdF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaW50IHJjOworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICByYyA9IEtNUF9EX0xPQ0tfRlVOQyh1c2VyX2xvY2ssIHRlc3QpKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2ssIGd0aWQpOworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKHJjKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworICAgIH0KKyMgZW5kaWYKKyAgICByZXR1cm4gcmM7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGludCAgICAgICAgICByYzsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Rlc3RfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHJjID0gVEVTVF9ORVNURURfTE9DSyggbGNrLCBndGlkICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggcmMgKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGxjayApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgcmV0dXJuIHJjOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEludGVyZmFjZSB0byBmYXN0IHNjYWxhYmxlIHJlZHVjZSBtZXRob2RzIHJvdXRpbmVzCisgKi8KKworLy8ga2VlcCB0aGUgc2VsZWN0ZWQgbWV0aG9kIGluIGEgdGhyZWFkIGxvY2FsIHN0cnVjdHVyZSBmb3IgY3Jvc3MtZnVuY3Rpb24gdXNhZ2U6IHdpbGwgYmUgdXNlZCBpbiBfX2ttcGNfZW5kX3JlZHVjZSogZnVuY3Rpb25zOworLy8gYW5vdGhlciBzb2x1dGlvbjogdG8gcmUtZGV0ZXJtaW5lIHRoZSBtZXRob2Qgb25lIG1vcmUgdGltZSBpbiBfX2ttcGNfZW5kX3JlZHVjZSogZnVuY3Rpb25zIChuZXcgcHJvdG90eXBlIHJlcXVpcmVkIHRoZW4pCisvLyBBVDogd2hpY2ggc29sdXRpb24gaXMgYmV0dGVyPworI2RlZmluZSBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRChndGlkLHJtZXRob2QpIFwKKyAgICAgICAgICAgICAgICAgICAoICggX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF9sb2NhbC5wYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApID0gKCBybWV0aG9kICkgKQorCisjZGVmaW5lIF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9EKGd0aWQpIFwKKyAgICAgICAgICAgICAgICAgICAoIF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKQorCisvLyBkZXNjcmlwdGlvbiBvZiB0aGUgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFyaWFibGU6IGxvb2sgYXQgdGhlIG1hY3JvcyBpbiBrbXAuaAorCisKKy8vIHVzZWQgaW4gYSBjcml0aWNhbCBzZWN0aW9uIHJlZHVjZSBibG9jaworc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQgKSB7CisKKyAgICAvLyB0aGlzIGxvY2sgd2FzIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZGluZyBwcm9maWxlIHRvb2wgYXMgYSBzZXJpYWwgb3ZlcmhlYWQgc3BhbgorICAgIC8vICAgICAgICAgICAgKGFsdGhvdWdoIGl0J3MgdXNlZCBmb3IgYW4gaW50ZXJuYWwgcHVycG9zZSBvbmx5KQorICAgIC8vICAgICAgICAgICAgd2h5IHdhcyBpdCB2aXNpYmxlIGluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uPworICAgIC8vICAgICAgICAgICAgc2hvdWxkIHdlIGtlZXAgaXQgdmlzaWJsZSBpbiBuZXcgcmVkdWNlIGJsb2NrPworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX2R5bmFfbG9ja190ICpsayA9IChrbXBfZHluYV9sb2NrX3QgKiljcml0OworICAgIC8vIENoZWNrIGlmIGl0IGlzIGluaXRpYWxpemVkLgorICAgIGlmICgqbGsgPT0gMCkgeworICAgICAgICBpZiAoS01QX0lTX0RfTE9DSyhfX2ttcF91c2VyX2xvY2tfc2VxKSkgeworICAgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKiljcml0LCAwLCBLTVBfR0VUX0RfVEFHKF9fa21wX3VzZXJfbG9ja19zZXEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2luaXRfaW5kaXJlY3RfY3NwdHIoY3JpdCwgbG9jLCBnbG9iYWxfdGlkLCBLTVBfR0VUX0lfVEFHKF9fa21wX3VzZXJfbG9ja19zZXEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBCcmFuY2ggZm9yIGFjY2Vzc2luZyB0aGUgYWN0dWFsIGxvY2sgb2JqZWN0IGFuZCBzZXQgb3BlcmF0aW9uLiBUaGlzIGJyYW5jaGluZyBpcyBpbmV2aXRhYmxlIHNpbmNlCisgICAgLy8gdGhpcyBsb2NrIGluaXRpYWxpemF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgbm9ybWFsIGRpc3BhdGNoIHBhdGggKGxvY2sgdGFibGUgaXMgbm90IHVzZWQpLgorICAgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyhsaykgIT0gMCkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWxrOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RfTE9DS19GVU5DKGxrLCBzZXQpKGxrLCBnbG9iYWxfdGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSAqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKWxrKTsKKyAgICAgICAgbGNrID0gaWxrLT5sb2NrOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lfTE9DS19GVU5DKGlsaywgc2V0KShsY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgZmFzdCByZWR1Y3Rpb24gY29kZSBpcyBvbmx5IGVtaXR0ZWQgYnkgSW50ZWwgY29tcGlsZXJzCisgICAgLy8gd2l0aCAzMiBieXRlIGNyaXRpY2FsIHNlY3Rpb25zLiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UsIHRoZW4gd2UKKyAgICAvLyBoYXZlIHRvIHVzZSBhIHBvaW50ZXIuCisgICAgaWYgKCBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplIDw9IElOVEVMX0NSSVRJQ0FMX1NJWkUgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0ciggY3JpdCwgbG9jLCBnbG9iYWxfdGlkICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYywgbGNrICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrLCBnbG9iYWxfdGlkICk7CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCApIHsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAgaWYgKEtNUF9JU19EX0xPQ0soX19rbXBfdXNlcl9sb2NrX3NlcSkpIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyk7CisgICAgICAgIEtNUF9EX0xPQ0tfRlVOQyhsY2ssIHVuc2V0KSgoa21wX2R5bmFfbG9ja190ICopbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKVRDUl9QVFIoKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKiljcml0KSk7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jKTsKKyAgICAgICAgS01QX0lfTE9DS19GVU5DKGlsaywgdW5zZXQpKGlsay0+bG9jaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBmYXN0IHJlZHVjdGlvbiBjb2RlIGlzIG9ubHkgZW1pdHRlZCBieSBJbnRlbCBjb21waWxlcnMgd2l0aCAzMiBieXRlIGNyaXRpY2FsCisgICAgLy8gc2VjdGlvbnMuIElmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSwgdGhlbiB3ZSBoYXZlIHRvIHVzZSBhIHBvaW50ZXIuCisgICAgaWYgKCBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID4gMzIgKSB7CisgICAgICAgIGxjayA9ICooIChrbXBfdXNlcl9sb2NrX3AgKikgY3JpdCApOworICAgICAgICBLTVBfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIGNyaXQ7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyApOworCisgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30gLy8gX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrCisKKworLyogMi5hLmkuIFJlZHVjZSBCbG9jayB3aXRob3V0IGEgdGVybWluYXRpbmcgYmFycmllciAqLworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV92YXJzIG51bWJlciBvZiBpdGVtcyAodmFyaWFibGVzKSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX3NpemUgc2l6ZSBvZiBkYXRhIGluIGJ5dGVzIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZGF0YSBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9mdW5jIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGluZyByZWR1Y3Rpb24gb3BlcmF0aW9uIG9uIHR3byBvcGVyYW5kcyBhbmQgcmV0dXJuaW5nIHJlc3VsdCBvZiByZWR1Y3Rpb24gaW4gbGhzX2RhdGEKK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKK0ByZXN1bHQgMSBmb3IgdGhlIG1hc3RlciB0aHJlYWQsIDAgZm9yIGFsbCBvdGhlciB0ZWFtIHRocmVhZHMsIDIgZm9yIGFsbCB0ZWFtIHRocmVhZHMgaWYgYXRvbWljIHJlZHVjdGlvbiBuZWVkZWQKKworVGhlIG5vd2FpdCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGEgcmVkdWNlIGNsYXVzZSB3aXRoIHRoZSBub3dhaXQgYXJndW1lbnQuCisqLwora21wX2ludDMyCitfX2ttcGNfcmVkdWNlX25vd2FpdCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soUkVEVUNFX25vd2FpdCk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqdGg7CisgICAgaW50IHRlYW1zX3N3YXBwZWQgPSAwLCB0YXNrX3N0YXRlOworI2VuZGlmCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlX25vd2FpdCgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSB1c2VkIGFzIGEgc3RhbmQtYWxvbmUgZGlyZWN0aXZlLgorCisgICAgLy8gZG8gbm90IGNhbGwgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpIGlmIG5lZWRlZAorICAgIC8vIHBvc3NpYmxlIGRldGVjdGlvbiBvZiBmYWxzZS1wb3NpdGl2ZSByYWNlIGJ5IHRoZSB0aHJlYWRjaGVja2VyID8/PworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvLyBjaGVjayBjb3JyZWN0bmVzcyBvZiByZWR1Y2UgYmxvY2sgbmVzdGluZworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jLCBOVUxMLCAwICk7CisjZWxzZQorICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCApOworI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKyAgICBpZiggdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsgICAvLyBBQzogY2hlY2sgaWYgd2UgYXJlIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0PworICAgICAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgICAgIGlmKCB0ZWFtLT50LnRfbGV2ZWwgPT0gdGgtPnRoLnRoX3RlYW1zX2xldmVsICkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyByZWR1Y3Rpb24gYXQgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCF0aC0+dGgudGhfaW5mby5kcy5kc190aWQpOyAgLy8gQUM6IGNoZWNrIHRoYXQgdGlkID09IDAKKyAgICAgICAgICAgIC8vIExldCdzIHN3YXAgdGVhbXMgdGVtcG9yYXJpbHkgZm9yIHRoZSByZWR1Y3Rpb24gYmFycmllcgorICAgICAgICAgICAgdGVhbXNfc3dhcHBlZCA9IDE7CisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID0gdGgtPnRoLnRoX3RlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIHRoLT50aC50aF90YXNrX3RlYW0gPSB0aC0+dGgudGhfdGVhbS0+dC50X3Rhc2tfdGVhbVswXTsKKyAgICAgICAgICAgIHRhc2tfc3RhdGUgPSB0aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIHRoLT50aC50aF90YXNrX3N0YXRlID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgICAgLy8gcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFsdWUgd2lsbCBiZSByZXVzZWQgYnkgX19rbXBfZW5kX3JlZHVjZSogZnVuY3Rpb24sIHRoZSB2YWx1ZSBzaG91bGQgYmUga2VwdCBpbiBhIHZhcmlhYmxlCisgICAgLy8gdGhlIHZhcmlhYmxlIHNob3VsZCBiZSBlaXRoZXIgYSBjb25zdHJ1Y3Qtc3BlY2lmaWMgb3IgdGhyZWFkLXNwZWNpZmljIHByb3BlcnR5LCBub3QgYSB0ZWFtIHNwZWNpZmljIHByb3BlcnR5CisgICAgLy8gICAgIChhIHRocmVhZCBjYW4gcmVhY2ggdGhlIG5leHQgcmVkdWNlIGJsb2NrIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCwgcmVkdWNlIG1ldGhvZCBtYXkgZGlmZmVyIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCkKKyAgICAvLyBhbiBpZGVudF90ICJsb2MiIHBhcmFtZXRlciBjb3VsZCBiZSB1c2VkIGFzIGEgY29uc3RydWN0LXNwZWNpZmljIHByb3BlcnR5ICh3aGF0IGlmIGxvYyA9PSAwPykKKyAgICAvLyAgICAgKGlmIGJvdGggY29uc3RydWN0LXNwZWNpZmljIGFuZCB0ZWFtLXNwZWNpZmljIHZhcmlhYmxlcyB3ZXJlIHNoYXJlZCwgdGhlbiB1bm5lc3MgZXh0cmEgc3luY3Mgc2hvdWxkIGJlIG5lZWRlZCkKKyAgICAvLyBhIHRocmVhZC1zcGVjaWZpYyB2YXJpYWJsZSBpcyBiZXR0ZXIgcmVnYXJkaW5nIHR3byBpc3N1ZXMgYWJvdmUgKG5leHQgY29uc3RydWN0IGFuZCBleHRyYSBzeW5jcykKKyAgICAvLyBhIHRocmVhZC1zcGVjaWZpYyAidGhfbG9jYWwucmVkdWN0aW9uX21ldGhvZCIgdmFyaWFibGUgaXMgdXNlZCBjdXJyZW50bHkKKyAgICAvLyBlYWNoIHRocmVhZCBleGVjdXRlcyAnZGV0ZXJtaW5lJyBhbmQgJ3NldCcgbGluZXMgKG5vIG5lZWQgdG8gZXhlY3V0ZSBieSBvbmUgdGhyZWFkLCB0byBhdm9pZCB1bm5lc3MgZXh0cmEgc3luY3MpCisKKyAgICBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9IF9fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBsb2MsIGdsb2JhbF90aWQsIG51bV92YXJzLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jLCBsY2sgKTsKKyAgICBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKTsKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICByZXR2YWwgPSAyOworCisgICAgICAgIC8vIGFsbCB0aHJlYWRzIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlIChiZWNhdXNlIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCgpIHdvbid0IGJlIGNhbGxlZCBieSB0aGUgY29kZSBnZW4pCisgICAgICAgIC8vICAgICAoaXQncyBub3QgcXVpdGUgZ29vZCwgYmVjYXVzZSB0aGUgY2hlY2tpbmcgYmxvY2sgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoaXMgJ3BvcCcsCisgICAgICAgIC8vICAgICAgYnV0IGF0b21pYyBvcGVyYXRpb24gaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIHlldCwgd2lsbCBiZSBleGVjdXRlZCBzbGlnaHRseSBsYXRlciwgbGl0ZXJhbGx5IG9uIG5leHQgaW5zdHJ1Y3Rpb24pCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vQVQ6IHBlcmZvcm1hbmNlIGlzc3VlOiBhIHJlYWwgYmFycmllciBoZXJlCisgICAgICAgIC8vQVQ6ICAgICAoaWYgbWFzdGVyIGdvZXMgc2xvdywgb3RoZXIgdGhyZWFkcyBhcmUgYmxvY2tlZCBoZXJlIHdhaXRpbmcgZm9yIHRoZSBtYXN0ZXIgdG8gY29tZSBhbmQgcmVsZWFzZSB0aGVtKQorICAgICAgICAvL0FUOiAgICAgKGl0J3Mgbm90IHdoYXQgYSBjdXN0b21lciBtaWdodCBleHBlY3Qgc3BlY2lmeWluZyBOT1dBSVQgY2xhdXNlKQorICAgICAgICAvL0FUOiAgICAgKHNwZWNpZnlpbmcgTk9XQUlUIHdvbid0IHJlc3VsdCBpbiBpbXByb3ZlbWVudCBvZiBwZXJmb3JtYW5jZSwgaXQnbGwgYmUgY29uZnVzaW5nIHRvIGEgY3VzdG9tZXIpCisgICAgICAgIC8vQVQ6IGFub3RoZXIgaW1wbGVtZW50YXRpb24gb2YgKmJhcnJpZXJfZ2F0aGVyKm5vd2FpdCgpIChvciBzb21lIG90aGVyIGRlc2lnbikgbWlnaHQgZ28gZmFzdGVyCisgICAgICAgIC8vICAgICAgICBhbmQgYmUgbW9yZSBpbiBsaW5lIHdpdGggc2Vuc2Ugb2YgTk9XQUlUCisgICAgICAgIC8vQVQ6IFRPIERPOiBkbyBlcGNjIHRlc3QgYW5kIGNvbXBhcmUgdGltZXMKKworICAgICAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIGludmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgbmVpdGhlciBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgbm9yIGN1c3RvbWVyJ3MgY29kZSwgaXQncyB1c2VkIGZvciBhbiBpbnRlcm5hbCBwdXJwb3NlKQorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgICAgIHJldHZhbCA9IF9fa21wX2JhcnJpZXIoIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSwgZ2xvYmFsX3RpZCwgRkFMU0UsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMgKTsKKyAgICAgICAgcmV0dmFsID0gKCByZXR2YWwgIT0gMCApID8gKCAwICkgOiAoIDEgKTsKKworICAgICAgICAvLyBhbGwgb3RoZXIgd29ya2VycyBleGNlcHQgbWFzdGVyIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlCisgICAgICAgIC8vICAgICAoIG5vbmUgb2Ygb3RoZXIgd29ya2VycyB3aWxsIGdldCB0byBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSApCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYoIHJldHZhbCA9PSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYoIHRlYW1zX3N3YXBwZWQgKSB7CisgICAgICAgIC8vIFJlc3RvcmUgdGhyZWFkIHN0cnVjdHVyZQorICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSAwOworICAgICAgICB0aC0+dGgudGhfdGVhbSA9IHRlYW07CisgICAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICB0aC0+dGgudGhfdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0YXNrX3N0YXRlXTsKKyAgICAgICAgdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSB0YXNrX3N0YXRlOworICAgIH0KKyNlbmRpZgorICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZV9ub3dhaXQoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHgsIHJldHVybnMgJTA4eFxuIiwgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHJldHZhbCApICk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgaWQuCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCisKK0ZpbmlzaCB0aGUgZXhlY3V0aW9uIG9mIGEgcmVkdWNlIG5vd2FpdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCApOworCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbmRfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIG9uIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyBuZWl0aGVyIG1hc3RlciBub3Igb3RoZXIgd29ya2VycyBzaG91bGQgZ2V0IGhlcmUKKyAgICAgICAgLy8gICAgIChjb2RlIGdlbiBkb2VzIG5vdCBnZW5lcmF0ZSB0aGlzIGNhbGwgaW4gY2FzZSAyOiBhdG9taWMgcmVkdWNlIGJsb2NrKQorICAgICAgICAvLyBhY3R1YWxseSBpdCdzIGJldHRlciB0byByZW1vdmUgdGhpcyBlbHNlaWYgYXQgYWxsOworICAgICAgICAvLyBhZnRlciByZW1vdmFsIHRoaXMgdmFsdWUgd2lsbCBjaGVja2VkIGJ5IHRoZSAnZWxzZScgYW5kIHdpbGwgYXNzZXJ0CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy8gb25seSBtYXN0ZXIgZ2V0cyBoZXJlCisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICk7CisKKyAgICByZXR1cm47Cit9CisKKy8qIDIuYS5paS4gUmVkdWNlIEJsb2NrIHdpdGggYSB0ZXJtaW5hdGluZyBiYXJyaWVyICovCisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdmFycyBudW1iZXIgb2YgaXRlbXMgKHZhcmlhYmxlcykgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9zaXplIHNpemUgb2YgZGF0YSBpbiBieXRlcyB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2RhdGEgcG9pbnRlciB0byBkYXRhIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZnVuYyBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRpbmcgcmVkdWN0aW9uIG9wZXJhdGlvbiBvbiB0d28gb3BlcmFuZHMgYW5kIHJldHVybmluZyByZXN1bHQgb2YgcmVkdWN0aW9uIGluIGxoc19kYXRhCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCitAcmVzdWx0IDEgZm9yIHRoZSBtYXN0ZXIgdGhyZWFkLCAwIGZvciBhbGwgb3RoZXIgdGVhbSB0aHJlYWRzLCAyIGZvciBhbGwgdGVhbSB0aHJlYWRzIGlmIGF0b21pYyByZWR1Y3Rpb24gbmVlZGVkCisKK0EgYmxvY2tpbmcgcmVkdWNlIHRoYXQgaW5jbHVkZXMgYW4gaW1wbGljaXQgYmFycmllci4KKyovCitrbXBfaW50MzIKK19fa21wY19yZWR1Y2UoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsCisgICAgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhSRURVQ0Vfd2FpdCk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZSgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSBhIHN0YW5kLWFsb25lIGRpcmVjdGl2ZS4KKworICAgIC8vIGRvIG5vdCBjYWxsIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCksIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKSBpZiBuZWVkZWQKKyAgICAvLyBwb3NzaWJsZSBkZXRlY3Rpb24gb2YgZmFsc2UtcG9zaXRpdmUgcmFjZSBieSB0aGUgdGhyZWFkY2hlY2tlciA/Pz8KKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8gY2hlY2sgY29ycmVjdG5lc3Mgb2YgcmVkdWNlIGJsb2NrIG5lc3RpbmcKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCwgMCApOworI2Vsc2UKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwgKTsKKyNlbmRpZgorCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX2ttcF9kZXRlcm1pbmVfcmVkdWN0aW9uX21ldGhvZCggbG9jLCBnbG9iYWxfdGlkLCBudW1fdmFycywgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYywgbGNrICk7CisgICAgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICk7CisKKyAgICBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIF9fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgcmV0dmFsID0gMjsKKworICAgIH0gZWxzZSBpZiggVEVTVF9SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgdHJlZV9yZWR1Y2VfYmxvY2sgKSApIHsKKworICAgICAgICAvL2Nhc2UgdHJlZV9yZWR1Y2VfYmxvY2s6CisgICAgICAgIC8vIHRoaXMgYmFycmllciBzaG91bGQgYmUgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG9uIGNvbnN0cnVjdHMgaWYgTk9XQUlUIG5vdCBzcGVjaWZpZWQpCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7IC8vIG5lZWRlZCBmb3IgY29ycmVjdCBub3RpZmljYXRpb24gb2YgZnJhbWVzCisjZW5kaWYKKyAgICAgICAgcmV0dmFsID0gX19rbXBfYmFycmllciggVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApLCBnbG9iYWxfdGlkLCBUUlVFLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jICk7CisgICAgICAgIHJldHZhbCA9ICggcmV0dmFsICE9IDAgKSA/ICggMCApIDogKCAxICk7CisKKyAgICAgICAgLy8gYWxsIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZQorICAgICAgICAvLyAgICAgKCBub25lIG9mIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciB3aWxsIGVudGVyIF9fa21wY19lbmRfcmVkdWNlKCkgKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmKCByZXR2YWwgPT0gMCApIHsgLy8gMDogYWxsIG90aGVyIHdvcmtlcnM7IDE6IG1hc3RlcgorICAgICAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlKCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4LCByZXR1cm5zICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCByZXR2YWwgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIGlkLgorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorCitGaW5pc2ggdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NraW5nIHJlZHVjZS4KK1RoZSA8dHQ+bGNrPC90dD4gcG9pbnRlciBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoYXQgdXNlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBzdGFydCBmdW5jdGlvbi4KKyovCit2b2lkCitfX2ttcGNfZW5kX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApIHsKKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcGFja2VkX3JlZHVjdGlvbl9tZXRob2Q7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlKCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQgKTsKKworICAgIC8vIHRoaXMgYmFycmllciBzaG91bGQgYmUgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgIC8vICAgICAgICAgICAgICAoaXQncyBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgb24gY29uc3RydWN0cyBpZiBOT1dBSVQgbm90IHNwZWNpZmllZCkKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICAgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggSW50ZWwgcGxhdGZvcm1zIG9ubHkgKQorCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICAgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy8gb25seSBtYXN0ZXIgZXhlY3V0ZXMgaGVyZSAobWFzdGVyIHJlbGVhc2VzIGFsbCBvdGhlciB3b3JrZXJzKQorICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciggVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApLCBnbG9iYWxfdGlkICk7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2UoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgKTsKKworICAgIHJldHVybjsKK30KKworI3VuZGVmIF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9ECisjdW5kZWYgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QKKworLyotLSBlbmQgb2YgaW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ttcF91aW50NjQKK19fa21wY19nZXRfdGFza2lkKCkgeworCisgICAga21wX2ludDMyICAgIGd0aWQ7CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKworICAgIGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07IC8vIGlmCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIHJldHVybiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfdGFza19pZDsKKworfSAvLyBfX2ttcGNfZ2V0X3Rhc2tpZAorCisKK2ttcF91aW50NjQKK19fa21wY19nZXRfcGFyZW50X3Rhc2tpZCgpIHsKKworICAgIGttcF9pbnQzMiAgICAgICAgZ3RpZDsKKyAgICBrbXBfaW5mb190ICogICAgIHRocmVhZDsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudF90YXNrOworCisgICAgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgLy8gaWYKKyAgICB0aHJlYWQgICAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBwYXJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9wYXJlbnQ7CisgICAgcmV0dXJuICggcGFyZW50X3Rhc2sgPT0gTlVMTCA/IDAgOiBwYXJlbnRfdGFzay0+dGRfdGFza19pZCApOworCit9IC8vIF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZAorCit2b2lkIF9fa21wY19wbGFjZV90aHJlYWRzKGludCBuUywgaW50IHNPLCBpbnQgbkMsIGludCBjTywgaW50IG5UKQoreworICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPSBuUzsKKyAgICBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ID0gc087CisgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbkM7CisgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBjTzsKKyAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG5UOworfQorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmZmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIGttcF9kZWJ1Zy5jIC0tIGRlYnVnIHV0aWxpdGllcyBmb3IgdGhlIEd1aWRlIGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIiAvKiByZWFsbHkgbmVjZXNzYXJ5PyAqLworI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZmRlZiBLTVBfREVCVUcKK3ZvaWQKK19fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX291dCwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKGFwKTsKK30KKyNlbmRpZgorCit2b2lkCitfX2ttcF9kZWJ1Z19wcmludGYoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX2VyciwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKCBhcCApOworfQorCisjaWZkZWYgS01QX1VTRV9BU1NFUlQKKyAgICBpbnQKKyAgICBfX2ttcF9kZWJ1Z19hc3NlcnQoCisgICAgICAgIGNoYXIgY29uc3QgKiAgbXNnLAorICAgICAgICBjaGFyIGNvbnN0ICogIGZpbGUsCisgICAgICAgIGludCAgICAgICAgICAgbGluZQorICAgICkgeworCisgICAgICAgIGlmICggZmlsZSA9PSBOVUxMICkgeworICAgICAgICAgICAgZmlsZSA9IEtNUF9JMThOX1NUUiggVW5rbm93bkZpbGUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBkaXJlY3RvcmllcyBmcm9tIHBhdGgsIGxlYXZlIG9ubHkgZmlsZSBuYW1lLiBGaWxlIG5hbWUgaXMgZW5vdWdoLCB0aGVyZSBpcyBubyBuZWVkCisgICAgICAgICAgICAvLyBpbiBib3RoZXJpbmcgZGV2ZWxvcGVycyBhbmQgY3VzdG9tZXJzIHdpdGggZnVsbCBwYXRocy4KKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzbGFzaCA9IHN0cnJjaHIoIGZpbGUsICcvJyApOworICAgICAgICAgICAgaWYgKCBzbGFzaCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBzbGFzaCArIDE7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMoJWQpOiAlcy5cbiIsIGZpbGUsIGxpbmUsIG1zZyApOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgICAgICAgICAjaWZkZWYgVVNFX0FTU0VSVF9CUkVBSworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBEZWJ1Z0JyZWFrKCk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9CUkVBSworICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfU1RBTEwKKyAgICAgICAgICAgICAgICAvKiAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7ICovCisgICAgICAgICAgICAgICAgZm9yKDs7KTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBVU0VfQVNTRVJUX1NUQUxMCisgICAgICAgICAgICAjaWZkZWYgVVNFX0FTU0VSVF9TRUcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB2b2xhdGlsZSAqIFpFUk8gPSAoaW50KikgMDsKKyAgICAgICAgICAgICAgICAgICAgKysgKCpaRVJPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9TRUcKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQXNzZXJ0aW9uRmFpbHVyZSwgZmlsZSwgbGluZSApLAorICAgICAgICAgICAgS01QX0hOVCggU3VibWl0QnVnUmVwb3J0ICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworCisgICAgICAgIHJldHVybiAwOworCisgICAgfSAvLyBfX2ttcF9kZWJ1Z19hc3NlcnQKKworI2VuZGlmIC8vIEtNUF9VU0VfQVNTRVJUCisKKy8qIER1bXAgZGVidWdnaW5nIGJ1ZmZlciB0byBzdGRlcnIgKi8KK3ZvaWQKK19fa21wX2R1bXBfZGVidWdfYnVmZmVyKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGRjID0gX19rbXBfZGVidWdfY291bnQ7CisgICAgICAgIGNoYXIgKmRiID0gJiBfX2ttcF9kZWJ1Z19idWZmZXJbIChkYyAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcykgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgY2hhciAqZGJfZW5kID0gJiBfX2ttcF9kZWJ1Z19idWZmZXJbIF9fa21wX2RlYnVnX2J1Zl9saW5lcyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFycyBdOworICAgICAgICBjaGFyICpkYjI7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiXG5TdGFydCBkdW1wIG9mIGRlYnVnZ2luZyBidWZmZXIgKGVudHJ5PSVkKTpcbiIsCisgICAgICAgICAgICAgICAgIGRjICUgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9kZWJ1Z19idWZfbGluZXM7IGkrKyApIHsKKworICAgICAgICAgICAgaWYgKCAqZGIgIT0gJ1wwJyApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXggdXAgd2hlcmUgbm8gY2FycmlhZ2UgcmV0dXJuIGJlZm9yZSBzdHJpbmcgdGVybWluYXRpb24gY2hhciAqLworICAgICAgICAgICAgICAgIGZvciAoIGRiMiA9IGRiICsgMTsgZGIyIDwgZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxOyBkYjIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAqZGIyID09ICdcMCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICooZGIyLTEpICE9ICdcbicgKSB7ICpkYjIgPSAnXG4nOyAqKGRiMisxKSA9ICdcMCc7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEhhbmRsZSBjYXNlIGF0IGVuZCBieSBzaG9ydGVuaW5nIHRoZSBwcmludGVkIG1lc3NhZ2UgYnkgb25lIGNoYXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICAgICAgaWYgKCBkYjIgPT0gZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxICYmCisgICAgICAgICAgICAgICAgICAgICAqZGIyID09ICdcMCcgJiYgKihkYjItMSkgIT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAgICAgKihkYjItMSkgPSAnXG4nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJTRkOiAlLipzIiwgaSwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCBkYiApOworICAgICAgICAgICAgICAgICpkYiA9ICdcMCc7IC8qIG9ubHkgbGV0IGl0IHByaW50IG9uY2UhICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRiICs9IF9fa21wX2RlYnVnX2J1Zl9jaGFyczsKKyAgICAgICAgICAgIGlmICggZGIgPj0gZGJfZW5kICkKKyAgICAgICAgICAgICAgICBkYiA9IF9fa21wX2RlYnVnX2J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiRW5kIGR1bXAgb2YgZGVidWdnaW5nIGJ1ZmZlciAoZW50cnk9JWQpLlxuXG4iLAorICAgICAgICAgICAgICAgICAoIGRjK2ktMSApICUgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjOTIzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICoga21wX2RlYnVnLmggLS0gZGVidWcgLyBhc3NlcnRpb24gY29kZSBmb3IgQXNzdXJlIGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfREVCVUdfSAorI2RlZmluZSBLTVBfREVCVUdfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJ1aWxkLXRpbWUgYXNzZXJ0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIEJ1aWxkLXRpbWUgYXNzZXJ0aW9uIGNhbiBkbyBjb21waWxlLXRpbWUgY2hlY2tpbmcgb2YgZGF0YSBzdHJ1Y3R1cmUgc2l6ZXMsIGV0Yy4gVGhpcyB3b3JrcyBieQorICAgIGRlY2xhcmluZyBhIG5lZ2F0aXZlLWxlbmd0aCBhcnJheSBpZiB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuICBJbiB0aGF0CisgICAgY2FzZSwgdGhlIGNvbXBpbGVyIGlzc3VlcyBhIHN5bnRheCBlcnJvciBhbmQgc3RvcHMgdGhlIGNvbXBpbGF0aW9uLiBJZiB0aGUgZXhwcmVzc2lvbiBpcworICAgIHRydWUsIHdlIGdldCBhbiBleHRyYW5lb3VzIHN0YXRpYyBzaW5nbGUgY2hhcmFjdGVyIGFycmF5IGluIHRoZSBzY29wZSBvZiB0aGUgbWFjcm8uCisKKyAgICBVc2FnZToKKworICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIHNvbWVfdCApIDw9IDMyICk7CisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBzb21lX3QsIGZpZWxkICkgJSA4ID09IDAgKTsKKworICAgIERvIG5vdCB1c2UgX0tNUF9CVUlMRF9BU1NFUlQgYW5kIF9fS01QX0JVSUxEX0FTU0VSVCBkaXJlY3RseSwgaXQgaXMgd29ya2luZyBndXRzLgorKi8KKworI2RlZmluZSBfX0tNUF9CVUlMRF9BU1NFUlQoIGV4cHIsIHN1ZmZpeCApICB0eXBlZGVmIGNoYXIgX19rbXBfYnVpbGRfY2hlY2tfIyNzdWZmaXhbIChleHByKSA/IDEgOiAtMSBdCisjZGVmaW5lIF9LTVBfQlVJTERfQVNTRVJUKCBleHByLCBzdWZmaXggKSAgIF9fS01QX0JVSUxEX0FTU0VSVCggKGV4cHIpLCBzdWZmaXggKQorI2lmZGVmIEtNUF9VU0VfQVNTRVJUIAorICAgICNkZWZpbmUgS01QX0JVSUxEX0FTU0VSVCggZXhwciApICAgICAgICAgICAgX0tNUF9CVUlMRF9BU1NFUlQoIChleHByKSwgX19MSU5FX18gKQorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9CVUlMRF9BU1NFUlQoIGV4cHIgKSAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSdW4tdGltZSBhc3NlcnRpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggdm9pZCApOworCisjaWZkZWYgS01QX1VTRV9BU1NFUlQKKyAgICBleHRlcm4gaW50IF9fa21wX2RlYnVnX2Fzc2VydCggY2hhciBjb25zdCAqIGV4cHIsIGNoYXIgY29uc3QgKiBmaWxlLCBpbnQgbGluZSApOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgKCAoY29uZCkgPyAwIDogX19rbXBfZGVidWdfYXNzZXJ0KCAjY29uZCwgX19GSUxFX18sIF9fTElORV9fICkgKQorICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKSAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoIChtc2cpLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVCggY29uZCApICAgICAgIEtNUF9BU1NFUlQoIGNvbmQgKQorICAgICAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQyKCBjb25kLCBtc2cgKSBLTVBfQVNTRVJUMiggY29uZCwgbXNnICkKKyAgICAjZWxzZQorICAgICAgICAvLyBEbyBub3QgZXhwb3NlIGNvbmRpdGlvbiBpbiByZWxlYXNlIGJ1aWxkLiBVc2UgImFzc2VydGlvbiBmYWlsdXJlIi4KKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgKCAoY29uZCkgPyAwIDogX19rbXBfZGVidWdfYXNzZXJ0KCAiYXNzZXJ0aW9uIGZhaWx1cmUiLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgIEtNUF9BU1NFUlQoIGNvbmQgKQorICAgICAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQoIGNvbmQgKSAgICAgICAwCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIDAKKyAgICAjZW5kaWYgLy8gS01QX0RFQlVHCisjZWxzZQorICAgICNkZWZpbmUgS01QX0FTU0VSVCggY29uZCApICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKSAgICAgICAwCisgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUKCBjb25kICkgICAgICAgMAorICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIDAKKyNlbmRpZiAvLyBLTVBfVVNFX0FTU0VSVAorCisjaWZkZWYgS01QX0RFQlVHCisgICAgZXh0ZXJuIHZvaWQgX19rbXBfZGVidWdfcHJpbnRmX3N0ZG91dCggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX2RlYnVnX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisKKyNpZmRlZiBLTVBfREVCVUcKKworICAgIGV4dGVybiBpbnQga21wX2FfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfYl9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9jX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2RfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZV9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9mX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2RpYWc7CisKKyAgICAjZGVmaW5lIEtBX1RSQUNFKGQseCkgICAgIGlmIChrbXBfYV9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0JfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9iX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLQ19UUkFDRShkLHgpICAgICBpZiAoa21wX2NfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtEX1RSQUNFKGQseCkgICAgIGlmIChrbXBfZF9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0VfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9lX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLRl9UUkFDRShkLHgpICAgICBpZiAoa21wX2ZfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtfRElBRyhkLHgpICAgICAgIHtpZiAoa21wX2RpYWcgPT0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0IHggOyB9IH0KKworICAgICNkZWZpbmUgS0FfRFVNUChkLHgpICAgICBpZiAoa21wX2FfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0JfRFVNUChkLHgpICAgICBpZiAoa21wX2JfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0NfRFVNUChkLHgpICAgICBpZiAoa21wX2NfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0RfRFVNUChkLHgpICAgICBpZiAoa21wX2RfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0VfRFVNUChkLHgpICAgICBpZiAoa21wX2VfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0ZfRFVNUChkLHgpICAgICBpZiAoa21wX2ZfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorCisjZWxzZQorCisgICAgI2RlZmluZSBLQV9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQl9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQ19UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRF9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRV9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRl9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLX0RJQUcoZCx4KSAgICAgICB7fS8qIG5vdGhpbmcgdG8gZG8gKi8KKworICAgICNkZWZpbmUgS0FfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQl9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtDX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0RfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRV9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtGX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2MxYWNiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmMKQEAgLTAsMCArMSwzMTQgQEAKKyNpZiBVU0VfREVCVUdHRVIKKy8qCisgKiBrbXBfZGVidWdnZXIuYyAtLSBkZWJ1Z2dlciBzdXBwb3J0LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfb21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisvKgorICAgIE5PVEU6IEFsbCB2YXJpYWJsZSBuYW1lcyBhcmUga25vd24gdG8gdGhlIGRlYnVnZ2VyLCBkbyBub3QgY2hhbmdlIQorKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisgICAgICAgIGV4dGVybiBrbXBfb21wX3N0cnVjdF9pbmZvX3QgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvOworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK2ludCBfX2ttcF9kZWJ1Z2dpbmcgICAgICAgICAgPSBGQUxTRTsgICAgLy8gQm9vbGVhbiB3aGV0aGVyIGN1cnJlbnRseSBkZWJ1Z2dpbmcgT3Blbk1QIFJUTC4KKworI2RlZmluZSBvZmZzZXRfYW5kX3NpemVfb2YoIHN0cnVjdHVyZSwgZmllbGQgKSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvZmZzZXRvZiggc3RydWN0dXJlLCAgICAgICAgICAgZmllbGQgKSwgICAgXAorICAgICAgICBzaXplb2YoICggKHN0cnVjdHVyZSAqKSBOVUxMKS0+ZmllbGQgKSAgICAgXAorICAgIH0KKworI2RlZmluZSBvZmZzZXRfYW5kX3NpemVfbm90X2F2YWlsYWJsZSBcCisgICAgeyAtMSwgLTEgfQorCisjZGVmaW5lIGFkZHJfYW5kX3NpemVfb2YoIHZhciApICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChrbXBfdWludDY0KSggJiB2YXIgKSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNpemVvZiggdmFyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIG50aHJfYnVmZmVyX3NpemUgMTAyNAorc3RhdGljIGttcF9pbnQzMgora21wX29tcF9udGhyX2luZm9fYnVmZmVyWyBudGhyX2J1ZmZlcl9zaXplIF0gPQorICAgIHsgbnRocl9idWZmZXJfc2l6ZSAqIHNpemVvZigga21wX2ludDMyICkgfTsKKworLyogVE9ETzogQ2hlY2sgcHVuY3R1YXRpb24gZm9yIHZhcmlvdXMgcGxhdGZvcm1zIGhlcmUgKi8KK3N0YXRpYyBjaGFyIGZ1bmNfbWljcm90YXNrW10gICAgPSAiX19rbXBfaW52b2tlX21pY3JvdGFzayI7CitzdGF0aWMgY2hhciBmdW5jX2ZvcmtbXSAgICAgICAgID0gIl9fa21wY19mb3JrX2NhbGwiOworc3RhdGljIGNoYXIgZnVuY19mb3JrX3RlYW1zW10gICA9ICJfX2ttcGNfZm9ya190ZWFtcyI7CisKKworLy8gVmFyaW91cyBpbmZvIGFib3V0IHJ1bnRpbWUgc3RydWN0dXJlczogYWRkcmVzc2VzLCBmaWVsZCBvZmZzZXRzLCBzaXplcywgZXRjLgora21wX29tcF9zdHJ1Y3RfaW5mb190CitfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm8gPSB7CisKKyAgICAvKiBDaGFuZ2UgdGhpcyBvbmx5IGlmIHlvdSBtYWtlIGEgZnVuZGFtZW50YWwgZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlIGhlcmUgKi8KKyAgICBLTVBfT01QX1ZFUlNJT04sCisKKyAgICAvKiBzYW5pdHkgY2hlY2suICBPbmx5IHNob3VsZCBiZSBjaGVja2VkIGlmIHZlcnNpb25zIGFyZSBpZGVudGljYWwKKyAgICAgKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBnZXQgdGhlIHJ1bnRpbWUKKyAgICAgKiBzdHJ1Y3R1cmUgc2l6ZSBpZiBpdCB0aGUgcnVudGltZSBpcyBvbGRlciB0aGFuIHRoZSBpbnRlcmZhY2UgKi8KKyAgICBzaXplb2YoIGttcF9vbXBfc3RydWN0X2luZm9fdCApLAorCisgICAgLyogT3Blbk1QIFJUTCB2ZXJzaW9uIGluZm8uICovCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdmVyc2lvbl9tYWpvciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3ZlcnNpb25fbWlub3IgKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF92ZXJzaW9uX2J1aWxkICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfb3Blbm1wX3ZlcnNpb24gKSwKKyAgICB7IChrbXBfdWludDY0KSggX19rbXBfY29weXJpZ2h0ICkgKyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4sIDAgfSwgICAgICAgIC8vIFNraXAgbWFnaWMgcHJlZml4LgorCisgICAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3RocmVhZHMgKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF9yb290ICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdGhyZWFkc19jYXBhY2l0eSApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX21vbml0b3IgKSwKKyNpZiAhIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdXNlcl9sb2NrX3RhYmxlICksCisjZW5kaWYKKyAgICBhZGRyX2FuZF9zaXplX29mKCBmdW5jX21pY3JvdGFzayApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGZ1bmNfZm9yayApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGZ1bmNfZm9ya190ZWFtcyApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3RlYW1fY291bnRlciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3Rhc2tfY291bnRlciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGttcF9vbXBfbnRocl9pbmZvX2J1ZmZlciApLAorICAgIHNpemVvZiggdm9pZCAqICksCisgICAgT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKiksCisgICAgYnNfbGFzdF9iYXJyaWVyLAorICAgIFRBU0tfREVRVUVfU0laRSwKKworICAgIC8vIHRocmVhZCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoIGttcF9iYXNlX2luZm9fdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9pbmZvICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3RlYW0gKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfcm9vdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9zZXJpYWxfdGVhbSApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9pZGVudCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9zcGluX2hlcmUgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfbmV4dF93YWl0aW5nICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3Rhc2tfdGVhbSAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9jdXJyZW50X3Rhc2sgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfdGFza19zdGF0ZSAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsICAgdGhfYmFyICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYnN0YXRlX3QsICAgICAgYl93b3JrZXJfYXJyaXZlZCApLAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLyB0ZWFtcyBpbmZvcm1hdGlvbgorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF90ZWFtc19taWNyb3Rhc2spLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF90ZWFtc19sZXZlbCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGVhbXNfc2l6ZV90LCBudGVhbXMgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90ZWFtc19zaXplX3QsIG50aCApLAorI2VuZGlmCisKKyAgICAvLyBrbXBfZGVzYyBzdHJ1Y3R1cmUgKGZvciBpbmZvIGZpZWxkIGFib3ZlKQorICAgIHNpemVvZigga21wX2Rlc2NfYmFzZV90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfZGVzY19iYXNlX3QsIGRzX3RpZCAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Rlc2NfYmFzZV90LCBkc19ndGlkICAgKSwKKyAgICAvLyBPbiBXaW5kb3dzKiBPUywgZHNfdGhyZWFkIGNvbnRhaW5zIGEgdGhyZWFkIC9oYW5kbGUvLCB3aGljaCBpcyBub3QgdXNhYmxlLCB3aGlsZSB0aHJlYWQgL2lkLworICAgIC8vIGlzIGluIGRzX3RocmVhZF9pZC4KKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9kZXNjX2Jhc2VfdCwgZHNfdGhyZWFkX2lkKSwKKyAgICAjZWxzZQorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Rlc2NfYmFzZV90LCBkc190aHJlYWQpLAorICAgICNlbmRpZgorCisgICAgLy8gdGVhbSBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoIGttcF9iYXNlX3RlYW1fdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfbWFzdGVyX3RpZCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfaWRlbnQgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfcGFyZW50ICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfbnByb2MgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfdGhyZWFkcyAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfc2VyaWFsaXplZCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfaWQgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfcGtmbiAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfdGFza190ZWFtICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhICksCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X2NhbmNlbF9yZXF1ZXN0ICksCisjZW5kaWYKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X2JhciApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2JhbGlnbl90ZWFtX3QsIGJfbWFzdGVyX2Fycml2ZWQgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYWxpZ25fdGVhbV90LCBiX3RlYW1fYXJyaXZlZCApLAorCisgICAgLy8gcm9vdCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoIGttcF9iYXNlX3Jvb3RfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2Vfcm9vdF90LCByX3Jvb3RfdGVhbSAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9yb290X3QsIHJfaG90X3RlYW0gICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Jvb3RfdCwgcl91YmVyX3RocmVhZCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9ub3RfYXZhaWxhYmxlLAorCisgICAgLy8gaWRlbnQgc3RydWN0dXJlIGluZm9ybWF0aW9uCisgICAgc2l6ZW9mKCBpZGVudF90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBpZGVudF90LCBwc291cmNlICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBpZGVudF90LCBmbGFncyAgICksCisKKyAgICAvLyBsb2NrIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICAgIHNpemVvZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBpbml0aWFsaXplZCAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBsb2NhdGlvbiApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIHRhaWxfaWQgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgaGVhZF9pZCAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBuZXh0X3RpY2tldCAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBub3dfc2VydmluZyAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBvd25lcl9pZCAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBkZXB0aF9sb2NrZWQgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBmbGFncyApLAorCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIC8qIExvY2sgdGFibGUuICovCisgICAgc2l6ZW9mKCBrbXBfbG9ja190YWJsZV90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfbG9ja190YWJsZV90LCB1c2VkICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfbG9ja190YWJsZV90LCBhbGxvY2F0ZWQgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfbG9ja190YWJsZV90LCB0YWJsZSAgICAgICksCisjZW5kaWYKKworICAgIC8vIFRhc2sgdGVhbSBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uCisgICAgc2l6ZW9mKCBrbXBfYmFzZV90YXNrX3RlYW1fdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X3RocmVhZHNfZGF0YSAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X2ZvdW5kX3Rhc2tzICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X25wcm9jICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X3VuZmluaXNoZWRfdGhyZWFkcyApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X2FjdGl2ZSAgICAgICAgICAgICApLAorCisgICAgLy8gdGFza19kYXRhX3QuCisgICAgc2l6ZW9mKCBrbXBfdGFza2RhdGFfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2tfaWQgICAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9mbGFncyAgICAgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGVhbSAgICAgICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3BhcmVudCAgICAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9sZXZlbCAgICAgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfaWRlbnQgICAgICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzICksCisKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF90YXNrd2FpdF9pZGVudCAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGFza3dhaXRfY291bnRlciApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2t3YWl0X3RocmVhZCAgKSwKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGFza2dyb3VwICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tncm91cF90LCBjb3VudCAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZ3JvdXBfdCwgY2FuY2VsX3JlcXVlc3QgICAgICksCisKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9kZXBub2RlICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfZGVwbm9kZV9saXN0X3QsIG5vZGUgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2RlcG5vZGVfbGlzdF90LCBuZXh0ICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2RlcG5vZGVfdCwgc3VjY2Vzc29ycyAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9kZXBub2RlX3QsIHRhc2sgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfZGVwbm9kZV90LCBucHJlZGVjZXNzb3JzICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2RlcG5vZGVfdCwgbnJlZnMgICAgICAgICAgICksCisjZW5kaWYKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrX3QsIHJvdXRpbmUgICAgICAgICAgICAgICAgICksCisKKyAgICAvLyB0aHJlYWRfZGF0YV90LgorICAgIHNpemVvZigga21wX3RocmVhZF9kYXRhX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9oZWFkICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgdGRfZGVxdWVfdGFpbCAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlX250YXNrcyAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9sYXN0X3N0b2xlbiApLAorCisgICAgLy8gVGhlIGxhc3QgZmllbGQuCisgICAgS01QX09NUF9WRVJTSU9OLAorCit9OyAvLyBfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm8KKworI3VuZGVmIG9mZnNldF9hbmRfc2l6ZV9vZgorI3VuZGVmIGFkZHJfYW5kX3NpemVfb2YKKworLyoKKyAgSW50ZWwgY29tcGlsZXIgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGlzc3VlcyBhIHdhcm5pbmcgImNvbnZlcnNpb24KKyAgZnJvbSAidW5zaWduZWQgbG9uZyBsb25nIiB0byAiY2hhciAqIiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzIgorICB3aGVuIDY0LWJpdCB2YWx1ZSBpcyBhc3NpZ25lZCB0byAzMi1iaXQgcG9pbnRlci4gVXNlIHRoaXMgZnVuY3Rpb24KKyAgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcuCisqLworc3RhdGljIGlubGluZQordm9pZCAqCitfX2ttcF9jb252ZXJ0X3RvX3B0cigKKyAgICBrbXBfdWludDY0ICAgIGFkZHIKKykgeworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogIDgxMCApIC8vIGNvbnZlcnNpb24gZnJvbSAidW5zaWduZWQgbG9uZyBsb25nIiB0byAiY2hhciAqIiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzCisgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMTE5NSApIC8vIGNvbnZlcnNpb24gZnJvbSBpbnRlZ2VyIHRvIHNtYWxsZXIgcG9pbnRlcgorICAgICNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCisgICAgcmV0dXJuICh2b2lkICopIGFkZHI7CisgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorICAgICNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCit9IC8vIF9fa21wX2NvbnZlcnRfdG9fcHRyCisKKworc3RhdGljIGludAora21wX2xvY2F0aW9uX21hdGNoKAorICAgIGttcF9zdHJfbG9jX3QgKiAgICAgICAgbG9jLAorICAgIGttcF9vbXBfbnRocl9pdGVtX3QgKiAgaXRlbQorKSB7CisKKyAgICBpbnQgZmlsZV9tYXRjaCA9IDA7CisgICAgaW50IGZ1bmNfbWF0Y2ggPSAwOworICAgIGludCBsaW5lX21hdGNoID0gMDsKKworICAgIGNoYXIgKiBmaWxlID0gKGNoYXIgKikgX19rbXBfY29udmVydF90b19wdHIoIGl0ZW0tPmZpbGUgKTsKKyAgICBjaGFyICogZnVuYyA9IChjaGFyICopIF9fa21wX2NvbnZlcnRfdG9fcHRyKCBpdGVtLT5mdW5jICk7CisgICAgZmlsZV9tYXRjaCA9IF9fa21wX3N0cl9mbmFtZV9tYXRjaCggJiBsb2MtPmZuYW1lLCBmaWxlICk7CisgICAgZnVuY19tYXRjaCA9CisgICAgICAgIGl0ZW0tPmZ1bmMgPT0gMCAgLy8gSWYgaXRlbS0+ZnVuYyBpcyBOVUxMLCBpdCBhbGxvd3MgYW55IGZ1bmMgbmFtZS4KKyAgICAgICAgfHwKKyAgICAgICAgc3RyY21wKCBmdW5jLCAiKiIgKSA9PSAwCisgICAgICAgIHx8CisgICAgICAgICggbG9jLT5mdW5jICE9IE5VTEwgJiYgc3RyY21wKCBsb2MtPmZ1bmMsIGZ1bmMgKSA9PSAwICk7CisgICAgbGluZV9tYXRjaCA9CisgICAgICAgIGl0ZW0tPmJlZ2luIDw9IGxvYy0+bGluZQorICAgICAgICAmJgorICAgICAgICAoIGl0ZW0tPmVuZCA8PSAwIHx8IGxvYy0+bGluZSA8PSBpdGVtLT5lbmQgKTsgLy8gaWYgaXRlbS0+ZW5kIDw9IDAsIGl0IG1lYW5zICJlbmQgb2YgZmlsZSIuCisKKyAgICByZXR1cm4gKCBmaWxlX21hdGNoICYmIGZ1bmNfbWF0Y2ggJiYgbGluZV9tYXRjaCApOworCit9IC8vIGttcF9sb2NhdGlvbl9tYXRjaAorCisKK2ludAorX19rbXBfb21wX251bV90aHJlYWRzKAorICAgIGlkZW50X3QgY29uc3QgKiBpZGVudAorKSB7CisKKyAgICBpbnQgbnVtX3RocmVhZHMgPSAwOworCisgICAga21wX29tcF9udGhyX2luZm9fdCAqIGluZm8gPQorICAgICAgICAoa21wX29tcF9udGhyX2luZm9fdCAqKSBfX2ttcF9jb252ZXJ0X3RvX3B0ciggIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mby5udGhyX2luZm8uYWRkciApOworICAgIGlmICggaW5mby0+bnVtID4gMCAmJiBpbmZvLT5hcnJheSAhPSAwICkgeworICAgICAgICBrbXBfb21wX250aHJfaXRlbV90ICogaXRlbXMgPSAoa21wX29tcF9udGhyX2l0ZW1fdCAqKSBfX2ttcF9jb252ZXJ0X3RvX3B0ciggaW5mby0+YXJyYXkgKTsKKyAgICAgICAga21wX3N0cl9sb2NfdCAgICAgICAgIGxvYyAgID0gX19rbXBfc3RyX2xvY19pbml0KCBpZGVudC0+cHNvdXJjZSwgMSApOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBpbmZvLT5udW07ICsrIGkgKSB7CisgICAgICAgICAgICBpZiAoIGttcF9sb2NhdGlvbl9tYXRjaCggJiBsb2MsICYgaXRlbXNbIGkgXSApICkgeworICAgICAgICAgICAgICAgIG51bV90aHJlYWRzID0gaXRlbXNbIGkgXS5udW1fdGhyZWFkczsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGZvcgorICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICYgbG9jICk7CisgICAgfTsgLy8gaWYKKworICAgIHJldHVybiBudW1fdGhyZWFkczs7CisKK30gLy8gX19rbXBfb21wX251bV90aHJlYWRzCisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Z2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjQxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaApAQCAtMCwwICsxLDUxIEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX2RlYnVnZ2VyLmggLS0gZGVidWdnZXIgc3VwcG9ydC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfREVCVUdHRVJfSAorI2RlZmluZSBLTVBfREVCVUdHRVJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKiAqIFRoaXMgZXh0ZXJuYWwgdmFyaWFibGUgY2FuIGJlIHNldCBieSBhbnkgZGVidWdnZXIgdG8gZmxhZyB0byB0aGUgcnVudGltZSB0aGF0IHdlCisgICBhcmUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnNpZGUgYSBkZWJ1Z2dlci4gIFRoaXMgd2lsbCBhbGxvdyB0aGUgZGVidWdnZXIgdG8gb3ZlcnJpZGUKKyAgIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBzcGF3bmVkIGluIGEgcGFyYWxsZWwgcmVnaW9uIGJ5IHVzaW5nIF9fa21wX29tcF9udW1fdGhyZWFkcygpIChiZWxvdykuIAorICAgKiBXaGVuIF9fa21wX2RlYnVnZ2luZyBpcyBUUlVFLCBlYWNoIHRlYW0gYW5kIGVhY2ggdGFzayBnZXRzIGEgdW5pcXVlIGludGVnZXIgaWRlbnRpZmllciAKKyAgIHRoYXQgY2FuIGJlIHVzZWQgYnkgZGVidWdnZXIgdG8gY29udmVuaWVudGx5IGlkZW50aWZ5IHRlYW1zIGFuZCB0YXNrcy4KKyAgICogVGhlIGRlYnVnZ2VyIGhhcyBhY2Nlc3MgdG8gX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgT3Blbk1QIGxpYnJhcnkncyBpbXBvcnRhbnQgaW50ZXJuYWwgc3RydWN0dXJlcy4gIFRoaXMgYWNjZXNzIHdpbGwgYWxsb3cgdGhlIGRlYnVnZ2VyIAorICAgdG8gcmVhZCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0eXBpY2FsIE9wZW5NUCBjb25zdHJ1Y3RzICh0ZWFtcywgdGhyZWFkcywgdGFza2luZywgZXRjLiApCisgICBkdXJpbmcgYSBkZWJ1Z2dpbmcgc2Vzc2lvbiBhbmQgb2ZmZXIgZGV0YWlsZWQgYW5kIHVzZWZ1bCBpbmZvcm1hdGlvbiB3aGljaCB0aGUgdXNlciBjYW4gcHJvYmUKKyAgIGFib3V0IHRoZSBPcGVuTVAgcG9ydGlvbiBvZiB0aGVpciBjb2RlLgorICAgKi8KK2V4dGVybiBpbnQgX19rbXBfZGVidWdnaW5nOyAgICAgICAgICAgICAvKiBCb29sZWFuIHdoZXRoZXIgY3VycmVudGx5IGRlYnVnZ2luZyBPcGVuTVAgUlRMICovCisvLyBSZXR1cm4gbnVtYmVyIG9mIHRocmVhZHMgc3BlY2lmaWVkIGJ5IHRoZSBkZWJ1Z2dlciBmb3IgZ2l2ZW4gcGFyYWxsZWwgcmVnaW9uLgorLyogVGhlIGlkZW50IGZpZWxkLCB3aGljaCByZXByZXNlbnRzIGEgc291cmNlIGZpbGUgbG9jYXRpb24sIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIAorICAgZGVidWdnZXIgaGFzIGNoYW5nZWQgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZvciB0aGUgcGFyYWxsZWwgcmVnaW9uIGF0IHNvdXJjZSBmaWxlIAorICAgbG9jYXRpb24gaWRlbnQuICBUaGlzIHdheSwgc3BlY2lmaWMgcGFyYWxsZWwgcmVnaW9ucycgbnVtYmVyIG9mIHRocmVhZHMgY2FuIGJlIGNoYW5nZWQKKyAgIGF0IHRoZSBkZWJ1Z2dlcidzIHJlcXVlc3QuCisgKi8KK2ludCBfX2ttcF9vbXBfbnVtX3RocmVhZHMoIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisKKyNlbmRpZiAvLyBLTVBfREVCVUdHRVJfSAorCisjZW5kaWYgLy8gVVNFX0RFQlVHR0VSCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGlzcGF0Y2guY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQzOGEzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApAQCAtMCwwICsxLDI2MjAgQEAKKy8qCisgKiBrbXBfZGlzcGF0Y2guY3BwOiBkeW5hbWljIHNjaGVkdWxpbmcgLSBpdGVyYXRpb24gaW5pdGlhbGl6YXRpb24gYW5kIGRpc3BhdGNoLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKgorICogRHluYW1pYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uIGFuZCBkaXNwYXRjaC4KKyAqCisgKiBOT1RFOiBfX2ttcF9udGggaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAqICAgICAgIGl0IG1heSBjaGFuZ2UgdmFsdWVzIGJldHdlZW4gcGFyYWxsZWwgcmVnaW9ucy4gIF9fa21wX21heF9udGgKKyAqICAgICAgIGlzIHRoZSBsYXJnZXN0IHZhbHVlIF9fa21wX250aCBtYXkgdGFrZSwgMSBpcyB0aGUgc21hbGxlc3QuCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgI2luY2x1ZGUgPGZsb2F0Lmg+CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gdGVtcGxhdGUgZm9yIHR5cGUgbGltaXRzCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdHJ1Y3QgaV9tYXhtaW4geworICAgIHN0YXRpYyBjb25zdCBUIG14OworICAgIHN0YXRpYyBjb25zdCBUIG1uOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgaW50ID4geworICAgIHN0YXRpYyBjb25zdCBpbnQgbXggPSAweDdmZmZmZmZmOworICAgIHN0YXRpYyBjb25zdCBpbnQgbW4gPSAweDgwMDAwMDAwOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgdW5zaWduZWQgaW50ID4geworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXggPSAweGZmZmZmZmZmOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbW4gPSAweDAwMDAwMDAwOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgbG9uZyBsb25nID4geworICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbXggPSAweDdmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG1uID0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBteCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkxMOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbW4gPSAweDAwMDAwMDAwMDAwMDAwMDBMTDsKK307CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorCisgICAgLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9X3QgdHlwZXMKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAgICAgVVQgY291bnQ7ICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkCisgICAgICAgIFQgIHViOworICAgICAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgVCAgbGI7CisgICAgICAgIFNUIHN0OyAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQKKyAgICAgICAgVVQgdGM7ICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkCisgICAgICAgIFQgIHN0YXRpY19zdGVhbF9jb3VudGVyOyAvLyBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIKKworICAgICAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworCisgICAgICAgIC8vIEtNUF9BTElHTiggMzIgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAgICAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgICAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAgICAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgICAgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICAgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7IC8vIGNvbXBpbGVyIGRvZXMgbm90IGFjY2VwdCBzaXplb2YoVCkqNAorICAgICAgICAgICAgVCAgcGFybTE7CisgICAgICAgICAgICBUICBwYXJtMjsKKyAgICAgICAgICAgIFQgIHBhcm0zOworICAgICAgICAgICAgVCAgcGFybTQ7CisgICAgICAgIH07CisKKyAgICAgICAgVVQgb3JkZXJlZF9sb3dlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgVVQgb3JkZXJlZF91cHBlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIFQgIGxhc3RfdXBwZXI7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH07CisKKyNlbHNlIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCisgICAgLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9X3QgdHlwZXMKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAgICAgVCAgbGI7CisgICAgICAgIFQgIHViOworICAgICAgICBTVCBzdDsgICAgICAgICAgICAvLyBzaWduZWQKKyAgICAgICAgVVQgdGM7ICAgICAgICAgICAgLy8gdW5zaWduZWQKKworICAgICAgICBUICBwYXJtMTsKKyAgICAgICAgVCAgcGFybTI7CisgICAgICAgIFQgIHBhcm0zOworICAgICAgICBUICBwYXJtNDsKKworICAgICAgICBVVCBjb3VudDsgICAgICAgICAvLyB1bnNpZ25lZAorCisgICAgICAgIFVUIG9yZGVyZWRfbG93ZXI7IC8vIHVuc2lnbmVkCisgICAgICAgIFVUIG9yZGVyZWRfdXBwZXI7IC8vIHVuc2lnbmVkCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworCVQgIGxhc3RfdXBwZXI7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH07CisKKyNlbmRpZiAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgdHlwZQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGUgeworICAgIC8vIGR1cGxpY2F0ZSBhbGlnbm1lbnQgaGVyZSwgb3RoZXJ3aXNlIHNpemUgb2Ygc3RydWN0dXJlIGlzIG5vdCBjb3JyZWN0IGluIG91ciBjb21waWxlcgorICAgIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBwcml2YXRlX2luZm9fdG1wbCB7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlPCBUID4gcDsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdCAgICAgICAgICAgICBwNjQ7CisgICAgfSB1OworICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZTsgIC8qIHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCisgICAga21wX3VpbnQzMiAgICAgIG9yZGVyZWQ7ICAgLyogb3JkZXJlZCBjbGF1c2Ugc3BlY2lmaWVkICovCisgICAga21wX3VpbnQzMiAgICAgIG9yZGVyZWRfYnVtcGVkOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTNdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcgorICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyAqIG5leHQ7IC8qIHN0YWNrIG9mIGJ1ZmZlcnMgZm9yIG5lc3Qgb2Ygc2VyaWFsIHJlZ2lvbnMgKi8KKyAgICBrbXBfdWludDMyICAgICAgbm9tZXJnZTsgICAvKiBkb24ndCBtZXJnZSBpdGVycyBpZiBzZXJpYWxpemVkICovCisgICAga21wX3VpbnQzMiAgICAgIHR5cGVfc2l6ZTsKKyAgICBlbnVtIGNvbnNfdHlwZSAgcHVzaGVkX3dzOworfTsKKworCisvLyByZXBsYWNlcyBkaXNwYXRjaF9zaGFyZWRfaW5mb3szMiw2NH0gc3RydWN0dXJlcyBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm97MzIsNjR9X3QgdHlwZXMKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZSB7CisgICAgLyogY2h1bmsgaW5kZXggdW5kZXIgZHluYW1pYywgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyB1bmRlciBzdGF0aWMtc3RlYWw7CisgICAgICAgaXRlcmF0aW9uIGluZGV4IG90aGVyd2lzZSAqLworICAgIHZvbGF0aWxlIFVUICAgICBpdGVyYXRpb247CisgICAgdm9sYXRpbGUgVVQgICAgIG51bV9kb25lOworICAgIHZvbGF0aWxlIFVUICAgICBvcmRlcmVkX2l0ZXJhdGlvbjsKKyAgICBVVCAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK307CisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3NoYXJlZF9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCB0eXBlCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlIHsKKyAgICAvLyB3ZSBuZWVkIHVuaW9uIGhlcmUgdG8ga2VlcCB0aGUgc3RydWN0dXJlIHNpemUKKyAgICB1bmlvbiBzaGFyZWRfaW5mb190bXBsIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZTwgVVQgPiAgczsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90ICAgICAgICAgICAgICAgczY0OworICAgIH0gdTsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICBidWZmZXJfaW5kZXg7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgVVNFX1RFU1RfTE9DS1MKKworLy8gdGVzdF90aGVuX2FkZCB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5fYWRkKCB2b2xhdGlsZSBUICpwLCBUIGQgKSB7IEtNUF9BU1NFUlQoMCk7IH07CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCit0ZXN0X3RoZW5fYWRkPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fQUREMzIoIHAsIGQgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9hZGQ8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9BREQ2NCggcCwgZCApOworICAgIHJldHVybiByOworfQorCisvLyB0ZXN0X3RoZW5faW5jX2FjcSB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jX2FjcSggdm9sYXRpbGUgVCAqcCApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwICkKK3sKKyAgICBrbXBfaW50MzIgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gdGVzdF90aGVuX2luYyB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jKCB2b2xhdGlsZSBUICpwICkgeyBLTVBfQVNTRVJUKDApOyB9OworCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgordGVzdF90aGVuX2luYzwga21wX2ludDMyID4oIHZvbGF0aWxlIGttcF9pbnQzMiAqcCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fSU5DMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmM8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAgKQoreworICAgIGttcF9pbnQ2NCByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0lOQzY0KCBwICk7CisgICAgcmV0dXJuIHI7Cit9CisKKy8vIGNvbXBhcmVfYW5kX3N3YXAgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2ludDMyCitjb21wYXJlX2FuZF9zd2FwKCB2b2xhdGlsZSBUICpwLCBUIGMsIFQgcyApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK2NvbXBhcmVfYW5kX3N3YXA8IGttcF9pbnQzMiA+KCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjLCBrbXBfaW50MzIgcyApCit7CisgICAgcmV0dXJuIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggcCwgYywgcyApOworfQorCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgorY29tcGFyZV9hbmRfc3dhcDwga21wX2ludDY0ID4oIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGMsIGttcF9pbnQ2NCBzICkKK3sKKyAgICByZXR1cm4gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCBwLCBjLCBzICk7Cit9CisKKy8qCisgICAgU3BpbiB3YWl0IGxvb3AgdGhhdCBmaXJzdCBkb2VzIHBhdXNlLCB0aGVuIHlpZWxkLgorICAgIFdhaXRzIHVudGlsIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gd2hlbiBjYWxsZWQgd2l0aCAqc3Bpbm5lciBhbmQgY2hlY2suCisgICAgRG9lcyBOT1QgcHV0IHRocmVhZHMgdG8gc2xlZXAuCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEFyZ3VtZW50czoKKyAgICAgICAgb2JqIC0tIGlzIGhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0IHRvIHJlcG9ydCB0byBpdHRub3RpZnkuIEl0IGlzIHVzZWQgdG8gcmVwb3J0CisgICAgICAgICAgICBsb2NrcyBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBpZiBsb2NrIGlzIGFjcXVpcmVkIGltbWVkaWF0ZWx5LCBpdHMgYWRkcmVzcyBpcworICAgICAgICAgICAgcmVwb3J0ZWQgdG8gaXR0bm90aWZ5IHZpYSBLTVBfRlNZTkNfQUNRVUlSRUQoKS4gSG93ZXZlciwgaXQgbG9jayBjYW5ub3QgYmUgYWNxdWlyZWQKKyAgICAgICAgICAgIGltbWVkaWF0ZWx5IGFuZCBsb2NrIHJvdXRpbmUgY2FsbHMgdG8gS01QX1dBSVRfWUlFTEQoKSwgdGhlIGxhdGVyIHNob3VsZCByZXBvcnQgdGhlIHNhbWUKKyAgICAgICAgICAgIGFkZHJlc3MsIG5vdCBhbiBhZGRyZXNzIG9mIGxvdy1sZXZlbCBzcGlubmVyLgorI2VuZGlmIC8vIFVTRV9JVFRfQlVJTEQKKyovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorLy8gVG9EbzogbWFrZSBpbmxpbmUgZnVuY3Rpb24gKG1vdmUgdG8gaGVhZGVyIGZpbGUgZm9yIGljbCkKK3N0YXRpYyBVVCAgLy8gdW5zaWduZWQgNC0gb3IgOC1ieXRlIHR5cGUKK19fa21wX3dhaXRfeWllbGQoIHZvbGF0aWxlIFVUICogc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgIFVUICAgICAgICAgICAgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKCogcHJlZCkoIFVULCBVVCApCisgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICAgICAgICAqIG9iaikgICAgLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBVVCAgICAgICAgICogc3BpbiAgICAgICAgICA9IHNwaW5uZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBzcGluczsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICgqZikgKCBVVCwgVVQgKSA9IHByZWQ7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIHI7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSghZihyID0gKnNwaW4sIGNoZWNrKSkKKyAgICB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8vIGlmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10aHJvdWdocHV0LCB0aGVuIHlpZWxkCisgICAgICAgIC8vIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZQorICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9lcSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX25lcSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2x0KCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9nZSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPj0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2xlKCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3IoIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkX3JlZiApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sqZ3RpZF9yZWZdOworICAgICAgICBpZiAoIHRoIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZQorICAgICAgICAgICYmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCAtPiBwdXNoZWRfd3MgIT0gY3Rfbm9uZSApICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwgKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2RlbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwcjsKKworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworLy8gICAgaW50ICBjaWQgPSAqY2lkX3JlZjsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAtPiB0aC50aF9kaXNwYXRjaCApOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGlmICggcHIgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+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+IHQudF9zZXJpYWxpemVkOworICAgIHRoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0IGN1cl9jaHVuayA9IGNodW5rOworICAgIGludCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgPSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgJiYKKyAgICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICYmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxOworI2VuZGlmCisgICAgaWYgKCAhIGFjdGl2ZSApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgICAgIG15X2J1ZmZlcl9pbmRleCA9IHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcF9pbmRleCArKzsKKworICAgICAgICAvKiBXaGF0IGhhcHBlbnMgd2hlbiBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VzLCBuZWVkIHRvIHJlc2l6ZSBidWZmZXI/ICovCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gICogPgorICAgICAgICAgICAgKCAmdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIEtNUF9NQVhfRElTUF9CVUYgXSApOworICAgICAgICBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogPgorICAgICAgICAgICAgKCAmdGVhbSAtPiB0LnRfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIEtNUF9NQVhfRElTUF9CVUYgXSApOworICAgIH0KKworICAgIC8qIFBpY2sgdXAgdGhlIG5vbWVyZ2Uvb3JkZXJlZCBiaXRzIGZyb20gdGhlIHNjaGVkdWxpbmcgdHlwZSAqLworICAgIGlmICggKHNjaGVkdWxlID49IGttcF9ubV9sb3dlcikgJiYgKHNjaGVkdWxlIDwga21wX25tX3VwcGVyKSApIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBUUlVFOworICAgICAgICBzY2hlZHVsZSA9IChlbnVtIHNjaGVkX3R5cGUpKCgoaW50KXNjaGVkdWxlKSAtIChrbXBfbm1fbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBGQUxTRTsKKyAgICB9CisgICAgcHItPnR5cGVfc2l6ZSA9IF9fX2ttcF9zaXplX3R5cGU7IC8vIHJlbWVtYmVyIHRoZSBzaXplIG9mIHZhcmlhYmxlcworICAgIGlmICgga21wX29yZF9sb3dlciAmIHNjaGVkdWxlICkgeworICAgICAgICBwci0+b3JkZXJlZCA9IFRSVUU7CisgICAgICAgIHNjaGVkdWxlID0gKGVudW0gc2NoZWRfdHlwZSkoKChpbnQpc2NoZWR1bGUpIC0gKGttcF9vcmRfbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm9yZGVyZWQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICBzY2hlZHVsZSA9IF9fa21wX3N0YXRpYzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfcnVudGltZSApIHsKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgc2NoZWR1bGluZyBzcGVjaWZpZWQgYnkgT01QX1NDSEVEVUxFIChvciBfX2ttcF9zY2hfZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKQorICAgICAgICAgICAgc2NoZWR1bGUgPSB0ZWFtIC0+IHQudF9zY2hlZC5yX3NjaGVkX3R5cGU7CisgICAgICAgICAgICAvLyBEZXRhaWwgdGhlIHNjaGVkdWxlIGlmIG5lZWRlZCAoZ2xvYmFsIGNvbnRyb2xzIGFyZSBkaWZmZXJlbnRpYXRlZCBhcHByb3ByaWF0ZWx5KQorICAgICAgICAgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfZ3VpZGVkOworICAgICAgICAgICAgfSBlbHNlIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9zdGF0aWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBVc2UgdGhlIGNodW5rIHNpemUgc3BlY2lmaWVkIGJ5IE9NUF9TQ0hFRFVMRSAob3IgZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKQorICAgICAgICAgICAgY2h1bmsgPSB0ZWFtIC0+IHQudF9zY2hlZC5jaHVuazsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBjdXJfY2h1bmsgPSBjaHVuazsKKyNlbmRpZgorICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmsgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9ndWlkZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGNodW5rIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9hdXRvICkgeworICAgICAgICAgICAgLy8gbWFwcGluZyBhbmQgZGlmZmVyZW50aWF0aW9uOiBpbiB0aGUgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKQorICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9hdXRvOworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDoga21wX3NjaF9hdXRvOiBUIyUlZCBuZXc6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuayApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8qIGd1aWRlZCBhbmFseXRpY2FsIG5vdCBzYWZlIGZvciB0b28gbWFueSB0aHJlYWRzICovCisgICAgICAgIGlmICggdGVhbS0+dC50X25wcm9jID4gMTw8MjAgJiYgc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkICkgeworICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBEaXNwYXRjaE1hbnlUaHJlYWRzICk7CisgICAgICAgIH0KKyAgICAgICAgcHItPnUucC5wYXJtMSA9IGNodW5rOworICAgIH0KKyAgICBLTVBfQVNTRVJUMiggKGttcF9zY2hfbG93ZXIgPCBzY2hlZHVsZSAmJiBzY2hlZHVsZSA8IGttcF9zY2hfdXBwZXIpLAorICAgICAgICAgICAgICAgICJ1bmtub3duIHNjaGVkdWxpbmcgdHlwZSIgKTsKKworICAgIHByLT51LnAuY291bnQgPSAwOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggc3QgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgKKyAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwKKyAgICAgICAgICAgICAgICAoIHByLT5vcmRlcmVkID8gY3RfcGRvX29yZGVyZWQgOiBjdF9wZG8gKSwgbG9jCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgdGMgPSAoIHViIC0gbGIgKyBzdCApOworICAgIGlmICggc3QgIT0gMSApIHsKKyAgICAgICAgaWYgKCBzdCA8IDAgKSB7CisgICAgICAgICAgICBpZiAoIGxiIDwgdWIgKSB7CisgICAgICAgICAgICAgICAgdGMgPSAwOyAgICAgICAgICAgIC8vIHplcm8tdHJpcAorICAgICAgICAgICAgfSBlbHNlIHsgICAvLyBsYiA+PSB1YgorICAgICAgICAgICAgICAgIHRjID0gKFNUKXRjIC8gc3Q7ICAvLyBjb252ZXJ0IHRvIHNpZ25lZCBkaXZpc2lvbgorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgICAgICAvLyBzdCA+IDAKKyAgICAgICAgICAgIGlmICggdWIgPCBsYiApIHsKKyAgICAgICAgICAgICAgICB0YyA9IDA7ICAgICAgICAgICAgLy8gemVyby10cmlwCisgICAgICAgICAgICB9IGVsc2UgeyAgIC8vIGxiID49IHViCisgICAgICAgICAgICAgICAgdGMgLz0gc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCB1YiA8IGxiICkgeyAgICAgICAgLy8gc3QgPT0gMQorICAgICAgICB0YyA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvLXRyaXAKKyAgICB9CisKKyAgICAvLyBBbnkgaGFsZi1kZWNlbnQgb3B0aW1pemVyIHdpbGwgcmVtb3ZlIHRoaXMgdGVzdCB3aGVuIHRoZSBibG9ja3MgYXJlIGVtcHR5IHNpbmNlIHRoZSBtYWNyb3MgZXhwYW5kIHRvIG5vdGhpbmcKKyAgICAvLyB3aGVuIHN0YXRpc3RpY3MgYXJlIGRpc2FibGVkLgorICAgIGlmIChzY2hlZHVsZSA9PSBfX2ttcF9zdGF0aWMpCisgICAgeworICAgICAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0ZPUl9zdGF0aWMpOworICAgICAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX3N0YXRpY19pdGVyYXRpb25zLCB0Yyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX2R5bmFtaWMpOworICAgICAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX2R5bmFtaWNfaXRlcmF0aW9ucywgdGMpOworICAgIH0KKworICAgIHByLT51LnAubGIgPSBsYjsKKyAgICBwci0+dS5wLnViID0gdWI7CisgICAgcHItPnUucC5zdCA9IHN0OworICAgIHByLT51LnAudGMgPSB0YzsKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgIHByLT51LnAubGFzdF91cHBlciA9IHViICsgc3Q7CisgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyAgICAvKiBOT1RFOiBvbmx5IHRoZSBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uKHMpIGhhcyBhY3RpdmUgb3JkZXJlZCBzZWN0aW9ucyAqLworCisgICAgaWYgKCBhY3RpdmUgKSB7CisgICAgICAgIGlmICggcHItPm9yZGVyZWQgPT0gMCApIHsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3I7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gMTsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IDA7CisKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBfX2ttcF9kaXNwYXRjaF9kZW88IFVUID47CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvPCBVVCA+OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGVudW0gY29uc190eXBlIHdzID0gcHItPm9yZGVyZWQgPyBjdF9wZG9fb3JkZXJlZCA6IGN0X3BkbzsKKyAgICAgICAgaWYgKCBwdXNoX3dzICkgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGd0aWQsIHdzLCBsb2MgKTsKKyAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSB3czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2NoZWNrX3dvcmtzaGFyZSggZ3RpZCwgd3MsIGxvYyApOworICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IGN0X25vbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKCBzY2hlZHVsZSApIHsKKyAgICAjaWYgICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIEtNUF9BUkNIX1g4Nl82NCApCisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIFQgbnRjLCBpbml0OworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLCBndGlkICkgKTsKKworICAgICAgICAgICAgbnRjID0gKHRjICUgY2h1bmsgPyAxIDogMCkgKyB0YyAvIGNodW5rOworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgJiYgbnRjID49IG5wcm9jICkgeworICAgICAgICAgICAgICAgIFQgaWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICAgICAgICAgIFQgc21hbGxfY2h1bmssIGV4dHJhczsKKworICAgICAgICAgICAgICAgIHNtYWxsX2NodW5rID0gbnRjIC8gbnByb2M7CisgICAgICAgICAgICAgICAgZXh0cmFzID0gbnRjICUgbnByb2M7CisKKyAgICAgICAgICAgICAgICBpbml0ID0gaWQgKiBzbWFsbF9jaHVuayArICggaWQgPCBleHRyYXMgPyBpZCA6IGV4dHJhcyApOworICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBpbml0ICsgc21hbGxfY2h1bmsgKyAoIGlkIDwgZXh0cmFzID8gMSA6IDAgKTsKKworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBsYjsKKyAgICAgICAgICAgICAgICAvL3ByLT5wZmllbGRzLnBhcm0zID0gMDsgLy8gaXQncyBub3QgdXNlZCBpbiBzdGF0aWNfc3RlYWwKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gaWQ7CisgICAgICAgICAgICAgICAgcHItPnUucC5zdCA9IHN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBmYWxsaW5nLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAgICAgICAgICAgICAvKiB0b28gZmV3IGl0ZXJhdGlvbnM6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCAqLworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgLyogRkFMTC1USFJPVUdIIHRvIHN0YXRpYyBiYWxhbmNlZCAqLworICAgICAgICB9IC8vIGNhc2UKKyAgICAjZW5kaWYKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgVCBpbml0LCBsaW1pdDsKKworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgVCBpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIHRjIDwgbnByb2MgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaWQgPCB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKGlkID09IHRjIC0gMSk7ICAvKiBwYXJtMSBzdG9yZXMgKnBsYXN0aXRlciAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7ICAvKiBtZWFucyBubyBtb3JlIGNodW5rcyB0byBleGVjdXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFQgc21hbGxfY2h1bmsgPSB0YyAvIG5wcm9jOworICAgICAgICAgICAgICAgICAgICBUIGV4dHJhcyA9IHRjICUgbnByb2M7CisgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpZCAqIHNtYWxsX2NodW5rICsgKGlkIDwgZXh0cmFzID8gaWQgOiBleHRyYXMpOworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBzbWFsbF9jaHVuayAtIChpZCA8IGV4dHJhcyA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IChpZCA9PSBucHJvYyAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCB0YyA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQgPSAwOworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRjIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IFRSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gemVybyB0cmlwIGNvdW50CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSAxOyAgLyogbWVhbnMgbm8gbW9yZSBjaHVua3MgdG8gZXhlY3V0ZSAqLworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgY2h1bmsgZm9yIG1ldGFkYXRhIHJlcG9ydAorICAgICAgICAgICAgaWYgKCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgKQorICAgICAgICAgICAgICAgIGN1cl9jaHVuayA9IGxpbWl0IC0gaW5pdCArIDE7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggc3QgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBwci0+dS5wLmxiID0gbGIgKyBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBsYiArIGxpbWl0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUIHViX3RtcCA9IGxiICsgbGltaXQgKiBzdDsgICAvLyBjYWxjdWxhdGVkIHVwcGVyIGJvdW5kLCAidWIiIGlzIHVzZXItZGVmaW5lZCB1cHBlciBib3VuZAorICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBsYiArIGluaXQgKiBzdDsKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdXBwZXIgYm91bmQgdG8gInViIiBpZiBuZWVkZWQsIHNvIHRoYXQgTVMgbGFzdHByaXZhdGUgd2lsbCBtYXRjaCBpdCBleGFjdGx5CisgICAgICAgICAgICAgICAgaWYgKCBzdCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAoIHViX3RtcCArIHN0ID4gdWIgPyB1YiA6IHViX3RtcCApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAoIHViX3RtcCArIHN0IDwgdWIgPyB1YiA6IHViX3RtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IC8vIGNhc2UKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkIDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgY2FzZVxuIixndGlkKSk7CisKKyAgICAgICAgICAgIGlmICggbnByb2MgPiAxICkgeworICAgICAgICAgICAgICAgIGlmICggKDJMICogY2h1bmsgKyAxICkgKiBucHJvYyA+PSB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2h1bmsgc2l6ZSB0b28gbGFyZ2UsIHN3aXRjaCB0byBkeW5hbWljICovCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZW1haW5pbmcgaXRlcnMgYmVjb21lIGxlc3MgdGhhbiBwYXJtMiAtIHN3aXRjaCB0byBkeW5hbWljCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBndWlkZWRfaW50X3BhcmFtICogbnByb2MgKiAoIGNodW5rICsgMSApOworICAgICAgICAgICAgICAgICAgICAqKGRvdWJsZSopJnByLT51LnAucGFybTMgPSBndWlkZWRfZmx0X3BhcmFtIC8gbnByb2M7ICAgLy8gbWF5IG9jY3VweSBwYXJtMyBhbmQgcGFybTQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgZmFsbGluZy10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeVxuIixndGlkKSk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgLyogdGVhbS0+dC50X25wcm9jID09IDE6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKi8KKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX2dyZWVkeSBjYXNlXG4iLGd0aWQpKTsKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gdGM7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCBjYXNlXG4iLCBndGlkKSk7CisKKyAgICAgICAgICAgIGlmICggbnByb2MgPiAxICkgeworICAgICAgICAgICAgICAgIGlmICggKDJMICogY2h1bmsgKyAxICkgKiBucHJvYyA+PSB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2h1bmsgc2l6ZSB0b28gbGFyZ2UsIHN3aXRjaCB0byBkeW5hbWljICovCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29tbW9ubHkgdXNlZCB0ZXJtOiAoMiBucHJvYyAtIDEpLygyIG5wcm9jKSAqLworICAgICAgICAgICAgICAgICAgICBEQkwgeDsKKworICAgICAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIExpbnV4KiBPUyBhbHJlYWR5IGhhcyA2NC1iaXQgY29tcHV0YXRpb24gYnkgZGVmYXVsdCBmb3IKKwkJICAgICAgIGxvbmcgZG91YmxlLCBhbmQgb24gV2luZG93cyogT1Mgb24gSW50ZWwoUikgNjQsCisJCSAgICAgICAvUWxvbmdfZG91YmxlIGRvZXNuJ3Qgd29yay4gIE9uIFdpbmRvd3MqIE9TCisJCSAgICAgICBvbiBJQS0zMiBhcmNoaXRlY3R1cmUsIHdlIG5lZWQgdG8gc2V0IHByZWNpc2lvbiB0bworCQkgICAgICAgNjQtYml0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNTMtYml0LiBFdmVuIHRob3VnaCBsb25nCisJCSAgICAgICBkb3VibGUgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MqIE9TIG9uIEludGVsKFIpIDY0LCB0aGUKKwkJICAgICAgIHJlc3VsdGluZyBsYWNrIG9mIHByZWNpc2lvbiBpcyBub3QgZXhwZWN0ZWQgdG8gaW1wYWN0CisJCSAgICAgICB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGFsZ29yaXRobSwgYnV0IHRoaXMgaGFzIG5vdCBiZWVuCisJCSAgICAgICBtYXRoZW1hdGljYWxseSBwcm92ZW4uCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgRlBDVyBhbmQgc2V0IHByZWNpc2lvbiB0byA2NC1iaXQsIGFzCisgICAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyB0byA1My1iaXQKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3cgPSBfY29udHJvbDg3KDAsMCk7CisgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcoX1BDXzY0LF9NQ1dfUEMpOyAvLyAwLDB4MzAwMDAKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gc29sdmVyIGZvciBjcm9zcy1vdmVyIHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHRhcmdldCA9ICgobG9uZyBkb3VibGUpY2h1bmsgKiAyICsgMSkgKiBucHJvYyAvIHRjOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNyb3Nzb3ZlciBwb2ludC0tY2h1bmsgaW5kZXhlcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4KKwkJICAgICAgIHRoaXMgcG9pbnQgc3dpdGNoIHRvIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICBVVCAgIGNyb3NzOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1vbmx5IHVzZWQgdGVybTogKDIgbnByb2MgLSAxKS8oMiBucHJvYykgKi8KKyAgICAgICAgICAgICAgICAgICAgeCA9IChsb25nIGRvdWJsZSkxLjAgLSAobG9uZyBkb3VibGUpMC41IC8gbnByb2M7CisKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICB7IC8vIHRlc3QgbmF0dXJhbCBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfdGVzdF9hIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTCAgZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfSB0OworICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG5hdHVyYWxfYWxpZ25tZW50ID0gKHB0cmRpZmZfdCkmdC5iIC0gKHB0cmRpZmZfdCkmdCAtIChwdHJkaWZmX3QpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vX19rbXBfd2FybiggIiAlbGx4ICVsbHggJWxsZCIsIChsb25nIGxvbmcpJnQuZCwgKGxvbmcgbG9uZykmdCwgKGxvbmcgbG9uZyluYXR1cmFsX2FsaWdubWVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoIChwdHJkaWZmX3QpJnByLT51LnAucGFybTMgKSAmICggbmF0dXJhbF9hbGlnbm1lbnQgKSApID09IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0RFQlVHCisKKyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgdGVybSBpbiB0aHJlYWQgcHJpdmF0ZSBkaXNwYXRjaCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgKihEQkwqKSZwci0+dS5wLnBhcm0zID0geDsKKworICAgICAgICAgICAgICAgICAgICAvKiBzb2x2ZSBmb3IgdGhlIGNyb3Nzb3ZlciBwb2ludCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGkgZm9yIHdoaWNoIENfaSA8PSBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVVCAgICAgICAgICBsZWZ0LCByaWdodCwgbWlkOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZXN0aW1hdGUgaW5pdGlhbCB1cHBlciBhbmQgbG93ZXIgYm91bmQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSByaWdodCBpcyBhcyBsb25nIGFzIGl0IGlzIHBvc2l0aXZlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGFmZmVjdHMgcGVyZm9ybWFuY2Ugb2YgdGhlIHNvbHZlcgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gMjI5OworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IF9fa21wX3BvdzwgVVQgPih4LHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcCA+IHRhcmdldCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAqPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA8PD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHA+dGFyZ2V0ICYmIHJpZ2h0IDwgKDE8PDI3KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID4+IDE7IC8qIGxvd2VyIGJvdW5kIGlzIHByZXZpb3VzIChmYWlsZWQpIGVzdGltYXRlIG9mIHVwcGVyIGJvdW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXNlY3Rpb24gcm9vdC1maW5kaW5nIG1ldGhvZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBsZWZ0ICsgMSA8IHJpZ2h0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3BvdzwgVVQgPih4LG1pZCkgPiB0YXJnZXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3MgPSByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBhc3NlcnQgc2FuaXR5IG9mIGNvbXB1dGVkIGNyb3Nzb3ZlciBwb2ludCAqLworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGNyb3NzICYmIF9fa21wX3BvdzwgVVQgPih4LCBjcm9zcyAtIDEpID4gdGFyZ2V0ICYmIF9fa21wX3BvdzwgVVQgPih4LCBjcm9zcykgPD0gdGFyZ2V0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBjcm9zc292ZXIgcG9pbnQgaW4gdGhyZWFkIHByaXZhdGUgZGlzcGF0Y2ggc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBjcm9zczsKKworICAgICAgICAgICAgICAgICAgICAvLyBDNzU4MDMKKyAgICAgICAgICAgICAgICAgICAgI2lmICggKCBLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MgKSAmJiBLTVBfQVJDSF9YODYgKSAmJiAoICEgZGVmaW5lZCggS01QX0k4ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgI2RlZmluZSBHVUlERURfQU5BTFlUSUNBTF9XT1JLQVJPVU5EICgqKCBEQkwgKiApJnByLT51LnAucGFybTMpCisgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQgKHgpCisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljLXN0eWxlIHNjaGVkdWxpbmcgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSB0YyAtIF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmcodGMsIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQsIGNyb3NzKSAtIGNyb3NzICogY2h1bms7CisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgRlBDVworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhvbGRGcGN3LF9NQ1dfUEMpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgLyogdGVhbS0+dC50X25wcm9jID09IDE6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKi8KKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gdGM7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19ncmVlZHkgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKCB0ZWFtIC0+IHQudF9ucHJvYyA+IDEgKSA/CisgICAgICAgICAgICAgICAgKCB0YyArIHRlYW0tPnQudF9ucHJvYyAtIDEgKSAvIHRlYW0tPnQudF9ucHJvYyA6CisgICAgICAgICAgICAgICAgdGM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZCA6CisgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCA6CisgICAgICAgIGlmICggcHItPnUucC5wYXJtMSA8PSAwICkgeworICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgICAgICB9CisgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfY2h1bmtlZC9rbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlc1xuIiwgZ3RpZCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWwgOgorICAgICAgICB7CisgICAgICAgICAgICAvKiBUU1M6IHRyYXBlem9pZCBzZWxmLXNjaGVkdWxpbmcsIG1pbmltdW0gY2h1bmtfc2l6ZSA9IHBhcm0xICovCisKKyAgICAgICAgICAgIFQgcGFybTEsIHBhcm0yLCBwYXJtMywgcGFybTQ7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3RyYXBlem9pZGFsIGNhc2VcbiIsIGd0aWQgKSApOworCisgICAgICAgICAgICBwYXJtMSA9IGNodW5rOworCisgICAgICAgICAgICAvKiBGIDogc2l6ZSBvZiB0aGUgZmlyc3QgY3ljbGUgKi8KKyAgICAgICAgICAgIHBhcm0yID0gKCB0YyAvICgyICogdGVhbS0+dC50X25wcm9jKSApOworCisgICAgICAgICAgICBpZiAoIHBhcm0yIDwgMSApIHsKKyAgICAgICAgICAgICAgICBwYXJtMiA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEwgOiBzaXplIG9mIHRoZSBsYXN0IGN5Y2xlLiAgTWFrZSBzdXJlIHRoZSBsYXN0IGN5Y2xlCisgICAgICAgICAgICAgKiAgICAgaXMgbm90IGxhcmdlciB0aGFuIHRoZSBmaXJzdCBjeWNsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBwYXJtMSA8IDEgKSB7CisgICAgICAgICAgICAgICAgcGFybTEgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICggcGFybTEgPiBwYXJtMiApIHsKKyAgICAgICAgICAgICAgICBwYXJtMSA9IHBhcm0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBOIDogbnVtYmVyIG9mIGN5Y2xlcyAqLworICAgICAgICAgICAgcGFybTMgPSAoIHBhcm0yICsgcGFybTEgKTsKKyAgICAgICAgICAgIHBhcm0zID0gKCAyICogdGMgKyBwYXJtMyAtIDEpIC8gcGFybTM7CisKKyAgICAgICAgICAgIGlmICggcGFybTMgPCAyICkgeworICAgICAgICAgICAgICAgIHBhcm0zID0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2lnbWEgOiBkZWNyZWFzaW5nIGluY3Igb2YgdGhlIHRyYXBlem9pZCAqLworICAgICAgICAgICAgcGFybTQgPSAoIHBhcm0zIC0gMSApOworICAgICAgICAgICAgcGFybTQgPSAoIHBhcm0yIC0gcGFybTEgKSAvIHBhcm00OworCisgICAgICAgICAgICAvLyBwb2ludGxlc3MgY2hlY2ssIGJlY2F1c2UgcGFybTQgPj0gMCBhbHdheXMKKyAgICAgICAgICAgIC8vaWYgKCBwYXJtNCA8IDAgKSB7CisgICAgICAgICAgICAvLyAgICBwYXJtNCA9IDA7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IHBhcm0xOworICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IHBhcm0yOworICAgICAgICAgICAgcHItPnUucC5wYXJtMyA9IHBhcm0zOworICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHBhcm00OworICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgICAgICAgS01QX01TRyggVW5rbm93blNjaGVkVHlwZURldGVjdGVkICksIC8vIFByaW1hcnkgbWVzc2FnZQorICAgICAgICAgICAgICAgIEtNUF9ITlQoIEdldE5ld2VyTGlicmFyeSApLCAgICAgICAgICAvLyBIaW50CisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlhZGljIGFyZ3VtZW50IGxpc3QgdGVybWluYXRvcgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9IC8vIHN3aXRjaAorICAgIHByLT5zY2hlZHVsZSA9IHNjaGVkdWxlOworICAgIGlmICggYWN0aXZlICkgeworICAgICAgICAvKiBUaGUgbmFtZSBvZiB0aGlzIGJ1ZmZlciBzaG91bGQgYmUgbXlfYnVmZmVyX2luZGV4IHdoZW4gaXQncyBmcmVlIHRvIHVzZSBpdCAqLworCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGJlZm9yZSB3YWl0OiBteV9idWZmZXJfaW5kZXg6JWQgc2gtPmJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIG15X2J1ZmZlcl9pbmRleCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZDwga21wX3VpbnQzMiA+KCAmIHNoLT5idWZmZXJfaW5kZXgsIG15X2J1ZmZlcl9pbmRleCwgX19rbXBfZXE8IGttcF91aW50MzIgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgLy8gTm90ZTogS01QX1dBSVRfWUlFTEQoKSBjYW5ub3QgYmUgdXNlZCB0aGVyZTogYnVmZmVyIGluZGV4IGFuZCBteV9idWZmZXJfaW5kZXggYXJlCisgICAgICAgICAgICAvLyAqYWx3YXlzKiAzMi1iaXQgaW50ZWdlcnMuCisgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGFmdGVyIHdhaXQ6IG15X2J1ZmZlcl9pbmRleDolZCBzaC0+YnVmZmVyX2luZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbXlfYnVmZmVyX2luZGV4LCBzaC0+YnVmZmVyX2luZGV4KSApOworCisgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QqKSBwcjsKKyAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfc2hfY3VycmVudCA9IChkaXNwYXRjaF9zaGFyZWRfaW5mb190KikgIHNoOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQoIGd0aWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgLy8gUmVwb3J0IGxvb3AgbWV0YWRhdGEKKyAgICAgICAgaWYgKCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgKSB7CisgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBtZXRhZGF0YSBieSBtYXN0ZXIgb2YgYWN0aXZlIHRlYW0gYXQgbGV2ZWwgMQorICAgICAgICAgICAga21wX3VpbnQ2NCBzY2hlZHR5cGUgPSAwOworICAgICAgICAgICAgc3dpdGNoICggc2NoZWR1bGUgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOi8vIENodW5rIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIHN3aXRjaCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgY3VyX2NodW5rID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBzY2hlZHR5cGUgPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKy8vICAgICAgICAgICAgU2hvdWxkIHdlIHB1dCB0aGlzIGNhc2UgdW5kZXIgInN0YXRpYyI/CisvLyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKGxvYywgc2NoZWR0eXBlLCB0YywgY3VyX2NodW5rKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9OyAvLyBpZgorCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCByZXR1cm5pbmc6IHNjaGVkdWxlOiUlZCBvcmRlcmVkOiUlJXMgbGI6JSUlcyB1YjolJSVzIiBcCisgICAgICAgICAgICAiIHN0OiUlJXMgdGM6JSUlcyBjb3VudDolJSVzXG5cdG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXMiIFwKKyAgICAgICAgICAgICIgcGFybTE6JSUlcyBwYXJtMjolJSVzIHBhcm0zOiUlJXMgcGFybTQ6JSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAsICggYnVmZiwKKyAgICAgICAgICAgIGd0aWQsIHByLT5zY2hlZHVsZSwgcHItPm9yZGVyZWQsIHByLT51LnAubGIsIHByLT51LnAudWIsCisgICAgICAgICAgICBwci0+dS5wLnN0LCBwci0+dS5wLnRjLCBwci0+dS5wLmNvdW50LAorICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIsIHByLT51LnAucGFybTEsCisgICAgICAgICAgICBwci0+dS5wLnBhcm0yLCBwci0+dS5wLnBhcm0zLCBwci0+dS5wLnBhcm00ICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorICAgICNpZiAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCApCisgICAgaWYgKCBfX19rbXBfc2l6ZV90eXBlIDwgOCApIHsKKyAgICAgIC8vIEl0IGNhbm5vdCBiZSBndWFyYW50ZWVkIHRoYXQgYWZ0ZXIgZXhlY3V0aW9uIG9mIGEgbG9vcCB3aXRoIHNvbWUgb3RoZXIgc2NoZWR1bGUga2luZAorICAgICAgLy8gYWxsIHRoZSBwYXJtMyB2YXJpYWJsZXMgd2lsbCBjb250YWluIHRoZSBzYW1lIHZhbHVlLgorICAgICAgLy8gRXZlbiBpZiBhbGwgcGFybTMgd2lsbCBiZSB0aGUgc2FtZSwgaXQgc3RpbGwgZXhpc3RzIGEgYmFkIGNhc2UgbGlrZSB1c2luZyAwIGFuZCAxCisgICAgICAvLyByYXRoZXIgdGhhbiBwcm9ncmFtIGxpZmUtdGltZSBpbmNyZW1lbnQuCisgICAgICAvLyBTbyB0aGUgZGVkaWNhdGVkIHZhcmlhYmxlIGlzIHJlcXVpcmVkLiBUaGUgJ3N0YXRpY19zdGVhbF9jb3VudGVyJyBpcyB1c2VkLgorICAgICAgaWYoIHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljX3N0ZWFsICkgeworICAgICAgICAvLyBPdGhlciB0aHJlYWRzIHdpbGwgaW5zcGVjdCB0aGlzIHZhcmlhYmxlIHdoZW4gc2VhcmNoaW5nIGZvciBhIHZpY3RpbS4KKyAgICAgICAgLy8gVGhpcyBpcyBhIGZsYWcgc2hvd2luZyB0aGF0IG90aGVyIHRocmVhZHMgbWF5IHN0ZWFsIGZyb20gdGhpcyB0aHJlYWQgc2luY2UgdGhlbi4KKyAgICAgICAgdm9sYXRpbGUgVCAqIHAgPSAmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcjsKKyAgICAgICAgKnAgPSAqcCArIDE7CisgICAgICB9CisgICAgfQorICAgICNlbmRpZiAvLyAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAmJiBVU0VfU1RFQUxJTkcgKQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSkgeworICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIEZvciBvcmRlcmVkIGxvb3BzLCBlaXRoZXIgX19rbXBfZGlzcGF0Y2hfZmluaXNoKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgorICogZXZlcnkgaXRlcmF0aW9uLCBvciBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyCisgKiBldmVyeSBjaHVuayBvZiBpdGVyYXRpb25zLiAgSWYgdGhlIG9yZGVyZWQgc2VjdGlvbihzKSB3ZXJlIG5vdCBleGVjdXRlZAorICogZm9yIHRoaXMgaXRlcmF0aW9uIChvciBldmVyeSBpdGVyYXRpb24gaW4gdGhpcyBjaHVuayksIHdlIG5lZWQgdG8gc2V0IHRoZQorICogb3JkZXJlZCBpdGVyYXRpb24gY291bnRlcnMgc28gdGhhdCB0aGUgbmV4dCB0aHJlYWQgY2FuIHByb2NlZWQuCisgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZmluaXNoKCBpbnQgZ3RpZCwgaWRlbnRfdCAqbG9jICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCBTVDsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogc2ggPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID52b2xhdGlsZSogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCApIHsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVUIGxvd2VyID0gcHItPnUucC5vcmRlcmVkX2xvd2VyOworCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJSVkIGJlZm9yZSB3YWl0OiBvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlJWQgYWZ0ZXIgd2FpdDogb3JkZXJlZF9pdGVyYXRpb246JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uICk7CisgICAgICAgIH0gLy8gaWYKKyAgICB9IC8vIGlmCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoIGludCBndGlkLCBpZGVudF90ICpsb2MgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFVUID46OnNpZ25lZF90IFNUOworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworLy8gICAgICAgIGludCBjaWQ7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiAqIHByID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gdm9sYXRpbGUgKiBzaCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPnZvbGF0aWxlKiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisvLyAgICAgICAgZm9yIChjaWQgPSAwOyBjaWQgPCBLTVBfTUFYX09SREVSRUQ7ICsrY2lkKSB7CisgICAgICAgICAgICBVVCBsb3dlciA9IHByLT51LnAub3JkZXJlZF9sb3dlcjsKKyAgICAgICAgICAgIFVUIHVwcGVyID0gcHItPnUucC5vcmRlcmVkX3VwcGVyOworICAgICAgICAgICAgVVQgaW5jID0gdXBwZXIgLSBsb3dlciArIDE7CisKKyAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkID09IGluYyApIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluYyAtPSBwci0+b3JkZXJlZF9idW1wZWQ7CisKKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlJWQgYmVmb3JlIHdhaXQ6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCB1cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKy8vISEhISEgVE9ETyBjaGVjayBpZiB0aGUgaW5jIHNob3VsZCBiZSB1bnNpZ25lZCwgb3Igc2lnbmVkPz8/CisgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJSVkIGFmdGVyIHdhaXQ6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgaW5jOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBpbmMsIGxvd2VyLCB1cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIHRlc3RfdGhlbl9hZGQ8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGluYyk7CisgICAgICAgICAgICB9CisvLyAgICAgICAgfQorICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiBEZWZpbmUgYSBtYWNybyBmb3IgZXhpdGluZyBfX2ttcF9kaXNwYXRjaF9uZXh0KCkuIElmIHN0YXR1cyBpcyAwCisgKiAobm8gbW9yZSB3b3JrKSwgdGhlbiB0ZWxsIE9NUFQgdGhlIGxvb3AgaXMgb3Zlci4gSW4gc29tZSBjYXNlcworICoga21wX2Rpc3BhdGNoX2ZpbmkoKSBpcyBub3QgY2FsbGVkLiAqLworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisjZGVmaW5lIE9NUFRfTE9PUF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzdGF0dXMgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkpIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOyAgICAgICAgXAorICAgICAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkoICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPTVBUX0xPT1BfRU5EIC8vIG5vLW9wCisjZW5kaWYKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIGludAorX19rbXBfZGlzcGF0Y2hfbmV4dCgKKyAgICBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwgVCAqcF9sYiwgVCAqcF91YiwgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBfc3QKKykgeworCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCAgREJMOworI2lmICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIEtNUF9BUkNIX1g4Nl82NCApCisgICAgc3RhdGljIGNvbnN0IGludCBfX19rbXBfc2l6ZV90eXBlID0gc2l6ZW9mKCBVVCApOworI2VuZGlmCisKKyAgICAvLyBUaGlzIGlzIHBvdGVudGlhbGx5IHNsaWdodGx5IG1pc2xlYWRpbmcsIHNjaGVkdWxlKHJ1bnRpbWUpIHdpbGwgYXBwZWFyIGhlcmUgZXZlbiBpZiB0aGUgYWN0dWFsIHJ1bnRtZSBzY2hlZHVsZQorICAgIC8vIGlzIHN0YXRpYy4gKFdoaWNoIHBvaW50cyBvdXQgYSBkaXNhZGF2YW50YWdlIG9mIHNjaGVkdWxlKHJ1bnRpbWUpOiBldmVuIHdoZW4gc3RhdGljIHNjaGVkdWxpbmcgaXMgdXNlZCBpdCBjb3N0cworICAgIC8vIG1vcmUgdGhhbiBhIGNvbXBpbGUgdGltZSBjaG9pY2UgdG8gdXNlIHN0YXRpYyBzY2hlZHVsaW5nIHdvdWxkLikKKyAgICBLTVBfVElNRV9CTE9DSyhGT1JfZHluYW1pY19zY2hlZHVsaW5nKTsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICogcHI7CisgICAga21wX2luZm9fdCAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aCAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgICAgICAgICAgICAgICAgICAgICAgICAgICogdGVhbSA9IHRoIC0+IHRoLnRoX3RlYW07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwX2xiICYmIHBfdWIgJiYgcF9zdCApOyAvLyBBQzogdGhlc2UgY2Fubm90IGJlIE5VTEwKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIGNhbGxlZCBwX2xiOiUlJXMgcF91YjolJSVzIHBfc3Q6JSUlcyBwX2xhc3Q6ICUlcFxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgKnBfbGIsICpwX3ViLCBwX3N0ID8gKnBfc3QgOiAwLCBwX2xhc3QgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIC8qIE5PVEU6IHNlcmlhbGl6ZSB0aGlzIGRpc3BhdGNoIGJlY2FzZSB3ZSBhcmUgbm90IGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByICk7CisKKyAgICAgICAgaWYgKCAoc3RhdHVzID0gKHByLT51LnAudGMgIT0gMCkpID09IDAgKSB7CisgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAqcF91YiA9IDA7CisvLyAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorLy8gICAgICAgICAgICAgICAgKnBfbGFzdCA9IDA7CisgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+cHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIHByLT5ub21lcmdlICkgeworICAgICAgICAgICAga21wX2ludDMyIGxhc3Q7CisgICAgICAgICAgICBUICAgICAgICAgc3RhcnQ7CisgICAgICAgICAgICBVVCAgICAgICAgbGltaXQsIHRyaXAsIGluaXQ7CisgICAgICAgICAgICBTVCAgICAgICAgaW5jcjsKKyAgICAgICAgICAgIFQgICAgICAgICBjaHVuayA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfZHluYW1pY19jaHVua2VkIGNhc2VcbiIsIGd0aWQgKSApOworCisgICAgICAgICAgICBpbml0ID0gY2h1bmsgKiBwci0+dS5wLmNvdW50Kys7CisgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0IDw9IHRyaXApKSA9PSAwICkgeworICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisvLyAgICAgICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKy8vICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+cHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZSggZ3RpZCwgcHItPnB1c2hlZF93cywgbG9jICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworICAgICAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gbGFzdDsKKyAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gaW5jcjsKKyAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwci0+dS5wLnRjID0gMDsKKyAgICAgICAgICAgICpwX2xiID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICpwX3ViID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gKnBfdWI7CisgICAgICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwX2xhc3QgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwX3N0ID0gcHItPnUucC5zdDsKKyAgICAgICAgfSAvLyBpZgorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgc2VyaWFsaXplZCBjYXNlOiBwX2xiOiUlJXMgIiBcCisgICAgICAgICAgICAgICAgInBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiUlcCAlJWQgIHJldHVybmluZzolJWRcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgKnBfc3QsIHBfbGFzdCwgKnBfbGFzdCwgc3RhdHVzKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICAgICAgU1NDX01BUktfRElTUEFUQ0hfTkVYVCgpOworI2VuZGlmCisgICAgICAgIE9NUFRfTE9PUF9FTkQ7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2ludDMyIGxhc3QgPSAwOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAqc2g7CisgICAgICAgIFQgICAgICAgICBzdGFydDsKKyAgICAgICAgU1QgICAgICAgIGluY3I7CisgICAgICAgIFVUICAgICAgICBsaW1pdCwgdHJpcCwgaW5pdDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX3RlYW0tPnQudF9kaXNwYXRjaFt0aC0+dGgudGhfaW5mby5kcy5kc190aWRdICk7CisKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKworICAgICAgICBpZiAoIHByLT51LnAudGMgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIHplcm8gdHJpcCBjb3VudAorICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHItPnNjaGVkdWxlKSB7CisgICAgICAgICAgICAjaWYgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgJiYgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLCBndGlkKSApOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fX2ttcF9zaXplX3R5cGUgPiA0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgdGhyZWFkcyBkbyBub3QgbG9vayBpbnRvIHRoZSBkYXRhIG9mIHRoaXMgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHNvIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBtYWtlIHZvbGF0aWxlIGNhc3RpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICAgPSAoIHByLT51LnAuY291bnQgKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gKCBpbml0IDwgKFVUKXByLT51LnAudWIgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgdW5pb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVUIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICB1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHVuaW9uX2k0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIG9wZXJhdGlvbnMgb24gJ2NvdW50JyBvciAndWInIG11c3QgYmUgY29tYmluZWQgYXRvbWljYWxseSB0b2dldGhlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIGltcGxlbWVudGVkIG9ubHkgZm9yIDQtYnl0ZSBpbmRleGVzCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb25faTQgdm9sZCwgdm5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3LnAuY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2xhdGlsZSBrbXBfaW50NjQqICkmcHItPnUucC5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm9sZC5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQ2NCAqKSZ2bmV3LmIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldyA9IHZvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcucC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICAgPSB2bmV3LnAuY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gKCBpbml0IDwgKFVUKXZuZXcucC51YiApIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9saW1pdCA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhbGdvcml0aG0gb2Ygc2VhcmNoaW5nIGZvciBhIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFuZCBtZWFzdXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCAhc3RhdHVzICkgJiYgKCB3aGlsZV9saW1pdCAhPSArK3doaWxlX2luZGV4ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uX2k0ICB2b2xkLCB2bmV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgcmVtYWluaW5nOyAvLyBrbXBfaW50MzIgYmVjYXVzZSBLTVBfSTQgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgdmljdGltSWR4ICAgID0gcHItPnUucC5wYXJtNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgIG9sZFZpY3RpbUlkeCA9IHZpY3RpbUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKiB2aWN0aW07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICF2aWN0aW1JZHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmljdGltSWR4ID0gdGVhbS0+dC50X25wcm9jIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS12aWN0aW1JZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW0gPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggb3RoZXJfdGhyZWFkc1t2aWN0aW1JZHhdLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggKHZpY3RpbSA9PSBOVUxMIHx8IHZpY3RpbSA9PSBwcikgJiYgb2xkVmljdGltSWR4ICE9IHZpY3RpbUlkeCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGluayBhYm91dCBhIHByb3BlciBwbGFjZSBvZiB0aGlzIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoICF2aWN0aW0gKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgqKCB2b2xhdGlsZSBUICogKSZ2aWN0aW0tPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiggdm9sYXRpbGUgVCAqICkmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRlbGF5IHdvdWxkIGJlIG5pY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZpY3RpbSBpcyBub3QgcmVhZHkgeWV0IHRvIHBhcnRpY2lwYXRlIGluIHN0ZWFsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB2aWN0aW0gaXMgc3RpbGwgaW4ga21wX2luaXRfZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG9sZFZpY3RpbUlkeCA9PSB2aWN0aW1JZHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gdmljdGltSWR4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iID0gKiggdm9sYXRpbGUga21wX2ludDY0ICogKSggJnZpY3RpbS0+dS5wLmNvdW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHZuZXcucC51YiAtIDEpICogKFVUKWNodW5rIDw9IHRyaXAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdm5ldy5wLmNvdW50ID49IChVVCl2bmV3LnAudWIgfHwgKHJlbWFpbmluZyA9IHZuZXcucC51YiAtIHZuZXcucC5jb3VudCkgPCA0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldy5wLnViIC09IChyZW1haW5pbmcgPj4gMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCh2bmV3LnAudWIgLSAxKSAqIChVVCljaHVuayA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHdhcm5pbmcgb24gcG9pbnRsZXNzIGNvbXBhcmlzb24gb2YgdW5zaWduZWQgd2l0aCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDE4NiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh2bmV3LnAudWIgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApJnZpY3RpbS0+dS5wLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm9sZC5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm5ldy5iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHVwZGF0ZSBvd24gY291bnQgYW5kIHViCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIGV4ZWN1dGVkIG9uIG5vbi1LTVBfQVJDSF9YODYgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdG9taWMgNjQtYml0IHdyaXRlIG9uIGlhMzIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5hdmFpbGFibGUsIHNvIHdlIGRvIHRoaXMgaW4gc3RlcHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBUaGlzIGNvZGUgaXMgbm90IHRlc3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHZvbGQucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IHZuZXcucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdm5ldy5wLnViOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaXMgaXQgc2FmZSBhbmQgZW5vdWdoPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KSA9IHZvbGQuYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RhdHVzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAucGFybTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICo9IGNodW5rOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBjaHVuayArIGluaXQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGluaXQgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgI2VuZGlmIC8vICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIEtNUF9BUkNIX1g4Nl82NCApCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgY2FzZVxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gIXByLT51LnAuY291bnQpICE9IDAgKSB7ICAvKiBjaGVjayBpZiB0aHJlYWQgaGFzIGFueSBpdGVyYXRpb24gdG8gZG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBwci0+dS5wLnViOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHByLT51LnAucGFybTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLyogbm8gaXRlcmF0aW9ucyB0byBkbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5sYiA9IHByLT51LnAudWIgKyBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeTogIC8qIG9yaWdpbmFsIGNvZGUgZm9yIGttcF9zY2hfc3RhdGljX2dyZWVkeSB3YXMgbWVyZ2VkIGhlcmUgKi8KKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFQgcGFybTE7CisKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9zdGF0aWNfW2FmZmluaXR5fGNodW5rZWRdIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgICAgICBwYXJtMSA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgICAgICAgICAgICAgdHJpcCAgPSBwci0+dS5wLnRjIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCAgPSBwYXJtMSAqIChwci0+dS5wLmNvdW50ICsgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPD0gdHJpcCkpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHBhcm0xICsgaW5pdCAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgKz0gdGVhbS0+dC50X25wcm9jOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgICAgICAgICBpbml0ID0gY2h1bmsgKiB0ZXN0X3RoZW5faW5jX2FjcTwgU1QgPigodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworICAgICAgICAgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPD0gdHJpcCkpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gY2h1bmsgKyBpbml0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUICBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9ndWlkZWRfY2h1bmtlZCBpdGVyYXRpdmUgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YzsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgYXRvbWljIHBhcnQgb2YgY2FsY3VsYXRpb25zCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUICByZW1haW5pbmc7ICAgICAgICAgICAgIC8vIHNpZ25lZCwgYmVjYXVzZSBjYW4gYmUgPCAwCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gc2gtPnUucy5pdGVyYXRpb247ICAvLyBzaGFyZWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZW1haW5pbmcgPD0gMCApIHsgICAgLy8gQUM6IG5lZWQgdG8gY29tcGFyZSB3aXRoIDAgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLCBkb24ndCB0cnkgYXRvbWljIG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKFQpcmVtYWluaW5nIDwgcHItPnUucC5wYXJtMiApIHsgLy8gY29tcGFyZSB3aXRoIEsqbnByb2MqKGNodW5rKzEpLCBLPTIgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkeW5hbWljLXN0eWxlIHNoY2VkdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXRvbWljYWxseSBpbnJlbWVudCBpdGVyYXRpb25zLCBnZXQgb2xkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRlc3RfdGhlbl9hZGQ8U1Q+KCAoU1QqKSZzaC0+dS5zLml0ZXJhdGlvbiwgKFNUKWNodW5rc3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAvLyBhbGwgaXRlcmF0aW9ucyBnb3QgYnkgb3RoZXIgdGhyZWFkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvdCBzb21lIGl0ZXJhdGlvbnMgdG8gd29yayBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChUKXJlbWFpbmluZyA+IGNodW5rc3BlYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIGNodW5rc3BlYyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMTsgICAvLyB0aGUgbGFzdCBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpbml0ICsgcmVtYWluaW5nIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIChVVCkoIHJlbWFpbmluZyAqICooZG91YmxlKikmcHItPnUucC5wYXJtMyApOyAvLyBkaXZpZGUgYnkgSypucHJvYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb21wYXJlX2FuZF9zd2FwPFNUPiggKFNUKikmc2gtPnUucy5pdGVyYXRpb24sIChTVClpbml0LCAoU1QpbGltaXQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDQVMgd2FzIHN1Y2Nlc3NmdWwsIGNodW5rIG9idGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFQgICBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICBVVCBjaHVua0lkeDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIGZvciBzdG9yaW5nIG9yaWdpbmFsIEZQQ1cgdmFsdWUgZm9yIFdpbmRvd3MqIE9TIG9uCisJCSAgICAgICBJQS0zMiBhcmNoaXRlY3R1cmUgOC1ieXRlIHZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3c7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmcGN3U2V0ID0gMDsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9ndWlkZWRfY2h1bmtlZCBhbmFseXRpY2FsIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YzsKKworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9ucHJvYyA+IDEpOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCgyVUwgKiBjaHVua3NwZWMgKyAxKSAqIChVVCl0ZWFtLT50LnRfbnByb2MgPCB0cmlwKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSgxKSB7IC8qIHRoaXMgd2hpbGUgbG9vcCBpcyBhIHNhZmVndWFyZCBhZ2FpbnN0IHVuZXhwZWN0ZWQgemVybyBjaHVuayBzaXplcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtJZHggPSB0ZXN0X3RoZW5faW5jX2FjcTwgU1QgPigodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjaHVua0lkeCA+PSAoVVQpcHItPnUucC5wYXJtMiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBjaHVua0lkeCAqIGNodW5rc3BlYyArIHByLT51LnAuY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byB2ZXJpZnkgaW5pdCA+IDAgaW4gY2FzZSBvZiBvdmVyZmxvdyBpbiB0aGUgYWJvdmUgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoaW5pdCA+IDAgJiYgaW5pdCA8PSB0cmlwKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpbml0ICsgY2h1bmtzcGVjIC0xOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIGV4cG9uZW50aWFsLXN0eWxlIHNjaGVkdWxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGNoZWNrIGlzIHRvIHdvcmthcm91bmQgdGhlIGxhY2sgb2YgbG9uZyBkb3VibGUgcHJlY2lzaW9uIG9uIFdpbmRvd3MqIE9TLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2hlY2sgd29ya3MgYXJvdW5kIHRoZSBwb3NzaWJsZSBlZmZlY3QgdGhhdCBpbml0ICE9IDAgZm9yIGNodW5rSWR4ID09IDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLCBzYXZlIG9yaWdpbmFsCisJCQkgICAgICAgRlBDVyBhbmQgc2V0IHByZWNpc2lvbiB0byA2NC1iaXQsIGFzIFdpbmRvd3MqIE9TCisJCQkgICAgICAgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIHRvIDUzLWJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIWZwY3dTZXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEZwY3cgPSBfY29udHJvbDg3KDAsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcoX1BDXzY0LF9NQ1dfUEMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGN3U2V0ID0gMHgzMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjaHVua0lkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmc8IFQgPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlwLCAqKCBEQkwgKiApJnByLT51LnAucGFybTMsIGNodW5rSWR4ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaW5pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwIC0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZzwgVCA+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlwLCAqKCBEQkwgKiApJnByLT51LnAucGFybTMsIGNodW5rSWR4ICsgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoaW5pdCA8PSBsaW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbml0IDwgbGltaXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobGltaXQgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAoMSkKKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgRlBDVyBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgQUM6IGNoZWNrIGZwY3dTZXQgZmxhZyBmaXJzdCBiZWNhdXNlIG9sZEZwY3cgY2FuIGJlIHVuaW5pdGlhbGl6ZWQgaGVyZQorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIGZwY3dTZXQgJiYgKCBvbGRGcGN3ICYgZnBjd1NldCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcob2xkRnBjdyxfTUNXX1BDKTsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVUICAgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIFQgICAgcGFybTIgPSBwci0+dS5wLnBhcm0yOworICAgICAgICAgICAgICAgICAgICBUICAgIHBhcm0zID0gcHItPnUucC5wYXJtMzsKKyAgICAgICAgICAgICAgICAgICAgVCAgICBwYXJtNCA9IHByLT51LnAucGFybTQ7CisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfdHJhcGV6b2lkYWwgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworCisgICAgICAgICAgICAgICAgICAgIGluaXQgPSAoIGluZGV4ICogKCAoMipwYXJtMikgLSAoaW5kZXgtMSkqcGFybTQgKSApIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9ICgoVClpbmRleCA8IHBhcm0zICYmIGluaXQgPD0gdHJpcCkpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gKCAoaW5kZXgrMSkgKiAoIDIqcGFybTIgLSBpbmRleCpwYXJtNCApICkgLyAyIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsgLy8gdG8gYXZvaWQgY29tcGxhaW50cyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzZQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFVua25vd25TY2hlZFR5cGVEZXRlY3RlZCApLCAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIEdldE5ld2VyTGlicmFyeSApLCAgICAgICAgICAvLyBIaW50CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCB0ZXJtaW5hdG9yCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAvLyBzd2l0Y2gKKyAgICAgICAgfSAvLyBpZiB0YyA9PSAwOworCisgICAgICAgIGlmICggc3RhdHVzID09IDAgKSB7CisgICAgICAgICAgICBVVCAgIG51bV9kb25lOworCisgICAgICAgICAgICBudW1fZG9uZSA9IHRlc3RfdGhlbl9pbmM8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMubnVtX2RvbmUgKTsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIGluY3JlbWVudCBudW1fZG9uZTolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm51bV9kb25lICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBpZiAoIChTVCludW1fZG9uZSA9PSB0ZWFtLT50LnRfbnByb2MtMSApIHsKKyAgICAgICAgICAgICAgICAvKiBOT1RFOiByZWxlYXNlIHRoaXMgYnVmZmVyIHRvIGJlIHJldXNlZCAqLworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgICAgICAgICBzaC0+dS5zLm51bV9kb25lID0gMDsKKyAgICAgICAgICAgICAgICBzaC0+dS5zLml0ZXJhdGlvbiA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPIHJlcGxhY2Ugd2l0aCBnZW5lcmFsIHJlbGVhc2UgcHJvY2VkdXJlPyAqLworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICAgICAgc2ggLT4gYnVmZmVyX2luZGV4ICs9IEtNUF9NQVhfRElTUF9CVUY7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQgY2hhbmdlIGJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIHByLT5wdXNoZWRfd3MsIGxvYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IE5VTEw7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gTlVMTDsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPSBOVUxMOworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IE5VTEw7CisgICAgICAgIH0gLy8gaWYgKHN0YXR1cyA9PSAwKQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGVsc2UgaWYgKCBsYXN0ICkgeworICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gcHItPnUucC51YjsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgJiYgc3RhdHVzICE9IDAgKQorICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgfSAvLyBpZgorCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBub3JtYWwgY2FzZTogIiBcCisgICAgICAgICAgICAicF9sYjolJSVzIHBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiUlcCAgcmV0dXJuaW5nOiUlZFxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgcF9zdCA/ICpwX3N0IDogMCwgcF9sYXN0LCBzdGF0dXMgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19ESVNQQVRDSF9ORVhUKCk7CisjZW5kaWYKKyAgICBPTVBUX0xPT1BfRU5EOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXN0X2dldF9ib3VuZHMoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYywKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbG93ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jcgorKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIHRlYW1faWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgbnRlYW1zOworICAgIHJlZ2lzdGVyIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICogdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFzdGl0ZXIgJiYgcGxvd2VyICYmIHB1cHBlciApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZGlzdF9nZXRfYm91bmRzIGNhbGxlZCAoJWQpXG4iLCBndGlkKSk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCggIl9fa21wY19kaXN0X2dldF9ib3VuZHM6IFQjJSVkIGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCBpbmNyICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBpbGxlZ2FsLgorICAgICAgICAgICAgLy8gU29tZSB6ZXJvLXRyaXAgbG9vcHMgbWFpbnRhaW5lZCBieSBjb21waWxlciwgZS5nLjoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOysraSkgLy8gbG93ZXIgPj0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7LS1pKSAvLyBsb3dlciA8PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDsrK2kpIC8vIGluY3IgPiAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDstLWkpIC8vIGluY3IgPCAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyBDb21waWxlciBkb2VzIG5vdCBjaGVjayB0aGUgZm9sbG93aW5nIGlsbGVnYWwgbG9vcHM6CisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aTwxMDtpKz1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aT4wO2ktPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrKTsgICAvLyB3ZSBhcmUgaW4gdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgIG50ZWFtcyA9IHRoLT50aC50aF90ZWFtc19zaXplLm50ZWFtczsKKyAgICAjZW5kaWYKKyAgICB0ZWFtX2lkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGVhbXMgPT0gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jKTsKKworICAgIC8vIGNvbXB1dGUgZ2xvYmFsIHRyaXAgY291bnQKKyAgICBpZiggaW5jciA9PSAxICkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlciAtICpwbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZihpbmNyID09IC0xKSB7CisgICAgICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlciArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJpcF9jb3VudCA9IChTVCkoKnB1cHBlciAtICpwbG93ZXIpIC8gaW5jciArIDE7IC8vIGNhc3QgdG8gc2lnbmVkIHRvIGNvdmVyIGluY3I8MCBjYXNlCisgICAgfQorCisgICAgaWYoIHRyaXBfY291bnQgPD0gbnRlYW1zICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAvLyBvbmx5IHNvbWUgdGVhbXMgZ2V0IHNpbmdsZSBpdGVyYXRpb24sIG90aGVycyBnZXQgbm90aGluZworICAgICAgICBpZiggdGVhbV9pZCA8IHRyaXBfY291bnQgKSB7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0ZWFtX2lkICogaW5jcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gemVyby10cmlwIGxvb3AKKyAgICAgICAgfQorICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSB0cmlwX2NvdW50IC0gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICByZWdpc3RlciBVVCBjaHVuayA9IHRyaXBfY291bnQgLyBudGVhbXM7CisgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRlYW1zOworICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKCB0ZWFtX2lkICogY2h1bmsgKyAoIHRlYW1faWQgPCBleHRyYXMgPyB0ZWFtX2lkIDogZXh0cmFzICkgKTsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmsgKiBpbmNyIC0gKCB0ZWFtX2lkIDwgZXh0cmFzID8gMCA6IGluY3IgKTsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSBudGVhbXMgLSAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdpc3RlciBUIGNodW5rX2luY19jb3VudCA9CisgICAgICAgICAgICAgICAgKCB0cmlwX2NvdW50IC8gbnRlYW1zICsgKCAoIHRyaXBfY291bnQgJSBudGVhbXMgKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFQgdXBwZXIgPSAqcHVwcGVyOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICpwbG93ZXIgKz0gdGVhbV9pZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmtfaW5jX2NvdW50IC0gaW5jcjsKKyAgICAgICAgICAgIC8vIENoZWNrL2NvcnJlY3QgYm91bmRzIGlmIG5lZWRlZAorICAgICAgICAgICAgaWYoIGluY3IgPiAwICkgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyID4gdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA+PSB1cHBlciAmJiAqcHVwcGVyIDwgdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3BhdGNoIHJvdXRpbmVzCisvLyAgICBUcmFuc2ZlciBjYWxsIHRvIHRlbXBsYXRlPCB0eXBlIFQgPgorLy8gICAgX19rbXBfZGlzcGF0Y2hfaW5pdCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVCBsYiwgVCB1YiwgU1Qgc3QsIFNUIGNodW5rICkKK2V4dGVybiAiQyIgeworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHsKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gc2NoZWR1bGUgU2NoZWR1bGUgdHlwZQorQHBhcmFtIGxiICBMb3dlciBib3VuZAorQHBhcmFtIHViICBVcHBlciBib3VuZAorQHBhcmFtIHN0ICBTdGVwIChvciBpbmNyZW1lbnQgaWYgeW91IHByZWZlcikKK0BwYXJhbSBjaHVuayBUaGUgY2h1bmsgc2l6ZSB0byBibG9jayB3aXRoCisKK1RoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIHJ1bnRpbWUgdG8gc3RhcnQgYSBkeW5hbWljYWxseSBzY2hlZHVsZWQgZm9yIGxvb3AsIHNhdmluZyB0aGUgbG9vcCBhcmd1bWVudHMuCitUaGVzZSBmdW5jdGlvbnMgYXJlIGFsbCBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4KKyovCisKK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorCitEaWZmZXJlbmNlIGZyb20gX19rbXBjX2Rpc3BhdGNoX2luaXQgc2V0IG9mIGZ1bmN0aW9ucyBpcyB0aGVzZSBmdW5jdGlvbnMKK2FyZSBjYWxsZWQgZm9yIGNvbXBvc2l0ZSBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBjb25zdHJ1Y3QuIFRodXMgYmVmb3JlCityZWd1bGFyIGl0ZXJhdGlvbnMgZGlzcGF0Y2hpbmcgd2UgbmVlZCB0byBjYWxjIHBlci10ZWFtIGl0ZXJhdGlvbiBzcGFjZS4KKworVGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuCisqLwordm9pZAorX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXN0X2dldF9ib3VuZHM8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCAmbGIsICZ1Yiwgc3QgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsICZsYiwgJnViLCBzdCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCit2b2lkCitfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3RfZ2V0X2JvdW5kczwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCisvKiEKK0BwYXJhbSBsb2MgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBwX2xhc3QgUG9pbnRlciB0byBhIGZsYWcgc2V0IHRvIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNodW5rIG9yIHplcm8gb3RoZXJ3aXNlCitAcGFyYW0gcF9sYiAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF91YiAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF9zdCAgIFBvaW50ZXIgdG8gdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHJldHVybiBvbmUgaWYgdGhlcmUgaXMgd29yayB0byBiZSBkb25lLCB6ZXJvIG90aGVyd2lzZQorCitHZXQgdGhlIG5leHQgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNodW5rIG9mIHdvcmsgZm9yIHRoaXMgdGhyZWFkLgorSWYgdGhlcmUgaXMgbm8gbW9yZSB3b3JrLCB0aGVuIHRoZSBsYix1YiBhbmQgc3RyaWRlIG5lZWQgbm90IGJlIG1vZGlmaWVkLgorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBfbGIsIGttcF9pbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0ICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNAorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqcF9sYiwga21wX3VpbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwX2xiLCBrbXBfaW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKnBfbGIsIGttcF91aW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitAcGFyYW0gbG9jIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCisKK01hcmsgdGhlIGVuZCBvZiBhIGR5bmFtaWMgbG9vcC4KKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfZmluaV80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKy8qISBAfSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvL05vbi10ZW1wbGF0ZSByb3V0aW5lcyBmcm9tIGttcF9kaXNwYXRjaC5jIHVzZWQgaW4gb3RoZXIgc291cmNlcworCitrbXBfdWludDMyIF9fa21wX2VxXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA9PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sdF80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPCBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2dlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA+PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2xlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCitrbXBfdWludDMyCitfX2ttcF93YWl0X3lpZWxkXzQodm9sYXRpbGUga21wX3VpbnQzMiAqIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKiBwcmVkKSgga21wX3VpbnQzMiwga21wX3VpbnQzMiApCisgICAgICAgICAgICAgICAgICAgLCB2b2lkICAgICAgICAqIG9iaiAgICAvLyBIaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCwgb3IgTlVMTC4KKyAgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgKiBzcGluICAgICAgICAgID0gc3Bpbm5lcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICBjaGVjayAgICAgICAgID0gY2hlY2tlcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgc3BpbnM7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAoKmYpICgga21wX3VpbnQzMiwga21wX3VpbnQzMiApID0gcHJlZDsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICByOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopIHNwaW4gKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgICAgd2hpbGUoIWYociA9IFRDUl80KCpzcGluKSwgY2hlY2spKSB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgd2FpdGVkIGEgYml0LCBvciBhcmUgb3ZlcnN1YnNjcmliZWQsIHlpZWxkICovCisgICAgICAgIC8qIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZSAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDkwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDU5NiBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5jIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgT1MtaW5kZXBlbmRlbnRseS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBXZSB1c2UgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBmb3IgV2luZG93cyogT1MgaW5zdGVhZCBvZiBnZXRlbnYgYmVjYXVzZSB0aGUgYWN0IG9mCisgICAgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpCisgICAgdW5hdmFpbGFibGUuICBnZXRlbnYoKSBhcHBhcmVudGx5IGdldHMgYSBjbGVhbiBjb3B5IG9mIHRoZSBlbnYgdmFyaWFibGVzIGFzIHRoZXkgZXhpc3RlZAorICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgcnVuLgorICAgIEpIIDEyLzIzLzIwMDIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPbiBXaW5kb3dzKiBPUywgdGhlcmUgYXJlIHR3byBlbnZpcm9ubWVudHMgKGF0IGxlYXN0LCBzZWUgYmVsb3cpOgorCisgICAgICAgIDEuIEVudmlyb25tZW50IG1haW50YWluZWQgYnkgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiAKKwkgICBBY2Nlc3NpYmxlIHRocm91Z2ggR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLAorICAgICAgICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCksIGFuZCBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKS4KKworICAgICAgICAyLiBFbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBBY2Nlc3NpYmxlIHRocm91Z2ggZ2V0ZW52KCksIHB1dGVudigpLgorCisgICAgcHV0ZW52KCkgZnVuY3Rpb24gdXBkYXRlcyBib3RoIEMgYW5kIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gZ2V0ZW52KCkgZnVuY3Rpb24gCisgICAgc2VhcmNoIGZvciB2YXJpYWJsZXMgaW4gQyBSVEwgZW52aXJvbm1lbnQgb25seS4gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGZ1bmN0aW9ucyB3b3JrICpvbmx5KiAKKyAgICB3aXRoIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4KKworICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBtYWludGFpbmVkIGJ5IE9TLCBzbyB0aGVyZSBpcyBhbHdheXMgb25seSBvbmUgV2luZG93cyogT1Mgb24gCisgICAgSUEtMzIgYXJjaGl0ZWN0dXJlIHBlciBwcm9jZXNzLiBDaGFuZ2VzIGluIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhcmUgcHJvY2Vzcy12aXNpYmxlLgorCisgICAgQyBlbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBNdWx0aXBsZSBjb3BpZXMgb2YgQyBSVEwgbWF5IGJlIHByZXNlbnQgaW4gdGhlIHByb2Nlc3MsIGFuZAorICAgIGVhY2ggQyBSVEwgbWFpbnRhaW5zIGl0cyBvd24gZW52aXJvbm1lbnQuIDotKAorCisgICAgVGh1cywgcHJvcGVyIHdheSB0byB3b3JrIHdpdGggZW52aXJvbm1lbnQgb24gV2luZG93cyogT1MgaXM6CisKKyAgICAgICAgMS4gU2V0IHZhcmlhYmxlcyB3aXRoIHB1dGVudigpIGZ1bmN0aW9uIC0tIGJvdGggQyBhbmQgV2luZG93cyogT1Mgb24KKwkgICBJQS0zMiBhcmNoaXRlY3R1cmUgYXJlIGJlaW5nIHVwZGF0ZWQuIFdpbmRvd3MqIE9TIG9uIAorCSAgIElBLTMyIGFyY2hpdGVjdHVyZSBtYXkgYmUgY29uc2lkZXJlZCBhcyBwcmltYXJ5IHRhcmdldCwKKwkgICB3aGlsZSB1cGRhdGluZyBDIFJUTCBlbnZpcm9ubWVudCBpcyBhIGZyZWUgYm9udXMuCisKKyAgICAgICAgMi4gR2V0IHZhcmlhYmxlcyB3aXRoIEdldEVudmlyb25tZW50VmFyaWFibGUoKSAtLSBnZXRlbnYoKSBkb2VzIG5vdCAKKwkgICBzZWFyY2ggV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbmQgY2FuIG5vdCBzZWUgdmFyaWFibGVzCisJICAgc2V0IHdpdGggU2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLgorCisgICAgMjAwNy0wNC0wNSAtLSBsZXYKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI2luY2x1ZGUgImttcF9vcy5oIiAgICAvLyBLTVBfT1NfKi4KKyNpbmNsdWRlICJrbXAuaCIgICAgICAgLy8KKyNpbmNsdWRlICJrbXBfc3RyLmgiICAgLy8gX19rbXBfc3RyXyooKS4KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaWYgS01QX09TX1VOSVgKKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIGdldGVudiwgc2V0ZW52LCB1bnNldGVudi4KKyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+ICAgIC8vIHN0cmxlbiwgc3RyY3B5LgorICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgICNpbmNsdWRlIDxjcnRfZXh0ZXJucy5oPgorICAgICAgICAjZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisgICAgI2Vsc2UKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiAqIGVudmlyb247CisgICAgI2VuZGlmCisjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICNpbmNsdWRlIDx3aW5kb3dzLmg+ICAgLy8gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSwgU2V0RW52aXJvbm1lbnRWYXJpYWJsZSwgR2V0TGFzdEVycm9yLgorI2Vsc2UKKyAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyNlbmRpZgorCisKKy8vIFRPRE86IEVsaW1pbmF0ZSBkaXJlY3QgbWVtb3J5IGFsbG9jYXRpb25zLCB1c2Ugc3RyaW5nIG9wZXJhdGlvbnMgaW5zdGVhZC4KKworc3RhdGljIGlubGluZQordm9pZCAqCithbGxvY2F0ZSgKKyAgICBzaXplX3Qgc2l6ZQorKSB7CisgICAgdm9pZCAqIHB0ciA9IEtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemUgKTsKKyAgICBpZiAoIHB0ciA9PSBOVUxMICkgeworCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBwdHI7Cit9IC8vIGFsbG9jYXRlCisKKworY2hhciAqCitfX2ttcF9lbnZfZ2V0KCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKworICAgIGNoYXIgKiByZXN1bHQgPSBOVUxMOworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGdldGVudiggbmFtZSApOworICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gS01QX1NUUkxFTiggdmFsdWUgKSArIDE7CisgICAgICAgICAgICByZXN1bHQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBLTVBfU1RSTkNQWV9TKCByZXN1bHQsIGxlbiwgdmFsdWUsIGxlbiApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8qCisgICAgICAgICAgICBXZSB1c2UgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBmb3IgV2luZG93cyogT1MgaW5zdGVhZCBvZiBnZXRlbnYgYmVjYXVzZSB0aGUgYWN0IG9mCisgICAgICAgICAgICBsb2FkaW5nIGEgRExMIG9uIFdpbmRvd3MqIE9TIG1ha2VzIGFueSB1c2VyLXNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGkuZS4gd2l0aCBwdXRlbnYoKSkKKyAgICAgICAgICAgIHVuYXZhaWxhYmxlLiAgZ2V0ZW52KCkgYXBwYXJlbnRseSBnZXRzIGEgY2xlYW4gY29weSBvZiB0aGUgZW52IHZhcmlhYmxlcyBhcyB0aGV5IGV4aXN0ZWQKKyAgICAgICAgICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgcnVuLgorICAgICAgICAgICAgSkggMTIvMjMvMjAwMgorICAgICAgICAqLworICAgICAgICBEV09SRCByYzsKKyAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMLCAwICk7CisgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIC8vIFZhcmlhYmxlIGlzIG5vdCBmb3VuZCwgaXQncyBvaywganVzdCBjb250aW51ZS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERXT1JEIGxlbiA9IHJjOworICAgICAgICAgICAgcmVzdWx0ID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICk7CisgICAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCByZXN1bHQsIGxlbiApOworICAgICAgICAgICAgaWYgKCAhIHJjICkgeworICAgICAgICAgICAgICAgIC8vIEdldEVudmlyb25tZW50VmFyaWFibGUoKSBtYXkgcmV0dXJuIDAgaWYgdmFyaWFibGUgaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UgR2V0TGFzdEVycm9yKCkgcmV0dXJucyBFUlJPUl9TVUNDRVNTLgorICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9TVUNDRVNTICkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGVycm9yLiBUaGUgdmFyaWFibGUgc2hvdWxkIGJlIGluIHRoZSBlbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJ1ZmZlciBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoLgorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHJlc3VsdCApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCisgICAgcmV0dXJuIHJlc3VsdDsKKworfSAvLyBmdW5jIF9fa21wX2Vudl9nZXQKKworCisvLyBUT0RPOiBGaW5kIGFuZCByZXBsYWNlIGFsbCByZWd1bGFyIGZyZWUoKSB3aXRoIF9fa21wX2Vudl9mcmVlKCkuCisKK3ZvaWQKK19fa21wX2Vudl9mcmVlKCBjaGFyIGNvbnN0ICogKiB2YWx1ZSApIHsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHZhbHVlICE9IE5VTEwgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgKiB2YWx1ZSApOworICAgICogdmFsdWUgPSBOVUxMOworCit9IC8vIGZ1bmMgX19rbXBfZW52X2ZyZWUKKworCisKK2ludAorX19rbXBfZW52X2V4aXN0cyggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbHVlID0gZ2V0ZW52KCBuYW1lICk7CisgICAgICAgIHJldHVybiAoICggdmFsdWUgPT0gTlVMTCApID8gKCAwICkgOiAoIDEgKSApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIERXT1JEIHJjOworICAgICAgICByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIE5VTEwsIDAgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCit9IC8vIGZ1bmMgX19rbXBfZW52X2V4aXN0cworCisKKwordm9pZAorX19rbXBfZW52X3NldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSApIHsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICBpbnQgcmMgPSBzZXRlbnYoIG5hbWUsIHZhbHVlLCBvdmVyd3JpdGUgKTsKKyAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgLy8gRGVhZCBjb2RlLiBJIHRyaWVkIHRvIHB1dCB0b28gbWFueSB2YXJpYWJsZXMgaW50byBMaW51eCogT1MKKyAgICAgICAgICAgIC8vIGVudmlyb25tZW50IG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gV2hlbiBhcHBsaWNhdGlvbiBjb25zdW1lcworICAgICAgICAgICAgLy8gbW9yZSB0aGFuIH4yLjUgR0Igb2YgbWVtb3J5LCBlbnRpcmUgc3lzdGVtIGZlZWxzIGJhZC4gU29tZXRpbWVzCisgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBpcyBraWxsZWQgKGJ5IE9TPyksIHNvbWV0aW1lcyBzeXN0ZW0gc3RvcHMgCisgICAgICAgICAgICAvLyByZXNwb25kaW5nLi4uIEJ1dCB0aGlzIGVycm9yIG1lc3NhZ2UgbmV2ZXIgYXBwZWFycy4gLS1sbgorICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggTm90RW5vdWdoTWVtb3J5ICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgQk9PTCByYzsKKyAgICAgICAgaWYgKCAhIG92ZXJ3cml0ZSApIHsKKyAgICAgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCwgMCApOworICAgICAgICAgICAgaWYgKCByYyApIHsKKyAgICAgICAgICAgICAgICAvLyBWYXJpYWJsZSBleGlzdHMsIGRvIG5vdCBvdmVyd3JpdGUuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmMgPSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCB2YWx1ZSApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl9zZXQKKworCisKK3ZvaWQKK19fa21wX2Vudl91bnNldCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgdW5zZXRlbnYoIG5hbWUgKTsKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBCT09MIHJjID0gU2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl91bnNldAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAgSW50ZWwgT3Blbk1QIFJUTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZW52aXJvbm1lbnQ6IGp1c3QgYSBzdHJpbmcgb2YgY2hhcmFjdGVycywgdmFyaWFibGVzCisgICAgYXJlIHNlcGFyYXRlZCB3aXRoIHZlcnRpY2FsIGJhcnMsIGUuIGcuOgorCisgICAgICAgICJLTVBfV0FSTklOR1M9MHxLTVBfQUZGSU5JVFk9Y29tcGFjdHwiCisKKyAgICBFbXB0eSB2YXJpYWJsZXMgYXJlIGFsbG93ZWQgYW5kIGlnbm9yZWQ6CisKKyAgICAgICAgInx8S01QX1dBUk5JTkdTPTF8fCIKKworKi8KKworc3RhdGljCit2b2lkCitfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgY29uc3QgKiAgICBlbnYgICAgICAvLyBJOiBTdHJpbmcgdG8gcGFyc2UuCispIHsKKworICAgIGNoYXIgY29uc3QgY2hyX2RlbGltaXRlciAgID0gJ3wnOworICAgIGNoYXIgY29uc3Qgc3RyX2RlbGltaXRlcltdID0geyBjaHJfZGVsaW1pdGVyLCAwIH07CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgICAgICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgICAgICAgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICBjb3VudCAgICAgID0gMDsgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzIGluIHZhcnMgYXJyYXkuCisgICAgaW50ICAgICAgICAgICAgIGRlbGltaXRlcnMgPSAwOyAgLy8gTnVtYmVyIG9mIGRlbGltaXRlcnMgaW4gaW5wdXQgc3RyaW5nLgorCisgICAgLy8gQ29weSBvcmlnaW5hbCBzdHJpbmcsIHdlIHdpbGwgbW9kaWZ5IHRoZSBjb3B5LgorICAgIGJ1bGsgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBlbnYgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IGRlbGltaXRlcnMgKG1heGltdW0gbnVtYmVyIG9mIHZhcmlhYmxlcworICAgIC8vIGlzIG51bWJlciBvZiBkZWxpbWl0ZXJzIHBsdXMgb25lKS4KKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBwdHIgPSBidWxrOworICAgICAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgICAgICBwdHIgPSBzdHJjaHIoIHB0ciwgY2hyX2RlbGltaXRlciApOworICAgICAgICAgICAgaWYgKCBwdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICArKyBkZWxpbWl0ZXJzOworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgIH07IC8vIGZvcmV2ZXIKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSB2YXJzIGFycmF5LgorICAgIHZhcnMgPSAoa21wX2Vudl92YXJfdCAqKSBhbGxvY2F0ZSggKCBkZWxpbWl0ZXJzICsgMSApICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcmlhYmxlcy4KKyAgICB7CisgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIHZhcmlhYmxlIChib3RoIG5hbWUgYW5kIHZhbHVlKS4KKyAgICAgICAgY2hhciAqIG5hbWU7ICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiB2YXJpYWJsZS4KKyAgICAgICAgY2hhciAqIHZhbHVlOyAgIC8vIFBvaW50ZXIgdG8gdmFsdWUuCisgICAgICAgIGNoYXIgKiBidWY7ICAgICAvLyBCdWZmZXIgZm9yIF9fa21wX3N0cl90b2tlbigpIGZ1bmN0aW9uLgorICAgICAgICB2YXIgPSBfX2ttcF9zdHJfdG9rZW4oIGJ1bGssIHN0cl9kZWxpbWl0ZXIsICYgYnVmICk7ICAgICAgLy8gR2V0IHRoZSBmaXJzdCB2YXIuCisgICAgICAgIHdoaWxlICggdmFyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAvLyBTYXZlIGZvdW5kIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNvdW50IDwgZGVsaW1pdGVycyArIDEgKTsKKyAgICAgICAgICAgIHZhcnNbIGNvdW50IF0ubmFtZSAgPSBuYW1lOworICAgICAgICAgICAgdmFyc1sgY291bnQgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdmFyLgorICAgICAgICAgICAgdmFyID0gX19rbXBfc3RyX3Rva2VuKCBOVUxMLCBzdHJfZGVsaW1pdGVyLCAmIGJ1ZiApOworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH0KKworICAgIC8vIEZpbGwgb3V0IHJlc3VsdC4KKyAgICBibG9jay0+YnVsayAgPSBidWxrOworICAgIGJsb2NrLT52YXJzICA9IHZhcnM7CisgICAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZworCisKKworLyoKKyAgICBXaW5kb3dzKiBPUyAoYWN0dWFsbHksIERPUykgZW52aXJvbm1lbnQgYmxvY2sgaXMgYSBwaWVjZSBvZiBtZW1vcnkgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEVhY2gKKyAgICB2YXJpYWJsZSBpcyB0ZXJtaW5hdGVkIHdpdGggemVybyBieXRlLCBlbnRpcmUgYmxvY2sgaXMgdGVybWluYXRlZCB3aXRoIG9uZSBleHRyYSB6ZXJvIGJ5dGUsIHNvCisgICAgd2UgaGF2ZSB0d28gemVybyBieXRlcyBhdCB0aGUgZW5kIG9mIGVudmlyb25tZW50IGJsb2NrLCBlLiBnLjoKKworICAgICAgICAiSE9NRT1DOlxcdXNlcnNcXGxldlx4MDBPUz1XaW5kb3dzX05UXHgwMFx4MDAiCisKKyAgICBJdCBpcyBub3QgY2xlYXIgaG93IGVtcHR5IGVudmlyb25tZW50IGlzIHJlcHJlc2VudGVkLiAiXHgwMFx4MDAiPworKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCitzdGF0aWMKK3ZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3dpbmRvd3MoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgY29uc3QgKiAgICBlbnYgICAgICAvLyBJOiBQb2ludGVyIHRvIFdpbmRvd3MqIE9TIChET1MpIGVudmlyb25tZW50IGJsb2NrLgorKSB7CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgPSBOVUxMOworICAgIGttcF9lbnZfdmFyX3QgKiB2YXJzICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsgICAgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzIGluIHZhcnMgYXJyYXkuCisgICAgaW50ICAgICAgICAgICAgIHNpemUgID0gMDsgICAgIC8vIFNpemUgb2YgYnVsay4KKworICAgIGNoYXIgKiBuYW1lOyAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciAqIHZhbHVlOyAgIC8vIFBvaW50ZXIgdG8gdmFsdWUuCisKKyAgICBpZiAoIGVudiAhPSBOVUxMICkgeworCisgICAgICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IHZhcmlhYmxlcywgZmluZCBzaXplIG9mIGJsb2NrLgorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICAgICAgaW50ICAgICAgICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIHZhciA9IGVudjsgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdmFyaWFibGUgc3RhcnRzIGFuZCBiZWdpbm5pbmcgb2YgZW52aXJvbm1lbnQgYmxvY2suCisgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCB2YXIgKTsKKyAgICAgICAgICAgIHdoaWxlICggbGVuICE9IDAgKSB7CisgICAgICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUgKyBsZW4gKyAxOworICAgICAgICAgICAgICAgIHZhciA9IHZhciArIGxlbiArIDE7IC8vIE1vdmUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIHZhciApOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIHNpemUgPSBzaXplICsgMTsgICAgICAgICAvLyBUb3RhbCBzaXplIG9mIGVudiBibG9jaywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8gYnl0ZS4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgb3JpZ2luYWwgYmxvY2sgdG8gYnVsaywgd2Ugd2lsbCBtb2RpZnkgYnVsaywgbm90IG9yaWdpbmFsIGJsb2NrLgorICAgICAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICAgICAgS01QX01FTUNQWV9TKCBidWxrLCBzaXplLCBlbnYsIHNpemUgKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgdmFycyBhcnJheS4KKyAgICAgICAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopIGFsbG9jYXRlKCBjb3VudCAqIHNpemVvZigga21wX2Vudl92YXJfdCApICk7CisKKyAgICAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycywgbm93IGluIGJ1bGsuCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgICAgICBpbnQgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgdmFyID0gYnVsazsKKyAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIHZhciApOworICAgICAgICAgICAgd2hpbGUgKCBsZW4gIT0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB2YXIsICc9JywgJiBuYW1lLCAmIHZhbHVlICk7CisgICAgICAgICAgICAgICAgdmFyc1sgY291bnQgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICAgICAgdmFyc1sgY291bnQgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB2YXIuCisgICAgICAgICAgICAgICAgdmFyID0gdmFyICsgbGVuICsgMTsKKyAgICAgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCB2YXIgKTsKKyAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgIH0KKworICAgIH07IC8vIGlmCisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV93aW5kb3dzCisjZW5kaWYKKworCisvKgorICAgIFVuaXggZW52aXJvbm1lbnQgYmxvY2sgaXMgYSBhcnJheSBvZiBwb2ludGVycyB0byB2YXJpYWJsZXMsIGxhc3QgcG9pbnRlciBpbiBhcnJheSBpcyBOVUxMOgorCisgICAgICAgIHsgIkhPTUU9L2hvbWUvbGV2IiwgIlRFUk09eHRlcm0iLCBOVUxMIH0KKyovCisKK3N0YXRpYwordm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2VfdW5peCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgY2hhciAqICogICAgICAgIGVudiAgICAgIC8vIEk6IFVuaXggZW52aXJvbm1lbnQgdG8gcGFyc2UuCispIHsKKworICAgIGNoYXIgKiAgICAgICAgICBidWxrICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOworICAgIGludCAgICAgICAgICAgICBzaXplICA9IDA7ICAgIC8vIFNpemUgb2YgYnVsay4KKworICAgIC8vIENvdW50IG51bWJlciBvZiB2YXJpYWJsZXMgYW5kIGxlbmd0aCBvZiByZXF1aXJlZCBidWxrLgorICAgIHsKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICBzaXplICA9IDA7CisgICAgICAgIHdoaWxlICggZW52WyBjb3VudCBdICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzaXplICs9IEtNUF9TVFJMRU4oIGVudlsgY291bnQgXSApICsgMTsKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKikgYWxsb2NhdGUoIGNvdW50ICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMuCisgICAgeworICAgICAgICBjaGFyICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICBjaGFyICogbmFtZTsgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICAgICAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKyAgICAgICAgaW50ICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgaW50ICAgIGk7CisgICAgICAgIHZhciA9IGJ1bGs7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICAvLyBDb3B5IHZhcmlhYmxlIHRvIGJ1bGsuCisgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCBlbnZbIGkgXSApOworICAgICAgICAgICAgS01QX01FTUNQWV9TKCB2YXIsIHNpemUsIGVudlsgaSBdLCBsZW4gKyAxICk7CisgICAgICAgICAgICAvLyBTYXZlIGZvdW5kIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgIHZhcnNbIGkgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICB2YXJzWyBpIF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIC8vIE1vdmUgcG9pbnRlci4KKyAgICAgICAgICAgIHZhciArPSBsZW4gKyAxOworICAgICAgICB9OyAvLyBmb3IKKyAgICB9CisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV91bml4CisKKworCit2b2lkCitfX2ttcF9lbnZfYmxrX2luaXQoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgLy8gTTogQmxvY2sgdG8gaW5pdGlhbGl6ZS4KKyAgICBjaGFyIGNvbnN0ICogICAgYnVsayAgICAvLyBJOiBJbml0aWFsaXphdGlvbiBzdHJpbmcsIG9yIE5VTEwuCispIHsKKworICAgIGlmICggYnVsayAhPSBOVUxMICkgeworICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcoIGJsb2NrLCBidWxrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV91bml4KCBibG9jaywgZW52aXJvbiApOworICAgICAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKiBtZW0gPSBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoIG1lbSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52aXJvbm1lbnQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cyggYmxvY2ssIG1lbSApOworICAgICAgICAgICAgICAgIEZyZWVFbnZpcm9ubWVudFN0cmluZ3MoIG1lbSApOworICAgICAgICAgICAgfQorICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgICAgICNlbmRpZgorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfZW52X2Jsa19pbml0CisKKworCitzdGF0aWMKK2ludAorX19fa21wX2Vudl92YXJfY21wKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHFzb3J0KCkuCisgICAga21wX2Vudl92YXJfdCBjb25zdCAqIGxocywKKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogcmhzCispIHsKKyAgICByZXR1cm4gc3RyY21wKCBsaHMtPm5hbWUsIHJocy0+bmFtZSApOworfQorCit2b2lkCitfX2ttcF9lbnZfYmxrX3NvcnQoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrICAvLyBNOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc29ydC4KKykgeworCisgICAgcXNvcnQoCisgICAgICAgICh2b2lkICopIGJsb2NrLT52YXJzLAorICAgICAgICBibG9jay0+Y291bnQsCisgICAgICAgIHNpemVvZigga21wX2Vudl92YXJfdCApLAorICAgICAgICAoIGludCAoICogKSggdm9pZCBjb25zdCAqLCB2b2lkIGNvbnN0ICogKSApICYgX19fa21wX2Vudl92YXJfY21wCisgICAgKTsKKworfSAvLyBfX2ttcF9lbnZfYmxvY2tfc29ydAorCisKKwordm9pZAorX19rbXBfZW52X2Jsa19mcmVlKAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jayAgLy8gTTogQmxvY2sgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGZyZWUuCispIHsKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBibG9jay0+dmFycyApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBibG9jay0+YnVsayApOworCisgICAgYmxvY2stPmNvdW50ID0gMDsKKyAgICBibG9jay0+dmFycyAgPSBOVUxMOworICAgIGJsb2NrLT5idWxrICA9IE5VTEw7CisKK30gLy8gX19rbXBfZW52X2Jsa19mcmVlCisKKworCitjaGFyIGNvbnN0ICogICAgICAgICAgICAgICAvLyBSOiBWYWx1ZSBvZiB2YXJpYWJsZSBvciBOVUxMIGlmIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgorX19rbXBfZW52X2Jsa192YXIoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAvLyBJOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgY2hhciBjb25zdCAqICAgIG5hbWUgICAvLyBJOiBOYW1lIG9mIHZhcmlhYmxlIHRvIGZpbmQuCispIHsKKworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2stPmNvdW50OyArKyBpICkgeworICAgICAgICBpZiAoIHN0cmNtcCggYmxvY2stPnZhcnNbIGkgXS5uYW1lLCBuYW1lICkgPT0gMCApIHsKKyAgICAgICAgICAgIHJldHVybiBibG9jay0+dmFyc1sgaSBdLnZhbHVlOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIHJldHVybiBOVUxMOworCit9IC8vIF9fa21wX2Vudl9ibG9ja192YXIKKworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNiNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5oIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJvaWFibGVzIE9TLWluZGVwZW5kZW50bHkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0VOVklST05NRU5UX0gKKyNkZWZpbmUgS01QX0VOVklST05NRU5UX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBOVUxMIGlmIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdC4KKy8vICpOb3RlKjogUmV0dXJuZWQgcG9pbnRlZCAqbXVzdCogYmUgZnJlZWQgYWZ0ZXIgdXNlIHdpdGggX19rbXBfZW52X2ZyZWUoKS4KK2NoYXIgKiBfX2ttcF9lbnZfZ2V0KCBjaGFyIGNvbnN0ICogbmFtZSApOwordm9pZCAgIF9fa21wX2Vudl9mcmVlKCBjaGFyIGNvbnN0ICogKiB2YWx1ZSApOworCisvLyBSZXR1cm4gMSBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhpc3RzIG9yIDAgaWYgZG9lcyBub3QgZXhpc3QuCitpbnQgX19rbXBfZW52X2V4aXN0cyggY2hhciBjb25zdCAqIG5hbWUgKTsKKworLy8gU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3NldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSApOworCisvLyBVbnNldCAocmVtb3ZlKSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3Vuc2V0KCBjaGFyIGNvbnN0ICogbmFtZSApOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXb3JraW5nIHdpdGggZW52aXJvbm1lbnQgYmxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIGttcF9lbnZfYmxrX3QgaXMgcmVhZC1vbmx5IGNvbGxlY3Rpb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIChvciBlbnZpcm9ubWVudC1saWtlKS4gVXNhZ2U6CisKKyAgICAgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBOVUxMICk7IC8vIEluaXRpYWxpemUgYmxvY2sgZnJvbSBwcm9jZXNzIGVudmlyb25tZW50LgorICAgICAgICAvLyBvcgorICAgICAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssICJLTVBfV0FSTklORz0xfEtNUF9BRkZJTklUWT1ub25lIiApOyAvLyBmcm9tIHN0cmluZy4KKyAgICAgICAgX19rbXBfZW52X2Jsa19zb3J0KCAmIGJsb2NrICk7IC8vIE9wdGlvbmFsbHksIHNvcnQgbGlzdC4KKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgYmxvY2sudmFyc1sgaSBdLm5hbWUgYW5kIGJsb2NrLnZhcnNbIGkgXS52YWx1ZS4uLgorICAgICAgICB9OyAvLyBmb3IgaQorICAgICAgICBfX2ttcF9lbnZfYmxvY2tfZnJlZSggJiBibG9jayApOworKi8KKworc3RydWN0IF9fa21wX2Vudl92YXIgeworICAgIGNoYXIgY29uc3QgKiBuYW1lOworICAgIGNoYXIgY29uc3QgKiB2YWx1ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9lbnZfdmFyIGttcF9lbnZfdmFyX3Q7CisKK3N0cnVjdCBfX2ttcF9lbnZfYmxrIHsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgICAgYnVsazsKKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogdmFyczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgY291bnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfZW52X2JsayBrbXBfZW52X2Jsa190OworCit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCBrbXBfZW52X2Jsa190ICogYmxvY2ssIGNoYXIgY29uc3QgKiBidWxrICk7Cit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19mcmVlKCBrbXBfZW52X2Jsa190ICogYmxvY2sgKTsKK3ZvaWQgICAgICAgICBfX2ttcF9lbnZfYmxrX3NvcnQoIGttcF9lbnZfYmxrX3QgKiBibG9jayApOworY2hhciBjb25zdCAqIF9fa21wX2Vudl9ibGtfdmFyKCAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCBjaGFyIGNvbnN0ICogbmFtZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0VOVklST05NRU5UX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY2ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmMKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgKiBrbXBfZXJyb3IuYyAtLSBLUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTUlOX1NUQUNLICAgICAgIDEwMAorCisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc190ZXh0X2NbXSA9IHsKKyAgICAiKG5vbmUpIiwKKyAgICAiXCJwYXJhbGxlbFwiIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkICJmb3IiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwib3JkZXJlZFwiIHdvcmstc2hhcmluZyIsIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAiZm9yIG9yZGVyZWQiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwic2VjdGlvbnNcIiIsCisgICAgIndvcmstc2hhcmluZyIsICAgICAgICAgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAic2luZ2xlIiBiZWNhdXNlIG9mIGxvd2VyaW5nIG9mICJzZWN0aW9ucyIgcHJhZ21hcyAqLworICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txIG9yZGVyZWRcIiIsCisgICAgIlwiY3JpdGljYWxcIiIsCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBBUkFMTEVMICovCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBETyAqLworICAgICJcIm9yZGVyZWRcIiIsICAgICAgICAgICAgICAvKiBpbiBUQVNLUSAqLworICAgICJcIm1hc3RlclwiIiwKKyAgICAiXCJyZWR1Y2VcIiIsCisgICAgIlwiYmFycmllclwiIgorfTsKKworI2RlZmluZSBnZXRfc3JjKCBpZGVudCApICAgKCAoaWRlbnQpID09IE5VTEwgPyBOVUxMIDogKGlkZW50KS0+cHNvdXJjZSApCisKKyNkZWZpbmUgUFVTSF9NU0coIGN0LCBpZGVudCApIFwKKyAgICAiXHRwdXNoaW5nIG9uIHN0YWNrOiAlcyAoJXMpXG4iLCBjb25zX3RleHRfY1sgKGN0KSBdLCBnZXRfc3JjKCAoaWRlbnQpICkKKyNkZWZpbmUgUE9QX01TRyggcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiXHRwb3BwaW5nIG9mZiBzdGFjazogJXMgKCVzKVxuIiwgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zX3RleHRfY1sgKHApLT5zdGFja19kYXRhWyB0b3MgXS50eXBlIF0sICAgICAgIFwKKyAgICBnZXRfc3JjKCAocCktPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ICkKKworc3RhdGljIGludCBjb25zdCBjb25zX3RleHRfY19udW0gICAgPSBzaXplb2YoIGNvbnNfdGV4dF9jICAgICkgLyBzaXplb2YoIGNoYXIgY29uc3QgKiApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLSBTVEFSVCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9jaGVja19udWxsX2Z1bmMoIHZvaWQgKQoreworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBpbnQgZ3RpZCwgc3RydWN0IGNvbnNfaGVhZGVyICpwICkKK3sKKyAgICBpbnQgICAgaTsKKyAgICBzdHJ1Y3QgY29uc19kYXRhICpkOworCisgICAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICAgIGlmIChndGlkIDwgMCkKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiZXhwYW5kIGNvbnNfc3RhY2sgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKyAgICBkID0gcC0+c3RhY2tfZGF0YTsKKworICAgIHAtPnN0YWNrX3NpemUgPSAocC0+c3RhY2tfc2l6ZSAqIDIpICsgMTAwOworCisgICAgLyogVE9ETyBmcmVlIHRoZSBvbGQgZGF0YSAqLworICAgIHAtPnN0YWNrX2RhdGEgPSAoc3RydWN0IGNvbnNfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgY29uc19kYXRhICkgKiAocC0+c3RhY2tfc2l6ZSsxKSApOworCisgICAgZm9yIChpID0gcC0+c3RhY2tfdG9wOyBpID49IDA7IC0taSkKKyAgICAgICAgcC0+c3RhY2tfZGF0YVtpXSA9IGRbaV07CisKKyAgICAvKiBOT1RFOiB3ZSBkbyBub3QgZnJlZSB0aGUgb2xkIHN0YWNrX2RhdGEgKi8KK30KKworLy8gTk9URTogRnVuY3Rpb24gcmV0dXJucyBhbGxvY2F0ZWQgbWVtb3J5LCBjYWxsZXIgbXVzdCBmcmVlIGl0IQorc3RhdGljIGNoYXIgY29uc3QgKgorX19rbXBfcHJhZ21hKAorICAgIGludCAgICAgICAgICAgICAgY3QsCisgICAgaWRlbnRfdCBjb25zdCAqICBpZGVudAorKSB7CisgICAgY2hhciBjb25zdCAqIGNvbnMgPSBOVUxMOyAgLy8gQ29uc3RydWN0IG5hbWUuCisgICAgY2hhciAqIGZpbGUgPSBOVUxMOyAgLy8gRmlsZSBuYW1lLgorICAgIGNoYXIgKiBmdW5jID0gTlVMTDsgIC8vIEZ1bmN0aW9uIChyb3V0aW5lKSBuYW1lLgorICAgIGNoYXIgKiBsaW5lID0gTlVMTDsgIC8vIExpbmUgbnVtYmVyLgorICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgIGttcF9tc2dfdCAgICAgcHJnbTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisgICAgaWYgKCAwIDwgY3QgJiYgY3QgPCBjb25zX3RleHRfY19udW0gKSB7CisgICAgICAgIGNvbnMgPSBjb25zX3RleHRfY1sgY3QgXTsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgfTsKKyAgICBpZiAoIGlkZW50ICE9IE5VTEwgJiYgaWRlbnQtPnBzb3VyY2UgIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHRhaWwgPSBOVUxMOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzIiwgaWRlbnQtPnBzb3VyY2UgKTsgLy8gQ29weSBzb3VyY2UgdG8gYnVmZmVyLgorICAgICAgICAvLyBTcGxpdCBzdHJpbmcgaW4gYnVmZmVyIHRvIGZpbGUsIGZ1bmMsIGFuZCBsaW5lLgorICAgICAgICB0YWlsID0gYnVmZmVyLnN0cjsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsIE5VTEwsICAgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJzsnLCAmIGZpbGUsICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICc7JywgJiBmdW5jLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsICYgbGluZSwgJiB0YWlsICk7CisgICAgfTsgLy8gaWYKKyAgICBwcmdtID0gX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5fZm10X1ByYWdtYSwgY29ucywgZmlsZSwgZnVuYywgbGluZSApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICByZXR1cm4gcHJnbS5zdHI7Cit9IC8vIF9fa21wX3ByYWdtYQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEVORCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfZXJyb3JfY29uc3RydWN0KAorICAgIGttcF9pMThuX2lkX3QgICAgaWQsICAgICAvLyBNZXNzYWdlIGlkZW50aWZpZXIuCisgICAgZW51bSBjb25zX3R5cGUgICBjdCwgICAgIC8vIENvbnN0cnVjdCB0eXBlLgorICAgIGlkZW50X3QgY29uc3QgKiAgaWRlbnQgICAvLyBDb25zdHJ1Y3QgaWRlbnQuCispIHsKKyAgICBjaGFyIGNvbnN0ICogY29uc3RydWN0ID0gX19rbXBfcHJhZ21hKCBjdCwgaWRlbnQgKTsKKyAgICBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgX19rbXBfbXNnX2Zvcm1hdCggaWQsIGNvbnN0cnVjdCApLCBfX2ttcF9tc2dfbnVsbCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBjb25zdHJ1Y3QgKTsKK30KKwordm9pZAorX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICBrbXBfaTE4bl9pZF90ICAgICAgICAgICAgaWQsICAgICAvLyBNZXNzYWdlIGlkZW50aWZpZXIuCisgICAgZW51bSBjb25zX3R5cGUgICAgICAgICAgIGN0LCAgICAgLy8gRmlyc3QgY29uc3RydWN0IHR5cGUuCisgICAgaWRlbnRfdCBjb25zdCAqICAgICAgICAgIGlkZW50LCAgLy8gRmlyc3QgY29uc3RydWN0IGlkZW50LgorICAgIHN0cnVjdCBjb25zX2RhdGEgY29uc3QgKiBjb25zICAgIC8vIFNlY29uZCBjb25zdHJ1Y3QuCispIHsKKyAgICBjaGFyIGNvbnN0ICogY29uc3RydWN0MSA9IF9fa21wX3ByYWdtYSggY3QsIGlkZW50ICk7CisgICAgY2hhciBjb25zdCAqIGNvbnN0cnVjdDIgPSBfX2ttcF9wcmFnbWEoIGNvbnMtPnR5cGUsIGNvbnMtPmlkZW50ICk7CisgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIF9fa21wX21zZ19mb3JtYXQoIGlkLCBjb25zdHJ1Y3QxLCBjb25zdHJ1Y3QyICksIF9fa21wX21zZ19udWxsICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGNvbnN0cnVjdDEgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgY29uc3RydWN0MiApOworfQorCisKK3N0cnVjdCBjb25zX2hlYWRlciAqCitfX2ttcF9hbGxvY2F0ZV9jb25zX3N0YWNrKCBpbnQgZ3RpZCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwOworCisgICAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH07IC8vIGlmCisgICAgS0VfVFJBQ0UoIDEwLCAoImFsbG9jYXRlIGNvbnNfc3RhY2sgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgcCA9IChzdHJ1Y3QgY29uc19oZWFkZXIgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IGNvbnNfaGVhZGVyICkgKTsKKyAgICBwLT5wX3RvcCA9IHAtPndfdG9wID0gcC0+c190b3AgPSAwOworICAgIHAtPnN0YWNrX2RhdGEgPSAoc3RydWN0IGNvbnNfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgY29uc19kYXRhICkgKiAoTUlOX1NUQUNLKzEpICk7CisgICAgcC0+c3RhY2tfc2l6ZSA9IE1JTl9TVEFDSzsKKyAgICBwLT5zdGFja190b3AgID0gMDsKKyAgICBwLT5zdGFja19kYXRhWyAwIF0udHlwZSA9IGN0X25vbmU7CisgICAgcC0+c3RhY2tfZGF0YVsgMCBdLnByZXYgPSAwOworICAgIHAtPnN0YWNrX2RhdGFbIDAgXS5pZGVudCA9IE5VTEw7CisgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQKK19fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApIHsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKiBwID0gKHN0cnVjdCBjb25zX2hlYWRlciAqKSBwdHI7CisgICAgaWYgKCBwICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggcC0+c3RhY2tfZGF0YSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggcC0+c3RhY2tfZGF0YSApOworICAgICAgICAgICAgcC0+c3RhY2tfZGF0YSA9IE5VTEw7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX2ZyZWUoIHAgKTsKKyAgICB9OyAvLyBpZgorfQorCisKKyNpZiBLTVBfREVCVUcKK3N0YXRpYyB2b2lkCitkdW1wX2NvbnNfc3RhY2soIGludCBndGlkLCBzdHJ1Y3QgY29uc19oZWFkZXIgKiBwICkgeworICAgIGludCBpOworICAgIGludCB0b3MgPSBwLT5zdGFja190b3A7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLVxuIiApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiQmVnaW4gY29uc3RydWN0IHN0YWNrIHdpdGggJWQgaXRlbXMgZm9yIHRocmVhZCAlZFxuIiwgdG9zLCBndGlkICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICAgIHN0YWNrX3RvcD0lZCB7IFA9JWQsIFc9JWQsIFM9JWQgfVxuIiwgdG9zLCBwLT5wX3RvcCwgcC0+d190b3AsIHAtPnNfdG9wICk7CisgICAgZm9yICggaSA9IHRvczsgaSA+IDA7IGktLSApIHsKKyAgICAgICAgc3RydWN0IGNvbnNfZGF0YSAqIGMgPSAmICggcC0+c3RhY2tfZGF0YVsgaSBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgICAgICBzdGFja19kYXRhWyUyZF0gPSB7ICVzICglcykgJWQgJXAgfVxuIiwgaSwgY29uc190ZXh0X2NbIGMtPnR5cGUgXSwgZ2V0X3NyYyggYy0+aWRlbnQgKSwgYy0+cHJldiwgYy0+bmFtZSApOworICAgIH07IC8vIGZvciBpCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJFbmQgY29uc3RydWN0IHN0YWNrIGZvciB0aHJlYWQgJWRcbiIsIGd0aWQgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIistKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1cbiIgKTsKKyAgICBfX2ttcF9kZWJ1Z19wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7Cit9CisjZW5kaWYKKwordm9pZAorX19rbXBfcHVzaF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF9jb25zICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfcGFyYWxsZWwgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3RfcGFyYWxsZWwsIGlkZW50ICkgKSApOworICAgIGlmICggcC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUgKSB7CisgICAgICAgIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBndGlkLCBwICk7CisgICAgfTsgLy8gaWYKKyAgICB0b3MgPSArK3AtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3RfcGFyYWxsZWw7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldiA9IHAtPnBfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSA9IE5VTEw7CisgICAgcC0+cF90b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKwordm9pZAorX19rbXBfY2hlY2tfd29ya3NoYXJlKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfY29ucyApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja193b3Jrc2hhcmUgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKworICAgIGlmICggcC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUgKSB7CisgICAgICAgIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBndGlkLCBwICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgJiYKKyAgICAgICAgIShJU19DT05TX1RZUEVfVEFTS1EocC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlKSAmJiBJU19DT05TX1RZUEVfVEFTS1EoY3QpKSkgeworICAgICAgICAvLyBXZSBhcmUgYWxyZWFkeSBpbiBhIFdPUktTSEFSRSBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uLgorICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHAtPnNfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8vIFdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uLgorICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwgJiBwLT5zdGFja19kYXRhWyBwLT5zX3RvcCBdICk7CisgICAgfTsgLy8gaWYKK30KKwordm9pZAorX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wdXNoX3dvcmtzaGFyZSAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGd0aWQsIGN0LCBpZGVudCApOworICAgIEtFX1RSQUNFKCAxMDAsICggUFVTSF9NU0coIGN0LCBpZGVudCApICkgKTsKKyAgICB0b3MgPSArK3AtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Q7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldiA9IHAtPndfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSA9IE5VTEw7CisgICAgcC0+d190b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKwordm9pZAorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCitfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjaywga21wX3VpbnQzMiBzZXEgKQorI2Vsc2UKK19fa21wX2NoZWNrX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKKyNlbmRpZgoreworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19zeW5jIChndGlkPSVkKVxuIiwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKyAgICBpZiAocC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUpCisgICAgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGd0aWQsIHAgKTsKKworICAgIGlmIChjdCA9PSBjdF9vcmRlcmVkX2luX3BhcmFsbGVsIHx8IGN0ID09IGN0X29yZGVyZWRfaW5fcGRvIHx8IGN0ID09IGN0X29yZGVyZWRfaW5fdGFza3EgKSB7CisgICAgICAgIGlmIChwLT53X3RvcCA8PSBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogd2UgYXJlIG5vdCBpbiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgcmVwb3J0IGVycm9yIG1lc3NhZ2VzIGZvciBQQVJBTExFTCBPUkRFUkVEICovCisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggY3QgPT0gY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNCb3VuZFRvV29ya3NoYXJpbmcsIGN0LCBpZGVudCApOworICAgICAgICAgICAgI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgIGlmICghSVNfQ09OU19UWVBFX09SREVSRUQocC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGUgPT0gY3RfdGFza3EpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNOb3RJblRhc2tDb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc05vT3JkZXJlZENsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wICYmIHAtPnNfdG9wID4gcC0+d190b3ApIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIHN5bmMgY29uc3RydWN0IHdoaWNoIGlzIGluc2lkZSBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgaW50IGluZGV4ID0gcC0+c190b3A7CisgICAgICAgICAgICBlbnVtIGNvbnNfdHlwZSBzdGFja190eXBlOworCisgICAgICAgICAgICBzdGFja190eXBlID0gcC0+c3RhY2tfZGF0YVsgaW5kZXggXS50eXBlOworCisgICAgICAgICAgICBpZiAoc3RhY2tfdHlwZSA9PSBjdF9jcml0aWNhbCB8fAorICAgICAgICAgICAgICAgICggKCBzdGFja190eXBlID09IGN0X29yZGVyZWRfaW5fcGFyYWxsZWwgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tfdHlwZSA9PSBjdF9vcmRlcmVkX2luX3BkbyAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN0YWNrX3R5cGUgPT0gY3Rfb3JkZXJlZF9pbl90YXNrcSAgKSAmJiAgICAgLyogQyBkb2Vzbid0IGFsbG93IG5hbWVkIG9yZGVyZWQ7IG9yZGVyZWQgaW4gb3JkZXJlZCBnZXRzIGVycm9yICovCisgICAgICAgICAgICAgICAgIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0uaWRlbnQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAocC0+c3RhY2tfZGF0YVsgaW5kZXggXS5pZGVudC0+ZmxhZ3MgJiBLTVBfSURFTlRfS01QQyApKSkgeworICAgICAgICAgICAgICAgIC8qIHdlIGFyZSBpbiBPUkRFUkVEIHdoaWNoIGlzIGluc2lkZSBhbiBPUkRFUkVEIG9yIENSSVRJQ0FMIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICggY3QgPT0gY3RfY3JpdGljYWwgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgaWYgKCBsY2sgIT0gTlVMTCAmJiBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKCBsY2ssIHNlcSApID09IGd0aWQgKSB7ICAgIC8qIHRoaXMgc2FtZSB0aHJlYWQgYWxyZWFkeSBoYXMgbG9jayBmb3IgdGhpcyBjcml0aWNhbCBzZWN0aW9uICovCisjZWxzZQorICAgICAgICBpZiAoIGxjayAhPSBOVUxMICYmIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7ICAgIC8qIHRoaXMgc2FtZSB0aHJlYWQgYWxyZWFkeSBoYXMgbG9jayBmb3IgdGhpcyBjcml0aWNhbCBzZWN0aW9uICovCisjZW5kaWYKKyAgICAgICAgICAgIGludCBpbmRleCA9IHAtPnNfdG9wOworICAgICAgICAgICAgc3RydWN0IGNvbnNfZGF0YSBjb25zID0geyBOVUxMLCBjdF9jcml0aWNhbCwgMCwgTlVMTCB9OworICAgICAgICAgICAgLyogd2FsayB1cCBjb25zdHJ1Y3Qgc3RhY2sgYW5kIHRyeSB0byBmaW5kIGNyaXRpY2FsIHdpdGggbWF0Y2hpbmcgbmFtZSAqLworICAgICAgICAgICAgd2hpbGUgKCBpbmRleCAhPSAwICYmIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0ubmFtZSAhPSBsY2sgKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBwLT5zdGFja19kYXRhWyBpbmRleCBdLnByZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgLyogZm91bmQgbWF0Y2ggb24gdGhlIHN0YWNrIChtYXkgbm90IGFsd2F5cyBiZWNhdXNlIG9mIGludGVybGVhdmVkIGNyaXRpY2FsIGZvciBGb3J0cmFuKSAqLworICAgICAgICAgICAgICAgIGNvbnMgPSBwLT5zdGFja19kYXRhWyBpbmRleCBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogd2UgYXJlIGluIENSSVRJQ0FMIHdoaWNoIGlzIGluc2lkZSBhIENSSVRJQ0FMIGNvbnN0cnVjdCBvZiB0aGUgc2FtZSBuYW1lICovCisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zTmVzdGluZ1NhbWVOYW1lLCBjdCwgaWRlbnQsICYgY29ucyApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICggY3QgPT0gY3RfbWFzdGVyIHx8IGN0ID09IGN0X3JlZHVjZSApIHsKKyAgICAgICAgaWYgKHAtPndfdG9wID4gcC0+cF90b3ApIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGlmIChjdCA9PSBjdF9yZWR1Y2UgJiYgcC0+c190b3AgPiBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgYW5vdGhlciBTWU5DIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKK30KKwordm9pZAorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCitfX2ttcF9wdXNoX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfdWludDMyIHNlcSApCisjZWxzZQorX19rbXBfcHVzaF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjayApCisjZW5kaWYKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0FTU0VSVCggZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfc3luYyAoZ3RpZD0lZClcbiIsIGd0aWQgKSApOworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgX19rbXBfY2hlY2tfc3luYyggZ3RpZCwgY3QsIGlkZW50LCBsY2ssIHNlcSApOworI2Vsc2UKKyAgICBfX2ttcF9jaGVja19zeW5jKCBndGlkLCBjdCwgaWRlbnQsIGxjayApOworI2VuZGlmCisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3QsIGlkZW50ICkgKSApOworICAgIHRvcyA9ICsrIHAtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlICA9IGN0OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnByZXYgID0gcC0+c190b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lICA9IGxjazsKKyAgICBwLT5zX3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcG9wX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICB0b3MgPSBwLT5zdGFja190b3A7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9wYXJhbGxlbCAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnBfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdF9wYXJhbGxlbCwgaWRlbnQgKTsKKyAgICB9CisgICAgaWYgKCB0b3MgIT0gcC0+cF90b3AgfHwgcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSAhPSBjdF9wYXJhbGxlbCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0X3BhcmFsbGVsLCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPnBfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCitlbnVtIGNvbnNfdHlwZQorX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIGludCB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkgKSApOworICAgIGlmICggdG9zID09IDAgfHwgcC0+d190b3AgPT0gMCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zRGV0ZWN0ZWRFbmQsIGN0LCBpZGVudCApOworICAgIH0KKworICAgIGlmICggdG9zICE9IHAtPndfdG9wIHx8CisgICAgICAgICAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgJiYKKyAgICAgICAgICAvKiBiZWxvdyBhcmUgdHdvIGV4Y2VwdGlvbnMgdG8gdGhlIHJ1bGUgdGhhdCBjb25zdHJ1Y3QgdHlwZXMgbXVzdCBtYXRjaCAqLworICAgICAgICAgICEgKCBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID09IGN0X3Bkb19vcmRlcmVkICYmIGN0ID09IGN0X3BkbyApICYmCisgICAgICAgICAgISAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPT0gY3RfdGFza19vcmRlcmVkICYmIGN0ID09IGN0X3Rhc2sgKQorICAgICAgICAgKQorICAgICAgICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPndfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworICAgIHJldHVybiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGU7Cit9CisKK3ZvaWQKK19fa21wX3BvcF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfc3luYyAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnNfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdCwgaWRlbnQgKTsKKyAgICB9OworICAgIGlmICggdG9zICE9IHAtPnNfdG9wIHx8IHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0V4cGVjdGVkRW5kLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyB0b3MgXQorICAgICAgICApOworICAgIH07CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisgICAgfTsKKyAgICBLRV9UUkFDRSggMTAwLCAoIFBPUF9NU0coIHAgKSApICk7CisgICAgcC0+c190b3AgPSBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdF9ub25lOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gTlVMTDsKKyAgICBwLT5zdGFja190b3AgPSB0b3MgLSAxOworICAgIEtFX0RVTVAoIDEwMDAsIGR1bXBfY29uc19zdGFjayggZ3RpZCwgcCApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9jaGVja19iYXJyaWVyKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19iYXJyaWVyIChsb2M6ICVwLCBndGlkOiAlZCAlZClcbiIsIGlkZW50LCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIGlkZW50ICE9IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH0KKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICk7CisgICAgfQorICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uICovCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsCisgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmUxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaApAQCAtMCwwICsxLDU3IEBACisvKgorICoga21wX2Vycm9yLmggLS0gUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRVJST1JfSAorI2RlZmluZSBLTVBfRVJST1JfSAorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdCggIGttcF9pMThuX2lkX3QgaWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfZXJyb3JfY29uc3RydWN0Migga21wX2kxOG5faWRfdCBpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwgc3RydWN0IGNvbnNfZGF0YSBjb25zdCAqIGNvbnMgKTsKKworc3RydWN0IGNvbnNfaGVhZGVyICogX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggaW50IGd0aWQgKTsKK3ZvaWQgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApOworCit2b2lkIF9fa21wX3B1c2hfcGFyYWxsZWwoIGludCBndGlkLCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfcHVzaF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUsIGttcF91aW50MzIgKTsKKyNlbHNlCit2b2lkIF9fa21wX3B1c2hfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lICk7CisjZW5kaWYKKwordm9pZCBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfY2hlY2tfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lLCBrbXBfdWludDMyICk7CisjZWxzZQordm9pZCBfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUgKTsKKyNlbmRpZgorCit2b2lkIF9fa21wX3BvcF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworZW51bSBjb25zX3R5cGUgX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcG9wX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX2NoZWNrX2JhcnJpZXIoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfRVJST1JfSAorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmYTFiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fY2RlY2wuYwpAQCAtMCwwICsxLDM1IEBACisvKgorICoga21wX2Z0bl9jZGVjbC5jIC0tIEZvcnRyYW4gX19jZGVjbCBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgICBpZiBkZWZpbmVkICBLTVBfV0lOX0NERUNMIHx8ICAhZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyMgICAgICAgZGVmaW5lIEtNUF9GVE5fRU5UUklFUyAgICAgIEtNUF9GVE5fVVBQRVIKKyMgICBlbmRpZgorI2VsaWYgS01QX09TX1VOSVgKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTICBLTVBfRlROX1BMQUlOCisjZW5kaWYKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmNkZWNsW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gX19jZGVjbCBPTVAgc3VwcG9ydDogIgorI2lmZGVmIEtNUF9GVE5fRU5UUklFUworICAgICJ5ZXMiOworIyAgIGRlZmluZSBGVE5fU1REQ0FMTCAJLyogbm8gc3RkY2FsbCAqLworIyAgIGluY2x1ZGUgImttcF9mdG5fb3MuaCIKKyMgICBpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisjZWxzZQorICAgICJubyI7CisjZW5kaWYgLyogS01QX0ZUTl9FTlRSSUVTICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiYWFjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZW50cnkuaApAQCAtMCwwICsxLDEyNTMgQEAKKy8qCisgKiBrbXBfZnRuX2VudHJ5LmggLS0gRm9ydHJhbiBlbnRyeSBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBGVE5fU1REQ0FMTAorIyBlcnJvciBUaGUgc3VwcG9ydCBmaWxlIGttcF9mdG5fZW50cnkuaCBzaG91bGQgbm90IGJlIGNvbXBpbGVkIGJ5IGl0c2VsZi4KKyNlbmRpZgorCisjaWZkZWYgS01QX1NUVUIKKyAgICAjaW5jbHVkZSAia21wX3N0dWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLyoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEdudS9NUyBPcGVuIE1QIGNvZGVnZW4sIG9tcF9zZXRfbnVtX3RocmVhZHMoKSwKKyAqIG9tcF9zZXRfbmVzdGVkKCksIGFuZCBvbXBfc2V0X2R5bmFtaWMoKSBbaW4gbG93ZXJjYXNlIG9uIE1TLCBhbmQgdy9vCisgKiBhIHRyYWlsaW5nIHVuZGVyc2NvcmUgb24gTGludXgqIE9TXSB0YWtlIGNhbGwgYnkgdmFsdWUgaW50ZWdlciBhcmd1bWVudHMuCisgKiArIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICogKyBvbXBfc2V0X3NjaGVkdWxlKCkKKyAqCisgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIDkuMSBhbmQgcHJldmlvdXMgSW50ZWwgY29tcGlsZXIsIHRoZXNlCisgKiBlbnRyeSBwb2ludHMgdGFrZSBjYWxsIGJ5IHJlZmVyZW5jZSBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAqLworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorIyBpZiAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4pIHx8IChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VUFBFUikKKyMgIGRlZmluZSBQQVNTX0FSR1NfQllfVkFMVUUgMQorIyBlbmRpZgorI2VuZGlmCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWYgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1BMQUlOKSB8fCAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fQVBQRU5EKQorIyAgZGVmaW5lIFBBU1NfQVJHU19CWV9WQUxVRSAxCisjIGVuZGlmCisjZW5kaWYKKworLy8gVGhpcyBtYWNybyBoZWxwcyB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbi4KKyNpZmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgICAjZGVmaW5lIEtNUF9ERVJFRgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9ERVJFRiAqCisjZW5kaWYKKwordm9pZCAgRlROX1NURENBTEwKK0ZUTl9TRVRfU1RBQ0tTSVpFKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCAoc2l6ZV90KSBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgIEZUTl9TVERDQUxMCitGVE5fU0VUX1NUQUNLU0laRV9TKCBzaXplX3QgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9TVEFDS1NJWkUoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9zdGFja3NpemUoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKGludClfX2ttcF9zdGtzaXplOworICAgICNlbmRpZgorfQorCitzaXplX3QgRlROX1NURENBTEwKK0ZUTl9HRVRfU1RBQ0tTSVpFX1MoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9zdGFja3NpemUoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gX19rbXBfc3Rrc2l6ZTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9CTE9DS1RJTUUoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9ibG9ja3RpbWUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorCWludCBndGlkLCB0aWQ7CisJa21wX2luZm9fdCAqdGhyZWFkOworCisJZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKwl0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCXRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUoIEtNUF9ERVJFRiBhcmcsIHRocmVhZCwgdGlkICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9CTE9DS1RJTUUoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9ibG9ja3RpbWUoKTsKKyAgICAjZWxzZQorCWludCBndGlkLCB0aWQ7CisJa21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBrbXBfdGVhbV9wICp0ZWFtOworCisJZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKwl0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCXRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfdGVhbTsKKworICAgICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBzZXR0aW5ncyB1c2VkIGluIF9fa21wX3dhaXRfc2xlZXAoKSAqLworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworCSAgICBLRl9UUkFDRSgxMCwgKCAia21wX2dldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisJCQkgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBLTVBfTUFYX0JMT0NLVElNRSkgKTsKKyAgICAgICAgICAgIHJldHVybiBLTVBfTUFYX0JMT0NLVElNRTsKKyAgICAgICAgfQorI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF96ZXJvX2J0ICYmICFnZXRfX2J0X3NldCggdGVhbSwgdGlkICkgKSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKwkJCSAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIDApICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisgICAgICAgIGVsc2UgeworCSAgICBLRl9UUkFDRSgxMCwgKCAia21wX2dldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBnZXRfX2Jsb2NrdGltZSggdGVhbSwgdGlkICkgKSApOworICAgICAgICAgICAgcmV0dXJuIGdldF9fYmxvY2t0aW1lKCB0ZWFtLCB0aWQgKTsKKyAgICAgICAgfTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZX1NFUklBTCggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggbGlicmFyeV9zZXJpYWwgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3NlcmlhbCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggbGlicmFyeV90dXJuYXJvdW5kICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfdXNlcl9zZXRfbGlicmFyeSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfdXNlcl9zZXRfbGlicmFyeSggbGlicmFyeV90dXJuYXJvdW5kICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfTElCUkFSWV9USFJPVUdIUFVUKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggS01QX0RFUkVGIGFyZyApOworICAgICNlbHNlCisgICAgICAgIGVudW0gbGlicmFyeV90eXBlIGxpYjsKKyAgICAgICAgbGliID0gKGVudW0gbGlicmFyeV90eXBlKSBLTVBfREVSRUYgYXJnOworICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWIgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0xJQlJBUlkgKHZvaWQpCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2xpYnJhcnkoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKGludCkgX19rbXBfbGlicmFyeSk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1NFVF9BRkZJTklUWSggdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHkoIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eSggbWFzayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MoIHZvaWQgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgI2lmIEtNUF9HUk9VUF9BRkZJTklUWSAmJiAhS01QX1VTRV9IV0xPQworICAgICAgICBpZiAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEgKSB7CisgICAgICAgICAgICByZXR1cm4gKGludClLTVBfQ1BVX1NFVFNJWkU7CisgICAgICAgIH0KKyAgICAjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgICAgIHJldHVybiBfX2ttcF94cHJvYzsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0NSRUFURV9BRkZJTklUWV9NQVNLKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICptYXNrID0gTlVMTDsKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICMgaWYgS01QX1VTRV9IV0xPQworICAgICAgICAqbWFzayA9IChod2xvY19jcHVzZXRfdClod2xvY19iaXRtYXBfYWxsb2MoKTsKKyAgICAjIGVsc2UKKyAgICAgICAgKm1hc2sgPSBrbXBjX21hbGxvYyggX19rbXBfYWZmaW5fbWFza19zaXplICk7CisgICAgIyBlbmRpZgorICAgICAgICBLTVBfQ1BVX1pFUk8oIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIC8vIE5vdGhpbmcKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmICggKm1hc2sgPT0gTlVMTCApIHsKKwkgICAgICAgIEtNUF9GQVRBTCggQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2siICk7CisJICAgIH0KKyAgICAgICAgfQorICAgICMgaWYgS01QX1VTRV9IV0xPQworICAgICAgICBod2xvY19iaXRtYXBfZnJlZSgoaHdsb2NfY3B1c2V0X3QpKCptYXNrKSk7CisgICAgIyBlbHNlCisgICAgICAgIGttcGNfZnJlZSggKm1hc2sgKTsKKyAgICAjIGVuZGlmCisgICAgICAgICptYXNrID0gTlVMTDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggS01QX0RFUkVGIHByb2MsIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHNldHMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uICovCisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9OVU1fVEhSRUFEUykoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgLy8gTm90aGluZy4KKyAgICAjZWxzZQorICAgICAgICBfX2ttcF9zZXRfbnVtX3RocmVhZHMoIEtNUF9ERVJFRiBhcmcsIF9fa21wX2VudHJ5X2d0aWQoKSApOworICAgICNlbmRpZgorfQorCisKKy8qIHJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIGN1cnJlbnQgdGVhbSAqLworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTlVNX1RIUkVBRFMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBjX2JvdW5kX251bV90aHJlYWRzIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICByZXR1cm4gX19rbXBjX2JvdW5kX251bV90aHJlYWRzKE5VTEwpOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9NQVhfVEhSRUFEUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBpbnQgICAgICAgICBndGlkOworICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIGd0aWQgICA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICAvL3JldHVybiB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfY3VycmVudF90YXNrWyB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkIF0gLT4gaWN2cy5ucHJvYzsKKwlyZXR1cm4gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLm5wcm9jOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9USFJFQURfTlVNKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGludCBndGlkOworCisgICAgICAgICNpZiBLTVBfT1NfREFSV0lOIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICAgICAgICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBpZiAoIV9fa21wX2luaXRfcGFyYWxsZWwgfHwKKyAgICAgICAgICAgICAgICAoZ3RpZCA9IChpbnQpKChrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBFaXRoZXIgbGlicmFyeSBpc24ndCBpbml0aWFsaXplZCBvciB0aHJlYWQgaXMgbm90IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICAvLyAwIGlzIHRoZSBjb3JyZWN0IFRJRCBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0tZ3RpZDsgLy8gV2Uga2VlcCAoZ3RpZCsxKSBpbiBUTFMKKyAgICAgICAgI2VsaWYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgICAgIGlmICggX19rbXBfZ3RpZF9tb2RlID49IDMgKSB7CisgICAgICAgICAgICAgICAgaWYgKChndGlkID0gX19rbXBfZ3RpZCkgPT0gS01QX0dUSURfRE5FKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoIV9fa21wX2luaXRfcGFyYWxsZWwgfHwKKyAgICAgICAgICAgICAgICAgICAgKGd0aWQgPSAoa21wX2ludHB0cl90KShwdGhyZWFkX2dldHNwZWNpZmljKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAtLWd0aWQ7CisgICAgICAgICAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgcmV0dXJuIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICAvKiBOT1RFOiB0aGlzIGlzIG5vdCBzeW5jcm9uaXplZCwgc28gaXQgY2FuIGNoYW5nZSBhdCBhbnkgbW9tZW50ICovCisgICAgICAgIC8qIE5PVEU6IHRoaXMgbnVtYmVyIGFsc28gaW5jbHVkZXMgdGhyZWFkcyBwcmVhbGxvY2F0ZWQgaW4gaG90LXRlYW1zICovCisgICAgICAgIHJldHVybiBUQ1JfNChfX2ttcF9udGgpOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9OVU1fUFJPQ1MpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F2YWlsX3Byb2M7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9ORVNURUQpKCBpbnQgS01QX0RFUkVGIGZsYWcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X25lc3RlZCggS01QX0RFUkVGIGZsYWcgKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworICAgICAgICBzZXRfX25lc3RlZCggdGhyZWFkLCAoIChLTVBfREVSRUYgZmxhZykgPyBUUlVFIDogRkFMU0UgKSApOworICAgICNlbmRpZgorfQorCisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05FU1RFRCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9uZXN0ZWQoKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICByZXR1cm4gZ2V0X19uZXN0ZWQoIHRocmVhZCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfRFlOQU1JQykoIGludCBLTVBfREVSRUYgZmxhZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfZHluYW1pYyggS01QX0RFUkVGIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICAvLyAhISEgV2hhdCBpZiBmb3JlaWduIHRocmVhZCBjYWxscyBpdD8KKyAgICAgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisgICAgICAgIHNldF9fZHluYW1pYyggdGhyZWFkLCBLTVBfREVSRUYgZmxhZyA/IFRSVUUgOiBGQUxTRSApOworICAgICNlbmRpZgorfQorCisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0RZTkFNSUMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfZHluYW1pYygpOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIHJldHVybiBnZXRfX2R5bmFtaWMoIHRocmVhZCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOX1BBUkFMTEVMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCB0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeworICAgICAgICAgICAgLy8gQUM6IHJfaW5fcGFyYWxsZWwgZG9lcyBub3Qgd29yayBpbnNpZGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICAvLyAgICAgd2hlcmUgcmVhbCBwYXJhbGxlbCBpcyBpbmFjdGl2ZSwgYnV0IGFsbCB0aHJlYWRzIGhhdmUgc2FtZSByb290LAorICAgICAgICAgICAgLy8gICAgIHNvIHNldHRpbmcgaXQgaW4gb25lIHRlYW0gYWZmZWN0cyBvdGhlciB0ZWFtcy4KKyAgICAgICAgICAgIC8vICAgICBUaGUgc29sdXRpb24gaXMgdG8gdXNlIHBlci10ZWFtIG5lc3RpbmcgbGV2ZWwKKyAgICAgICAgICAgIHJldHVybiAoIHRoLT50aC50aF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID8gMSA6IDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgIHJldHVybiAoIHRoLT50aC50aF9yb290LT5yLnJfaW5fcGFyYWxsZWwgPyBGVE5fVFJVRSA6IEZUTl9GQUxTRSApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfU0NIRURVTEUpKCBrbXBfc2NoZWRfdCBLTVBfREVSRUYga2luZCwgaW50IEtNUF9ERVJFRiBtb2RpZmllciApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc2NoZWR1bGUoIEtNUF9ERVJFRiBraW5kLCBLTVBfREVSRUYgbW9kaWZpZXIgKTsKKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKyAgICAgICAgLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgX19rbXBfc2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBraW5kLCBLTVBfREVSRUYgbW9kaWZpZXIgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1NDSEVEVUxFKSgga21wX3NjaGVkX3QgKiBraW5kLCBpbnQgKiBtb2RpZmllciApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19nZXRfc2NoZWR1bGUoIGtpbmQsIG1vZGlmaWVyICk7CisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgX19rbXBfZ2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksIGtpbmQsIG1vZGlmaWVyICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUykoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwkvLyBOb3RoaW5nLgorICAgICNlbHNlCisJLyogIFRPIERPICAqLworICAgICAgICAvKiBXZSB3YW50IHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJuYWwgY29udHJvbCAqLworICAgICAgICBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGFyZyApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOworICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIFdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisJcmV0dXJuIF9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0FDVElWRV9MRVZFTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOyAvLyByZXR1cm5zIDAgaWYgaXQgaXMgY2FsbGVkIGZyb20gdGhlIHNlcXVlbnRpYWwgcGFydCBvZiB0aGUgcHJvZ3JhbQorICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9hY3RpdmVfbGV2ZWw7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0xFVkVMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7IC8vIHJldHVybnMgMCBpZiBpdCBpcyBjYWxsZWQgZnJvbSB0aGUgc2VxdWVudGlhbCBwYXJ0IG9mIHRoZSBwcm9ncmFtCisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX3RlYW0gLT4gdC50X2xldmVsOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNKSggaW50IEtNUF9ERVJFRiBsZXZlbCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuICggS01QX0RFUkVGIGxldmVsICkgPyAoIC0xICkgOiAoIDAgKTsKKyAgICAjZWxzZQorCXJldHVybiBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYgbGV2ZWwgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEVBTV9TSVpFKSggaW50IEtNUF9ERVJFRiBsZXZlbCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAoIEtNUF9ERVJFRiBsZXZlbCApID8gKCAtMSApIDogKCAxICk7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wX2dldF90ZWFtX3NpemUoIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGxldmVsICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1RIUkVBRF9MSU1JVCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAxOyAgIC8vIFRPIERPOiBjbGFyaWZ5IHdoZXRoZXIgaXQgcmV0dXJucyAxIG9yIDA/CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgLyogZ2xvYmFsIElDViAqLworCXJldHVybiBfX2ttcF9tYXhfbnRoOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOX0ZJTkFMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7ICAgLy8gVE8gRE86IGNsYXJpZnkgd2hldGhlciBpdCByZXR1cm5zIDEgb3IgMD8KKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCXJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZmluYWw7CisgICAgI2VuZGlmCit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisKK2ttcF9wcm9jX2JpbmRfdCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1BST0NfQklORCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9wcm9jX2JpbmQoKTsKKyAgICAjZWxzZQorICAgICAgICByZXR1cm4gZ2V0X19wcm9jX2JpbmQoIF9fa21wX2VudHJ5X3RocmVhZCgpICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9URUFNUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgaWYgKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsKKyAgICAgICAgICAgIGludCBpaSA9IHRlYW0tPnQudF9sZXZlbDsgICAgICAgICAgICAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgaW50IGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRsZXZlbCArIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBpaSA+PSB0bGV2ZWwgKTsKKyAgICAgICAgICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGRkID4gMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgIC8vIHRlYW1zIHJlZ2lvbiBpcyBzZXJpYWxpemVkICggMSB0ZWFtIG9mIDEgdGhyZWFkICkuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2M7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9URUFNX05VTSkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgaWYgKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBpaSA9IHRlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgICAgIGludCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSB0bGV2ZWwgKyAxOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgJiYgKCAhZGQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBkZCA+IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyB0ZWFtcyByZWdpb24gaXMgc2VyaWFsaXplZCAoIDEgdGVhbSBvZiAxIHRocmVhZCApLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorCisjaWYgS01QX01JQyB8fCBLTVBfT1NfREFSV0lOCisKK3N0YXRpYyBpbnQgX19rbXBfZGVmYXVsdF9kZXZpY2UgPSAwOworCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfREVGQVVMVF9ERVZJQ0UoIHZvaWQgKQoreworICAgIHJldHVybiBfX2ttcF9kZWZhdWx0X2RldmljZTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9ERUZBVUxUX0RFVklDRSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgIF9fa21wX2RlZmF1bHRfZGV2aWNlID0gS01QX0RFUkVGIGFyZzsKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX05VTV9ERVZJQ0VTKCB2b2lkICkKK3sKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8vIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTgorCisjaWYgISBLTVBfT1NfTElOVVgKKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JU19JTklUSUFMX0RFVklDRSkoIHZvaWQgKQoreworICAgIHJldHVybiAxOworfQorCisjZWxzZQorCisvLyBUaGlzIGludGVybmFsIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB0aGUgZW50cnkgZnJvbSB0aGUgb2ZmbG9hZCBsaWJyYXJ5CisvLyBpcyBub3QgZm91bmQuCitpbnQgX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIoIHZvaWQgKSAgX19hdHRyaWJ1dGVfXygod2VhaykpOworCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lTX0lOSVRJQUxfREVWSUNFKSggdm9pZCApCit7CisgICAgaWYoIF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyICkgeworICAgICAgICByZXR1cm4gX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIoKSA9PSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyAhIEtNUF9PU19MSU5VWAorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmZGVmIEtNUF9TVFVCCit0eXBlZGVmIGVudW0geyBVTklOSVQgPSAtMSwgVU5MT0NLRUQsIExPQ0tFRCB9IGttcF9zdHViX2xvY2tfdDsKKyNlbmRpZiAvKiBLTVBfU1RVQiAqLworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9JTklUX0xPQ0tfV0lUSF9ISU5UKCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgS01QX0RFUkVGIGhpbnQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbG9ja193aXRoX2hpbnQoIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrLCBLTVBfREVSRUYgaGludCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UKCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgS01QX0RFUkVGIGhpbnQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2ssIEtNUF9ERVJFRiBoaW50ICk7CisgICAgI2VuZGlmCit9CisjZW5kaWYKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5JVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfaW5pdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTklUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9ERVNUUk9ZX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOSU5JVDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfZGVzdHJveV9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9ERVNUUk9ZX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5JTklUOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19kZXN0cm95X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgIT0gVU5MT0NLRUQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IExPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfc2V0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAoKigoaW50ICopdXNlcl9sb2NrKSkrKzsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfc2V0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVU5TRVRfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTkxPQ0tFRCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3Vuc2V0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1VOU0VUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTkxPQ0tFRCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAoKigoaW50ICopdXNlcl9sb2NrKSktLTsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1RFU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBMT0NLRUQgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IExPQ0tFRDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wY190ZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVEVTVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gKysoKigoaW50ICopdXNlcl9sb2NrKSk7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wY190ZXN0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworZG91YmxlIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfV1RJTUUpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfd3RpbWUoKTsKKyAgICAjZWxzZQorICAgICAgICBkb3VibGUgZGF0YTsKKyAgICAgICAgI2lmICEgS01QX09TX0xJTlVYCisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbiB0byBnZXQgdGhlIHRpbWUgb24gTGludXgqIE9TLgorICAgICAgICAvLyBUaGUgcm91dGluZSBjYW4gYmUgdXNlZCB0byBtZWFzdXJlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gdGltZSBvbiBMaW51eCogT1Mgbm93LgorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfZWxhcHNlZCggJiBkYXRhICk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgICNlbmRpZgorfQorCitkb3VibGUgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9XVElDSykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF93dGljaygpOworICAgICNlbHNlCisgICAgICAgIGRvdWJsZSBkYXRhOworICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICBfX2ttcF9lbGFwc2VkX3RpY2soICYgZGF0YSApOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX01BTExPQyggc2l6ZV90IEtNUF9ERVJFRiBzaXplICkKK3sKKyAgICAvLyBrbXBjX21hbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19tYWxsb2MoIEtNUF9ERVJFRiBzaXplICk7Cit9CisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX0NBTExPQyggc2l6ZV90IEtNUF9ERVJFRiBuZWxlbSwgc2l6ZV90IEtNUF9ERVJFRiBlbHNpemUgKQoreworICAgIC8vIGttcGNfY2FsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIHJldHVybiBrbXBjX2NhbGxvYyggS01QX0RFUkVGIG5lbGVtLCBLTVBfREVSRUYgZWxzaXplICk7Cit9CisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX1JFQUxMT0MoIHZvaWQgKiBLTVBfREVSRUYgcHRyLCBzaXplX3QgS01QX0RFUkVGIHNpemUgKQoreworICAgIC8vIGttcGNfcmVhbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19yZWFsbG9jKCBLTVBfREVSRUYgcHRyLCBLTVBfREVSRUYgc2l6ZSApOworfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fRlJFRSggdm9pZCAqIEtNUF9ERVJFRiBwdHIgKQoreworICAgIC8vIGRvZXMgbm90aGluZyBpZiB0aGUgbGlicmFyeSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICBrbXBjX2ZyZWUoIEtNUF9ERVJFRiBwdHIgKTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9XQVJOSU5HU19PTiggdm9pZCApCit7CisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9IGttcF93YXJuaW5nc19leHBsaWNpdDsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9XQVJOSU5HU19PRkYoIHZvaWQgKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBGQUxTRTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9ERUZBVUxUUyggY2hhciBjb25zdCAqIHN0cgorICAgICNpZm5kZWYgUEFTU19BUkdTX0JZX1ZBTFVFCisgICAgICAgICwgaW50IGxlbgorICAgICNlbmRpZgorKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgI2lmZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICAgICAgICAgaW50IGxlbiA9IChpbnQpS01QX1NUUkxFTiggc3RyICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKCBzdHIsIGxlbiApOworICAgICNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8qIHJldHVybnMgdGhlIHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gKi8KK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0NBTkNFTExBVElPTikodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisjZWxzZQorICAgIC8vIGluaXRpYWxpemUgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfb21wX2NhbmNlbGxhdGlvbjsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyhpbnQgY2FuY2VsX2tpbmQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICAgIHJldHVybiAwIC8qIGZhbHNlICovOworI2Vsc2UKKyAgICByZXR1cm4gX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2VsX2tpbmQpOworI2VuZGlmCit9CisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisvLyBHQ0MgY29tcGF0aWJpbGl0eSAodmVyc2lvbmVkIHN5bWJvbHMpCisjaWZkZWYgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworLyoKKyAgICBUaGVzZSBmb2xsb3dpbmcgc2VjdGlvbnMgY3JlYXRlIGZ1bmN0aW9uIGFsaWFzZXMgKGR1bW15IHN5bWJvbHMpIGZvciB0aGUgb21wXyogcm91dGluZXMuCisgICAgVGhlc2UgYWxpYXNlcyB3aWxsIHRoZW4gYmUgdmVyc2lvbmVkIGFjY29yZGluZyB0byBob3cgbGliZ29tcCBgYHZlcnNpb25zJycgaXRzCisgICAgc3ltYm9scyAoT01QXzEuMCwgT01QXzIuMCwgT01QXzMuMCwgLi4uKSB3aGlsZSBhbHNvIHJldGFpbmluZyB0aGUKKyAgICBkZWZhdWx0IHZlcnNpb24gd2hpY2ggbGlib21wIHVzZXM6IFZFUlNJT04gKGRlZmluZWQgaW4gZXhwb3J0c19zby50eHQpCisgICAgSWYgeW91IHdhbnQgdG8gc2VlIHRoZSB2ZXJzaW9uZWQgc3ltYm9scyBmb3IgbGliZ29tcC5zby4xIHRoZW4ganVzdCB0eXBlOgorCisgICAgb2JqZHVtcCAtVCAvcGF0aC90by9saWJnb21wLnNvLjEgfCBncmVwIG9tcF8KKworICAgIEV4YW1wbGU6CisgICAgU3RlcCAxKSAgQ3JlYXRlIF9fa21wX2FwaV9vbXBfc2V0X251bV90aHJlYWRzXzEwX2FsaWFzCisgICAgICAgICAgICAgd2hpY2ggaXMgYWxpYXMgb2YgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHMKKyAgICBTdGVwIDIpICBTZXQgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHNfMTBfYWxpYXMgdG8gdmVyc2lvbjogb21wX3NldF9udW1fdGhyZWFkc0BPTVBfMS4wCisgICAgU3RlcCAyQikgU2V0IF9fa21wX2FwaV9vbXBfc2V0X251bV90aHJlYWRzIHRvIGRlZmF1bHQgdmVyc2lvbiA6IG9tcF9zZXRfbnVtX3RocmVhZHNAQFZFUlNJT04KKyovCisKKy8vIE9NUF8xLjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9TRVRfTlVNX1RIUkVBRFMsICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTlVNX1RIUkVBRFMsICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTUFYX1RIUkVBRFMsICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEhSRUFEX05VTSwgICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTlVNX1BST0NTLCAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9JTl9QQVJBTExFTCwgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfRFlOQU1JQywgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfRFlOQU1JQywgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTkVTVEVELCAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTkVTVEVELCAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9JTklUX0xPQ0ssICAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMTApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX0xPQ0ssICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX05FU1RfTE9DSywgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTkVTVF9MT0NLLCAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9MT0NLLCAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMTApOworeGFsaWFzaWZ5KEZUTl9URVNUX0xPQ0ssICAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9URVNUX05FU1RfTE9DSywgICAgMTApOworCisvLyBPTVBfMi4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fR0VUX1dUSUNLLCAyMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9XVElNRSwgMjApOworCisvLyBPTVBfMy4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fU0VUX1NDSEVEVUxFLCAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1NDSEVEVUxFLCAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1RIUkVBRF9MSU1JVCwgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTLCAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTLCAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0xFVkVMLCAgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0sIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1RFQU1fU0laRSwgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0FDVElWRV9MRVZFTCwgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fSU5JVF9MT0NLLCAgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fSU5JVF9ORVNUX0xPQ0ssICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fREVTVFJPWV9ORVNUX0xPQ0ssICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fU0VUX0xPQ0ssICAgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fU0VUX05FU1RfTE9DSywgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fVU5TRVRfTE9DSywgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fVU5TRVRfTkVTVF9MT0NLLCAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fVEVTVF9ORVNUX0xPQ0ssICAgICAgICAgIDMwKTsKKworLy8gT01QXzMuMSBhbGlhc2VzCit4YWxpYXNpZnkoRlROX0lOX0ZJTkFMLCAzMSk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8gT01QXzQuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX0dFVF9QUk9DX0JJTkQsIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX05VTV9URUFNUywgNDApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEVBTV9OVU0sIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0NBTkNFTExBVElPTiwgNDApOworeGFsaWFzaWZ5KEZUTl9JU19JTklUSUFMX0RFVklDRSwgNDApOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDFfRU5BQkxFRAorLy8gT01QXzQuMSBhbGlhc2VzCisjZW5kaWYKKworI2lmIE9NUF81MF9FTkFCTEVECisvLyBPTVBfNS4wIGFsaWFzZXMKKyNlbmRpZgorCisvLyBPTVBfMS4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fU0VUX05VTV9USFJFQURTLCAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX1RIUkVBRFMsICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9OVU0sICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTl9QQVJBTExFTCwgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0RZTkFNSUMsICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTkVTVEVELCAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05FU1RFRCwgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCwgIk9NUF8xLjAiKTsKKworLy8gT01QXzIuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX0dFVF9XVElDSywgICAgICAgICAyMCwgIk9NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfV1RJTUUsICAgICAgICAgMjAsICJPTVBfMi4wIik7CisKKy8vIE9NUF8zLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfU0NIRURVTEUsICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1NDSEVEVUxFLCAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9USFJFQURfTElNSVQsICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTLCAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTEVWRUwsICAgICAgICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RFQU1fU0laRSwgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9BQ1RJVkVfTEVWRUwsICAzMCwgIk9NUF8zLjAiKTsKKworLy8gdGhlIGxvY2sgcm91dGluZXMgaGF2ZSBhIDEuMCBhbmQgMy4wIHZlcnNpb24KK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX0xPQ0ssICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fSU5JVF9ORVNUX0xPQ0ssICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9ERVNUUk9ZX05FU1RfTE9DSywgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0xPQ0ssICAgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9MT0NLLCAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVU5TRVRfTkVTVF9MT0NLLCAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9URVNUX05FU1RfTE9DSywgICAgMzAsICJPTVBfMy4wIik7CisKKy8vIE9NUF8zLjEgdmVyc2lvbmVkIHN5bWJvbAoreHZlcnNpb25pZnkoRlROX0lOX0ZJTkFMLCAgICAgICAgICAzMSwgIk9NUF8zLjEiKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisvLyBPTVBfNC4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fR0VUX1BST0NfQklORCwgICAgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fVEVBTVMsICAgICA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEVBTV9OVU0sICAgICAgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0NBTkNFTExBVElPTiwgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0lTX0lOSVRJQUxfREVWSUNFLCA0MCwgIk9NUF80LjAiKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjaWYgT01QXzQxX0VOQUJMRUQKKy8vIE9NUF80LjEgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjaWYgT01QXzUwX0VOQUJMRUQKKy8vIE9NUF81LjAgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvL2V4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMGZiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2V4dHJhLmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIGttcF9mdG5fZXh0cmEuYyAtLSBGb3J0cmFuICdleHRyYScgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisjICAgZGVmaW5lIEtNUF9GVE5fRU5UUklFUyBLTVBfRlROX1BMQUlOCisjZWxpZiBLTVBfT1NfVU5JWAorIyAgIGRlZmluZSBLTVBfRlROX0VOVFJJRVMgS01QX0ZUTl9BUFBFTkQKKyNlbmRpZgorCisvLyBOb3RlOiBUaGlzIHN0cmluZyBpcyBub3QgcHJpbnRlZCB3aGVuIEtNUF9WRVJTSU9OPTEuCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuZXh0cmFbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiRm9ydHJhbiBcImV4dHJhXCIgT01QIHN1cHBvcnQ6ICIKKyNpZmRlZiBLTVBfRlROX0VOVFJJRVMKKyAgICAieWVzIjsKKyMgICBkZWZpbmUgRlROX1NURENBTEwgLyogbm90aGluZyB0byBkbyAqLworIyAgIGluY2x1ZGUgImttcF9mdG5fb3MuaCIKKyMgICBpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisjZWxzZQorICAgICJubyI7CisjZW5kaWYgLyogS01QX0ZUTl9FTlRSSUVTICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MTI2MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fb3MuaApAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIGttcF9mdG5fb3MuaCAtLSBLUFRTIEZvcnRyYW4gZGVmaW5lcyBoZWFkZXIgZmlsZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRlROX09TX0gKKyNkZWZpbmUgS01QX0ZUTl9PU19ICisKKy8vIEtNUF9GTlRfRU5UUklFUyBtYXkgYmUgb25lIG9mOiBLTVBfRlROX1BMQUlOLCBLTVBfRlROX1VQUEVSLCBLTVBfRlROX0FQUEVORCwgS01QX0ZUTl9VQVBQRU5ELgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV4dGVybmFsIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4KKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX3NldF9zdGFja3NpemVfcworICAgICNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfc3RhY2tzaXplCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfcworICAgICNkZWZpbmUgRlROX1NFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfYmxvY2t0aW1lCisgICAgI2RlZmluZSBGVE5fR0VUX0JMT0NLVElNRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9ibG9ja3RpbWUKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCAgICAgICAgICAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9USFJPVUdIUFVUICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeQorICAgICNkZWZpbmUgRlROX0dFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfbGlicmFyeQorICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUUyAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfZGVmYXVsdHMKKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5CisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAga21wX2dldF9hZmZpbml0eQorICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0FGRklOSVRZX01BU0sgICAgICAgICAgICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICNkZWZpbmUgRlROX01BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tYWxsb2MKKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY2FsbG9jCisgICAgI2RlZmluZSBGVE5fUkVBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWxsb2MKKyAgICAjZGVmaW5lIEZUTl9GUkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZnJlZQorCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAga21wX2dldF9udW1fa25vd25fdGhyZWFkcworCisgICAgI2RlZmluZSBGVE5fU0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX3NldF9udW1fdGhyZWFkcworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9OVU0gICAgICAgICAgICAgICAgICAgb21wX2dldF90aHJlYWRfbnVtCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9QUk9DUyAgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fcHJvY3MKKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X2R5bmFtaWMKKyAgICAjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X2R5bmFtaWMKKyAgICAjZGVmaW5lIEZUTl9TRVRfTkVTVEVEICAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X25lc3RlZAorICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbmVzdGVkCisgICAgI2RlZmluZSBGVE5fSU5fUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgb21wX2luX3BhcmFsbGVsCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9MSU1JVCAgICAgICAgICAgICAgICAgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3NjaGVkdWxlCisgICAgI2RlZmluZSBGVE5fR0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9zY2hlZHVsZQorICAgICNkZWZpbmUgRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgI2RlZmluZSBGVE5fR0VUX0FDVElWRV9MRVZFTCAgICAgICAgICAgICAgICAgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAjZGVmaW5lIEZUTl9HRVRfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X2xldmVsCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fU0laRSAgICAgICAgICAgICAgICAgICAgb21wX2dldF90ZWFtX3NpemUKKyAgICAjZGVmaW5lIEZUTl9JTl9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5fZmluYWwKKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3Byb2NfYmluZAorICAgICNkZWZpbmUgRlROX0dFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfcHJvY19iaW5kCisvLyAgI2RlZmluZSBGVE5fQ1VSUl9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgb21wX2N1cnJfcHJvY19iaW5kCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90ZWFtcworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX05VTSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9udW0KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0lOSVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X2xvY2sKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICNkZWZpbmUgRlROX0lOSVRfTE9DS19XSVRIX0hJTlQgICAgICAgICAgICAgIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UICAgICAgICAgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorI2VuZGlmCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLICAgICAgICAgICAgICAgICAgICAgb21wX2Rlc3Ryb3lfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9jaworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIG9tcF91bnNldF9sb2NrCisgICAgI2RlZmluZSBGVE5fVEVTVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX3Rlc3RfbG9jaworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X25lc3RfbG9jaworCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OICAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vbgorICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aW1lCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSUNLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGljaworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgb21wX3NldF9kZWZhdWx0X2RldmljZQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXMKKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0lTX0lOSVRJQUxfREVWSUNFICAgICAgICAgICAgICAgIG9tcF9pc19pbml0aWFsX2RldmljZQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT04gICAgICAgICAgICAgICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fUExBSU4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0XworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnlfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0c18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5XworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21hbGxvY18KKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY2FsbG9jXworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsbG9jXworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mcmVlXworCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAga21wX2dldF9udW1fa25vd25fdGhyZWFkc18KKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbnVtX3RocmVhZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGhyZWFkc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X21heF90aHJlYWRzXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX251bV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV9wcm9jc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X2R5bmFtaWNfCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9keW5hbWljXworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9wYXJhbGxlbF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9saW1pdF8KKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3NjaGVkdWxlXworICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfc2NoZWR1bGVfCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsXworICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbGV2ZWxfCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9zaXplXworICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9maW5hbF8KKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3Byb2NfYmluZF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3Byb2NfYmluZF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBvbXBfY3Vycl9wcm9jX2JpbmRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90ZWFtc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fbnVtXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbG9ja18KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICNkZWZpbmUgRlROX0lOSVRfTE9DS19XSVRIX0hJTlQgICAgICAgICAgICAgIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50XworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVCAgICAgICAgIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnRfCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9sb2NrXworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9uZXN0X2xvY2tfCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBrbXBfc2V0X3dhcm5pbmdzX29uXworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmXworCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSU1FICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aWNrXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fZGV2aWNlc18KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0lTX0lOSVRJQUxfREVWSUNFICAgICAgICAgICAgICAgIG9tcF9pc19pbml0aWFsX2RldmljZV8KKyNlbmRpZgorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT04gICAgICAgICAgICAgICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uXworICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTICAgICAgICAgIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18KKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9BUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VUFBFUgorCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9TVEFDS1NJWkUKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfU0VUX1NUQUNLU0laRV9TCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRV9TCisgICAgI2RlZmluZSBGVE5fU0VUX0JMT0NLVElNRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9CTE9DS1RJTUUKKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRQorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1NFUklBTCAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9TRVJJQUwKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZCisgICAgI2RlZmluZSBGVE5fR0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9MSUJSQVJZCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUUworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQworICAgICNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgIEtNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIEtNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0sKKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQworICAgICNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgIEtNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01BTExPQworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DQUxMT0MKKyAgICAjZGVmaW5lIEZUTl9SRUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfUkVBTExPQworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9GUkVFCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfU0VUX05VTV9USFJFQURTCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEhSRUFEUworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RIUkVBRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX05VTSAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9OVU0KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QUk9DUworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfRFlOQU1JQworICAgICNkZWZpbmUgRlROX0dFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfRFlOQU1JQworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVEVECisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9ORVNURUQKKyAgICAjZGVmaW5lIEZUTl9JTl9QQVJBTExFTCAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5fUEFSQUxMRUwKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9MSU1JVAorICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfU0NIRURVTEUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1NDSEVEVUxFCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUNUSVZFX0xFVkVMICAgICAgICAgICAgICAgICBPTVBfR0VUX0FDVElWRV9MRVZFTAorICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTEVWRUwKKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9TSVpFICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fU0laRQorICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9GSU5BTAorLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5ECisgICAgI2RlZmluZSBGVE5fR0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9QUk9DX0JJTkQKKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBPTVBfQ1VSUl9QUk9DX0JJTkQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1RFQU1TCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fTlVNICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9URUFNX05VTQorI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTE9DSworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS19XSVRIX0hJTlQKKyAgICAjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQgICAgICAgICBPTVBfSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9MT0NLCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX0xPQ0sKKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgT01QX0RFU1RST1lfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNUX0xPQ0sKKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVEVTVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX1RFU1RfTkVTVF9MT0NLCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBLTVBfU0VUX1dBUk5JTkdTX09OCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PRkYKKworICAgICNkZWZpbmUgRlROX0dFVF9XVElNRSAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfV1RJTUUKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSUNLCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTgorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0UKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfU0VUX0RFRkFVTFRfREVWSUNFCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fREVWSUNFUworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgT01QX0lTX0lOSVRJQUxfREVWSUNFCisjZW5kaWYKKworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OICAgICAgICAgICAgICAgICBPTVBfR0VUX0NBTkNFTExBVElPTgorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTICAgICAgICAgIEtNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX1VQUEVSICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fVUFQUEVORAorCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9TVEFDS1NJWkVfCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAgS01QX1NFVF9TVEFDS1NJWkVfU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRV9TXworICAgICNkZWZpbmUgRlROX1NFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfQkxPQ0tUSU1FXworICAgICNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQkxPQ0tUSU1FXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1NFUklBTCAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9TRVJJQUxfCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkRfCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVRfCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZXworICAgICNkZWZpbmUgRlROX0dFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfTElCUkFSWV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0RFRkFVTFRTXworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DXworICAgICNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgIEtNUF9DUkVBVEVfQUZGSU5JVFlfTUFTS18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0FGRklOSVRZX01BU0sgICAgICAgICAgICBLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLXworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DXworICAgICNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgIEtNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0NfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0NfCisKKyAgICAjZGVmaW5lIEZUTl9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUFMTE9DXworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DQUxMT0NfCisgICAgI2RlZmluZSBGVE5fUkVBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1JFQUxMT0NfCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0ZSRUVfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTXworCisgICAgI2RlZmluZSBGVE5fU0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX1NFVF9OVU1fVEhSRUFEU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9USFJFQURTXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RIUkVBRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9OVU0gICAgICAgICAgICAgICAgICAgT01QX0dFVF9USFJFQURfTlVNXworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1BST0NTXworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfRFlOQU1JQ18KKyAgICAjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX0RZTkFNSUNfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNURURfCisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9ORVNURURfCisgICAgI2RlZmluZSBGVE5fSU5fUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX1BBUkFMTEVMXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX0xJTUlUXworICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfU0NIRURVTEVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9TQ0hFRFVMRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFNfCisgICAgI2RlZmluZSBGVE5fR0VUX0FDVElWRV9MRVZFTCAgICAgICAgICAgICAgICAgT01QX0dFVF9BQ1RJVkVfTEVWRUxfCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9MRVZFTF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU1fCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fU0laRSAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9URUFNX1NJWkVfCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX0ZJTkFMXworLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5EXworICAgICNkZWZpbmUgRlROX0dFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfUFJPQ19CSU5EXworLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIE9NUF9DVVJSX1BST0NfQklORF8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1RFQU1TXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX05VTSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9OVU1fCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5JVF9MT0NLXworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS19XSVRIX0hJTlRfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVF8KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0RFU1RST1lfTE9DSyAgICAgICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9MT0NLXworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIE9NUF9VTlNFVF9MT0NLXworICAgICNkZWZpbmUgRlROX1RFU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTkVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX05FU1RfTE9DS18KKworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PTiAgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT05fCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PRkZfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSU1FXworICAgICNkZWZpbmUgRlROX0dFVF9XVElDSyAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfV1RJQ0tfCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTgorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgT01QX1NFVF9ERUZBVUxUX0RFVklDRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0RFVklDRVMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9ERVZJQ0VTXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgT01QX0lTX0lOSVRJQUxfREVWSUNFXworI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT05fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAgS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTXworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX1VBUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHT01QIEFQSSBOQU1FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIEFsbCBHT01QXzEuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQgICAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiAgICAgICAgICAgICAgICAgICAgICBHT01QX2JhcnJpZXIKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5EICAgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCAgICAgICAgICAgIEdPTVBfY3JpdGljYWxfbmFtZV9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCAgICAgICAgICBHT01QX2NyaXRpY2FsX25hbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhUICAgICAgICAgICAgR09NUF9sb29wX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQgICAgICAgICAgIEdPTVBfbG9vcF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EICAgICAgICAgICAgICAgICAgICAgR09NUF9sb29wX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQgICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJUICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3N0YXRpY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCAgICAgICAgICAgIEdPTVBfbG9vcF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJUICAgICAgICAgICBHT01QX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhUICAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQgICAgICAgICAgICAgICAgICBHT01QX29yZGVyZWRfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQgICAgICAgICAgICAgICAgR09NUF9vcmRlcmVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCAgICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQgICAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQgICAgICAgICAgR09NUF9zZWN0aW9uc19lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQgICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX2NvcHlfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJUICAgICAgICAgICAgR09NUF9zaW5nbGVfY29weV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQgICAgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX3N0YXJ0CisKKy8vIEFsbCBHT01QXzIuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0sgICAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX3Rhc2sKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFza3dhaXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQgICAgICAgICBHT01QX2xvb3BfdWxsX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQgICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJUICAgICAgICAgR09NUF9sb29wX3VsbF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhUICAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19zdGFydAorCisvLyBBbGwgR09NUF8zLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXNreWllbGQKKworLy8gQWxsIEdPTVBfNC4wIHN5bWJvbHMgCisvLyBUT0RPOiBBcyBvZiAyMDEzLTEwLTE0LCBub25lIG9mIHRoZSBHT01QXzQuMCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIGxpYm9tcAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSX0NBTkNFTCAgICAgICAgICAgICAgICAgR09NUF9iYXJyaWVyX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UICAgICAgICAgICAgIEdPTVBfY2FuY2VsbGF0aW9uX3BvaW50CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCAgICAgICAgICAgICAgICBHT01QX2xvb3BfZW5kX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX2R5bmFtaWMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ydW50aW1lCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDICAgICAgICAgICBHT01QX3BhcmFsbGVsX2xvb3Bfc3RhdGljCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TICAgICAgICAgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgICBHT01QX3BhcmFsbGVsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwgICAgICAgICAgICBHT01QX3NlY3Rpb25zX2VuZF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUICAgICAgICAgICAgICAgIEdPTVBfdGFza2dyb3VwX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQgICAgICAgICAgICAgICAgICBHT01QX3Rhc2tncm91cF9lbmQKKy8qIFRhcmdldCBmdW5jdGlvbnMgc2hvdWxkIGJlIHRha2VuIGNhcmUgb2YgYnkgbGlib2ZmbG9hZCAqLworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXJnZXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X2RhdGEKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X2VuZF9kYXRhCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUgICAgICAgICAgICAgICAgICBHT01QX3RhcmdldF91cGRhdGUKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMgICAgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGVhbXMKKworI2lmZGVmIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisgICAgI2RlZmluZSB4c3RyKHgpIHN0cih4KQorICAgICNkZWZpbmUgc3RyKHgpICN4CisKKyAgICAvLyBJZiBMaW51eCwgeGV4cGFuZCBwcmVwZW5kcyBfX2ttcF9hcGlfIHRvIHRoZSByZWFsIEFQSSBuYW1lCisgICAgI2RlZmluZSB4ZXhwYW5kKGFwaV9uYW1lKSBleHBhbmQoYXBpX25hbWUpCisgICAgI2RlZmluZSBleHBhbmQoYXBpX25hbWUpIF9fa21wX2FwaV8jI2FwaV9uYW1lCisKKyAgICAjZGVmaW5lIHhhbGlhc2lmeShhcGlfbmFtZSx2ZXIpIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikKKyAgICAjZGVmaW5lIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikgX190eXBlb2ZfXyhfX2ttcF9hcGlfIyNhcGlfbmFtZSkgX19rbXBfYXBpXyMjYXBpX25hbWUjI18jI3ZlciMjX2FsaWFzIF9fYXR0cmlidXRlX18oKGFsaWFzKHhzdHIoX19rbXBfYXBpXyMjYXBpX25hbWUpKSkpCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgIlZFUlNJT04iKQorICAgICNkZWZpbmUgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCBkZWZhdWx0X3ZlcikgXAorICAgIF9fYXNtX18oIi5zeW12ZXIgIiB4c3RyKF9fa21wX2FwaV8jI2FwaV9uYW1lIyNfIyN2ZXJzaW9uX251bSMjX2FsaWFzKSAiLCIgeHN0cihhcGlfbmFtZSkgIkAiIHZlcnNpb25fc3RyICJcblx0Iik7IFwKKyAgICBfX2FzbV9fKCIuc3ltdmVyICIgeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSkgIiwiIHhzdHIoYXBpX25hbWUpICJAQCIgZGVmYXVsdF92ZXIgIlxuXHQiKQorCisjZWxzZSAvLyBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworICAgICNkZWZpbmUgeHN0cih4KSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBzdHIoeCkgIC8qIE5vdGhpbmcgKi8KKworICAgIC8vIGlmIFdpbmRvd3Mgb3IgTWFjLCB4ZXhwYW5kIGRvZXMgbm8gbmFtZSB0cmFuc2Zvcm1hdGlvbgorICAgICNkZWZpbmUgeGV4cGFuZChhcGlfbmFtZSkgZXhwYW5kKGFwaV9uYW1lKQorICAgICNkZWZpbmUgZXhwYW5kKGFwaV9uYW1lKSBhcGlfbmFtZQorCisgICAgI2RlZmluZSB4YWxpYXNpZnkoYXBpX25hbWUsdmVyKSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBhbGlhc2lmeShhcGlfbmFtZSx2ZXIpICAvKiBOb3RoaW5nICovCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgZGVmYXVsdF92ZXIpIC8qIE5vdGhpbmcgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNlbmRpZiAvKiBLTVBfRlROX09TX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX3N0ZGNhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjcwZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGttcF9mdG5fc3RkY2FsbC5jIC0tIEZvcnRyYW4gX19zdGRjYWxsIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKy8vIE5vdGU6IFRoaXMgc3RyaW5nIGlzIG5vdCBwcmludGVkIHdoZW4gS01QX1ZFUlNJT049MS4KK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5zdGRjYWxsW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gX19zdGRjYWxsIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgVVNFX0ZUTl9TVERDQUxMCisgICAgInllcyI7CisjZWxzZQorICAgICJubyI7CisjZW5kaWYKKworI2lmZGVmIFVTRV9GVE5fU1REQ0FMTAorCisjZGVmaW5lIEZUTl9TVERDQUxMIAlLTVBfU1REQ0FMTAorI2RlZmluZSBLTVBfRlROX0VOVFJJRVMJVVNFX0ZUTl9TVERDQUxMCisKKyNpbmNsdWRlICJrbXBfZnRuX29zLmgiCisjaW5jbHVkZSAia21wX2Z0bl9lbnRyeS5oIgorCisjZW5kaWYgLyogVVNFX0ZUTl9TVERDQUxMICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFjNzViCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dsb2JhbC5jCkBAIC0wLDAgKzEsNDcxIEBACisvKgorICoga21wX2dsb2JhbC5jIC0tIEtQVFMgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgcnVudGltZSBzdXBwb3J0IGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCitrbXBfa2V5X3QgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleTsKKwora21wX2NwdWluZm9fdCAgIF9fa21wX2NwdWluZm8gPSB7IDAgfTsgLy8gTm90IGluaXRpYWxpemVkCisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorLy8gbG9jayBmb3IgbW9kaWZ5aW5nIHRoZSBnbG9iYWwgX19rbXBfc3RhdHNfbGlzdAora21wX3Rhc19sb2NrX3QgX19rbXBfc3RhdHNfbG9jazsKKworLy8gZ2xvYmFsIGxpc3Qgb2YgcGVyIHRocmVhZCBzdGF0cywgdGhlIGhlYWQgaXMgYSBzZW50aW5lbCBub2RlIHdoaWNoIGFjY3VtdWxhdGVzIGFsbCBzdGF0cyBwcm9kdWNlZCBiZWZvcmUgX19rbXBfY3JlYXRlX3dvcmtlciBpcyBjYWxsZWQuCitrbXBfc3RhdHNfbGlzdCBfX2ttcF9zdGF0c19saXN0OworCisvLyB0aHJlYWQgbG9jYWwgcG9pbnRlciB0byBzdGF0cyBub2RlIHdpdGhpbiBsaXN0CitfX3RocmVhZCBrbXBfc3RhdHNfbGlzdCogX19rbXBfc3RhdHNfdGhyZWFkX3B0ciA9ICZfX2ttcF9zdGF0c19saXN0OworCisvLyBnaXZlcyByZWZlcmVuY2UgdGljayBmb3IgYWxsIGV2ZW50cyAoY29uc2lkZXJlZCB0aGUgMCB0aWNrKQordHNjX3RpY2tfY291bnQgX19rbXBfc3RhdHNfc3RhcnRfdGltZTsKKyNlbmRpZgorI2lmIEtNUF9VU0VfSFdMT0MKK2ludCBfX2ttcF9od2xvY19lcnJvciA9IEZBTFNFOworaHdsb2NfdG9wb2xvZ3lfdCBfX2ttcF9od2xvY190b3BvbG9neSA9IE5VTEw7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIElOSVRJQUxJWkFUSU9OIFZBUklBQkxFUyAqLworLyogdGhleSBhcmUgc3luY3Jvbml6ZWQgdG8gd3JpdGUgZHVyaW5nIGluaXQsIGJ1dCByZWFkIGFueXRpbWUgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9zZXJpYWwgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfZ3RpZCAgICAgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X2NvbW1vbiAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9taWRkbGUgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfcGFyYWxsZWwgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X21vbml0b3IgICAgPSAwOyAgLyogMSAtIGxhdW5jaGVkLCAyIC0gYWN0dWFsbHkgc3RhcnRlZCAoV2luZG93cyogT1Mgb25seSkgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tzID0gRkFMU0U7CisKKy8qIGxpc3Qgb2YgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGVzIGZvciBjb21tb25zICovCitrbXBfY2FjaGVkX2FkZHJfdCAgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IE5VTEw7CisKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF9jb3VudGVyICA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3Jvb3RfY291bnRlciAgPSAwOworaW50ICAgICAgICAgICAgICAgICBfX2ttcF92ZXJzaW9uICAgICAgID0gMDsKKwordm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXIgID0gMDsKK3ZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyICA9IDA7CisKK3Vuc2lnbmVkIGludCBfX2ttcF9pbml0X3dhaXQgPSBLTVBfREVGQVVMVF9JTklUX1dBSVQ7ICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCit1bnNpZ25lZCBpbnQgX19rbXBfbmV4dF93YWl0ID0gS01QX0RFRkFVTFRfTkVYVF9XQUlUOyAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworCitzaXplX3QgICAgICBfX2ttcF9zdGtzaXplICAgICAgICAgPSBLTVBfREVGQVVMVF9TVEtTSVpFOworc2l6ZV90ICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gMDsgIC8vIGF1dG8gYWRqdXN0CitzaXplX3QgICAgICBfX2ttcF9zdGtvZmZzZXQgICAgICAgPSBLTVBfREVGQVVMVF9TVEtPRkZTRVQ7CitpbnQgICAgICAgICBfX2ttcF9zdGtwYWRkaW5nICAgICAgPSBLTVBfTUlOX1NUS1BBRERJTkc7CisKK3NpemVfdCAgICBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICA9IEtNUF9ERUZBVUxUX01BTExPQ19QT09MX0lOQ1I7CisKKy8qIEJhcnJpZXIgbWV0aG9kIGRlZmF1bHRzLCBzZXR0aW5ncywgYW5kIHN0cmluZ3MgKi8KKy8qIGJyYW5jaCBmYWN0b3IgPSAyXmJyYW5jaF9iaXRzIChvbmx5IHJlbGV2YW50IGZvciB0cmVlIGFuZCBoeXBlciBiYXJyaWVyIHR5cGVzKSAqLworI2lmIEtNUF9BUkNIX1g4Nl82NAora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogaHlwZXIyOiBDNzg5ODAgKi8KK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogY29tbXVuaWNhdGlvbiBpbiBjb3JlIGZvciBNSUMgKi8KK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGNvbW11bmljYXRpb24gaW4gY29yZSBmb3IgTUlDICovCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisjaWYgS01QX0FSQ0hfWDg2XzY0CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0ICA9IGJwX2h5cGVyX2JhcjsgIC8qIGh5cGVyMjogQzc4OTgwICovCitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdCA9IGJwX2h5cGVyX2JhcjsgIC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdCAgPSBicF9saW5lYXJfYmFyOwora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQgPSBicF9saW5lYXJfYmFyOworI2VuZGlmCitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzICBbIGJzX2xhc3RfYmFycmllciBdID0geyAwIH07CitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0cyBbIGJzX2xhc3RfYmFycmllciBdID0geyAwIH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gICBbIGJzX2xhc3RfYmFycmllciBdID0geyBicF9saW5lYXJfYmFyIH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuICBbIGJzX2xhc3RfYmFycmllciBdID0geyBicF9saW5lYXJfYmFyIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgWyBic19sYXN0X2JhcnJpZXIgXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAiS01QX1BMQUlOX0JBUlJJRVIiLCAiS01QX0ZPUktKT0lOX0JBUlJJRVIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiS01QX1JFRFVDVElPTl9CQVJSSUVSIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lICAgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4iLCAiS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfdHlwZV9uYW1lICAgICAgICAgICBbIGJzX2xhc3RfYmFycmllciBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJwbGFpbiIsICJmb3Jram9pbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJyZWR1Y3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVticF9sYXN0X2Jhcl0gPSB7ImxpbmVhciIsInRyZWUiLCJoeXBlciIsImhpZXJhcmNoaWNhbCJ9OworCitpbnQgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDA7CitzaXplX3QgICAgX19rbXBfYWxpZ25fYWxsb2MgPSBDQUNIRV9MSU5FOworCisKK2ludCAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfbG93OworaW50ICAgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3hwcm9jID0gMDsKK2ludCAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSAwOworc2l6ZV90ICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA9IEtNUF9NSU5fU1RLU0laRTsKK2ludCAgICAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBLTVBfTUFYX05USDsKK2ludCAgICAgICAgICAgICAgIF9fa21wX21heF9udGggPSAwOworaW50ICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IDA7CitpbnQgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gMDsKK2ludCAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSAwOworaW50ICAgICAgICAgICBfX2ttcF90cF9jYXBhY2l0eSA9IDA7CitpbnQgICAgICAgICAgICAgX19rbXBfdHBfY2FjaGVkID0gMDsKK2ludCAgICAgICAgICAgX19rbXBfZGZsdF9uZXN0ZWQgPSBGQUxTRTsKK2ludCBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzID0gS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUOyAvKiBtYXhfYWN0aXZlX2xldmVscyBsaW1pdCAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitpbnQgX19rbXBfaG90X3RlYW1zX21vZGUgICAgICAgICA9IDA7IC8qIDAgLSBmcmVlIGV4dHJhIHRocmVhZHMgd2hlbiByZWR1Y2VkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgLSBrZWVwIGV4dHJhIHRocmVhZHMgd2hlbiByZWR1Y2VkICovCitpbnQgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCAgICA9IDE7IC8qIG5lc3RpbmcgbGV2ZWwgb2YgaG90IHRlYW1zICovCisjZW5kaWYKK2VudW0gbGlicmFyeV90eXBlIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X25vbmU7CitlbnVtIHNjaGVkX3R5cGUgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9kZWZhdWx0OyAgLyogc2NoZWR1bGluZyBtZXRob2QgZm9yIHJ1bnRpbWUgc2NoZWR1bGluZyAqLworZW51bSBzY2hlZF90eXBlICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsgLyogZGVmYXVsdCBzdGF0aWMgc2NoZWR1bGluZyBtZXRob2QgKi8KK2VudW0gc2NoZWRfdHlwZSAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsgLyogZGVmYXVsdCBndWlkZWQgc2NoZWR1bGluZyBtZXRob2QgKi8KK2VudW0gc2NoZWRfdHlwZSAgICAgIF9fa21wX2F1dG8gPSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ7IC8qIGRlZmF1bHQgYXV0byBzY2hlZHVsaW5nIG1ldGhvZCAqLworaW50ICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9ERUZBVUxUX0JMT0NLVElNRTsKK2ludCAgICAgICBfX2ttcF9tb25pdG9yX3dha2V1cHMgPSBLTVBfTUlOX01PTklUT1JfV0FLRVVQUzsKK2ludCAgICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBLTVBfREVGQVVMVF9CTE9DS1RJTUUsIEtNUF9NSU5fTU9OSVRPUl9XQUtFVVBTICk7CisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKK2ludCAgICAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworI2lmZGVmIEtNUF9ERkxUX05USF9DT1JFUworaW50ICAgICAgICAgICAgICAgIF9fa21wX25jb3JlcyA9IDA7CisjZW5kaWYKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSAwOworaW50ICAgICAgICAgICBfX2ttcF9hYm9ydF9kZWxheSA9IDA7CisjaWYgS01QX09TX0xJTlVYICYmIGRlZmluZWQoS01QX1REQVRBX0dUSUQpCitpbnQgICAgICAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gMzsgLyogdXNlIF9fZGVjbHNwZWModGhyZWFkKSBUTFMgdG8gc3RvcmUgZ3RpZCAqLworaW50ICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworI2VsaWYgS01QX09TX1dJTkRPV1MKK2ludCAgICAgICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSAyOyAvKiB1c2UgVExTIGZ1bmN0aW9ucyB0byBzdG9yZSBndGlkICovCitpbnQgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gRkFMU0U7CisjZWxzZQoraW50ICAgICAgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IDA7IC8qIHNlbGVjdCBtZXRob2QgdG8gZ2V0IGd0aWQgYmFzZWQgb24gI3RocmVhZHMgKi8KK2ludCAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBUUlVFOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAmJiBkZWZpbmVkKEtNUF9UREFUQV9HVElEKSAqLworI2lmZGVmIEtNUF9UREFUQV9HVElECisjaWYgS01QX09TX1dJTkRPV1MKK19fZGVjbHNwZWModGhyZWFkKSBpbnQgX19rbXBfZ3RpZCA9IEtNUF9HVElEX0RORTsKKyNlbHNlCitfX3RocmVhZCBpbnQgX19rbXBfZ3RpZCA9IEtNUF9HVElEX0RORTsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAtIHdvcmthcm91bmQgYmVjYXVzZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBjb21waWxlciAyMDExMDMxNiBkb2Vzbid0IGFjY2VwdCBfX2RlY2xzcGVjICovCisjZW5kaWYgLyogS01QX1REQVRBX0dUSUQgKi8KK2ludCAgICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW4gPSBJTlRfTUFYOworaW50ICAgICAgICAgICAgX19rbXBfZm9yZWlnbl90cCA9IFRSVUU7CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAoraW50ICAgIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCA9IFRSVUU7CitrbXBfaW50MTYgIF9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgPSAwOwora21wX3VpbnQzMiAgICAgX19rbXBfaW5pdF9teGNzciA9IDA7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorZG91YmxlICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgICA9IDEuMDsKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKK2ttcF9uZXN0ZWRfbnRocmVhZHNfdCBfX2ttcF9uZXN0ZWRfbnRoICA9IHsgTlVMTCwgMCwgMCB9OworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCitrbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXNfdCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcyA9IHsgMSwgMTAyNCB9OyAvLyBUT0RPOiB0dW5lIGl0IQorCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitjaGFyICogX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlID0gIi0iOworI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyNpZiBPTVBfNDBfRU5BQkxFRAoraW50IF9fa21wX2Rpc3BsYXlfZW52ICAgICAgICAgICA9IEZBTFNFOworaW50IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgICA9IEZBTFNFOworaW50IF9fa21wX29tcF9jYW5jZWxsYXRpb24gICAgICA9IEZBTFNFOworI2VuZGlmCisKKy8qIG1hcCBPTVAgMy4wIHNjaGVkdWxlIHR5cGVzIHdpdGggb3VyIGludGVybmFsIHNjaGVkdWxlIHR5cGVzICovCitlbnVtIHNjaGVkX3R5cGUgX19rbXBfc2NoX21hcFsga21wX3NjaGVkX3VwcGVyIC0ga21wX3NjaGVkX2xvd2VyX2V4dCArIGttcF9zY2hlZF91cHBlcl9zdGQgLSBrbXBfc2NoZWRfbG93ZXIgLSAyIF0gPSB7CisgICAga21wX3NjaF9zdGF0aWNfY2h1bmtlZCwgICAgIC8vID09PiBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxCisgICAga21wX3NjaF9keW5hbWljX2NodW5rZWQsICAgIC8vID09PiBrbXBfc2NoZWRfZHluYW1pYyAgICAgICAgICAgPSAyCisgICAga21wX3NjaF9ndWlkZWRfY2h1bmtlZCwgICAgIC8vID09PiBrbXBfc2NoZWRfZ3VpZGVkICAgICAgICAgICAgPSAzCisgICAga21wX3NjaF9hdXRvLCAgICAgICAgICAgICAgIC8vID09PiBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0CisgICAga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgIC8vID09PiBrbXBfc2NoZWRfdHJhcGV6b2lkYWwgICAgICAgPSAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBsaWtlbHkgbm90IHVzZWQsIGludHJvZHVjZWQgaGVyZSBqdXN0IHRvIGRlYnVnIHRoZSBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHB1YmxpYyBpbnRlbCBleHRlbnNpb24gc2NoZWR1bGVzCit9OworCisjaWYgS01QX09TX0xJTlVYCitlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgX19rbXBfY2xvY2tfZnVuY3Rpb247CitpbnQgX19rbXBfY2xvY2tfZnVuY3Rpb25fcGFyYW07CisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKK2VudW0gbWljX3R5cGUgX19rbXBfbWljX3R5cGUgPSBub25fbWljOworI2VuZGlmCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKK2ludCBfX2ttcF9udW1fcHJvY19ncm91cHMgPSAxOworCitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSBOVUxMOwora21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKK2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKK3NpemVfdCAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7CitlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CitlbnVtIGFmZmluaXR5X2dyYW4gX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZGVmYXVsdDsKK2ludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyAgPSAtMTsKK2ludCBfX2ttcF9hZmZpbml0eV9kdXBzID0gVFJVRTsKK2VudW0gYWZmaW5pdHlfdG9wX21ldGhvZCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgID0gMDsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICA9IDA7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgPSBGQUxTRTsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICA9IFRSVUU7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdDsKK2NoYXIgKiAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICAgICA9IE5VTEw7CitrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrcyA9IE5VTEw7Cit1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgICAgPSAwOworCitjaGFyIGNvbnN0ICogIF9fa21wX2NwdWluZm9fZmlsZSAgICAgPSBOVUxMOworCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ttcF9uZXN0ZWRfcHJvY19iaW5kX3QgX19rbXBfbmVzdGVkX3Byb2NfYmluZCA9IHsgTlVMTCwgMCwgMCB9OworaW50IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworI2VuZGlmCisKK2ludCBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9IDA7CitpbnQgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCA9IDA7CitpbnQgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gMDsKK2ludCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IDA7CitpbnQgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSAwOworCitrbXBfdGFza2luZ19tb2RlX3QgX19rbXBfdGFza2luZ19tb2RlID0gdHNrbV90YXNrX3RlYW1zOworCisvKiBUaGlzIGNoZWNrIGVuc3VyZXMgdGhhdCB0aGUgY29tcGlsZXIgaXMgcGFzc2luZyB0aGUgY29ycmVjdCBkYXRhIHR5cGUKKyAqIGZvciB0aGUgZmxhZ3MgZm9ybWFsIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24ga21wY19vbXBfdGFza19hbGxvYygpLgorICogSWYgdGhlIHR5cGUgaXMgbm90IGEgNC1ieXRlIHR5cGUsIHRoZW4gZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIGFib3V0CisgKiBhIG5vbi1wb3NpdGl2ZSBsZW5ndGggYXJyYXkgcG9pbnRpbmcgaGVyZS4gIElmIHRoYXQgaGFwcGVucywgdGhlCisgKiBrbXBfdGFza2luZ19mbGFnc190IHN0cnVjdHVyZSBtdXN0IGJlIHJlZGVmaW5lZCB0byBoYXZlIGV4YWN0bHkgMzIgYml0cy4KKyAqLworS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKGttcF90YXNraW5nX2ZsYWdzX3QpID09IDQgKTsKKwora21wX2ludDMyIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCA9IDE7ICAgLyogQ29uc3RyYWluIHRhc2sgc3RlYWxpbmcgYnkgZGVmYXVsdCAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50ICAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9IDA7CisjZW5kaWYKKworaW50ICAgICBfX2ttcF9zZXR0aW5ncyA9IEZBTFNFOworaW50ICAgICBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayA9IDA7CisjaWYgVVNFX0lUVF9CVUlMRAoraW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXMgPSAxOworaW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9IDM7CisjZW5kaWYKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQ7CitpbnQgICAgIF9fa21wX2RldGVybV9yZWQgPSBGQUxTRTsKKworI2lmZGVmIEtNUF9ERUJVRworaW50ICAgICBrbXBfYV9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9iX2RlYnVnID0gMDsKK2ludCAgICAga21wX2NfZGVidWcgPSAwOworaW50ICAgICBrbXBfZF9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9lX2RlYnVnID0gMDsKK2ludCAgICAga21wX2ZfZGVidWcgPSAwOworaW50ICAgICBrbXBfZGlhZyAgICA9IDA7CisjZW5kaWYKKworLyogRm9yIGRlYnVnIGluZm9ybWF0aW9uIGxvZ2dpbmcgdXNpbmcgcm90YXRpbmcgYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1ZiA9IEZBTFNFOyAgICAgICAgLyogVFJVRSBtZWFucyB1c2UgYnVmZmVyLCBGQUxTRSBtZWFucyBwcmludCB0byBzdGRlcnIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzID0gS01QX0RFQlVHX0JVRl9MSU5FU19JTklUOyAvKiBMaW5lcyBvZiBkZWJ1ZyBzdG9yZWQgaW4gYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFycyA9IEtNUF9ERUJVR19CVUZfQ0hBUlNfSU5JVDsgLyogQ2hhcmFjdGVycyBhbGxvd2VkIHBlciBsaW5lIGluIGJ1ZmZlciAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfYXRvbWljID0gRkFMU0U7IC8qIFRSVUUgbWVhbnMgdXNlIGF0b21pYyB1cGRhdGUgb2YgYnVmZmVyIGVudHJ5IHBvaW50ZXIgKi8KKworY2hhciAgICpfX2ttcF9kZWJ1Z19idWZmZXIgPSBOVUxMOyAgICAgIC8qIERlYnVnIGJ1ZmZlciBpdHNlbGYgKi8KK2ludCAgICAgX19rbXBfZGVidWdfY291bnQgPSAwOyAgICAgICAgICAvKiBDb3VudGVyIGZvciBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBpbiBidWZmZXIgc28gZmFyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gMDsgLyogS2VlcCB0cmFjayBvZiBjaGFyIGluY3JlYXNlIHJlY29tbWVuZGVkIGluIHdhcm5pbmdzICovCisvKiBlbmQgcm90YXRpbmcgZGVidWcgYnVmZmVyICovCisKKyNpZmRlZiBLTVBfREVCVUcKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlOyAgICAgICAgICAgLyogKzEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBvdXRzaWRlIHJhbmdlICovCitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lW0tNUF9QQVJfUkFOR0VfUk9VVElORV9MRU5dID0geyAnXDAnIH07CitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl0gPSB7ICdcMCcgfTsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX3ViID0gSU5UX01BWDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworLyogRm9yIHByaW50aW5nIG91dCBkeW5hbWljIHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcCA9IEZBTFNFOyAgICAgICAgIC8qIFRydWUgbWVhbnMgcHJpbnQgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsgLyogVHJ1ZSBtZWFucyBzdG9yYWdlIG1hcCBpbmNsdWRlcyBwbGFjZW1lbnQgaW5mbyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IEZBTFNFOworLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBkYXRhIHN0cnVjdHVyZXMgd2hlbiB3ZSBmb3JrIGEgY2hpbGQgcHJvY2VzcywgZGVmYXVsdHMgdG8gVFJVRSAqLworaW50ICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9IFRSVUU7IC8qIEF0IGluaXRpYWxpemF0aW9uLCBjYWxsIHB0aHJlYWRfYXRmb3JrIHRvIGluc3RhbGwgZm9yayBoYW5kbGVyICovCitpbnQgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCA9IFRSVUU7CisKK2ludCAgICAgICAgX19rbXBfZW52X2NodW5rICAgICAgID0gRkFMU0U7ICAvKiBLTVBfQ0hVTksgc3BlY2lmaWVkPyAgICAgKi8KK2ludCAgICAgICAgX19rbXBfZW52X3N0a3NpemUgICAgID0gRkFMU0U7ICAvKiBLTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X29tcF9zdGtzaXplID0gRkFMU0U7ICAvKiBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2FsbF90aHJlYWRzICAgICA9IEZBTFNFOy8qIEtNUF9BTExfVEhSRUFEUyBvciBLTVBfTUFYX1RIUkVBRFMgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfb21wX2FsbF90aHJlYWRzID0gRkFMU0U7LyogT01QX1RIUkVBRF9MSU1JVCBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUgICA9IEZBTFNFOyAgLyogS01QX0JMT0NLVElNRSBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9jaGVja3MgICAgICA9IEZBTFNFOyAgLyogS01QX0NIRUNLUyBzcGVjaWZpZWQ/ICAgICovCitpbnQgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAgPSBGQUxTRTsgIC8qIEtNUF9DT05TSVNURU5DWV9DSEVDSyBzcGVjaWZpZWQ/ICovCisKK2ttcF91aW50MzIgX19rbXBfeWllbGRfaW5pdCA9IEtNUF9JTklUX1dBSVQ7CitrbXBfdWludDMyIF9fa21wX3lpZWxkX25leHQgPSBLTVBfTkVYVF9XQUlUOwora21wX3VpbnQzMiBfX2ttcF95aWVsZGluZ19vbiA9IDE7CisjaWYgS01QX09TX0NOSwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZSA9IDA7CisjZWxzZQora21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZSA9IDE7ICAgICAvKiBZaWVsZC1jeWNsZSBpcyBvbiBieSBkZWZhdWx0ICovCisjZW5kaWYKK2ttcF9pbnQzMiAgX19rbXBfeWllbGRfb25fY291bnQgPSAxMDsgLyogQnkgZGVmYXVsdCwgeWllbGRpbmcgaXMgb24gZm9yIDEwIG1vbml0b3IgcGVyaW9kcy4gKi8KK2ttcF9pbnQzMiAgX19rbXBfeWllbGRfb2ZmX2NvdW50ID0gMTsgLyogQnkgZGVmYXVsdCwgeWllbGRpbmcgaXMgb2ZmIGZvciAxIG1vbml0b3IgcGVyaW9kcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBTVEFURSBtb3N0bHkgc3luY3Jvbml6ZWQgd2l0aCBnbG9iYWwgbG9jayAqLworLyogZGF0YSB3cml0dGVuIHRvIHJhcmVseSBieSBtYXN0ZXJzLCByZWFkIG9mdGVuIGJ5IHdvcmtlcnMgKi8KKy8qCisgKiBTSEFMTCBXRSBFRElUIFRIRSBDT01NRU5UIEJFTE9XIElOIFNPTUUgV0FZPworICogVE9ETzogIE5vbmUgb2YgdGhpcyBnbG9iYWwgcGFkZGluZyBzdHVmZiB3b3JrcyBjb25zaXN0ZW50bHkgYmVjYXVzZQorICogdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9uIGlzIG5vdCBuZWNlc3NhcmlseSBjb3JyZWxhdGVkIHRvIHN0b3JhZ2Ugb3JkZXIuCisgKiBUbyBmaXggdGhpcywgYWxsIHRoZSBpbXBvcnRhbnQgZ2xvYmFscyBtdXN0IGJlIHB1dCBpbiBhIGJpZyBzdHJ1Y3R1cmUKKyAqIGluc3RlYWQuCisgKi8KK0tNUF9BTElHTl9DQUNIRQorICAgICAgICAga21wX2luZm9fdCAqKl9fa21wX3RocmVhZHMgICAgID0gTlVMTDsKKyAgICAgICAgIGttcF9yb290X3QgKipfX2ttcF9yb290ICAgICAgICA9IE5VTEw7CisKKy8qIGRhdGEgcmVhZC93cml0dGVuIHRvIG9mdGVuIGJ5IG1hc3RlcnMgKi8KK0tNUF9BTElHTl9DQUNIRQordm9sYXRpbGUgaW50ICAgICAgICAgIF9fa21wX250aCAgICAgICAgICAgICAgICAgICAgPSAwOwordm9sYXRpbGUgaW50ICAgICAgICAgIF9fa21wX2FsbF9udGggICAgICAgICAgICAgICAgPSAwOworaW50ICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aCAgICAgICAgPSAwOwordm9sYXRpbGUga21wX2luZm9fdCAgKl9fa21wX3RocmVhZF9wb29sICAgICAgICAgICAgPSBOVUxMOwordm9sYXRpbGUga21wX3RlYW1fdCAgKl9fa21wX3RlYW1fcG9vbCAgICAgICAgICAgICAgPSBOVUxMOworCitLTVBfQUxJR05fQ0FDSEUKK3ZvbGF0aWxlIGludCAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoID0gMDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR0xPQkFML1JPT1QgU1RBVEUgKi8KK0tNUF9BTElHTl9DQUNIRQora21wX2dsb2JhbF90IF9fa21wX2dsb2JhbCA9IHt7IDAgfX07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBHTE9CQUwgU1lOQ0hST05JWkFUSU9OIExPQ0tTICovCisvKiBUT0RPIHZlcmlmeSB0aGUgbmVlZCBmb3IgdGhlc2UgbG9ja3MgYW5kIGlmIHRoZXkgbmVlZCB0byBiZSBnbG9iYWwgKi8KKworI2lmIEtNUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVAorLyogTXVsdGlub2RlIHN5c3RlbXMgaGF2ZSBsYXJnZXIgY2FjaGUgbGluZSBncmFudWxhcml0eSB3aGljaCBjYW4gY2F1c2UKKyAqIGZhbHNlIHNoYXJpbmcgaWYgdGhlIGFsaWdubWVudCBpcyBub3QgbGFyZ2UgZW5vdWdoIGZvciB0aGVzZSBsb2NrcyAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQorCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pbml0el9sb2NrICAgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIF9fa21wX2luaXR6X2xvY2sgICApOyAvKiBDb250cm9sIGluaXRpYWxpemF0aW9ucyAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZm9ya2pvaW5fbG9jazsgLyogY29udHJvbCBmb3JrL2pvaW4gYWNjZXNzICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9leGl0X2xvY2s7ICAgLyogZXhpdCgpIGlzIG5vdCBhbHdheXMgdGhyZWFkLXNhZmUgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX21vbml0b3JfbG9jazsgLyogY29udHJvbCBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7IC8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uIHRvIGNvLWV4aXN0ICovCisKK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9sb2NrX3QgX19rbXBfZ2xvYmFsX2xvY2s7ICAgICAgICAgICAvKiBDb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgICAgICAgIC8qIENvbnRyb2wgZGlzcGF0Y2ggYWNjZXNzICAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2xvY2tfdCBfX2ttcF9kZWJ1Z19sb2NrOyAgICAgICAgICAgIC8qIENvbnRyb2wgSS9PIGFjY2VzcyBmb3IgS01QX0RFQlVHICovCisjZWxzZQorS01QX0FMSUdOX0NBQ0hFCisKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2sgICA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfaW5pdHpfbG9jayAgICk7IC8qIENvbnRyb2wgaW5pdGlhbGl6YXRpb25zICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfbW9uaXRvcl9sb2NrOyAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF90cF9jYWNoZWRfbG9jazsgLyogdXNlZCBmb3IgdGhlIGhhY2sgdG8gYWxsb3cgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbmQgX19rbXBfdGhyZWFkcyBleHBhbnNpb24gdG8gY28tZXhpc3QgKi8KKworS01QX0FMSUdOKDEyOCkKK2ttcF9sb2NrX3QgX19rbXBfZ2xvYmFsX2xvY2s7ICAgICAgICAgICAvKiBDb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgKi8KK0tNUF9BTElHTigxMjgpCitrbXBfcXVldWluZ19sb2NrX3QgX19rbXBfZGlzcGF0Y2hfbG9jazsgICAgICAgICAvKiBDb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK0tNUF9BTElHTigxMjgpCitrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAgICAgICAgLyogQ29udHJvbCBJL08gYWNjZXNzIGZvciBLTVBfREVCVUcgKi8KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgLyoKKyAgICAgICAgU2lnbmFsIGhhbmRsaW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgaXQgY29uZnVzZXMgdXNlcnM6IEluIGNhc2Ugb2Ygc2lnc2VndgorICAgICAgICAob3Igb3RoZXIgdHJvdWJsZSkgaW4gdXNlciBjb2RlIHNpZ25hbCBoYW5kbGVyIGNhdGNoZXMgdGhlIHNpZ25hbCwgd2hpY2ggdGhlbiAiYXBwZWFycyIgaW4KKyAgICAgICAgdGhlIG1vbml0b3IgdGhyZWFkICh3aGVuIHRoZSBtb25pdG9yIGV4ZWN1dGVzIHJhaXNlKCkgZnVuY3Rpb24pLiBVc2VycyBzZWUgc2lnbmFsIGluIHRoZQorICAgICAgICBtb25pdG9yIHRocmVhZCBhbmQgYmxhbWUgT3Blbk1QIFJUTC4KKworICAgICAgICBHcmFudCBzYWlkIHNpZ25hbCBoYW5kbGluZyByZXF1aXJlZCBvbiBzb21lIG9sZGVyIE9TZXMgKElyaXg/KSBzdXBwb3J0ZWQgYnkgS0FJLCBiZWNhdXNlCisgICAgICAgIGJhZCBhcHBsaWNhdGlvbnMgaHVuZyBidXQgbm90IGFib3J0ZWQuIEN1cnJlbnRseSBpdCBpcyBub3QgYSBwcm9ibGVtIGZvciBMaW51eCogT1MsIE9TIFgqIGFuZAorICAgICAgICBXaW5kb3dzKiBPUy4KKworICAgICAgICBHcmFudDogRm91bmQgbmV3IGhhbmdzIGZvciBFTDQsIEVMNSwgYW5kIGEgRmVkb3JhIENvcmUgbWFjaGluZS4gIFNvIEknbSBwdXR0aW5nCisgICAgICAgIHRoZSBkZWZhdWx0IGJhY2sgZm9yIG5vdyB0byBzZWUgaWYgdGhhdCBmaXhlcyBoYW5ncyBvbiB0aG9zZSBtYWNoaW5lcy4KKworICAgICAgICAyMDEwLTA0MDEzIExldjogSXQgd2FzIGEgYnVnIGluIEZvcnRyYW4gUlRMLiBGb3J0cmFuIFJUTCBwcmludHMgYSBraW5kIG9mIHN0YWNrIGJhY2t0cmFjZQorICAgICAgICB3aGVuIHByb2dyYW0gaXMgYWJvcnRpbmcsIGJ1dCB0aGUgY29kZSBpcyBub3Qgc2lnbmFsLXNhZmUuIFdoZW4gbXVsdGlwbGUgc2lnbmFscyByYWlzZWQgYXQKKyAgICAgICAgdGhlIHNhbWUgdGltZSAod2hpY2ggb2NjdXJzIGluIGR5bmFtaWMgbmVnYXRpdmUgdGVzdHMgYmVjYXVzZSBhbGwgdGhlIHdvcmtlciB0aHJlYWRzIGRldGVjdHMKKyAgICAgICAgdGhlIHNhbWUgZXJyb3IpLCBGb3J0cmFuIFJUTCBtYXkgaGFuZy4gVGhlIGJ1ZyBmaW5hbGx5IGZpeGVkIGluIEZvcnRyYW4gUlRMIGxpYnJhcnkgcHJvdmlkZWQKKyAgICAgICAgYnkgU3RldmUgUi4sIGFuZCB3aWxsIGJlIGF2YWlsYWJsZSBzb29uLgorICAgICovCisgICAgaW50IF9fa21wX2hhbmRsZV9zaWduYWxzID0gRkFMU0U7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBCVUlMRF9UVgora21wX2tleV90IF9fa21wX3R2X2tleSA9IDA7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK2ludAorZ2V0X3N1c3BlbmRfY291bnRfKCB2b2lkICkgeworICAgIGludCBjb3VudCA9IF9fa21wX3N1c3BlbmRfY291bnQ7CisgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9IDA7CisgICAgcmV0dXJuIGNvdW50OworfQordm9pZAorc2V0X3N1c3BlbmRfY291bnRfKCBpbnQgKiB2YWx1ZSApIHsKKyAgICBfX2ttcF9zdXNwZW5kX2NvdW50ID0gKnZhbHVlOworfQorI2VuZGlmCisKKy8vIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb24uCitpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9leGFjdGx5X29uZV9PcGVuTVBfbGlicmFyeSA9IDE7CitpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9JbnRlbF9PcGVuTVBfbGlicmFyeSAgICAgICA9IDE7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgKCBLTVBfVkVSU0lPTl9NQUpPUiA+IDQgKQorICAgIGludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisjZW5kaWYKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dzdXBwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5YWM0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jCkBAIC0wLDAgKzEsMTYwMiBAQAorLyoKKyAqIGttcF9nc3VwcG9ydC5jCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2RlZmluZSBNS0xPQyhsb2Mscm91dGluZSkgXAorICAgIHN0YXRpYyBpZGVudF90IChsb2MpID0gezAsIEtNUF9JREVOVF9LTVBDLCAwLCAwLCAiO3Vua25vd247dW5rbm93bjswOzA7OyIgfTsKKworI2luY2x1ZGUgImttcF9mdG5fb3MuaCIKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfYmFycmllciIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfYmFycmllcjogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCisKKy8vCisvLyBNdXR1YWwgZXhjbHVzaW9uCisvLworCisvLworLy8gVGhlIHN5bWJvbCB0aGF0IGljYy9pZm9ydCBnZW5lcmF0ZXMgZm9yIHVubmFtZWQgZm9yIHVubmFtZWQgY3JpdGljYWwKKy8vIHNlY3Rpb25zIC0gLmdvbXBfY3JpdGljYWxfdXNlcl8gLSBpcyBkZWZpbmVkIHVzaW5nIC5jb21tIGluIGFueSBvYmplY3RzCisvLyByZWZlcmVuY2UgaXQuICBXZSBjYW4ndCByZWZlcmVuY2UgaXQgZGlyZWN0bHkgaGVyZSBpbiBDIGNvZGUsIGFzIHRoZQorLy8gc3ltYm9sIGNvbnRhaW5zIGEgIi4iLgorLy8KKy8vIFRoZSBSVEwgY29udGFpbnMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBvZiAuZ29tcF9jcml0aWNhbF91c2VyXworLy8gd2l0aCBhbm90aGVyIHN5bWJvbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIgaW5pdGlhbGl6ZWQgd2l0aCBpdCdzCisvLyBhZGRyZXNzLgorLy8KK2V4dGVybiBrbXBfY3JpdGljYWxfbmFtZSAqX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOworCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9lbmQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2NyaXRpY2FsX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQpKHZvaWQgKipwcHRyKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19jcml0aWNhbCgmbG9jLCBndGlkLCAoa21wX2NyaXRpY2FsX25hbWUgKilwcHRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5EKSh2b2lkICoqcHB0cikKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9uYW1lX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfZW5kX2NyaXRpY2FsKCZsb2MsIGd0aWQsIChrbXBfY3JpdGljYWxfbmFtZSAqKXBwdHIpOworfQorCisKKy8vCisvLyBUaGUgR251IGNvZGVnZW4gdHJpZXMgdG8gdXNlIGxvY2tlZCBvcGVyYXRpb25zIHRvIHBlcmZvcm0gYXRvbWljIHVwZGF0ZXMKKy8vIGlubGluZS4gIElmIGl0IGNhbid0LCB0aGVuIGl0IGNhbGxzIEdPTVBfYXRvbWljX3N0YXJ0KCkgYmVmb3JlIHBlcmZvcm1pbmcKKy8vIHRoZSB1cGRhdGUgYW5kIEdPTVBfYXRvbWljX2VuZCgpIGFmdGVyd2FyZCwgcmVnYXJkbGVzcyBvZiB0aGUgZGF0YSB0eXBlLgorLy8KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fb21wdF90aHJlYWRfYXNzaWduX3dhaXRfaWQoMCk7CisjZW5kaWYKKworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfYXRvbWljX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisKK2ludAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zaW5nbGVfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gM3JkIHBhcmFtZXRlciA9PSBGQUxTRSBwcmV2ZW50cyBrbXBfZW50ZXJfc2luZ2xlIGZyb20gcHVzaGluZyBhCisgICAgLy8gd29ya3NoYXJlIHdoZW4gVVNFX0NIRUNLUyBpcyBkZWZpbmVkLiAgV2UgbmVlZCB0byBhdm9pZCB0aGUgcHVzaCwKKyAgICAvLyBhcyB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIEdPTVBfc2luZ2xlX2VuZCgpIGNhbGwuCisgICAgLy8KKyAgICByZXR1cm4gX19rbXBfZW50ZXJfc2luZ2xlKGd0aWQsICZsb2MsIEZBTFNFKTsKK30KKworCit2b2lkICoKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQpKHZvaWQpCit7CisgICAgdm9pZCAqcmV0dmFsOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2luZ2xlX2NvcHlfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9jb3B5X3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aHJlYWQgdG8gZW50ZXIsIHJldHVybiBOVUxMLiAgVGhlIGdlbmVyYXRlZAorICAgIC8vIGNvZGUgd2lsbCB0aGVuIGNhbGwgR09NUF9zaW5nbGVfY29weV9lbmQoKSBmb3IgdGhpcyB0aHJlYWQgb25seSwKKyAgICAvLyB3aXRoIHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuCisgICAgLy8KKyAgICBpZiAoX19rbXBfZW50ZXJfc2luZ2xlKGd0aWQsICZsb2MsIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvLworICAgIC8vIFdhaXQgZm9yIHRoZSBmaXJzdCB0aHJlYWQgdG8gc2V0IHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIsCisgICAgLy8gYW5kIGZvciBhbGwgb3RoZXIgdGhyZWFkcyB0byByZWFjaCB0aGlzIHBvaW50LgorICAgIC8vCisgICAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICAvLworICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludCwgYW5kIHdhaXQgZm9yIGFsbAorICAgIC8vIHRocmVhZHMgdG8gZG8gbGlrZXdpc2UsIHRoZW4gcmV0dXJuLgorICAgIC8vCisgICAgcmV0dmFsID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhOworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQpKHZvaWQgKmRhdGEpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2luZ2xlX2NvcHlfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyIGZvIHRoZSB0ZWFtLCB0aGVuIGhpdCB0aGUgYmFycmllcgorICAgIC8vIHNvIHRoYXQgdGhlIG90aGVyIHRocmVhZHMgd2lsbCBjb250aW51ZSBvbiBhbmQgcmVhZCBpdC4gIEhpdCBhbm90aGVyCisgICAgLy8gYmFycmllciBiZWZvcmUgY29udGludWluZywgc28gdGhhdCB0aGUga25vdyB0aGF0IHRoZSBjb3B5cHJpdmF0ZQorICAgIC8vIGRhdGEgcG9pbnRlciBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIGFsbCB0aHJlYWRzIGJlZm9yZSB0cnlpbmcgdG8KKyAgICAvLyByZXVzZSB0aGUgdF9jb3B5cHJpdl9kYXRhIGZpZWxkLgorICAgIC8vCisgICAgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhID0gZGF0YTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9vcmRlcmVkX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX29yZGVyZWQoJmxvYywgZ3RpZCk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfb3JkZXJlZF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfb3JkZXJlZCgmbG9jLCBndGlkKTsKK30KKworCisvLworLy8gRGlzcGF0Y2ggbWFjcm8gZGVmcworLy8KKy8vIFRoZXkgY29tZSBpbiB0d28gZmxhdm9yczogNjQtYml0IHVuc2lnbmVkLCBhbmQgZWl0aGVyIDMyLWJpdCBzaWduZWQKKy8vIChJQS0zMiBhcmNoaXRlY3R1cmUpIG9yIDY0LWJpdCBzaWduZWQgKEludGVsKFIpIDY0KS4KKy8vCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVCAgICAgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNAorIyBkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzQKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUICAgICAgICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisjZWxzZQorIyBkZWZpbmUgS01QX0RJU1BBVENIX0lOSVQgICAgICAgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfTkVYVCAgICAgICAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVF9VTEwgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184dQorIyBkZWZpbmUgS01QX0RJU1BBVENIX05FWFRfVUxMICAgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1CisKKworLy8KKy8vIFRoZSBwYXJhbGxlbCBjb250cnVjdAorLy8KKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9taWNyb3Rhc2tfd3JhcHBlcihpbnQgKmd0aWQsIGludCAqbnByLCB2b2lkICgqdGFzaykodm9pZCAqKSwKKyAgdm9pZCAqZGF0YSkKK3sKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBrbXBfaW5mb190ICp0aHI7CisgICAgb21wdF9mcmFtZV90ICpvbXB0X2ZyYW1lOworICAgIG9tcHRfc3RhdGVfdCBlbmNsb3Npbmdfc3RhdGU7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIGdldCBwb2ludGVyIHRvIHRocmVhZCBkYXRhIHN0cnVjdHVyZQorICAgICAgICB0aHIgPSBfX2ttcF90aHJlYWRzWypndGlkXTsKKworICAgICAgICAvLyBzYXZlIGVuY2xvc2luZyB0YXNrIHN0YXRlOyBzZXQgY3VycmVudCBzdGF0ZSBmb3IgdGFzaworICAgICAgICBlbmNsb3Npbmdfc3RhdGUgPSB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKworICAgICAgICAvLyBzZXQgdGFzayBmcmFtZQorICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIHRhc2soZGF0YSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIGNsZWFyIHRhc2sgZnJhbWUKKyAgICAgICAgb21wdF9mcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAvLyByZXN0b3JlIGVuY2xvc2luZyBzdGF0ZQorICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBlbmNsb3Npbmdfc3RhdGU7CisgICAgfQorI2VuZGlmCit9CisKKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9wYXJhbGxlbF9taWNyb3Rhc2tfd3JhcHBlcihpbnQgKmd0aWQsIGludCAqbnByLAorICB2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMsIGlkZW50X3QgKmxvYywKKyAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBsb25nIHN0YXJ0LCBsb25nIGVuZCwgbG9uZyBpbmNyLCBsb25nIGNodW5rX3NpemUpCit7CisgICAgLy8KKyAgICAvLyBJbnRpYWxpemUgdGhlIGxvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0LgorICAgIC8vCisgICAgS01QX0RJU1BBVENIX0lOSVQobG9jLCAqZ3RpZCwgc2NoZWR1bGUsIHN0YXJ0LCBlbmQsIGluY3IsIGNodW5rX3NpemUsCisgICAgICBzY2hlZHVsZSAhPSBrbXBfc2NoX3N0YXRpYyk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBrbXBfaW5mb190ICp0aHI7CisgICAgb21wdF9mcmFtZV90ICpvbXB0X2ZyYW1lOworICAgIG9tcHRfc3RhdGVfdCBlbmNsb3Npbmdfc3RhdGU7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHRociA9IF9fa21wX3RocmVhZHNbKmd0aWRdOworICAgICAgICAvLyBzYXZlIGVuY2xvc2luZyB0YXNrIHN0YXRlOyBzZXQgY3VycmVudCBzdGF0ZSBmb3IgdGFzaworICAgICAgICBlbmNsb3Npbmdfc3RhdGUgPSB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKworICAgICAgICAvLyBzZXQgdGFzayBmcmFtZQorICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vCisgICAgLy8gTm93IGludm9rZSB0aGUgbWljcm90YXNrLgorICAgIC8vCisgICAgdGFzayhkYXRhKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLy8gY2xlYXIgdGFzayBmcmFtZQorICAgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICAgIC8vIHJlc2V0IGVuY2xvc2luZyBzdGF0ZQorICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBlbmNsb3Npbmdfc3RhdGU7CisgICAgfQorI2VuZGlmCit9CisKKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9mb3JrX2NhbGwoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgdm9pZCAoKnVud3JhcHBlZF90YXNrKSh2b2lkICopLCBtaWNyb3Rhc2tfdCB3cmFwcGVyLCBpbnQgYXJnYywuLi4pCit7CisgICAgaW50IHJjOworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGFyZ2MpOworCisgICAgcmMgPSBfX2ttcF9mb3JrX2NhbGwobG9jLCBndGlkLCBmb3JrX2NvbnRleHRfZ251LCBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgVk9MQVRJTEVfQ0FTVCh2b2lkICopIHVud3JhcHBlZF90YXNrLAorI2VuZGlmCisgICAgICB3cmFwcGVyLCBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgJmFwCisjZWxzZQorICAgICAgYXAKKyNlbmRpZgorICAgICAgKTsKKworICAgIHZhX2VuZChhcCk7CisKKyAgICBpZiAocmMpIHsKKyAgICAgICAgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soZ3RpZCwgdGlkLCB0aHIsIHRlYW0pOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9UUkFDRQorICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworCisgICAgICAgIC8vIGltcGxpY2l0IHRhc2sgY2FsbGJhY2sKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKAorICAgICAgICAgICAgICAgIHRlYW1faW5mby0+cGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAoKnRhc2spKHZvaWQgKikpCit7CisgICAgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBvbXB0X3Rhc2tfaWRfdCBvbXB0X3Rhc2tfaWQgPSBfX29tcHRfZ2V0X3Rhc2tfaWRfaW50ZXJuYWwoMCk7CisgICAgICAgIG9tcHRfZnJhbWVfdCAgKm9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQgPSBfX29tcHRfcGFyYWxsZWxfaWRfbmV3KGd0aWQpOworICAgICAgICBvbXB0X3Rhc2tfaWRfdCBteV9vbXB0X3Rhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisKKyAgICAgICAgb21wdF9mcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAvLyBwYXJhbGxlbCByZWdpb24gY2FsbGJhY2sKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbikpIHsKKyAgICAgICAgICAgIGludCB0ZWFtX3NpemUgPSAxOworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSgKKyAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfaWQsIG9tcHRfZnJhbWUsIG9tcHRfcGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9zaXplLCAodm9pZCAqKSB0YXNrLAorICAgICAgICAgICAgICAgIE9NUFRfSU5WT0tFUihmb3JrX2NvbnRleHRfZ251KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgdXAgbGlnaHR3ZWlnaHQgdGFzaworICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IChvbXB0X2x3X3Rhc2t0ZWFtX3QgKikKKyAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZihvbXB0X2x3X3Rhc2t0ZWFtX3QpKTsKKyAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQobHd0LCB0aHIsIGd0aWQsICh2b2lkICopIHRhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworICAgICAgICBsd3QtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBteV9vbXB0X3Rhc2tfaWQ7CisgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsobHd0LCB0aHIpOworCisjaWYgT01QVF9UUkFDRQorICAgICAgICAvLyBpbXBsaWNpdCB0YXNrIGNhbGxiYWNrCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBteV9vbXB0X3Rhc2tfaWQpOworICAgICAgICB9CisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU1RBUlQpKHZvaWQgKCp0YXNrKSh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcykKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X2ZyYW1lOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBwYXJlbnRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIHBhcmVudF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgfQorI2VuZGlmCisKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeworICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywKKyAgICAgICAgICAobWljcm90YXNrX3QpX19rbXBfR09NUF9taWNyb3Rhc2tfd3JhcHBlciwgMiwgdGFzaywgZGF0YSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgfQorI2VuZGlmCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGttcF9pbmZvX3QgKnRocjsKKworICAgIHRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZDsKKyAgICBvbXB0X2ZyYW1lX3QgKm9tcHRfZnJhbWUgPSBOVUxMOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICBwYXJhbGxlbF9pZCA9IHRlYW1faW5mby0+cGFyYWxsZWxfaWQ7CisKKyAgICAgICAgLy8gUmVjb3JkIHRoYXQgd2UgcmUtZW50ZXJlZCB0aGUgcnVudGltZSBzeXN0ZW0gaW4gdGhlIGltcGxpY2l0CisgICAgICAgIC8vIHRhc2sgZnJhbWUgcmVwcmVzZW50aW5nIHRoZSBwYXJhbGxlbCByZWdpb24uIAorICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgcGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIHVubGluayBpZiBuZWNlc3NhcnkuIG5vLW9wIGlmIHRoZXJlIGlzIG5vdCBhIGxpZ2h0d2VpZ2h0IHRhc2suCisgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0ID0gX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayh0aHIpOworICAgICAgICAvLyBHT01QIGFsbG9jYXRlcy9mcmVlcyBsd3Qgc2luY2UgaXQgY2FuJ3QgYmUga2VwdCBvbiB0aGUgc3RhY2sKKyAgICAgICAgaWYgKGx3dCkgeyAKKyAgICAgICAgICAgX19rbXBfZnJlZShsd3QpOworICAgICAKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAvLyBTaW5jZSBhIGxpZ2h0d2VpZ2h0IHRhc2sgd2FzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgICAgICAgICAgIC8vIHJlbWFpbmluZyBkZWVwZXN0IHRhc2sga25vd3MgdGhlIHN0YWNrIGZyYW1lIHdoZXJlIHRoZSBydW50aW1lIAorICAgICAgICAgICAgICAvLyB3YXMgcmVlbnRlcmVkLgorICAgICAgICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICghIHRoci0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICAgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayhndGlkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCB0aHIsCisgICAgICAgICAgdGhyLT50aC50aF90ZWFtKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgLy8gU2V0IHJlZW50ZXIgZnJhbWUgaW4gcGFyZW50IHRhc2ssIHdoaWNoIHdpbGwgYmVjb21lIGN1cnJlbnQgdGFzaworICAgICAgICAgIC8vIGluIHRoZSBtaWRzdCBvZiBqb2luLiBUaGlzIGlzIG5lZWRlZCBiZWZvcmUgdGhlIGVuZF9wYXJhbGxlbCBjYWxsYmFjay4KKyAgICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDEpOworICAgICAgICAgIG9tcHRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBfX2ttcF9qb2luX2NhbGwoJmxvYywgZ3RpZAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgLCBmb3JrX2NvbnRleHRfZ251CisjZW5kaWYKKyAgICAgICAgKTsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgIG9tcHRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIFJlY29yZCB0aGF0IHdlIHJlLWVudGVyZWQgdGhlIHJ1bnRpbWUgc3lzdGVtIGluIHRoZSBmcmFtZSB0aGF0IAorICAgICAgICAgICAgLy8gY3JlYXRlZCB0aGUgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkoCisgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIAorICAgICAgICAgICAgICAgICAgICBPTVBUX0lOVk9LRVIoZm9ya19jb250ZXh0X2dudSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPQorICAgICAgICAgICAgICAgICgoKHRoci0+dGgudGhfdGVhbSktPnQudF9zZXJpYWxpemVkKSA/CisgICAgICAgICAgICAgICAgb21wdF9zdGF0ZV93b3JrX3NlcmlhbCA6IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KK30KKworCisvLworLy8gTG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworCisvLworLy8gVGhlIEdudSBjb2RlZ2VuIHBhc3NlcyBpbiBhbiBleGNsdXNpdmUgdXBwZXIgYm91bmQgZm9yIHRoZSBvdmVyYWxsIHJhbmdlLAorLy8gYnV0IHRoZSBsaWJndWlkZSBkaXNwYXRjaCBjb2RlIGV4cGVjdHMgYW4gaW5jbHVzaXZlIHVwcGVyIGJvdW5kLCBoZW5jZSB0aGUKKy8vICJlbmQgLSBpbmNyIiA1dGggYXJndW1lbnQgdG8gS01QX0RJU1BBVENIX0lOSVQgKGFuZCB0aGUgIiB1YiAtIHN0ciIgMTF0aAorLy8gYXJndW1lbnQgdG8gX19rbXBfR09NUF9mb3JrX2NhbGwpLgorLy8KKy8vIENvbnZlcnNlbHksIEtNUF9ESVNQQVRDSF9ORVhUIHJldHVybnMgYW5kIGluY2x1c2l2ZSB1cHBlciBib3VuZCBpbiAqcF91YiwKKy8vIGJ1dCB0aGUgR251IGNvZGVnZW4gZXhwZWN0cyBhbiBleGNsdXNpZGUgdXBwZXIgYm91bmQsIHNvIHRoZSBhZGp1c3RtZW50CisvLyAiKnBfdWIgKz0gc3RyaWRlIiBjb21wZW5zdGF0ZXMgZm9yIHRoZSBkaXNjcmVwYW5jeS4KKy8vCisvLyBDb3JyZWN0aW9uOiB0aGUgZ251IGNvZGVnZW4gYWx3YXlzIGFkanVzdHMgdGhlIHVwcGVyIGJvdW5kIGJ5ICstMSwgbm90IHRoZQorLy8gc3RyaWRlIHZhbHVlLiAgV2UgYWRqdXN0IHRoZSBkaXNwYXRjaCBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5IChieSArLTEpLCBidXQKKy8vIHdlIHN0aWxsIGFkanVzdCBwX3ViIGJ5IHRoZSBhY3R1YWwgc3RyaWRlIHZhbHVlLgorLy8KKy8vIFRoZSAicnVudGltZSIgdmVyc2lvbnMgZG8gbm90IHRha2UgYSBjaHVua19zeiBwYXJhbWV0ZXIuCisvLworLy8gVGhlIHByb2ZpbGUgbGliIGNhbm5vdCBzdXBwb3J0IGNvbnN0cnVjdCBjaGVja2luZyBvZiB1bm9yZGVyZWQgbG9vcHMgdGhhdAorLy8gYXJlIHByZWRldGVybWluZWQgYnkgdGhlIGNvbXBpbGVyIHRvIGJlIHN0YXRpY2FsbHkgc2NoZWR1bGVkLCBhcyB0aGUgZ2NjCisvLyBjb2RlZ2VuIHdpbGwgbm90IGFsd2F5cyBlbWl0IGNhbGxzIHRvIEdPTVBfbG9vcF9zdGF0aWNfbmV4dCgpIHRvIGdldCB0aGUKKy8vIG5leHQgaXRlcmF0aW9uLiAgSW5zdGVhZCwgaXQgZW1pdHMgaW5saW5lIGNvZGUgdG8gY2FsbCBvbXBfZ2V0X3RocmVhZF9udW0oKQorLy8gbnVtIGFuZCBjYWxjdWxhdGUgdGhlIGl0ZXJhdGlvbiBzcGFjZSB1c2luZyB0aGUgcmVzdWx0LiAgSXQgZG9lc24ndCBkbyB0aGlzCisvLyB3aXRoIG9yZGVyZWQgc3RhdGljIGxvb3AsIHNvIHRoZXkgY2FuIGJlIGNoZWNrZWQuCisvLworCisjZGVmaW5lIExPT1BfU1RBUlQoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeiwgbG9uZyAqcF9sYiwgICAgICAgICBcCisgICAgICBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAweCVseFxuIiwgIFwKKyAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgXAorICAgICAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9SVU5USU1FX1NUQVJUKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAobG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgKnBfbGIsIGxvbmcgKnBfdWIpICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGNodW5rX3N6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogJWRcbiIsICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgVFJVRSk7ICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICBcCisgICAgICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVseCwgKnBfdWIgMHglbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX05FWFQoZnVuYyxmaW5pX2NvZGUpIFwKKyAgICBpbnQgZnVuYyhsb25nICpwX2xiLCBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZpbmlfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICAgICAgXAorICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpwX3ViICs9IChzdHJpZGUgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVseCwgKnBfdWIgMHglbHgsIHN0cmlkZSAweCVseCwgIiAgXAorICAgICAgICAgICJyZXR1cm5pbmcgJWRcbiIsIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RyaWRlLCBzdGF0dXMpKTsgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX1NUQVJUKSwga21wX3NjaF9zdGF0aWMpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhUKSwge30pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX1NUQVJUKSwga21wX3NjaF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJUKSwga21wX3NjaF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQpLCB7fSkKK0xPT1BfUlVOVElNRV9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCksIGttcF9zY2hfcnVudGltZSkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9ORVhUKSwge30pCisKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUKSwga21wX29yZF9zdGF0aWMpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCksIGttcF9vcmRfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQpLCBrbXBfb3JkX2d1aWRlZF9jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1JVTlRJTUVfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCksIGttcF9vcmRfcnVudGltZSkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kOiBUIyVkXG4iLCBndGlkKSkKKworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZCBleGl0OiBUIyVkXG4iLCBndGlkKSkKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCkodm9pZCkKK3sKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKworLy8KKy8vIFVuc2lnbmVkIGxvbmcgbG9uZyBsb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKy8vCisvLyBUaGVzZSBhcmUgbmV3IHdpdGggZ2NjIDQuNAorLy8KKworI2RlZmluZSBMT09QX1NUQVJUX1VMTChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGludCB1cCwgdW5zaWduZWQgbG9uZyBsb25nIGxiLCB1bnNpZ25lZCBsb25nIGxvbmcgdWIsICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBjaHVua19zeiwgICAgICAgICAgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBfdWIpICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyMiA9IHVwID8gKChsb25nIGxvbmcpc3RyKSA6IC0oKGxvbmcgbG9uZylzdHIpOyAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgdXAgJWQsIGxiIDB4JWxseCwgdWIgMHglbGx4LCBzdHIgMHglbGx4LCBjaHVua19zeiAweCVsbHhcbiIsIFwKKyAgICAgICAgICBndGlkLCB1cCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUX1VMTCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyMiA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyMiwgY2h1bmtfc3osICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfbGIsIChrbXBfdWludDY0ICopcF91YiwgKGttcF9pbnQ2NCAqKSZzdHJpZGUpOyBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX1JVTlRJTUVfU1RBUlRfVUxMKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAoaW50IHVwLCB1bnNpZ25lZCBsb25nIGxvbmcgbGIsIHVuc2lnbmVkIGxvbmcgbG9uZyB1YiwgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0ciwgdW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKnBfdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHIyID0gdXAgPyAoKGxvbmcgbG9uZylzdHIpIDogLSgobG9uZyBsb25nKXN0cik7ICAgICAgICAgIFwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgY2h1bmtfc3ogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIHVwICVkLCBsYiAweCVsbHgsIHViIDB4JWxseCwgc3RyIDB4JWxseCwgY2h1bmtfc3ogMHglbGx4XG4iLCBcCisgICAgICAgICAgZ3RpZCwgdXAsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVF9VTEwoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0cjIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0cjIsIGNodW5rX3N6LCBUUlVFKTsgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFRfVUxMKCZsb2MsIGd0aWQsIE5VTEwsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChrbXBfdWludDY0ICopcF9sYiwgKGttcF91aW50NjQgKilwX3ViLCAoa21wX2ludDY0ICopJnN0cmlkZSk7IFwKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKGxvbmcgbG9uZylzdHJpZGUgPT0gc3RyMik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVsbHgsICpwX3ViIDB4JWxseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdGF0dXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIExPT1BfTkVYVF9VTEwoZnVuYyxmaW5pX2NvZGUpIFwKKyAgICBpbnQgZnVuYyh1bnNpZ25lZCBsb25nIGxvbmcgKnBfbGIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF91YikgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZpbmlfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFRfVUxMKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfdWludDY0ICopcF9sYiwgXAorICAgICAgICAgIChrbXBfdWludDY0ICopcF91YiwgKGttcF9pbnQ2NCAqKSZzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpwX3ViICs9IChzdHJpZGUgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVsbHgsICpwX3ViIDB4JWxseCwgc3RyaWRlIDB4JWxseCwgIiBcCisgICAgICAgICAgInJldHVybmluZyAlZFxuIiwgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdHJpZGUsIHN0YXR1cykpOyAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCksIGttcF9zY2hfc3RhdGljKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhUKSwge30pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJUKSwga21wX3NjaF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfTkVYVCksIHt9KQorTE9PUF9SVU5USU1FX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQpLCBrbXBfc2NoX3J1bnRpbWUpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhUKSwge30pCisKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfU1RBUlQpLCBrbXBfb3JkX3N0YXRpYykKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQpLCBrbXBfb3JkX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQpLCBrbXBfb3JkX2d1aWRlZF9jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCitMT09QX1JVTlRJTUVfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJUKSwga21wX29yZF9ydW50aW1lKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorCisKKy8vCisvLyBDb21iaW5lZCBwYXJhbGxlbCAvIGxvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKy8vIFRoZXJlIGFyZSBubyB1bGwgdmVyc2lvbnMgKHlldCkuCisvLworCisjZGVmaW5lIFBBUkFMTEVMX0xPT1BfU1RBUlQoZnVuYywgc2NoZWR1bGUsIG9tcHRfcHJlLCBvbXB0X3Bvc3QpIFwKKyAgICB2b2lkIGZ1bmMgKHZvaWQgKCp0YXNrKSAodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMsICAgICAgXAorICAgICAgbG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgY2h1bmtfc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAweCVseFxuIiwgICAgICAgIFwKKyAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9tcHRfcHJlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCB0YXNrLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksICAgICAgICAgXAorICAgICAgICAgICAgICB0YXNrLCBkYXRhLCBudW1fdGhyZWFkcywgJmxvYywgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3opOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCwgdGFzayk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb21wdF9wb3N0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworCisjaWYgT01QVF9TVVBQT1JUCisKKyNkZWZpbmUgT01QVF9MT09QX1BSRSgpIFwKKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF9mcmFtZTsgXAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsgXAorICAgICAgICBwYXJlbnRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7IFwKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsgXAorICAgIH0KKworCisjZGVmaW5lIE9NUFRfTE9PUF9QT1NUKCkgXAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsgXAorICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7IFwKKyAgICB9CisKKyNlbHNlCisKKyNkZWZpbmUgT01QVF9MT09QX1BSRSgpIAorCisjZGVmaW5lIE9NUFRfTE9PUF9QT1NUKCkKKworI2VuZGlmCisKKworUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJUKSwgCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfc3RhdGljLCBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQpLCAKKyAgICAgICAgICAgICAgICAgICAga21wX3NjaF9keW5hbWljX2NodW5rZWQsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEX1NUQVJUKSwgCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCksIAorICAgICAgICAgICAgICAgICAgICBrbXBfc2NoX3J1bnRpbWUsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorCisKKy8vCisvLyBUYXNraW5nIGNvbnN0cnVjdHMKKy8vCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTSykodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEsIHZvaWQgKCpjb3B5X2Z1bmMpKHZvaWQgKiwgdm9pZCAqKSwKKyAgbG9uZyBhcmdfc2l6ZSwgbG9uZyBhcmdfYWxpZ24sIGludCBpZl9jb25kLCB1bnNpZ25lZCBnb21wX2ZsYWdzKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFzayIpOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbnQzMiBmbGFncyA9IDA7CisgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqaW5wdXRfZmxhZ3MgPSAoa21wX3Rhc2tpbmdfZmxhZ3NfdCAqKSAmIGZsYWdzOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLyBUaGUgbG93LW9yZGVyIGJpdCBpcyB0aGUgInRpZWQiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDEpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID0gMTsKKyAgICB9CisgICAgLy8gVGhlIHNlY29uZCBsb3ctb3JkZXIgYml0IGlzIHRoZSAiZmluYWwiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDIpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPmZpbmFsID0gMTsKKyAgICB9CisgICAgaW5wdXRfZmxhZ3MtPm5hdGl2ZSA9IDE7CisgICAgLy8gX19rbXBfdGFza19hbGxvYygpIHNldHMgdXAgYWxsIG90aGVyIGZsYWdzCisKKyAgICBpZiAoISBpZl9jb25kKSB7CisgICAgICAgIGFyZ19zaXplID0gMDsKKyAgICB9CisKKyAgICBrbXBfdGFza190ICp0YXNrID0gX19rbXBfdGFza19hbGxvYygmbG9jLCBndGlkLCBpbnB1dF9mbGFncywKKyAgICAgIHNpemVvZihrbXBfdGFza190KSwgYXJnX3NpemUgPyBhcmdfc2l6ZSArIGFyZ19hbGlnbiAtIDEgOiAwLAorICAgICAgKGttcF9yb3V0aW5lX2VudHJ5X3QpZnVuYyk7CisKKyAgICBpZiAoYXJnX3NpemUgPiAwKSB7CisgICAgICAgIGlmIChhcmdfYWxpZ24gPiAwKSB7CisgICAgICAgICAgICB0YXNrLT5zaGFyZWRzID0gKHZvaWQgKikoKCgoc2l6ZV90KXRhc2stPnNoYXJlZHMpCisgICAgICAgICAgICAgICsgYXJnX2FsaWduIC0gMSkgLyBhcmdfYWxpZ24gKiBhcmdfYWxpZ24pOworICAgICAgICB9CisgICAgICAgIC8vZWxzZSBlcnJvcj8/CisKKyAgICAgICAgaWYgKGNvcHlfZnVuYykgeworICAgICAgICAgICAgKCpjb3B5X2Z1bmMpKHRhc2stPnNoYXJlZHMsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX01FTUNQWSh0YXNrLT5zaGFyZWRzLCBkYXRhLCBhcmdfc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaWZfY29uZCkgeworICAgICAgICBfX2ttcGNfb21wX3Rhc2soJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorICAgIGVsc2UgeworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBvbXB0X3RocmVhZF9pbmZvX3Qgb2xkSW5mbzsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB0aHJlYWRzIHN0YXRlcyBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyIHRoZSB0YXNrCisgICAgICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgICAgICB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgICAgICAgICAgb2xkSW5mbyA9IHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbzsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPQorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCZsb2MsIGd0aWQsIHRhc2spOworICAgICAgICBmdW5jKGRhdGEpOworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCZsb2MsIGd0aWQsIHRhc2spOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbyA9IG9sZEluZm87CisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlUKSh2b2lkKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza3dhaXQiKTsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza3dhaXQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIF9fa21wY19vbXBfdGFza3dhaXQoJmxvYywgZ3RpZCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t3YWl0IGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCisvLworLy8gU2VjdGlvbnMgd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIEZvciB0aGUgc2VjdGlvbnMgY29uc3RydWN0LCB3ZSBpbml0aWFsaXplIGEgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AKKy8vIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCB3aXRoIGxiIDEgYW5kIHN0cmlkZSAxLCBhbmQgdXNlIHRoZSBpdGVyYXRpb24gIydzCisvLyB0aGF0IGl0cyByZXR1cm5zIGFzIHNlY3Rpb25zIGlkcy4KKy8vCisvLyBUaGVyZSBhcmUgbm8gc3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIG9yZGVyZWQgc2VjdGlvbnMsIHNvIHdlIGFsd2F5cyB1c2UKKy8vIHRoZSBkeW5hbWljYWxseSBzY2hlZHVsZWQgd29ya3NoYXJlLCBldmVuIGlmIHRoZSBzZWN0aW9ucyBhcmVuJ3Qgb3JkZXJlZC4KKy8vCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUKSh1bnNpZ25lZCBjb3VudCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbnQgbGIsIHViLCBzdHJpZGU7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQgZXhpdDogVCMlZCByZXR1cm5pbmcgJXVcbiIsIGd0aWQsCisgICAgICAodW5zaWduZWQpbGIpKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKWxiOworfQorCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQpKHZvaWQpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW50IGxiLCB1Yiwgc3RyaWRlOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX25leHQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX25leHQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfbmV4dCBleGl0OiBUIyVkIHJldHVybmluZyAldVxuIiwgZ3RpZCwKKyAgICAgICh1bnNpZ25lZClsYikpOworICAgIHJldHVybiAodW5zaWduZWQpbGI7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCkodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLAorICB1bnNpZ25lZCBudW1fdGhyZWFkcywgdW5zaWduZWQgY291bnQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF9mcmFtZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgMSwgY291bnQsIDEsIDEsIFRSVUUpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kOiBUIyVkXG4iLCBndGlkKSkKKworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlUKSh2b2lkKQoreworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKy8vIGxpYmdvbXAgaGFzIGFuIGVtcHR5IGZ1bmN0aW9uIGZvciBHT01QX3Rhc2t5aWVsZCBhcyBvZiAyMDEzLTEwLTEwCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCkodm9pZCkKK3sKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t5aWVsZDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCisgICAgcmV0dXJuOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQgLy8gdGhlc2UgYXJlIG5ldyBHT01QXzQuMCBlbnRyeSBwb2ludHMKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTCkodm9pZCAoKnRhc2spKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIGlmKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfbWljcm90YXNrX3dyYXBwZXIsIDIsIHRhc2ssIGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKyAgICB0YXNrKGRhdGEpOworICAgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSgpOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TKSh2b2lkICgqdGFzaykgKHZvaWQgKiksIHZvaWQgKmRhdGEsCisgIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBjb3VudCwgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnM6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIGlmKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHRhc2soZGF0YSk7CisgICAgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKyNkZWZpbmUgUEFSQUxMRUxfTE9PUChmdW5jLCBzY2hlZHVsZSkgXAorICAgIHZvaWQgZnVuYyAodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgICAgICBcCisgICAgICBsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeiwgdW5zaWduZWQgZmxhZ3MpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6IDB4JWx4XG4iLCAgICAgICAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGZsYWdzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9wcm9jX2JpbmQoJmxvYywgZ3RpZCwgKGttcF9wcm9jX2JpbmRfdClmbGFncyk7ICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCA5LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgdGFzaywgZGF0YSwgbnVtX3RocmVhZHMsICZsb2MsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6KTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOyAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0YXNrKGRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMpLCBrbXBfc2NoX3N0YXRpYykKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCkKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FKSwga21wX3NjaF9ydW50aW1lKQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3Rhc2tncm91cF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza2dyb3VwX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBfX2ttcGNfdGFza2dyb3VwKCZsb2MsIGd0aWQpOworCisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza2dyb3VwX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza2dyb3VwX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgX19rbXBjX2VuZF90YXNrZ3JvdXAoJmxvYywgZ3RpZCk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZm5kZWYgS01QX0RFQlVHCitzdGF0aWMKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK2ttcF9pbnQzMiBfX2ttcF9nb21wX3RvX29tcF9jYW5jZWxsYXRpb25fa2luZChpbnQgZ29tcF9raW5kKSB7CisgICAga21wX2ludDMyIGNuY2xfa2luZCA9IDA7CisgICAgc3dpdGNoKGdvbXBfa2luZCkgeworICAgICAgY2FzZSAxOgorICAgICAgICBjbmNsX2tpbmQgPSBjYW5jZWxfcGFyYWxsZWw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBjbmNsX2tpbmQgPSBjYW5jZWxfbG9vcDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF9zZWN0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF90YXNrZ3JvdXA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gY25jbF9raW5kOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCkoaW50IHdoaWNoKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NhbmNlbGxhdGlvbl9wb2ludCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY2FuY2VsbGF0aW9uX3BvaW50OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBrbXBfaW50MzIgY25jbF9raW5kID0gX19rbXBfZ29tcF90b19vbXBfY2FuY2VsbGF0aW9uX2tpbmQod2hpY2gpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxsYXRpb25wb2ludCgmbG9jLCBndGlkLCBjbmNsX2tpbmQpOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMKSh2b2lkKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2JhcnJpZXJfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9iYXJyaWVyX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworYm9vbAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwpKGludCB3aGljaCwgYm9vbCBkb19jYW5jZWwpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jYW5jZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGttcF9pbnQzMiBjbmNsX2tpbmQgPSBfX2ttcF9nb21wX3RvX29tcF9jYW5jZWxsYXRpb25fa2luZCh3aGljaCk7CisKKyAgICBpZihkb19jYW5jZWwgPT0gRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UKSh3aGljaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIF9fa21wY19jYW5jZWwoJmxvYywgZ3RpZCwgY25jbF9raW5kKTsKKyAgICB9Cit9CisKK2Jvb2wKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCkodm9pZCkKK3sKKyAgICBpZihfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIH0KKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19lbmRfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmRfY2FuY2VsOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICByZXR1cm4gX19rbXBjX2NhbmNlbF9iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCkodm9pZCkKK3sKKyAgICBpZihfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIH0KKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9sb29wX2VuZF9jYW5jZWwiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworLy8gQWxsIHRhcmdldCBmdW5jdGlvbnMgYXJlIGVtcHR5IGFzIG9mIDIwMTQtMDUtMjkKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUKShpbnQgZGV2aWNlLCB2b2lkICgqZm4pICh2b2lkICopLCBjb25zdCB2b2lkICpvcGVubXBfdGFyZ2V0LAorICAgICAgICAgICAgIHNpemVfdCBtYXBudW0sIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfREFUQSkoaW50IGRldmljZSwgY29uc3Qgdm9pZCAqb3Blbm1wX3RhcmdldCwgc2l6ZV90IG1hcG51bSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEpKHZvaWQpCit7CisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUpKGludCBkZXZpY2UsIGNvbnN0IHZvaWQgKm9wZW5tcF90YXJnZXQsIHNpemVfdCBtYXBudW0sCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9URUFNUykodW5zaWduZWQgaW50IG51bV90ZWFtcywgdW5zaWduZWQgaW50IHRocmVhZF9saW1pdCkKK3sKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworCisvKgorICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgb2YgY29kZSBjcmVhdGUgYWxpYXNlcyBmb3IgdGhlIEdPTVBfKiBmdW5jdGlvbnMsCisgICAgdGhlbiBjcmVhdGUgdmVyc2lvbmVkIHN5bWJvbHMgdXNpbmcgdGhlIGFzc2VtYmxlciBkaXJlY3RpdmUgLnN5bXZlci4KKyAgICBUaGlzIGlzIG9ubHkgcGVydGluZW50IGZvciBFTEYgLnNvIGxpYnJhcnkKKyAgICB4YWxpYXNpZnkgYW5kIHh2ZXJzaW9uaWZ5IGFyZSBkZWZpbmVkIGluIGttcF9mdG5fb3MuaAorKi8KKworI2lmZGVmIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKy8vIEdPTVBfMS4wIGFsaWFzZXMKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9TVEFSVCwgMTApOworCisvLyBHT01QXzIuMCBhbGlhc2VzCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTSywgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCwgMjApOworCisvLyBHT01QXzMuMCBhbGlhc2VzCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxELCAzMCk7CisKKy8vIEdPTVBfNC4wIGFsaWFzZXMKKy8vIFRoZSBHT01QX3BhcmFsbGVsKiBlbnRyeSBwb2ludHMgYmVsb3cgYXJlbid0IE9wZW5NUCA0LjAgcmVsYXRlZC4KKyNpZiBPTVBfNDBfRU5BQkxFRAoreGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRSwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJULCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5ULCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX1VQREFURSwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RFQU1TLCA0MCk7CisjZW5kaWYKKworLy8gR09NUF8xLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKKworLy8gR09NUF8yLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0ssIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7CisKKy8vIEdPTVBfMy4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQsIDMwLCAiR09NUF8zLjAiKTsKKworLy8gR09NUF80LjAgdmVyc2lvbmVkIHN5bWJvbHMKKyNpZiBPTVBfNDBfRU5BQkxFRAoreHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVELCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RFQU1TLCA0MCwgIkdPTVBfNC4wIik7CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy9leHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGFkMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uYwpAQCAtMCwwICsxLDk3NCBAQAorLyoKKyAqIGttcF9pMThuLmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2lvLmgiICAgICAgICAgIC8vIF9fa21wX3ByaW50Zi4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImttcF9pMThuX2RlZmF1bHQuaW5jIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI3VuZGVmIEtNUF9JMThOX09LCisKKyNkZWZpbmUgZ2V0X3NlY3Rpb24oIGlkICkgICggKGlkKSA+PiAxNiApCisjZGVmaW5lIGdldF9udW1iZXIoIGlkICkgICAoIChpZCkgJiAweEZGRkYgKQorCitrbXBfbXNnX3QgICAgICAgICAgIF9fa21wX21zZ19lbXB0eSA9IHsga21wX210X2R1bW15LCAwLCAiIiwgMCAgfTsKK2ttcF9tc2dfdCAgICAgICAgICAgX19rbXBfbXNnX251bGwgID0geyBrbXBfbXRfZHVtbXksIDAsIE5VTEwsIDAgfTsKK3N0YXRpYyBjaGFyIGNvbnN0ICogbm9fbWVzc2FnZV9hdmFpbGFibGUgPSAiKE5vIG1lc3NhZ2UgYXZhaWxhYmxlKSI7CisKK2VudW0ga21wX2kxOG5fY2F0X3N0YXR1cyB7CisgICAgS01QX0kxOE5fQ0xPU0VELCAgICAvLyBOb3QgeWV0IG9wZW5lZCBvciBjbG9zZWQuCisgICAgS01QX0kxOE5fT1BFTkVELCAgICAvLyBPcGVuZWQgc3VjY2Vzc2Z1bGx5LCByZWFkeSB0byB1c2UuCisgICAgS01QX0kxOE5fQUJTRU5UICAgICAvLyBPcGVuaW5nIGZhaWxlZCwgbWVzc2FnZSBjYXRhbG9nIHNob3VsZCBub3QgYmUgdXNlZC4KK307IC8vIGVudW0ga21wX2kxOG5fY2F0X3N0YXR1cwordHlwZWRlZiBlbnVtIGttcF9pMThuX2NhdF9zdGF0dXMgIGttcF9pMThuX2NhdF9zdGF0dXNfdDsKK3N0YXRpYyB2b2xhdGlsZSBrbXBfaTE4bl9jYXRfc3RhdHVzX3QgIHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKKworLyoKKyAgICBNZXNzYWdlIGNhdGFsb2cgaXMgb3BlbmVkIGF0IGZpcnN0IHVzYWdlLCBzbyB3ZSBoYXZlIHRvIHN5bmNocm9uaXplIG9wZW5pbmcgdG8gYXZvaWQgcmFjZSBhbmQKKyAgICBtdWx0aXBsZSBvcGVuaW5ncy4KKworICAgIENsb3NpbmcgZG9lcyBub3QgcmVxdWlyZSBzeW5jaHJvbml6YXRpb24sIGJlY2F1c2UgY2F0YWxvZyBpcyBjbG9zZWQgdmVyeSBsYXRlIGF0IGxpYnJhcnkKKyAgICBzaHV0dGluZyBkb3duLCB3aGVuIG5vIG90aGVyIHRocmVhZHMgYXJlIGFsaXZlLgorKi8KKworc3RhdGljIHZvaWQgX19rbXBfaTE4bl9kb19jYXRvcGVuKCk7CitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgIGxvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKTsKKyAgICAvLyBgbG9jaycgdmFyaWFibGUgbWF5IGJlIHBsYWNlZCBpbnRvIF9fa21wX2kxOG5fY2F0b3BlbiBmdW5jdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgb25seSBieQorICAgIC8vIHRoYXQgZnVuY3Rpb24uIEJ1dCB3ZSBhZnJhaWQgYSAoYnVnZ3kpIGNvbXBpbGVyIG1heSB0cmVhdCBpdCB3cm9uZ2x5LiBTbyB3ZSBwdXQgaXQgb3V0c2lkZSBvZgorICAgIC8vIGZ1bmN0aW9uIGp1c3QgaW4gY2FzZS4KKwordm9pZAorX19rbXBfaTE4bl9jYXRvcGVuKAorKSB7CisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICAgICAgX19rbXBfaTE4bl9kb19jYXRvcGVuKCk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOworICAgIH07IC8vIGlmCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRvcGVuCisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBMaW51eCogT1MgYW5kIE9TIFgqIHBhcnQuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgS01QX09TX1VOSVgKKyNkZWZpbmUgS01QX0kxOE5fT0sKKworI2luY2x1ZGUgPG5sX3R5cGVzLmg+CisKKyNkZWZpbmUgS01QX0kxOE5fTlVMTENBVCAoKG5sX2NhdGQpKCAtMSApKQorc3RhdGljIG5sX2NhdGQgICAgICAgY2F0ICA9IEtNUF9JMThOX05VTExDQVQ7ICAgIC8vICEhISBTaGFsbCBpdCBiZSB2b2xhdGlsZT8KK3N0YXRpYyBjaGFyIGNvbnN0ICogIG5hbWUgPSAoIEtNUF9WRVJTSU9OX01BSk9SID09IDQgPyAibGliZ3VpZGUuY2F0IiA6ICJsaWJvbXAuY2F0IiApOworCisvKgorICAgIFVzZWZ1bCBsaW5rczoKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Jhc2VkZWZzL3hiZF9jaGFwMDguaHRtbCN0YWdfMDhfMDIKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9jYXRvcGVuLmh0bWwKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9zZXRsb2NhbGUuaHRtbAorKi8KKwordm9pZAorX19rbXBfaTE4bl9kb19jYXRvcGVuKAorKSB7CisgICAgaW50ICAgIGVuZ2xpc2ggPSAwOworICAgIGNoYXIgKiBsYW5nICAgID0gX19rbXBfZW52X2dldCggIkxBTkciICk7CisgICAgLy8gVE9ETzogV2hhdCBhYm91dCBMQ19BTEwgb3IgTENfTUVTU0FHRVM/CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICAgID09IEtNUF9JMThOX05VTExDQVQgKTsKKworICAgIGVuZ2xpc2ggPQorCWxhbmcgPT0gTlVMTCAgICAgICAgICAgICAgICAgICAgICAgfHwgIC8vIEluIGFsbCB0aGVzZSBjYXNlcyBFbmdsaXNoIGxhbmd1YWdlIGlzIHVzZWQuCisJc3RyY21wKCBsYW5nLCAiIiApICAgICAgICAgICAgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIGxhbmcsICIgIiApICAgICAgICAgICA9PSAwIHx8CisgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIEZvcnRyYW4gUlRMIGJ1ZyBEUEQyMDAxMzc4NzMgIkZvcnRyYW4gcnVudGltZSByZXNldHMgTEFORyBlbnYgdmFyCisgICAgICAgICAgICAgIC8vIHRvIHNwYWNlIGlmIGl0IGlzIG5vdCBzZXQiLgorCXN0cmNtcCggbGFuZywgIkMiICkgICAgICAgICAgID09IDAgfHwKKwlzdHJjbXAoIGxhbmcsICJQT1NJWCIgKSAgICAgICA9PSAwOworCisgICAgaWYgKCAhIGVuZ2xpc2ggKSB7ICAvLyBFbmdsaXNoIGxhbmd1YWdlIGlzIG5vdCB5ZXQgZGV0ZWN0ZWQsIGxldCB1cyBjb250aW51ZS4KKyAgICAgICAgLy8gRm9ybWF0IG9mIExBTkcgaXM6IFtsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXV0KKyAgICAgICAgLy8gU3RyaXAgYWxsIHBhcnRzIGV4Y2VwdCBsYW5ndWFnZS4KKyAgICAgICAgY2hhciAqIHRhaWwgPSBOVUxMOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIGxhbmcsICdAJywgJiBsYW5nLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBsYW5nLCAnLicsICYgbGFuZywgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggbGFuZywgJ18nLCAmIGxhbmcsICYgdGFpbCApOworICAgICAgICBlbmdsaXNoID0gKCBzdHJjbXAoIGxhbmcsICJlbiIgKSA9PSAwICk7CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBsYW5nICk7CisKKyAgICAvLyBEbyBub3QgdHJ5IHRvIG9wZW4gRW5nbGlzaCBjYXRhbG9nIGJlY2F1c2UgaW50ZXJuYWwgbWVzc2FnZXMgYXJlCisgICAgLy8gZXhhY3QgY29weSBvZiBtZXNzYWdlcyBpbiBFbmdsaXNoIGNhdGFsb2cuCisgICAgaWYgKCBlbmdsaXNoICkgeworCXN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QgYmUgcmUtb3BlbmVkLgorCXJldHVybjsKKyAgICB9CisKKyAgICBjYXQgPSBjYXRvcGVuKCBuYW1lLCAwICk7CisgICAgLy8gVE9ETzogV2h5IGRvIHdlIHBhc3MgMCBpbiBmbGFncz8KKyAgICBzdGF0dXMgPSAoIGNhdCA9PSBLTVBfSTE4Tl9OVUxMQ0FUID8gS01QX0kxOE5fQUJTRU5UIDogS01QX0kxOE5fT1BFTkVEICk7CisKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9BQlNFTlQgKSB7CisgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7IC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisgICAgICAgIGludCAgICBlcnJvciAgID0gZXJybm87IC8vIFNhdmUgZXJybm8gaW1tZWRpYXRlbHkuCisJY2hhciAqIG5sc3BhdGggPSBfX2ttcF9lbnZfZ2V0KCAiTkxTUEFUSCIgKTsKKyAgICAgICAgY2hhciAqIGxhbmcgICAgPSBfX2ttcF9lbnZfZ2V0KCAiTEFORyIgKTsKKworCS8vIEluZmluaXRlIHJlY3Vyc2lvbiB3aWxsIG5vdCBvY2N1ciAtLSBzdGF0dXMgaXMgS01QX0kxOE5fQUJTRU5UIG5vdywgc28KKwkvLyBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG5vdCB0cnkgdG8gb3BlbiBjYXRhbG9nLCBidXQgd2lsbCByZXR1cm4gZGVmYXVsdCBtZXNzYWdlLgorCV9fa21wX21zZygKKwkgICAga21wX21zX3dhcm5pbmcsCisJICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwKKwkgICAgS01QX0VSUiggZXJyb3IgKSwKKwkgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJOTFNQQVRIIiwgbmxzcGF0aCApLAorICAgICAgICAgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJMQU5HIiwgbGFuZyApLAorCSAgICBfX2ttcF9tc2dfbnVsbAorCSk7CisJS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbmxzcGF0aCApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbGFuZyApOworICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQKKworICAgICAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBpbnQgbnVtYmVyICA9IGdldF9udW1iZXIoIGttcF9pMThuX3BycF9WZXJzaW9uICk7CisgICAgICAgIGNoYXIgY29uc3QgKiBleHBlY3RlZCA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBjYXRnZXRzKCBjYXQsIHNlY3Rpb24sIG51bWJlciwgTlVMTCApICk7CisKKyAgICAgICAgICAgIC8vIFN0cmluZyByZXR1cm5lZCBieSBjYXRnZXRzIGlzIGludmFsaWQgYWZ0ZXIgY2xvc2luZyB0aGUgY2F0YWxvZywgc28gY29weSBpdC4KKyAgICAgICAgaWYgKCBzdHJjbXAoIHZlcnNpb24uc3RyLCBleHBlY3RlZCApICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7ICAgICAvLyBDbG9zZSBiYWQgY2F0YWxvZy4KKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIEFuZCBtYXJrIGl0IGFzIGFic2VudC4KKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsgLy8gQUM6IG9ubHkgaXNzdWUgd2FybmluZyBpbiBjYXNlIGV4cGxpY2l0bHkgYXNrZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBBbmQgbm93IHByaW50IGEgd2FybmluZyB1c2luZyBkZWZhdWx0IG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lICAgID0gIk5MU1BBVEgiOworICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBubHNwYXRoID0gX19rbXBfZW52X2dldCggbmFtZSApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFdyb25nTWVzc2FnZUNhdGFsb2csIG5hbWUsIHZlcnNpb24uc3RyLCBleHBlY3RlZCApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGVja0VudlZhciwgbmFtZSwgbmxzcGF0aCApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBubHNwYXRoICk7CisgICAgICAgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB2ZXJzaW9uICk7CisKKyAgICB9OyAvLyBpZgorCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9kb19jYXRvcGVuCisKKwordm9pZAorX19rbXBfaTE4bl9jYXRjbG9zZSgKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICAgICAgY2F0Y2xvc2UoIGNhdCApOworICAgICAgICBjYXQgPSBLTVBfSTE4Tl9OVUxMQ0FUOworICAgIH07IC8vIGlmCisgICAgc3RhdHVzID0gS01QX0kxOE5fQ0xPU0VEOworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Y2xvc2UKKworCitjaGFyIGNvbnN0ICoKK19fa21wX2kxOG5fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBpZCApOworICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlciggaWQgKTsKKyAgICBjaGFyIGNvbnN0ICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICBpZiAoIDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICkgeworICAgICAgICBpZiAoIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKSB7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBjYXRnZXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIG1lc3NhZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgbWVzc2FnZSA9IG5vX21lc3NhZ2VfYXZhaWxhYmxlOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGdldHMKKworCisjZW5kaWYgLy8gS01QX09TX1VOSVgKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBXaW5kb3dzKiBPUyBwYXJ0LgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjZGVmaW5lIEtNUF9JMThOX09LCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNkZWZpbmUgS01QX0kxOE5fTlVMTENBVCAgTlVMTAorc3RhdGljIEhNT0RVTEUgICAgICAgY2F0ICA9IEtNUF9JMThOX05VTExDQVQ7ICAgIC8vICEhISBTaGFsbCBpdCBiZSB2b2xhdGlsZT8KK3N0YXRpYyBjaGFyIGNvbnN0ICogIG5hbWUgPSAoIEtNUF9WRVJTSU9OX01BSk9SID09IDQgPyAibGliZ3VpZGU0MHVpLmRsbCIgOiAibGlib21wdWkuZGxsIiApOworCitzdGF0aWMga21wX2kxOG5fdGFibGVfdCAgdGFibGUgICAgICAgICAgICAgPSB7IDAsIE5VTEwgfTsKKyAgICAvLyBNZXNzYWdlcyBmb3JtYXR0ZWQgYnkgRm9ybWF0TWVzc2FnZSgpIHNob3VsZCBiZSBmcmVlZCwgYnV0IGNhdGdldHMoKSBpbnRlcmZhY2UgYXNzdW1lcworICAgIC8vIHVzZXIgd2lsbCBub3QgZnJlZSBtZXNzYWdlcy4gU28gd2UgY2FjaGUgYWxsIHRoZSByZXRyaWV2ZWQgbWVzc2FnZXMgaW4gdGhlIHRhYmxlLCB3aGljaAorICAgIC8vIGFyZSBmcmVlZCBhdCBjYXRjbG9zZSgpLgorc3RhdGljIFVJTlQgY29uc3QgICAgICAgIGRlZmF1bHRfY29kZV9wYWdlID0gQ1BfT0VNQ1A7CitzdGF0aWMgVUlOVCAgICAgICAgICAgICAgY29kZV9wYWdlICAgICAgICAgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBfX19jYXRnZXRzKCBrbXBfaTE4bl9pZF90ICBpZCApOworc3RhdGljIFVJTlQgICAgICAgICBnZXRfY29kZV9wYWdlKCk7CitzdGF0aWMgdm9pZCAgICAgICAgIGttcF9pMThuX3RhYmxlX2ZyZWUoIGttcF9pMThuX3RhYmxlX3QgKiB0YWJsZSApOworCisKK3N0YXRpYyBVSU5UCitnZXRfY29kZV9wYWdlKAorKSB7CisKKyAgICBVSU5UIGNwID0gZGVmYXVsdF9jb2RlX3BhZ2U7CisgICAgY2hhciBjb25zdCAqIHZhbHVlID0gX19rbXBfZW52X2dldCggIktNUF9DT0RFUEFHRSIgKTsKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggX3N0cmljbXAoIHZhbHVlLCAiQU5TSSIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9BQ1A7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIk9FTSIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9PRU1DUDsKKyAgICAgICAgfSBlbHNlIGlmICggX3N0cmljbXAoIHZhbHVlLCAiVVRGLTgiICkgPT0gMCB8fCBfc3RyaWNtcCggdmFsdWUsICJVVEY4IiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX1VURjg7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIlVURi03IiApID09IDAgfHwgX3N0cmljbXAoIHZhbHVlLCAiVVRGNyIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9VVEY3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gISEhIFRPRE86IElzc3VlIGEgd2FybmluZz8KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB2YWx1ZSApOworICAgIHJldHVybiBjcDsKKworfSAvLyBmdW5jIGdldF9jb2RlX3BhZ2UKKworCitzdGF0aWMgdm9pZAora21wX2kxOG5fdGFibGVfZnJlZSgKKyAgICBrbXBfaTE4bl90YWJsZV90ICogdGFibGUKKykgeworICAgIGludCBzOworICAgIGludCBtOworICAgIGZvciAoIHMgPSAwOyBzIDwgdGFibGUtPnNpemU7ICsrIHMgKSB7CisgICAgICAgIGZvciAoIG0gPSAwOyBtIDwgdGFibGUtPnNlY3RbIHMgXS5zaXplOyArKyBtICkgeworICAgICAgICAgICAgLy8gRnJlZSBtZXNzYWdlLgorICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHRhYmxlLT5zZWN0WyBzIF0uc3RyWyBtIF0gKTsKKyAgICAgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc3RyWyBtIF0gPSBOVUxMOworICAgICAgICB9OyAvLyBmb3IgbQorICAgICAgICB0YWJsZS0+c2VjdFsgcyBdLnNpemUgPSAwOworICAgICAgICAvLyBGcmVlIHNlY3Rpb24gaXRzZWxmLgorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSAoICh2b2lkICopIHRhYmxlLT5zZWN0WyBzIF0uc3RyICk7CisgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc3RyID0gTlVMTDsKKyAgICB9OyAvLyBmb3IgcworICAgIHRhYmxlLT5zaXplID0gMDsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgdGFibGUtPnNlY3QgKTsKKyAgICB0YWJsZS0+c2VjdCA9IE5VTEw7Cit9IC8vIGttcF9pOG5fdGFibGVfZnJlZQorCisKK3ZvaWQKK19fa21wX2kxOG5fZG9fY2F0b3BlbigKKykgeworCisgICAgTENJRCAgICAgICAgICBsb2NhbGVfaWQgPSBHZXRUaHJlYWRMb2NhbGUoKTsKKyAgICBXT1JEIAkgIGxhbmdfaWQgPSBMQU5HSURGUk9NTENJRCggbG9jYWxlX2lkICk7CisgICAgV09SRCAgICAgICAgICBwcmltYXJ5X2xhbmdfaWQgPSBQUklNQVJZTEFOR0lEKCBsYW5nX2lkICk7CisgICAga21wX3N0cl9idWZfdCBwYXRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAgICA9PSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgcGF0aCApOworCisgICAgLy8gRG8gbm90IHRyeSB0byBvcGVuIEVuZ2xpc2ggY2F0YWxvZyBiZWNhdXNlIGludGVybmFsIG1lc3NhZ2VzIGFyZQorICAgIC8vIGV4YWN0IGNvcHkgb2YgbWVzc2FnZXMgaW4gRW5nbGlzaCBjYXRhbG9nLgorICAgIGlmICggcHJpbWFyeV9sYW5nX2lkID09IExBTkdfRU5HTElTSCApIHsKKwlzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBtYXJrIGNhdGFsb2cgYXMgYWJzZW50IHNvIGl0IHdpbGwgbm90IGJlIHJlLW9wZW5lZC4KKwlnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gQ29uc3RydWN0IHJlc291cmNlIERMTCBuYW1lLgorICAgIC8qCisgICAgICAgIFNpbXBsZQorICAgICAgICAgICAgTG9hZExpYnJhcnkoIG5hbWUgKQorICAgICAgICBpcyBub3Qgc3VpdGFibGUgZHVlIHRvIHNlY3VyaXR5IGlzc3VlIChzZWUKKyAgICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvc2VjdXJpdHkvYWR2aXNvcnkvMjI2OTYzNy5tc3B4KS4gV2UgaGF2ZSB0byBzcGVjaWZ5IGZ1bGwKKyAgICAgICAgcGF0aCB0byB0aGUgbWVzc2FnZSBjYXRhbG9nLgorICAgICovCisgICAgeworCisgICAgICAgIC8vIEdldCBoYW5kbGUgb2Ygb3VyIERMTCBmaXJzdC4KKyAgICAgICAgSE1PRFVMRSBoYW5kbGU7CisgICAgICAgIEJPT0wgYnJjID0KKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZUV4KAorICAgICAgICAgICAgICAgIEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfRlJPTV9BRERSRVNTIHwgR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19VTkNIQU5HRURfUkVGQ09VTlQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgTFBDU1RSID4oICYgX19rbXBfaTE4bl9kb19jYXRvcGVuICksCisgICAgICAgICAgICAgICAgJiBoYW5kbGUKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggISBicmMgKSB7ICAgIC8vIEVycm9yIG9jY3VycmVkLgorICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gbWFyayBjYXRhbG9nIGFzIGFic2VudCBzbyBpdCB3aWxsIG5vdCBiZSByZS1vcGVuZWQuCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBtdWx0aXBsZSBtZXNzYWdlcyAoS01QX01TRykgdG8gYmUgcGFzc2VkIHRvIF9fa21wX21zZzsgYW5kIHByaW50CisgICAgICAgICAgICAvLyBhIHByb3BlciB3YXJuaW5nLgorICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIE5vdyBnZXQgcGF0aCB0byB0aGUgb3VyIERMTC4KKyAgICAgICAgZm9yICggOyA7ICkgeworICAgICAgICAgICAgRFdPUkQgZHJjID0gR2V0TW9kdWxlRmlsZU5hbWUoIGhhbmRsZSwgcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgICAgICAgICAgaWYgKCBkcmMgPT0gMCApIHsgICAgLy8gRXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggZHJjIDwgcGF0aC5zaXplICkgeworICAgICAgICAgICAgICAgIHBhdGgudXNlZCA9IGRyYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoICYgcGF0aCwgcGF0aC5zaXplICogMiApOworICAgICAgICB9OyAvLyBmb3JldmVyCisKKyAgICAgICAgLy8gTm93IGNvbnN0cnVjdCB0aGUgbmFtZSBvZiBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfZm5hbWUgZm5hbWU7CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9pbml0KCAmIGZuYW1lLCBwYXRoLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmIHBhdGggKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiJXMlbHUvJXMiLCBmbmFtZS5kaXIsICh1bnNpZ25lZCBsb25nKSggbG9jYWxlX2lkICksIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgZm5hbWUgKTsKKworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zLCB1c2UgTG9hZExpYnJhcnlFeCgpIGFuZCBsb2FkIG1lc3NhZ2UgY2F0YWxvZyBhcyBhIGRhdGEgZmlsZS4KKyAgICBjYXQgPSBMb2FkTGlicmFyeUV4KCBwYXRoLnN0ciwgTlVMTCwgTE9BRF9MSUJSQVJZX0FTX0RBVEFGSUxFICk7CisgICAgc3RhdHVzID0gKCBjYXQgPT0gS01QX0kxOE5fTlVMTENBVCA/IEtNUF9JMThOX0FCU0VOVCA6IEtNUF9JMThOX09QRU5FRCApOworCisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQUJTRU5UICkgeworICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeyAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworCURXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisJLy8gSW5maW5pdGUgcmVjdXJzaW9uIHdpbGwgbm90IG9jY3VyIC0tIHN0YXR1cyBpcyBLTVBfSTE4Tl9BQlNFTlQgbm93LCBzbworCS8vIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgbm90IHRyeSB0byBvcGVuIGNhdGFsb2cgYnV0IHdpbGwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgLyoKKyAgICAgICAgIElmIG1lc3NhZ2UgY2F0YWxvZyBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUgZm91bmQgKGUuZy4gT3Blbk1QIFJUTAorCSBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIG9wZW5zIGxpYm9tcHVpLmRsbCBmb3IgSW50ZWwoUikgNjQpCisJIFdpbmRvd3MqIE9TIHJldHVybnMgZXJyb3IgMTkzIChFUlJPUl9CQURfRVhFX0ZPUk1BVCkuIEhvd2V2ZXIsCisgICAgICAgICBGb3JtYXRNZXNzYWdlIGZhaWxzIHRvIHJldHVybiBhIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IsIHNvIHVzZXIKKwkgd2lsbCBzZWU6CisKKyAgICAgICAgIE9NUDogV2FybmluZyAjMjogQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nICIxMDQxXGxpYm9tcHVpLmRsbCI6CisgICAgICAgICBPTVA6IFN5c3RlbSBlcnJvciAjMTkzOiAoTm8gc3lzdGVtIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlKQorICAgICAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4KKworICAgICAgICAgSXNzdWUgYSBoaW50IGluIHRoaXMgY2FzZSB0byBsZXQgY2F1c2Ugb2YgdHJvdWJsZSBtb3JlIHVuZGVyc3RhbmRhYmxlLgorICAgICAgICAqLworCV9fa21wX21zZygKKwkgICAga21wX21zX3dhcm5pbmcsCisJICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIHBhdGguc3RyICksCisJICAgIEtNUF9TWVNFUlJDT0RFKCBlcnJvciApLAorICAgICAgICAgICAgKCBlcnJvciA9PSBFUlJPUl9CQURfRVhFX0ZPUk1BVCA/IEtNUF9ITlQoIEJhZEV4ZUZvcm1hdCwgcGF0aC5zdHIsIEtNUF9BUkNIX1NUUiApIDogX19rbXBfbXNnX251bGwgKSwKKwkgICAgX19rbXBfbXNnX251bGwKKwkpOworCUtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVECisKKyAgICAgICAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbigga21wX2kxOG5fcHJwX1ZlcnNpb24gKTsKKyAgICAgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBjaGFyIGNvbnN0ICogZXhwZWN0ZWQgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBfX19jYXRnZXRzKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApICk7CisgICAgICAgICAgICAvLyBTdHJpbmcgcmV0dXJuZWQgYnkgY2F0Z2V0cyBpcyBpbnZhbGlkIGFmdGVyIGNsb3NpbmcgdGhlIGNhdGFsb2csIHNvIGNvcHkgaXQuCisgICAgICAgIGlmICggc3RyY21wKCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQgKSAhPSAwICkgeworICAgICAgICAgICAgLy8gQ2xvc2UgYmFkIGNhdGFsb2cuCisgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBBbmQgbWFyayBpdCBhcyBhYnNlbnQuCisgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7CisgICAgICAgICAgICAgICAgLy8gQW5kIG5vdyBwcmludCBhIHdhcm5pbmcgdXNpbmcgZGVmYXVsdCBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBXcm9uZ01lc3NhZ2VDYXRhbG9nLCBwYXRoLnN0ciwgdmVyc2lvbi5zdHIsIGV4cGVjdGVkICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB2ZXJzaW9uICk7CisKKyAgICB9OyAvLyBpZgorICAgIGNvZGVfcGFnZSA9IGdldF9jb2RlX3BhZ2UoKTsKKworICAgIGVuZDoKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHBhdGggKTsKKyAgICAgICAgcmV0dXJuOworCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9kb19jYXRvcGVuCisKKwordm9pZAorX19rbXBfaTE4bl9jYXRjbG9zZSgKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICAgICAga21wX2kxOG5fdGFibGVfZnJlZSggJiB0YWJsZSApOworICAgICAgICBGcmVlTGlicmFyeSggY2F0ICk7CisgICAgICAgIGNhdCA9IEtNUF9JMThOX05VTExDQVQ7CisgICAgfTsgLy8gaWYKKyAgICBjb2RlX3BhZ2UgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKyAgICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7Cit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRjbG9zZQorCisvKgorICAgIFdlIHVzZSBGb3JtYXRNZXNzYWdlKCkgdG8gZ2V0IHN0cmluZ3MgZnJvbSBjYXRhbG9nLCBnZXQgc3lzdGVtIGVycm9yIG1lc3NhZ2VzLCBldGMuCisgICAgRm9ybWF0TWVzc2FnZSgpIHRlbmRzIHRvIHJldHVybiBXaW5kb3dzKiBPUy1zdHlsZSBlbmQtb2YtbGluZXMsICJcclxuIi4gV2hlbiBzdHJpbmcgaXMgcHJpbnRlZCwKKyAgICBwcmludGYoKSBhbHNvIHJlcGxhY2VzIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgIlxuIiB3aXRoICJcclxuIiAoYWdhaW4hKSwgc28gc2VxdWVuY2VzIGxpa2UKKyAgICAiXHJcclxyXG4iIGFwcGVhciBpbiBvdXRwdXQuIEl0IGlzIG5vdCB0b28gZ29vZC4KKworICAgIEFkZGl0aW9uYWwgbWVzcyBjb21lcyBmcm9tIG1lc3NhZ2UgY2F0YWxvZzogT3VyIGNhdGFsb2cgc291cmNlIGVuX1VTLm1jIGZpbGUgKGdlbmVyYXRlZCBieQorICAgIG1lc3NhZ2UtY29udmVydGVyLnBsKSBjb250YWlucyBvbmx5ICJcbiIgY2hhcmFjdGVycywgYnV0IGVuX1VTX21zZ18xMDMzLmJpbiBmaWxlIChwcm9kdWNlZCBieQorICAgIG1jLmV4ZSkgbWF5IGNvbnRhaW4gIlxyXG4iIG9yIGp1c3QgIlxuIi4gVGhpcyBtZXNzIGdvZXMgZnJvbSBlbl9VU19tc2dfMTAzMy5iaW4gZmlsZSB0bworICAgIG1lc3NhZ2UgY2F0YWxvZywgbGlib21wdWkuZGxsLiBGb3IgZXhhbXBsZSwgbWVzc2FnZQorCisgICAgICAgIEVycm9yCisKKyAgICAodGhlcmUgaXMgIlxuIiBhdCB0aGUgZW5kKSBpcyBjb21waWxlZCBieSBtYy5leGUgdG8gIkVycm9yXHJcbiIsIHdoaWxlCisKKyAgICAgICAgT01QOiBFcnJvciAlMSFkITogJTIhcyFcbgorCisgICAgKHRoZXJlIGlzICJcbiIgYXQgdGhlIGVuZCBhcyB3ZWxsKSBpcyBjb21waWxlZCB0byAiT01QOiBFcnJvciAlMSFkITogJTIhcyFcclxuXG4iLgorCisgICAgVGh1cywgc3RyaXBwaW5nIGFsbCAiXHIiIG5vcm1hbGl6ZXMgc3RyaW5nIGFuZCByZXR1cm5zIGl0IHRvIGNhbm9uaWNhbCBmb3JtLCBzbyBwcmludGYoKSB3aWxsCisgICAgcHJvZHVjZSBjb3JyZWN0IGVuZC1vZi1saW5lIHNlcXVlbmNlcy4KKworICAgIF9fX3N0cmlwX2NycygpIHNlcnZlcyBmb3IgdGhpcyBwdXJwb3NlOiBpdCByZW1vdmVzIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgIlxyIiBpbi1wbGFjZSBhbmQKKyAgICByZXR1cm5zIG5ldyBsZW5ndGggb2Ygc3RyaW5nLgorKi8KK3N0YXRpYworaW50CitfX19zdHJpcF9jcnMoCisgICAgY2hhciAqIHN0cgorKSB7CisgICAgaW50IGluICA9IDA7ICAvLyBJbnB1dCBjaGFyYWN0ZXIgaW5kZXguCisgICAgaW50IG91dCA9IDA7ICAvLyBPdXRwdXQgY2hhcmFjdGVyIGluZGV4LgorICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaWYgKCBzdHJbIGluIF0gIT0gJ1xyJyApIHsKKyAgICAgICAgICAgIHN0clsgb3V0IF0gPSBzdHJbIGluIF07CisgICAgICAgICAgICArKyBvdXQ7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggc3RyWyBpbiBdID09IDAgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKysgaW47CisgICAgfTsgLy8gZm9yZXZlcgorICAgIHJldHVybiBvdXQgLSAxOworfSAvLyBmdW5jIF9fc3RyaXBfY3JzCisKKworc3RhdGljCitjaGFyIGNvbnN0ICoKK19fX2NhdGdldHMoCisgICAga21wX2kxOG5faWRfdCAgaWQKKykgeworCisgICAgY2hhciAqICAgIHJlc3VsdCA9IE5VTEw7CisgICAgUFZPSUQgICAgIGFkZHIgICA9IE5VTEw7CisgICAgd2NoYXJfdCAqIHdtc2cgICA9IE5VTEw7CisgICAgRFdPUkQgICAgIHdsZW4gICA9IDA7CisgICAgY2hhciAqICAgIG1zZyAgICA9IE5VTEw7CisgICAgaW50ICAgICAgIGxlbiAgICA9IDA7CisgICAgaW50ICAgICAgIHJjOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICB3bGVuID0gICAgLy8gd2xlbiBkb2VzICpub3QqIGluY2x1ZGUgdGVybWluYXRpbmcgbnVsbC4KKyAgICAgICAgRm9ybWF0TWVzc2FnZVcoCisgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX0hNT0RVTEUgfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAvLyBMYW5nSWQKKyAgICAgICAgICAgIChMUFdTVFIpICYgYWRkciwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8vIFNpemUgaW4gZWxlbWVudHMsIG5vdCBpbiBieXRlcy4KKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgKTsKKyAgICBpZiAoIHdsZW4gPD0gMCApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKyAgICB3bXNnID0gKHdjaGFyX3QgKikgYWRkcjsgIC8vIFdhcm5pbmc6IHdtc2cgbWF5IGJlIG5vdCBudWwtdGVybWluYXRlZCEKKworICAgIC8vIENhbGN1bGF0ZSBsZW5ndGggb2YgbXVsdGlieXRlIG1lc3NhZ2UuCisgICAgbGVuID0gICAgIC8vIFNpbmNlIHdsZW4gZG9lcyBub3QgaW5jbHVkZSB0ZXJtaW5hdGluZyBudWxsLCBsZW4gZG9lcyBub3QgaW5jbHVkZSBpdCBhbHNvLgorICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKAorICAgICAgICAgICAgY29kZV9wYWdlLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gRmxhZ3MuCisgICAgICAgICAgICB3bXNnLCB3bGVuLCAgICAgICAvLyBXaWRlIGJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIDAsICAgICAgICAgIC8vIEJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIE5VTEwgICAgICAgIC8vIERlZmF1bHQgY2hhciBhbmQgdXNlZCBkZWZhdWx0IGNoYXIuCisgICAgICAgICk7CisgICAgaWYgKCBsZW4gPD0gMCApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBtc2cgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKyAxICk7CisKKyAgICAvLyBDb252ZXJ0IHdpZGUgbWVzc2FnZSB0byBtdWx0aWJ5dGUgb25lLgorICAgIHJjID0KKyAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZSgKKyAgICAgICAgICAgIGNvZGVfcGFnZSwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIEZsYWdzLgorICAgICAgICAgICAgd21zZywgd2xlbiwgICAgICAgLy8gV2lkZSBidWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBtc2csIGxlbiwgICAgICAgICAvLyBCdWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBOVUxMLCBOVUxMICAgICAgICAvLyBEZWZhdWx0IGNoYXIgYW5kIHVzZWQgZGVmYXVsdCBjaGFyLgorICAgICAgICApOworICAgIGlmICggcmMgPD0gMCB8fCByYyA+IGxlbiApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByYyA9PSBsZW4gKTsKKyAgICBsZW4gPSByYzsKKyAgICBtc2dbIGxlbiBdID0gMDsgICAgICAgICAgIC8vIFB1dCB0ZXJtaW5hdGluZyBudWxsIHRvIHRoZSBlbmQuCisKKyAgICAvLyBTdHJpcHBpbmcgYWxsICJcciIgYmVmb3JlIHN0cmlwcGluZyBsYXN0IGVuZC1vZi1saW5lIHNpbXBsaWZpZXMgdGhlIHRhc2suCisgICAgbGVuID0gX19fc3RyaXBfY3JzKCBtc2cgKTsKKworICAgIC8vIEV2ZXJ5IG1lc3NhZ2UgaW4gY2F0YWxvZyBpcyB0ZXJtaW5hdGVkIHdpdGggIlxuIi4gU3RyaXAgaXQuCisgICAgaWYgKCBsZW4gPj0gMSAmJiBtc2dbIGxlbiAtIDEgXSA9PSAnXG4nICkgeworICAgICAgICAtLSBsZW47CisgICAgICAgIG1zZ1sgbGVuIF0gPSAwOworICAgIH07IC8vIGlmCisKKyAgICAvLyBFdmVyeXRoaW5nIGxvb2tzIG9rLgorICAgIHJlc3VsdCA9IG1zZzsKKyAgICBtc2cgICAgPSBOVUxMOworCisgICAgZW5kOgorCisgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG1zZyApOworICAgIH07IC8vIGlmCisgICAgaWYgKCB3bXNnICE9IE5VTEwgKSB7CisgICAgICAgIExvY2FsRnJlZSggd21zZyApOworICAgIH07IC8vIGlmCisKKyAgICByZXR1cm4gcmVzdWx0OworCit9IC8vIF9fX2NhdGdldHMKKworCitjaGFyIGNvbnN0ICoKK19fa21wX2kxOG5fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBpZCApOworICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlciggaWQgKTsKKyAgICBjaGFyIGNvbnN0ICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICBpZiAoIDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICkgeworICAgICAgICBpZiAoIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKSB7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNpemUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdCA9IChrbXBfaTE4bl9zZWN0aW9uX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9DQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZSArIDIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGttcF9pMThuX3NlY3Rpb25fdCApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zaXplID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemU7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHIgPSAoY29uc3QgY2hhciAqKikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9DQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGNoYXIgY29uc3QgKiApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGlmICggdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0gPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0gPSBfX19jYXRnZXRzKCBpZCApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIENhdGFsb2cgaXMgbm90IG9wZW5lZCBvciBtZXNzYWdlIGlzIG5vdCBmb3VuZCwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICBtZXNzYWdlID0gbm9fbWVzc2FnZV9hdmFpbGFibGU7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gbWVzc2FnZTsKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Z2V0cworCisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgS01QX0kxOE5fT0sKKyAgICAjZXJyb3IgSTE4biBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBPUy4KKyNlbmRpZiAvLyBLTVBfSTE4Tl9PSworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2kxOG5fZHVtcF9jYXRhbG9nKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIKKykgeworCisgICAgc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QgeworICAgICAgICBrbXBfaTE4bl9pZF90ICBmaXJzdDsKKyAgICAgICAga21wX2kxOG5faWRfdCAgbGFzdDsKKyAgICB9OyAvLyBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdAorCisgICAgc3RhdGljIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90IHJhbmdlc1tdID0geworICAgICAgICB7IGttcF9pMThuX3BycF9maXJzdCwga21wX2kxOG5fcHJwX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9zdHJfZmlyc3QsIGttcF9pMThuX3N0cl9sYXN0IH0sCisgICAgICAgIHsga21wX2kxOG5fZm10X2ZpcnN0LCBrbXBfaTE4bl9mbXRfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX21zZ19maXJzdCwga21wX2kxOG5fbXNnX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9obnRfZmlyc3QsIGttcF9pMThuX2hudF9sYXN0IH0KKyAgICB9OyAvLyByYW5nZXMKKworICAgIGludCAgICAgICAgICAgbnVtX29mX3JhbmdlcyA9IHNpemVvZiggcmFuZ2VzICkgLyBzaXplb2YoIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90ICk7CisgICAgaW50ICAgICAgICAgICByYW5nZTsKKyAgICBrbXBfaTE4bl9pZF90IGlkOworCisgICAgZm9yICggcmFuZ2UgPSAwOyByYW5nZSA8IG51bV9vZl9yYW5nZXM7ICsrIHJhbmdlICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIqKiogU2V0ICMlZCAqKipcbiIsIHJhbmdlICsgMSApOworICAgICAgICBmb3IgKCBpZCA9IChrbXBfaTE4bl9pZF90KSggcmFuZ2VzWyByYW5nZSBdLmZpcnN0ICsgMSApOworICAgICAgICAgICAgICBpZCA8IHJhbmdlc1sgcmFuZ2UgXS5sYXN0OworICAgICAgICAgICAgICBpZCA9IChrbXBfaTE4bl9pZF90KSggaWQgKyAxICkgKSB7CisgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQ6IDw8JXM+PlxuIiwgaWQsIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSApOworICAgICAgICB9OyAvLyBmb3IgaWQKKyAgICB9OyAvLyBmb3IgcmFuZ2UKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLT5zdHIgKTsKKworfSAvLyBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ttcF9tc2dfdAorX19rbXBfbXNnX2Zvcm1hdCgKKyAgICBrbXBfaTE4bl9pZF90IGlkLAorICAgIC4uLgorKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgdmFfbGlzdCAgICAgICAgYXJnczsKKyAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgdmFfc3RhcnQoIGFyZ3MsIGlkICk7CisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgcHJvY2VzcyBwYXJhbWV0ZXIgbnVtYmVycywgZm9yIGV4YW1wbGU6CisgICAgICAgIC8vICIlMiRzICUxJHMiLgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggJiBidWZmZXIsIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSwgYXJncyApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8vIE9uIFdpbm9kd3MsIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgZG9lcyBub3QgcmVjb2duaXplIEdOVSBzdHlsZSBwYXJhbWV0ZXIgbnVtYmVycywKKyAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB1c2UgRm9ybWF0TWVzc2FnZSgpIGluc3RlYWQuIEl0IHJlY29nbml6ZXMgcGFyYW1ldGVyIG51bWJlcnMsIGUuIGcuOgorICAgICAgICAvLyAiJTIhcyEgIiUxIXMhIi4KKyAgICAgICAgeworICAgICAgICAgICAgTFBUU1RSIHN0ciA9IE5VTEw7CisgICAgICAgICAgICBpbnQgICAgbGVuOworICAgICAgICAgICAgRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORyB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMoIGlkICksCisgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAoTFBUU1RSKSggJiBzdHIgKSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICYgYXJncworICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGxlbiA9IF9fX3N0cmlwX2Nycyggc3RyICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBidWZmZXIsIHN0ciwgbGVuICk7CisgICAgICAgICAgICBMb2NhbEZyZWUoIHN0ciApOworICAgICAgICB9CisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yCisgICAgI2VuZGlmCisgICAgdmFfZW5kKCBhcmdzICk7CisgICAgX19rbXBfc3RyX2J1Zl9kZXRhY2goICYgYnVmZmVyICk7CisKKyAgICBtc2cudHlwZSA9IChrbXBfbXNnX3R5cGVfdCkoIGlkID4+IDE2ICk7CisgICAgbXNnLm51bSAgPSBpZCAmIDB4RkZGRjsKKyAgICBtc2cuc3RyICA9IGJ1ZmZlci5zdHI7CisgICAgbXNnLmxlbiAgPSBidWZmZXIudXNlZDsKKworICAgIHJldHVybiBtc2c7CisKK30gLy8gX19rbXBfbXNnX2Zvcm1hdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYworY2hhciAqCitzeXNfZXJyb3IoCisgICAgaW50IGVycgorKSB7CisKKyAgICBjaGFyICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKworICAgICAgICBMUFZPSUQgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGludCAgICAgbGVuOworICAgICAgICBEV09SRCAgIHJjOworICAgICAgICByYyA9CisgICAgICAgICAgICBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgZXJyLAorICAgICAgICAgICAgICAgIE1BS0VMQU5HSUQoIExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUICksIC8vIERlZmF1bHQgbGFuZ3VhZ2UuCisgICAgICAgICAgICAgICAgKExQVFNUUikgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIHJjID4gMCApIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0dGVkLiBDb3B5IGl0IChzbyB3ZSBjYW4gZnJlZSBpdCBsYXRlciB3aXRoIG5vcm1hbCBmcmVlKCkuCisgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgKGNoYXIgKikgYnVmZmVyICk7CisgICAgICAgICAgICBsZW4gPSBfX19zdHJpcF9jcnMoIG1lc3NhZ2UgKTsgLy8gRGVsZXRlIGNhcnJpYWdlIHJldHVybnMgaWYgYW55LgorICAgICAgICAgICAgLy8gU3RyaXAgdHJhaWxpbmcgbmV3bGluZXMuCisgICAgICAgICAgICB3aGlsZSAoIGxlbiA+IDAgJiYgbWVzc2FnZVsgbGVuIC0gMSBdID09ICdcbicgKSB7CisgICAgICAgICAgICAgICAgLS0gbGVuOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIG1lc3NhZ2VbIGxlbiBdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvcm1hdE1lc3NhZ2UoKSBmYWlsZWQgdG8gZm9ybWF0IHN5c3RlbSBlcnJvciBtZXNzYWdlLiBHZXRMYXN0RXJyb3IoKSB3b3VsZCBnaXZlIHVzCisgICAgICAgICAgICAvLyBlcnJvciBjb2RlLCB3aGljaCB3ZSB3b3VsZCBjb252ZXJ0IHRvIG1lc3NhZ2UuLi4gdGhpcyBpdCBkYW5nZXJvdXMgcmVjdXJzaW9uLCB3aGljaAorICAgICAgICAgICAgLy8gY2Fubm90IGNsYXJpZnkgb3JpZ2luYWwgZXJyb3IsIHNvIHdlIHdpbGwgbm90IGV2ZW4gc3RhcnQgaXQuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBMb2NhbEZyZWUoIGJ1ZmZlciApOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2Vsc2UgLy8gTm9uLVdpbmRvd3MqIE9TOiBMaW51eCogT1Mgb3IgT1MgWCoKKworICAgICAgICAvKgorICAgICAgICAgICAgVGhlcmUgYXJlIDIgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIHN0cmVycm9yX3I6CisKKyAgICAgICAgICAgICAgICBjaGFyICogc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gR05VIHZlcnNpb24KKyAgICAgICAgICAgICAgICBpbnQgICAgc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gWFNJIHZlcnNpb24KKyAgICAgICAgKi8KKworICAgICAgICAjaWYgS01QX09TX0xJTlVYCisKKyAgICAgICAgICAgIC8vIEdOVSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGNoYXIgICBidWZmZXJbIDIwNDggXTsKKyAgICAgICAgICAgIGNoYXIgKiBjb25zdCBlcnJfbXNnID0gc3RyZXJyb3JfciggZXJyLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgKTsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgZWxpbWluYXRlIHRoaXMgYXNzaWdubWVudCB0byB0ZW1wb3JhcnkgdmFyaWFibGUsIG90aGVyd2lzZSBjb21waWxlciB3b3VsZAorICAgICAgICAgICAgICAgIC8vIG5vdCBpc3N1ZSB3YXJuaW5nIGlmIHN0cmVycm9yX3IoKSByZXR1cm5zIGBpbnQnIGluc3RlYWQgb2YgZXhwZWN0ZWQgYGNoYXIgKicuCisgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgZXJyX21zZyApOworCisgICAgICAgICNlbHNlIC8vIE9TIFgqLCBGcmVlQlNEKiBldGMuCisKKyAgICAgICAgICAgIC8vIFhTSSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGludCAgICBzaXplICAgPSAyMDQ4OworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoZWNraW5nIHJlc3VsdCBvZiBtYWxsb2MoKS4KKyAgICAgICAgICAgIGNoYXIgKiBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICBpbnQgICAgcmM7CisgICAgICAgICAgICByYyA9IHN0cmVycm9yX3IoIGVyciwgYnVmZmVyLCBzaXplICk7CisgICAgICAgICAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAgICAgLy8gWFNJIHZlcnNpb24gc2V0cyBlcnJuby4KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB3aGlsZSAoIHJjID09IEVSQU5HRSApIHsgICAvLyBFUkFOR0UgbWVhbnMgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgICAgIHNpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICAgICAgcmMgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICAgICAgICAgIGlmICggcmMgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAvLyBYU0kgdmVyc2lvbiBzZXRzIGVycm5vLgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBidWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBpcyB1bnVzZWQuIEZyZWUgaXQuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjZW5kaWYKKworICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIC8vIFRPRE86IEkxOG4gdGhpcyBtZXNzYWdlLgorICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgIihObyBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUpIiApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gc3lzX2Vycm9yCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfY29kZSgKKyAgICBpbnQgIGNvZGUKKykgeworCisgICAga21wX21zZ190ICAgICAgbXNnOworICAgIG1zZy50eXBlID0ga21wX210X3N5c2VycjsKKyAgICBtc2cubnVtICA9IGNvZGU7CisgICAgbXNnLnN0ciAgPSBzeXNfZXJyb3IoIGNvZGUgKTsKKyAgICBtc2cubGVuICA9IEtNUF9TVFJMRU4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9jb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfbWVzZygKKyAgICBjaGFyIGNvbnN0ICogbWVzZworKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgbXNnLnR5cGUgPSBrbXBfbXRfc3lzZXJyOworICAgIG1zZy5udW0gID0gMDsKKyAgICBtc2cuc3RyICA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIG1lc2cgKTsKKyAgICBtc2cubGVuICA9IEtNUF9TVFJMRU4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9tZXNnCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfbXNnKAorICAgIGttcF9tc2dfc2V2ZXJpdHlfdCAgc2V2ZXJpdHksCisgICAga21wX21zZ190ICAgICAgICAgICBtZXNzYWdlLAorICAgIC4uLgorKSB7CisKKyAgICB2YV9saXN0ICAgICAgICBhcmdzOworICAgIGttcF9pMThuX2lkX3QgIGZvcm1hdDsgICAgICAvLyBmb3JtYXQgaWRlbnRpZmllcgorICAgIGttcF9tc2dfdCAgICAgIGZtc2c7ICAgICAgICAvLyBmb3JtYXR0ZWQgbWVzc2FnZQorICAgIGttcF9zdHJfYnVmX3QgIGJ1ZmZlcjsKKworICAgIGlmICggc2V2ZXJpdHkgIT0ga21wX21zX2ZhdGFsICYmIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYgKQorICAgICAgICByZXR1cm47IC8vIG5vIHJlYXNvbiB0byBmb3JtIGEgc3RyaW5nIGluIG9yZGVyIHRvIG5vdCBwcmludCBpdAorCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgLy8gRm9ybWF0IHRoZSBwcmltYXJ5IG1lc3NhZ2UuCisgICAgc3dpdGNoICggc2V2ZXJpdHkgKSB7CisgICAgICAgIGNhc2Uga21wX21zX2luZm9ybSA6IHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9JbmZvOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGttcF9tc193YXJuaW5nIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X1dhcm5pbmc7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Uga21wX21zX2ZhdGFsIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X0ZhdGFsOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICB9OworICAgIH07IC8vIHN3aXRjaAorICAgIGZtc2cgPSBfX2ttcF9tc2dfZm9ybWF0KCBmb3JtYXQsIG1lc3NhZ2UubnVtLCBtZXNzYWdlLnN0ciApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBtZXNzYWdlLnN0ciApOworICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIGJ1ZmZlciwgZm1zZy5zdHIsIGZtc2cubGVuICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGZtc2cuc3RyICk7CisKKyAgICAvLyBGb3JtYXQgb3RoZXIgbWVzc2FnZXMuCisgICAgdmFfc3RhcnQoIGFyZ3MsIG1lc3NhZ2UgKTsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIG1lc3NhZ2UgPSB2YV9hcmcoIGFyZ3MsIGttcF9tc2dfdCApOworICAgICAgICBpZiAoIG1lc3NhZ2UudHlwZSA9PSBrbXBfbXRfZHVtbXkgJiYgbWVzc2FnZS5zdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIG1lc3NhZ2UudHlwZSA9PSBrbXBfbXRfZHVtbXkgJiYgbWVzc2FnZS5zdHIgPT0gX19rbXBfbXNnX2VtcHR5LnN0ciApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzd2l0Y2ggKCBtZXNzYWdlLnR5cGUgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9tdF9oaW50IDogeworICAgICAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9IaW50OworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX210X3N5c2VyciA6IHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfU3lzRXJyOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgICAgIGZtc2cgPSBfX2ttcF9tc2dfZm9ybWF0KCBmb3JtYXQsIG1lc3NhZ2UubnVtLCBtZXNzYWdlLnN0ciApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgbWVzc2FnZS5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgYnVmZmVyLCBmbXNnLnN0ciwgZm1zZy5sZW4gKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGZtc2cuc3RyICk7CisgICAgfTsgLy8gZm9yZXZlcgorICAgIHZhX2VuZCggYXJncyApOworCisgICAgLy8gUHJpbnQgZm9ybWF0dGVkIG1lc3NhZ2VzLgorICAgIC8vIFRoaXMgbG9jayBwcmV2ZW50cyBtdWx0aXBsZSBmYXRhbCBlcnJvcnMgb24gdGhlIHNhbWUgcHJvYmxlbS4KKyAgICAvLyBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsgICAgLy8gR0VIIC0gVGhpcyBsb2NrIGNhdXNpbmcgdGVzdHMgdG8gaGFuZyBvbiBPUyBYKi4KKyAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgICBpZiAoIHNldmVyaXR5ID09IGttcF9tc19mYXRhbCApIHsKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX3RocmVhZF9zbGVlcCggNTAwICk7ICAgLyogRGVsYXkgdG8gZ2l2ZSBtZXNzYWdlIGEgY2hhbmNlIHRvIGFwcGVhciBiZWZvcmUgcmVhcGluZyAqLworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfYWJvcnRfcHJvY2VzcygpOworICAgIH07IC8vIGlmCisKKyAgICAvLyBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsgIC8vIEdFSCAtIHRoaXMgbG9jayBjYXVzaW5nIHRlc3RzIHRvIGhhbmcgb24gT1MgWCouCisKK30gLy8gX19rbXBfbXNnCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pMThuLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWM1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICoga21wX2kxOG4uaAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9JMThOX0gKKyNkZWZpbmUgS01QX0kxOE5fSAorCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKgorICAgIGttcF9pMThuX2lkLmluYyBkZWZpbmVzIGttcF9pMThuX2lkX3QgdHlwZS4gSXQgaXMgYW4gZW51bWVyYXRpb24gd2l0aCBpZGVudGlmaWVycyBvZiBhbGwgdGhlCisgICAgbWVzc2FnZXMgaW4gdGhlIGNhdGFsb2cuIFRoZXJlIGlzIG9uZSBzcGVjaWFsIGlkZW50aWZpZXI6IGttcF9pMThuX251bGwsIHdoaWNoIGRlbm90ZXMgYWJzZW5jZQorICAgIG9mIG1lc3NhZ2UuCisqLworI2luY2x1ZGUgImttcF9pMThuX2lkLmluYyIgLy8gR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0IGl0IG1hbnVhbGx5LgorCisvKgorICAgIExvdy1sZXZlbCBmdW5jdGlvbnMgaGFuZGxpbmcgbWVzc2FnZSBjYXRhbG9nLiBfX2ttcF9pMThuX29wZW4oKSBvcGVucyBtZXNzYWdlIGNhdGFsb2csCisgICAgX19rbXBfaTE4bl9jbG9zZXMoKSBpdC4gRXhwbGljaXQgb3BlbmluZyBpcyBub3QgcmVxdWlyZWQ6IGlmIG1lc3NhZ2UgY2F0YWxvZyBpcyBub3QgeWV0IG9wZW4sCisgICAgX19rbXBfaTE4bl9jYXRnZXRzKCkgd2lsbCBvcGVuIGl0IGltcGxpY2l0bHkuIEhvd2V2ZXIsIGNhdGFsb2cgc2hvdWxkIGJlIGV4cGxpY2l0bHkgY2xvc2VkLAorICAgIG90aGVyd2lzZSByZXNvdXJjZXMgKG1hbW9yeSwgaGFuZGxlcykgbWF5IGxlYWsuCisKKyAgICBfX2ttcF9pMThuX2NhdGdldHMoKSByZXR1cm5zIHJlYWQtb25seSBzdHJpbmcuIEl0IHNob3VsZCBub3QgYmUgZnJlZWQuCisKKyAgICBLTVBfSTE4Tl9TVFIgbWFjcm8gc2ltcGxpZmllcyBhY2NlcyB0byBzdHJpbmdzIGluIG1lc3NhZ2UgY2F0YWxvZyBhIGJpdC4gRm9sbG93aW5nIHR3byBsaW5lcyBhcmUKKyAgICBlcXVpdmFsZW50OgorCisgICAgICAgIF9fa21wX2kxOG5fY2F0Z2V0cygga21wX2kxOG5fc3RyX1dhcm5pbmcgKQorICAgICAgICBLTVBfSTE4Tl9TVFIoIFdhcm5pbmcgKQorKi8KKwordm9pZCAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0b3BlbigpOwordm9pZCAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKK2NoYXIgY29uc3QgKiAgICBfX2ttcF9pMThuX2NhdGdldHMoIGttcF9pMThuX2lkX3QgaWQgKTsKKworI2RlZmluZSBLTVBfSTE4Tl9TVFIoIGlkICkgICAgX19rbXBfaTE4bl9jYXRnZXRzKCBrbXBfaTE4bl9zdHJfICMjIGlkICkKKworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgSGlnaC1sZXZlbCBpbnRlcmZhY2UgZm9yIHByaW50aW5nIHN0cmluZ3MgdGFyZ2V0ZWQgdG8gdGhlIHVzZXIuCisKKyAgICBBbGwgdGhlIHN0cmluZ3MgYXJlIGRpdmlkZWQgaW50byAzIHR5cGVzOgorCisgICAgICAgICogbWVzc2FnZXMsCisgICAgICAgICogaGludHMsCisgICAgICAgICogc3lzdGVtIGVycm9ycy4KKworICAgIFRoZXJlIGFyZSAzIGtpbmQgb2YgbWVzc2FnZSBzZXZlcml0aWVzOgorCisgICAgICAgICogaW5mb3JtYXRpb25hbCBtZXNzYWdlcywKKyAgICAgICAgKiB3YXJuaW5ncyAobm9uLWZhdGFsIGVycm9ycyksCisgICAgICAgICogZmF0YWwgZXJyb3JzLgorCisgICAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgT01QOiBXYXJuaW5nICMyOiBDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgImxpYmd1aWRlLmNhdCI6ICAgKDEpCisgICAgICAgIE9NUDogU3lzdGVtIGVycm9yICMyOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICgyKQorICAgICAgICBPTVA6IEhpbnQ6IFBsZWFzZSBjaGVjayBOTFNQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiAgICAgICAgICAoMykKKyAgICAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgKDQpCisKKyAgICB3aGVyZQorCisgICAgICAgICgxKSBpcyBhIG1lc3NhZ2Ugb2Ygd2FybmluZyBzZXZlcml0eSwKKyAgICAgICAgKDIpIGlzIGEgc3lzdGVtIGVycm9yIGNhdXNlZCB0aGUgcHJldmlvdXMgd2FybmluZywKKyAgICAgICAgKDMpIGlzIGEgaGludCBmb3IgdGhlIHVzZXIgaG93IHRvIGZpeCB0aGUgcHJvYmxlbSwKKyAgICAgICAgKDQpIGlzIGEgbWVzc2FnZSBvZiBpbmZvcm1hdGlvbmFsIHNldmVyaXR5LgorCisgICBVc2FnZSBpbiBjb21wbGV4IGNhc2VzIChtZXNzYWdlIGlzIGFjY29tcGFuaWVkIHdpdGggaGludHMgYW5kIHN5c3RlbSBlcnJvcnMpOgorCisgICAgICAgaW50IGVycm9yID0gZXJybm87ICAgLy8gV2UgbmVlZCBzYXZlIGVycm5vIGltbWVkaWF0ZWx5LCBiZWNhdXNlIGl0IG1heSBiZSBjaGFuZ2VkLgorICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAga21wX21zX3dhcm5pbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwgICAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbSBlcnJvcgorICAgICAgICAgICBLTVBfSE5UKCBDaGVja05MU1BBVEggKSwgICAgICAgICAgICAgICAgICAgLy8gSGludAorICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCBmaW5pc2hlcgorICAgICAgICk7CisKKyAgICBVc2FnZSBpbiBzaW1wbGUgY2FzZXMgKGp1c3QgYSBtZXNzYWdlLCBubyBzeXN0ZW0gZXJyb3JzIG9yIGhpbnRzKToKKworICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBuYW1lICk7CisgICAgICAgIEtNUF9GQVRBTCggU3RhY2tPdmVybGFwICk7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitlbnVtIGttcF9tc2dfdHlwZSB7CisgICAga21wX210X2R1bW15ICA9ICAwLCAvLyBTcGVjaWFsIHR5cGUgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIGttcF9tdF9tZXNnICAgPSAgNCwgLy8gUHJpbWFyeSBPcGVuTVAgbWVzc2FnZSwgY291bGQgYmUgaW5mb3JtYXRpb24sIHdhcm5pbmcsIG9yIGZhdGFsLgorICAgIGttcF9tdF9oaW50ICAgPSAgNSwgLy8gSGludCB0byB0aGUgdXNlci4KKyAgICBrbXBfbXRfc3lzZXJyID0gLTEgIC8vIFN5c3RlbSBlcnJvciBtZXNzYWdlLgorfTsgLy8gZW51bSBrbXBfbXNnX3R5cGUKK3R5cGVkZWYgZW51bSBrbXBfbXNnX3R5cGUgIGttcF9tc2dfdHlwZV90OworCitzdHJ1Y3Qga21wX21zZyB7CisgICAga21wX21zZ190eXBlX3QgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgIG51bTsKKyAgICBjaGFyIGNvbnN0ICogICAgc3RyOworICAgIGludCAgICAgICAgICAgICBsZW47Cit9OyAvLyBzdHJ1Y3Qga21wX21lc3NhZ2UKK3R5cGVkZWYgc3RydWN0IGttcF9tc2cgIGttcF9tc2dfdDsKKworLy8gVHdvIHNwZWNpYWwgbWVzc2FnZXMuCitleHRlcm4ga21wX21zZ190IF9fa21wX21zZ19lbXB0eTsgIC8vIENhbiBiZSB1c2VkIGluIHBsYWNlIHdoZXJlIG1lc3NhZ2UgaXMgcmVxdWlyZWQgc3ludGFjdGljYWxseS4KK2V4dGVybiBrbXBfbXNnX3QgX19rbXBfbXNnX251bGw7ICAgLy8gRGVub3RlcyB0aGUgZW5kIG9mIHZhcmlhZGljIGxpc3Qgb2YgYXJndW1lbnRzLgorCisvLyBIZWxwZXIgZnVuY3Rpb25zLiBDcmVhdGVzIG1lc3NhZ2VzIGVpdGhlciBmcm9tIG1lc3NhZ2UgY2F0YWxvZyBvciBmcm9tIHN5c3RlbS4gTm90ZTogdGhlc2UKKy8vIGZ1bmN0aW9ucyBhbGxvY2F0ZSBtZW1vcnkuIFlvdSBzaG91bGQgcGFzcyBjcmVhdGVkIG1lc3NhZ2VzIHRvIF9fa21wX21zZygpIGZ1bmN0aW9uLCBpdCB3aWxsCisvLyBwcmludCBtZXNzYWdlcyBhbmQgZGVzdHJveSB0aGVtLgora21wX21zZ190ICBfX2ttcF9tc2dfZm9ybWF0KCBrbXBfaTE4bl9pZF90IGlkLCAuLi4gKTsKK2ttcF9tc2dfdCAgX19rbXBfbXNnX2Vycm9yX2NvZGUoIGludCBjb2RlICk7CitrbXBfbXNnX3QgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBjaGFyIGNvbnN0ICogbWVzZyApOworCisvLyBIZWxwZXIgbWFjcm9zIHRvIG1ha2UgY2FsbHMgc2hvcnRlci4KKyNkZWZpbmUgS01QX01TRyggLi4uICApICAgX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5fbXNnXyAjIyBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEtNUF9ITlQoIC4uLiAgKSAgIF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX2hudF8gIyMgX19WQV9BUkdTX18gKQorI2RlZmluZSBLTVBfU1lTRVJSQ09ERSggY29kZSApICBfX2ttcF9tc2dfZXJyb3JfY29kZSggY29kZSApCisjZGVmaW5lIEtNUF9TWVNFUlJNRVNHKCBtZXNnICkgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBtZXNnICkKKyNkZWZpbmUgS01QX0VSUiBLTVBfU1lTRVJSQ09ERQorCisvLyBNZXNzYWdlIHNldmVyaXR5LgorZW51bSBrbXBfbXNnX3NldmVyaXR5IHsKKyAgICBrbXBfbXNfaW5mb3JtLCAgICAgIC8vIEp1c3QgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyLgorICAgIGttcF9tc193YXJuaW5nLCAgICAgLy8gTm9uLWZhdGFsIGVycm9yLCBleGVjdXRpb24gY29udGludWVzLgorICAgIGttcF9tc19mYXRhbCAgICAgICAgLy8gRmF0YWwgZXJyb3IsIHByb2dyYW0gYWJvcnRzLgorfTsgLy8gZW51bSBrbXBfbXNnX3NldmVyaXR5Cit0eXBlZGVmIGVudW0ga21wX21zZ19zZXZlcml0eSAga21wX21zZ19zZXZlcml0eV90OworCisvLyBQcmltYXJ5IGZ1bmN0aW9uIGZvciBwcmludGluZyBtZXNzYWdlcyBmb3IgdGhlIHVzZXIuIFRoZSBmaXJzdCBtZXNzYWdlIGlzIG1hbmRhdG9yeS4gQW55IG51bWJlcgorLy8gb2Ygc3lzdGVtIGVycm9ycyBhbmQgaGludHMgbWF5IGJlIHNwZWNpZmllZC4gQXJndW1lbnQgbGlzdCBtdXN0IGJlIGZpbmlzaGVkIHdpdGggX19rbXBfbXNnX251bGwuCit2b2lkICAgIF9fa21wX21zZygga21wX21zZ19zZXZlcml0eV90IHNldmVyaXR5LCBrbXBfbXNnX3QgbWVzc2FnZSwgLi4uICk7CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gbWFrZSBjYWxscyBzaG9ydGVyIGluIHNpbXBsZSBjYXNlcy4KKyNkZWZpbmUgS01QX0lORk9STSggLi4uICApIF9fa21wX21zZygga21wX21zX2luZm9ybSwgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1dBUk5JTkcoIC4uLiApIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX0ZBVEFMKCAgIC4uLiApIF9fa21wX21zZygga21wX21zX2ZhdGFsLCAgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9tc2coICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgZnVuYyApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1NZU0VSUkNPREUoIGVycm9yICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisKKy8vIENoZWNrIGVycm9yLCBpZiBub3QgemVybywgZ2VuZXJhdGUgZmF0YWwgZXJyb3IgbWVzc2FnZS4KKyNkZWZpbmUgS01QX0NIRUNLX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBlcnJvciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9TWVNGQUlMKCBmdW5jLCBlcnJvciApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIENoZWNrIHN0YXR1cywgaWYgbm90IHplcm8sIGdlbmVyYXRlIGZhdGFsIGVycm9yIG1lc3NhZ2UgdXNpbmcgZXJybm8uCisjZGVmaW5lIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCBmdW5jLCBzdGF0dXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfU1lTRkFJTCggZnVuYywgZXJyb3IgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgdm9pZCBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOworI2VuZGlmIC8vIEtNUF9ERUJVRworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9OyAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9JMThOX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pbXBvcnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pbXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmZiYTQxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2ltcG9ydC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBrbXBfaW1wb3J0LmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhpcyBzb3VyY2UgZmlsZSBpcyBsaW5rZWQgdG8gV2luZG93cyogT1MgRExMIGltcG9ydCBsaWJyYXJ5IChsaWJvbXBtZC5saWIpCisgICAgb25seSEgSXQgaXMgbm90IGEgcGFydCBvZiByZWd1bGFyIHN0YXRpYyBvciBkeW5hbWljIE9wZW5NUCBSVEwuIEFueSBjb2RlIHRoYXQganVzdCBuZWVkcyB0byBnbworICAgIGluIHRoZSBsaWJvbXBtZC5saWIgKGJ1dCBub3QgaW4gbGlib21wbXQubGliIGFuZCBsaWJvbXBtZC5kbGwpIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcworICAgIGZpbGUuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgICAgVGhlc2Ugc3ltYm9scyBhcmUgcmVxdWlyZWQgZm9yIG11dHVhbCBleGNsdXNpb24gd2l0aCBNaWNyb3NvZnQgT3Blbk1QIFJUTCAoYW5kIGNvbXBhdGliaWxpdHkKKyAgICB3aXRoIE1TIENvbXBpbGVyKS4KKyovCisKK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODA4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIEtNUF9JTy5jIC0tIFJUTCBJTworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX19BQlNPRlRfV0lOCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXAuaCIgLy8gS01QX0dUSURfRE5FLCBfX2ttcF9kZWJ1Z19idWYsIGV0YworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorIyBwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMjcxIDMxMCApCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfc3RkaW9fbG9jayAgID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9zdGRpb19sb2NrICAgKTsgLyogQ29udHJvbCBzdGRpbyBmdW5jdGlvbnMgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfY29uc29sZV9sb2NrICk7IC8qIENvbnRyb2wgY29uc29sZSBpbml0aWFsaXphdGlvbiAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKworICAgICMgaWZkZWYgS01QX0RFQlVHIAorICAgIC8qIF9fa21wX3N0ZG91dCBpcyB1c2VkIG9ubHkgZm9yIGRldiBidWlsZCAqLworICAgIHN0YXRpYyBIQU5ETEUgICAgX19rbXBfc3Rkb3V0ID0gTlVMTDsKKyAgICAjIGVuZGlmCisgICAgc3RhdGljIEhBTkRMRSAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IEZBTFNFOworICAgIHN0YXRpYyBrbXBfc3RyX2J1Zl90IF9fa21wX2NvbnNvbGVfYnVmOworCisgICAgc3RhdGljIGludAorICAgIGlzX2NvbnNvbGUoIHZvaWQgKQorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbIDEyOCBdOworICAgICAgICBEV09SRCByYyAgPSAwOworICAgICAgICBEV09SRCBlcnIgPSAwOworICAgICAgICAvLyBUcnkgdG8gZ2V0IGNvbnNvbGUgdGl0bGUuCisgICAgICAgIFNldExhc3RFcnJvciggMCApOworICAgICAgICAgICAgLy8gR2V0Q29uc29sZVRpdGxlIGRvZXMgbm90IHJlc2V0IGxhc3QgZXJyb3IgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIHNob3J0IGJ1ZmZlciwKKyAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2xlYXIgaXQgZXhwbGljaXRseS4KKyAgICAgICAgcmMgPSBHZXRDb25zb2xlVGl0bGUoIGJ1ZmZlciwgc2l6ZW9mKCBidWZmZXIgKSApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICAvLyByYyA9PSAwIG1lYW5zIGdldHRpbmcgY29uc29sZSB0aXRsZSBmYWlsZWQuIExldCB1cyBmaW5kIG91dCB3aHkuCisgICAgICAgICAgICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIC8vIGVyciA9PSAwIG1lYW5zIGJ1ZmZlciB0b28gc2hvcnQgKHdlIHN1cHBvc2UgY29uc29sZSBleGlzdHMpLgorICAgICAgICAgICAgLy8gSW4gV2luZG93IGFwcGxpY2F0aW9ucyB3ZSB1c3VhbGx5IGhhdmUgZXJyID09IDYgKGludmFsaWQgaGFuZGxlKS4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmV0dXJuIHJjID4gMCB8fCBlcnIgPT0gMDsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19rbXBfY2xvc2VfY29uc29sZSggdm9pZCApCisgICAgeworICAgICAgICAvKiB3YWl0IHVudGlsIHVzZXIgcHJlc3NlcyByZXR1cm4gYmVmb3JlIGNsb3Npbmcgd2luZG93ICovCisgICAgICAgIC8qIFRPRE8gb25seSBjbG9zZSBpZiBhIHdpbmRvdyB3YXMgb3BlbmVkICovCisgICAgICAgIGlmKCBfX2ttcF9jb25zb2xlX2V4aXN0cyApIHsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcgCisgICAgICAgICAgICAvKiBzdGFuZGFyZCBvdXQgaXMgdXNlZCBvbmx5IGluIGRldiBidWlsZCAqLworICAgICAgICAgICAgX19rbXBfc3Rkb3V0ID0gTlVMTDsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJl9fa21wX2NvbnNvbGVfYnVmICk7CisgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRm9yIHdpbmRvd3MsIGNhbGwgdGhpcyBiZWZvcmUgc3Rkb3V0LCBzdGRlcnIsIG9yIHN0ZGluIGFyZSB1c2VkLgorICAgICAqIEl0IG9wZW5zIGEgY29uc29sZSB3aW5kb3cgYW5kIHN0YXJ0cyBwcm9jZXNzaW5nICovCisgICAgc3RhdGljIHZvaWQKKyAgICBfX2ttcF9yZWRpcmVjdF9vdXRwdXQoIHZvaWQgKQorICAgIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworCisgICAgICAgIGlmKCAhIF9fa21wX2NvbnNvbGVfZXhpc3RzICkgeworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRyAKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIG91dCBpcyB1c2VkIG9ubHkgaW4gZGV2IGJ1aWxkICovCisgICAgICAgICAgICBIQU5ETEUgaG87CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIEhBTkRMRSBoZTsKKworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmX19rbXBfY29uc29sZV9idWYgKTsKKworICAgICAgICAgICAgQWxsb2NDb25zb2xlKCk7CisgICAgICAgICAgICAvLyBXZSBkbyBub3QgY2hlY2sgdGhlIHJlc3VsdCBvZiBBbGxvY0NvbnNvbGUgYmVjYXVzZQorICAgICAgICAgICAgLy8gIDEuIHRoZSBjYWxsIGlzIGhhcm1sZXNzCisgICAgICAgICAgICAvLyAgMi4gaXQgaXMgbm90IGNsZWFyIGhvdyB0byBjb21tdW5pY2F0ZSBmYWlsdWUKKyAgICAgICAgICAgIC8vICAzLiB3ZSB3aWxsIGRldGVjdCBmYWlsdXJlIGxhdGVyIHdoZW4gd2UgZ2V0IGhhbmRsZShzKQorCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgaG8gPSBHZXRTdGRIYW5kbGUoIFNURF9PVVRQVVRfSEFORExFICk7CisgICAgICAgICAgICAgICAgaWYgKCBobyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCBobyA9PSBOVUxMICkgeworCisgICAgICAgICAgICAgICAgICAgIERXT1JEICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogb3V0cHV0IGVycm9yIHNvbWVob3cgKG1heWJlIG1lc3NhZ2UgYm94KQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBobzsgLy8gdGVtcG9yYXJ5IGNvZGUsIG5lZWQgbmV3IGdsb2JhbCBmb3IgaG8KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgaGUgPSBHZXRTdGRIYW5kbGUoIFNURF9FUlJPUl9IQU5ETEUgKTsKKyAgICAgICAgICAgIGlmICggaGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwgaGUgPT0gTlVMTCApIHsKKworICAgICAgICAgICAgICAgIERXT1JEICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdXRwdXQgZXJyb3Igc29tZWhvdyAobWF5YmUgbWVzc2FnZSBib3gpCisgICAgICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0ZGVyciA9IGhlOyAvLyB0ZW1wb3JhcnkgY29kZSwgbmVlZCBuZXcgZ2xvYmFsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworICAgIH0KKworI2Vsc2UKKyAgICAjZGVmaW5lICAgICAgIF9fa21wX3N0ZGVyciAgICAgKHN0ZGVycikKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCit2b2lkCitfX2ttcF92cHJpbnRmKCBlbnVtIGttcF9pbyBfX2ttcF9pbywgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcCApCit7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGlmKCAhX19rbXBfY29uc29sZV9leGlzdHMgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWRpcmVjdF9vdXRwdXQoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgaWYoICEgX19rbXBfc3RkZXJyICYmIF9fa21wX2lvID09IGttcF9lcnIgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoICEgX19rbXBfc3Rkb3V0ICYmIF9fa21wX2lvID09IGttcF9vdXQgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIGlmICggX19rbXBfZGVidWdfYnVmICYmIF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMICkgeworCisgICAgICAgIGludCBkYyA9ICggX19rbXBfZGVidWdfYnVmX2F0b21pYyA/CisgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9kZWJ1Z19jb3VudCkgOiBfX2ttcF9kZWJ1Z19jb3VudCsrICkKKyAgICAgICAgICAgICAgICAgICAlIF9fa21wX2RlYnVnX2J1Zl9saW5lczsKKyAgICAgICAgY2hhciAqZGIgPSAmIF9fa21wX2RlYnVnX2J1ZmZlclsgZGMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgaW50IGNoYXJzID0gMDsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgIGNoYXJzID0gS01QX1NOUFJJTlRGKCBkYiwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCAicGlkPSVkOiAiLCAoa21wX2ludDMyKWdldHBpZCgpICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBjaGFycyArPSBLTVBfVlNOUFJJTlRGKCBkYiwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCBmb3JtYXQsIGFwICk7CisKKyAgICAgICAgaWYgKCBjaGFycyArIDEgPiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKSB7CisgICAgICAgICAgICBpZiAoIGNoYXJzICsgMSA+IF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzICkgeworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBEV09SRCBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJl9fa21wX2NvbnNvbGVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9NUCB3YXJuaW5nOiBEZWJ1Z2dpbmcgYnVmZmVyIG92ZXJmbG93OyBpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMgKyAxICk7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlRmlsZSggX19rbXBfc3RkZXJyLCBfX2ttcF9jb25zb2xlX2J1Zi5zdHIsIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsICZjb3VudCwgTlVMTCApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBfX2ttcF9zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk9NUCB3YXJuaW5nOiBEZWJ1Z2dpbmcgYnVmZmVyIG92ZXJmbG93OyBpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzICsgMSApOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gY2hhcnMgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogdGVybWluYXRlIHN0cmluZyBpZiBvdmVyZmxvdyBvY2N1cnJlZCAqLworICAgICAgICAgICAgZGJbIF9fa21wX2RlYnVnX2J1Zl9jaGFycyAtIDIgXSA9ICdcbic7CisgICAgICAgICAgICBkYlsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMSBdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgRFdPUkQgY291bnQ7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmX19rbXBfY29uc29sZV9idWYsICJwaWQ9JWQ6ICIsCisgICAgICAgICAgICAgICAgICAoa21wX2ludDMyKWdldHBpZCgpICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfdnByaW50KCAmX19rbXBfY29uc29sZV9idWYsIGZvcm1hdCwgYXAgKTsKKyAgICAgICAgICAgIFdyaXRlRmlsZSgKKyAgICAgICAgICAgICAgICBfX2ttcF9zdGRlcnIsCisgICAgICAgICAgICAgICAgX19rbXBfY29uc29sZV9idWYuc3RyLAorICAgICAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsCisgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgICAgIGZwcmludGYoIF9fa21wX3N0ZGVyciwgInBpZD0lZDogIiwgKGttcF9pbnQzMilnZXRwaWQoKSApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB2ZnByaW50ZiggX19rbXBfc3RkZXJyLCBmb3JtYXQsIGFwICk7CisgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0ICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBmb3JtYXQsIGFwICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisKKyAgICB2YV9lbmQoIGFwICk7Cit9CisKK3ZvaWQKK19fa21wX3ByaW50Zl9ub19sb2NrKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjYWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBrbXBfaW8uaCAtLSBSVEwgSU8gaGVhZGVyIGZpbGUuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lPX0gKKyNkZWZpbmUgS01QX0lPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIGttcF9pbyB7CisgICAga21wX291dCA9IDAsCisgICAga21wX2VycgorfTsKKworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3N0ZGlvX2xvY2s7ICAgICAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jazsgICAvKiBDb250cm9sIGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfdnByaW50ZiggZW51bSBrbXBfaW8gX19rbXBfaW8sIGNoYXIgY29uc3QgKiBmb3JtYXQsIHZhX2xpc3QgYXAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9wcmludGZfbm9fbG9jayggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbG9zZV9jb25zb2xlKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSU9fSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2ZDYzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuYwpAQCAtMCwwICsxLDE0NCBAQAorI2luY2x1ZGUgImttcF9jb25maWcuaCIKKworI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmMgLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjaW5jbHVkZSAia21wX2l0dC5pbmwiCisjZW5kaWYKKworCisjaWYgVVNFX0lUVF9OT1RJRlkKKworICAgIGttcF9pbnQzMiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudDsKKyAgICBrbXBfaW50MzIgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudDsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAga21wX2ludDMyIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgX19pdHRfZG9tYWluICogbWV0YWRhdGFfZG9tYWluID0gTlVMTDsKKworICAgICNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorICAgICNpbmNsdWRlICJrbXBfaTE4bi5oIgorICAgICNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGttcF9pdHRfbWFya190ICkgPT0gc2l6ZW9mKCBfX2l0dF9tYXJrX3R5cGUgKSApOworCisgICAgLyoKKyAgICAgICAgUHJldmlvdXNseSB1c2VkIHdhcm5pbmdzOgorCisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRBbGxOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRPYmpOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRNYXJrTm90aWZEaXNhYmxlZCApOworICAgICAgICBLTVBfV0FSTklORyggSXR0VW5sb2FkTGliRmFpbGVkLCBsaWJpdHRub3RpZnkgKTsKKyAgICAqLworCisKKyAgICBrbXBfaW50MzIgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgPSAwOworICAgIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2l0dF9kZWJ1Z19sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pdHRfZGVidWdfbG9jayApOworCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpIHsKKworICAgIC8vIElUVE5vdGlmeSBsaWJyYXJ5IGlzIGxvYWRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgZmlyc3QgY2FsbCB0byBhbnkgaXR0bm90aWZ5IGZ1bmN0aW9uLAorICAgIC8vIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgbG9hZCBpdCBhbnkgbW9yZS4KKyAgICAvLyBKdXNyIHJlcG9ydCBPTVAgUlRMIHZlcnNpb24gdG8gSVRUTm90aWZ5LgorCisgICAgI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIC8vIFJlcG9ydCBPcGVuTVAgUlRMIHZlcnNpb24uCisgICAgICAgIGttcF9zdHJfYnVmX3QgICAgICAgYnVmOworICAgICAgICBfX2l0dF9tYXJrX3R5cGUgICAgIHZlcnNpb247CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICYgYnVmLAorICAgICAgICAgICAgIk9NUCBSVEwgVmVyc2lvbiAlZC4lZC4lZCIsCisgICAgICAgICAgICBfX2ttcF92ZXJzaW9uX21ham9yLAorICAgICAgICAgICAgX19rbXBfdmVyc2lvbl9taW5vciwKKyAgICAgICAgICAgIF9fa21wX3ZlcnNpb25fYnVpbGQKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKCBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmLCAiOiVzIiwgX19pdHRfYXBpX3ZlcnNpb24oKSApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICB2ZXJzaW9uID0gX19pdHRfbWFya19jcmVhdGUoIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19pdHRfbWFyayggdmVyc2lvbiwgTlVMTCApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmICk7CisgICAgI2VuZGlmCisKK30gLy8gX19rbXBfaXR0X2luaXRpYWxpemUKKworCit2b2lkIF9fa21wX2l0dF9kZXN0cm95KCkgeworICAgICNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWIoKTsKKyAgICAjZW5kaWYKK30gLy8gX19rbXBfaXR0X2Rlc3Ryb3kKKworCitleHRlcm4gIkMiCit2b2lkCitfX2l0dF9lcnJvcl9oYW5kbGVyKAorICAgIF9faXR0X2Vycm9yX2NvZGUgZXJyLAorICAgIHZhX2xpc3QgYXJncworKSB7CisKKyAgICBzd2l0Y2ggKCBlcnIgKSB7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3Jfbm9fbW9kdWxlIDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGxpYnJhcnkgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgaW50IHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUkNPREUoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUk1FU0coIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX25vX3N5bWJvbCA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBsaWJyYXJ5ID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzeW1ib2wgID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRMb29rdXBGYWlsZWQsIHN5bWJvbCwgbGlicmFyeSApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGdyb3VwID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRVbmtub3duR3JvdXAsIHZhciwgZ3JvdXAgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgYWN0X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgbWF4X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0RW52VmFyVG9vTG9uZywgdmFyLCAodW5zaWduZWQgbG9uZykgYWN0X2xlbiwgKHVuc2lnbmVkIGxvbmcpIG1heF9sZW4gKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52IDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIHZhciAgICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgaW50ICAgICAgICAgIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQ2FudEdldEVudlZhciwgdmFyICksIEtNUF9FUlIoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9zeXN0ZW0gOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZnVuYyAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJdHRGdW5jdGlvbkVycm9yLCBmdW5jICksIEtNUF9TWVNFUlJDT0RFKCBzeXNfZXJyICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0VW5rbm93bkVycm9yLCBlcnIgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKKworfSAvLyBfX2l0dF9lcnJvcl9oYW5kbGVyCisKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1YTRmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaApAQCAtMCwwICsxLDMwOSBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmggLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lUVF9ICisjZGVmaW5lIEtNUF9JVFRfSAorCisjaW5jbHVkZSAia21wX2xvY2suaCIKKworI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIF9fa21wX2lubGluZSAgICAgICAgICAgLy8gVHVybiBvZmYgaW5saW5pbmcgaW4gZGVidWcgbW9kZS4KKyNlbHNlCisgICAgI2RlZmluZSBfX2ttcF9pbmxpbmUgc3RhdGljIGlubGluZQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGV4dGVybiBrbXBfaW50MzIgIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5OworIyBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVsc2UKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVuZGlmCisjZW5kaWYKKworLy8gU2ltcGxpZnkgdGhlIGhhbmRsaW5nIG9mIGFuIGFyZ3VtZW50IHRoYXQgaXMgb25seSByZXF1aXJlZCB3aGVuIFVTRV9JVFRfQlVJTEQgaXMgZW5hYmxlZC4KKyNkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkgLHgKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOwordm9pZCBfX2ttcF9pdHRfZGVzdHJveSgpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZXcgc3R1ZmYgZm9yIHJlcG9ydGluZyBoaWdoLWxldmVsIGNvbnN0cnVjdHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5vdGUgdGhlIG5hbWluZyBjb252ZW50aW9uOgorLy8gICAgIF9fa21wX2l0dF94eHhpbmcoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhY3Rpb24sIHdoaWxlCisvLyAgICAgX19rbXBfaXR0X3h4eGVkKCkgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWN0aW9uLgorCisvLyAtLS0gUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyggIGludCBndGlkLCBpbnQgdGVhbV9zaXplLCBpbnQgYmFycmllcnMsIGludCBzZXJpYWxpemVkID0gMCApOyAvLyBNYXN0ZXIgb25seSwgYmVmb3JlIGZvcmtpbmcgdGhyZWFkcy4KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fam9pbmVkKCAgIGludCBndGlkLCBpbnQgc2VyaWFsaXplZCA9IDAgKTsgLy8gTWFzdGVyIG9ubHksIGFmdGVyIGpvaW5pbmcgdGhyZWFkcy4KKyAgICAvLyAoKikgTm90ZTogQSB0aHJlYWQgbWF5IGV4ZWN1dGUgdGFza3MgYWZ0ZXIgdGhpcyBwb2ludCwgdGhvdWdoLgorCisvLyAtLS0gRnJhbWUgcmVwb3J0aW5nIC0tLQorLy8gcmVnaW9uID0gMCAtIG5vIHJlZ2lvbnMsIHJlZ2lvbiA9IDEgLSBwYXJhbGxlbCwgcmVnaW9uID0gMiAtIHNlcmlhbGl6ZWQgcGFyYWxsZWwKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKmxvYywgaW50IHRlYW1fc2l6ZSwgaW50IHJlZ2lvbiA9IDAgKTsKKworLy8gLS0tIE1ldGFkYXRhIHJlcG9ydGluZyAtLS0KKy8vIGJlZ2luL2VuZCAtIGJlZ2luL2VuZCB0aW1lc3RhbXBzIG9mIGEgYmFycmllciBmcmFtZSwgaW1iYWxhbmNlIC0gYWdncmVnYXRlZCB3YWl0IHRpbWUgdmFsdWUsIHJlZHVjdGlvbiAtaWYgdGhpcyBpcyBhIHJlZHVjdGlvbiBiYXJyaWVyCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKCBpbnQgZ3RpZCwga21wX3VpbnQ2NCBiZWdpbiwga21wX3VpbnQ2NCBlbmQsIGttcF91aW50NjQgaW1iYWxhbmNlLCBrbXBfdWludDY0IHJlZHVjdGlvbiApOworLy8gc2NoZWRfdHlwZTogMCAtIHN0YXRpYywgMSAtIGR5bmFtaWMsIDIgLSBndWlkZWQsIDMgLSBjdXN0b20gKGFsbCBvdGhlcnMpOyBpdGVyYXRpb25zIC0gbG9vcCB0cmlwIGNvdW50LCBjaHVuayAtIGNodW5rIHNpemUKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKCBpZGVudF90ICogbG9jLCBrbXBfdWludDY0IHNjaGVkX3R5cGUsIGttcF91aW50NjQgaXRlcmF0aW9ucywga21wX3VpbnQ2NCBjaHVuayApOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X21ldGFkYXRhX3NpbmdsZSggaWRlbnRfdCAqIGxvYyApOworCisvLyAtLS0gQmFycmllciByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAqIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggaW50IGd0aWQsIGludCBidCwgaW50IHNldF9uYW1lID0gMCwgaW50IGRlbHRhID0gMCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCAgIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFza3dhaXQgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgKiBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggICBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFzayByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBMb2NrIHJlcG9ydGluZyAtLS0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjb25zdCBpZGVudF90ICogKTsKKyNlbHNlCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKyNlbmRpZgorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKworLy8gLS0tIENyaXRpY2FsIHJlcG9ydGluZyAtLS0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY29uc3QgaWRlbnRfdCAqICk7CisjZWxzZQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworI2VuZGlmCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZCggIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CisKKy8vIC0tLSBTaW5nbGUgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc2luZ2xlX2VuZCggICBpbnQgZ3RpZCApOworCisvLyAtLS0gT3JkZXJlZCByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQoICBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCAgaW50IGd0aWQgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfc3RhcnQoIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCggICBpbnQgZ3RpZCApOworCisvLyAtLS0gVGhyZWFkcyByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsKK19fa21wX2lubGluZSB2b2lkICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGludCBndGlkICk7CisKKy8vIC0tLSBTeXN0ZW0gb2JqZWN0cyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggdm9pZCAqIG9iamVjdCwgY2hhciBjb25zdCAqIG5hbWUgKTsKKworLy8gLS0tIFN0YWNrIHN0aXRjaGluZyAtLS0KK19fa21wX2lubGluZSBfX2l0dF9jYWxsZXIgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUodm9pZCk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koX19pdHRfY2FsbGVyKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoX19pdHRfY2FsbGVyKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoX19pdHRfY2FsbGVyKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT2xkIHN0dWZmIGZvciByZXBvcnRpbmcgbG93LWxldmVsIGludGVybmFsIHN5bmNocm9uaXphdGlvbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIFVTRV9JVFRfTk9USUZZCisKKyAgICAvKgorICAgICAqIFN1cHBvcnQgZm9yIFNTQyBtYXJrcywgd2hpY2ggYXJlIHVzZWQgYnkgU0RFCisgICAgICogaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbnRlbC1zb2Z0d2FyZS1kZXZlbG9wbWVudC1lbXVsYXRvcgorICAgICAqIHRvIG1hcmsgcG9pbnRzIGluIGluc3RydWN0aW9uIHRyYWNlcyB0aGF0IHJlcHJlc2VudCBzcGluLWxvb3BzIGFuZCBhcmUKKyAgICAgKiB0aGVyZWZvcmUgdW5pbnRlcmVzdGluZyB3aGVuIGNvbGxlY3RpbmcgdHJhY2VzIGZvciBhcmNoaXRlY3R1cmUgc2ltdWxhdGlvbi4KKyAgICAgKi8KKyAgICAjaWZuZGVmIElOQ0xVREVfU1NDX01BUktTCisgICAgIyBkZWZpbmUgSU5DTFVERV9TU0NfTUFSS1MgKEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9YODZfNjQpCisgICAgI2VuZGlmCisKKyAgICAvKiBMaW51eCA2NCBvbmx5IGZvciBub3cgKi8KKyAgICAjaWYgKElOQ0xVREVfU1NDX01BUktTICYmIEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9YODZfNjQpCisgICAgLy8gUG9ydGFibGUgKGF0IGxlYXN0IGZvciBnY2MgYW5kIGljYykgY29kZSB0byBpbnNlcnQgdGhlIG5lY2Vzc2FyeSBpbnN0cnVjdGlvbnMKKyAgICAvLyB0byBzZXQgJWVieCBhbmQgZXhlY3V0ZSB0aGUgdW5saWtlbHkgbm8tb3AuCisgICAgICAjaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisgICAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSBfX1NTQ19NQVJLKHRhZykKKyAgICAgICNlbHNlCisgICAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92bCAlMCwgJSVlYng7IC5ieXRlIDB4NjQsIDB4NjcsIDB4OTAgIiA6OiJpIih0YWcpOiIlZWJ4IikKKyAgICAgICNlbmRpZgorICAgICNlbHNlCisgICAgIyBkZWZpbmUgSU5TRVJUX1NTQ19NQVJLKHRhZykgKCh2b2lkKTApCisgICAgI2VuZGlmCisKKyAgICAvKiBNYXJrZXJzIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiByZWdpb25zIHRoYXQgcmVwcmVzZW50IHBvbGxpbmcgYW5kCisgICAgICogYXJlIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHRvIGFyY2hpdGVjdHVyYWwgc2ltdWxhdGlvbnMgMHg0Mzc2IGFuZAorICAgICAqIDB4NDM3NyBhcmUgYXJiaXRyYXJ5IG51bWJlcnMgdGhhdCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzcGFjZSBvZgorICAgICAqIFNTQyB0YWdzLCBidXQgdGhlcmUgaXMgbm8gY2VudHJhbCBpc3N1aW5nIGF1dGhvcml0eSByYXRoZXIKKyAgICAgKiByYW5kb21uZXNzIGlzIGV4cGVjdGVkIHRvIHdvcmsuCisgICAgICovCisgICAgI2RlZmluZSBTU0NfTUFSS19TUElOX1NUQVJUKCkgSU5TRVJUX1NTQ19NQVJLKDB4NDM3NikKKyAgICAjZGVmaW5lIFNTQ19NQVJLX1NQSU5fRU5EKCkgICBJTlNFUlRfU1NDX01BUksoMHg0Mzc3KQorCisgICAgLy8gTWFya2VycyBmb3IgYXJjaGl0ZWN0dXJlIHNpbXVsYXRpb24uCisgICAgLy8gRk9SS0lORyAgICAgIDogQmVmb3JlIHRoZSBtYXN0ZXIgdGhyZWFkIGZvcmtzLgorICAgIC8vIEpPSU5JTkcgICAgICA6IEF0IHRoZSBzdGFydCBvZiB0aGUgam9pbi4KKyAgICAvLyBJTlZPS0lORyAgICAgOiBCZWZvcmUgdGhlIHRocmVhZHMgaW52b2tlIG1pY3JvdGFza3MuCisgICAgLy8gRElTUEFUQ0hfSU5JVDogQXQgdGhlIHN0YXJ0IG9mIGR5bmFtaWNhbGx5IHNjaGVkdWxlZCBsb29wLgorICAgIC8vIERJU1BBVENIX05FWFQ6IEFmdGVyIGNsYW1pbmcgbmV4dCBpdGVyYXRpb24gb2YgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisgICAgI2RlZmluZSBTU0NfTUFSS19GT1JLSU5HKCkgICAgICAgICAgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5MykKKyAgICAjZGVmaW5lIFNTQ19NQVJLX0pPSU5JTkcoKSAgICAgICAgICBJTlNFUlRfU1NDX01BUksoMHhkNjk0KQorICAgICNkZWZpbmUgU1NDX01BUktfSU5WT0tJTkcoKSAgICAgICAgIElOU0VSVF9TU0NfTUFSSygweGQ2OTUpCisgICAgI2RlZmluZSBTU0NfTUFSS19ESVNQQVRDSF9JTklUKCkgICAgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5NikKKyAgICAjZGVmaW5lIFNTQ19NQVJLX0RJU1BBVENIX05FWFQoKSAgICBJTlNFUlRfU1NDX01BUksoMHhkNjk3KQorCisgICAgLy8gVGhlIG9iamVjdCBpcyBhbiBhZGRyZXNzIHRoYXQgYXNzb2NpYXRlcyBhIHNwZWNpZmljIHNldCBvZiB0aGUgcHJlcGFyZSwgYWNxdWlyZSwgcmVsZWFzZSwKKyAgICAvLyBhbmQgY2FuY2VsIG9wZXJhdGlvbnMuCisKKyAgICAvKiBTeW5jIHByZXBhcmUgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHN0YXJ0IHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkCisgICAgICAgdG8gc2VuZCBhIHJlbGVhc2UgZXZlbnQuICBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgZG9uZSBqdXN0IGJlZm9yZSB0aGUgdGhyZWFkCisgICAgICAgYmVnaW5zIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSByZWxlYXNlIGV2ZW50ICovCisKKyAgICAvKiBTeW5jIGNhbmNlbCBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgY2FuY2VsbGluZyBhIHdhaXQgb24gYW5vdGhlciB0aHJlYWQgYW5jCisgICAgICAgY29udGludWluZyBleGVjdXRpb24gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHJlbGVhc2UgaXQgKi8KKworICAgIC8qIFN5bmMgYWNxdWlyZWQgaW5kaWNhdGVzIGEgdGhyZWFkIGhhcyByZWNlaXZlZCBhIHJlbGVhc2UgZXZlbnQgZnJvbSBhbm90aGVyCisgICAgICAgdGhyZWFkIGFuZCBoYXMgc3RvcHBlZCB3YWl0aW5nLiAgVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IGFmdGVyIHRoZSByZWxlYXNlCisgICAgICAgZXZlbnQgaXMgcmVjZWl2ZWQuICovCisKKyAgICAvKiBTeW5jIHJlbGVhc2UgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHNlbmQgYSByZWxlYXNlIGV2ZW50IHRvIGFub3RoZXIgdGhyZWFkCisgICAgICAgc28gaXQgd2lsbCBzdG9wIHdhaXRpbmcgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBqdXN0IGhhcHBlbiBiZWZvcmUKKyAgICAgICB0aGUgcmVsZWFzZSBldmVudC4gKi8KKworICAgICNkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgIF9faXR0X2ZzeW5jX3ByZXBhcmUoICAgKHZvaWQgKikoIG9iaiApICkKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwoICAgIG9iaiApICBfX2l0dF9mc3luY19jYW5jZWwoICAgICh2b2lkICopKCBvYmogKSApCisgICAgI2RlZmluZSBLTVBfRlNZTkNfQUNRVUlSRUQoICBvYmogKSAgX19pdHRfZnN5bmNfYWNxdWlyZWQoICAodm9pZCAqKSggb2JqICkgKQorICAgICNkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgIF9faXR0X2ZzeW5jX3JlbGVhc2luZyggKHZvaWQgKikoIG9iaiApICkKKworICAgIC8qCisgICAgICAgIEluIGNhc2Ugb2Ygd2FpdGluZyBpbiBhIHNwaW4gbG9vcCwgSVRUIHdhbnRzIEtNUF9GU1lOQ19QUkVQQVJFKCkgdG8gYmUgY2FsbGVkIHdpdGggYSBkZWxheQorICAgICAgICAoYW5kIG5vdCBjYWxsZWQgYXQgYWxsIGlmIHdhaXRpbmcgdGltZSBpcyBzbWFsbCkuIFNvLCBpbiBzcGluIGxvb3BzLCBkbyBub3QgdXNlCisgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCksIGJ1dCB1c2UgS01QX0ZTWU5DX1NQSU5fSU5JVCgpIChiZWZvcmUgc3BpbiBsb29wKSwKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSgpICh3aGl0aGluIHRoZSBzcGluIGxvb3ApLCBhbmQgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoKS4KKyAgICAgICAgU2VlIEtNUF9XQUlUX1lJRUxEKCkgZm9yIGV4YW1wbGUuCisgICAgKi8KKworICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fSU5JVAorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCBzcGluICkgICAgXAorICAgICAgICBpbnQgc3luY19pdGVycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyICkgeyAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBvYmogPT0gTlVMTCApIHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9iaiA9IHNwaW47ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTU0NfTUFSS19TUElOX1NUQVJUKCkKKworICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRQorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyICYmIHN5bmNfaXRlcnMgPCBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgXAorICAgICAgICAgICAgKysgc3luY19pdGVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBzeW5jX2l0ZXJzID49IF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICkgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCAodm9pZCopIG9iaiApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9IHdoaWxlICgwKQorICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKSBkbyB7ICAgICAgICAgXAorICAgICAgICBTU0NfTUFSS19TUElOX0VORCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3luY19pdGVycyA+PSBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgIFwKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggKHZvaWQqKSBvYmogKTsgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gd2hpbGUgKDApCisKKyAgICAvKiBJVFQgd2lsbCBub3QgcmVwb3J0IG9iamVjdHMgY3JlYXRlZCB3aXRoaW4gS01QX0lUVF9JR05PUkUoKSwgZS4gZy46CisgICAgICAgICAgIEtNUF9JVFRfSUdOT1JFKAorICAgICAgICAgICAgICAgcHRyID0gbWFsbG9jKCBzaXplICk7CisgICAgICAgICAgICk7CisgICAgKi8KKyAgICAjZGVmaW5lIEtNUF9JVFRfSUdOT1JFKCBzdGF0ZW1lbnQgKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9faXR0X3N0YXRlX3QgX19pdHRfc3RhdGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX19pdHRfc3RhdGVfZ2V0X3B0ciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9zdGF0ZV8gPSBfX2l0dF9zdGF0ZV9nZXQoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9vYmpfbW9kZV9zZXQoIF9faXR0X29ial9wcm9wX2lnbm9yZSwgX19pdHRfb2JqX3N0YXRlX3NldCApOyBcCisgICAgICAgICAgICB9ICAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7IHN0YXRlbWVudCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIF9faXR0X3N0YXRlX2dldF9wdHIgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19pdHRfc3RhdGVfc2V0KCBfX2l0dF9zdGF0ZV8gKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGNvbnN0IGludCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMgPSA1MTI7IC8vIE1heGltdW0gbnVtYmVyIG9mIGZyYW1lIGRvbWFpbnMgdG8gdXNlIChtYXBzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IE9wZW5NUCByZWdpb25zIGluIHRoZSB1c2VyIHNvdXJjZSBjb2RlKS4KKyAgICBleHRlcm4ga21wX2ludDMyIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50OworICAgIGV4dGVybiBrbXBfaW50MzIgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudDsKKyAgICBleHRlcm4gX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIGV4dGVybiBfX2l0dF9kb21haW4gKiBtZXRhZGF0YV9kb21haW47CisKKyNlbHNlCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKyMgZGVmaW5lIEtNUF9GU1lOQ19QUkVQQVJFKCAgIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwoICAgIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19BQ1FVSVJFRCggIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19SRUxFQVNJTkcoIG9iaiApICAgICAgICAoKHZvaWQpMCkKKworIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCBzcGluICkgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggIG9iaiApICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfSVRUX0lHTk9SRShzdG10ICkgZG8geyBzdG10IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvLyBVU0VfSVRUX05PVElGWQorCisjaWYgISBLTVBfREVCVUcKKyAgICAvLyBJbiByZWxlYXNlIG1vZGUgaW5jbHVkZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgZnVuY3Rpb25zLgorICAgICNpbmNsdWRlICJrbXBfaXR0LmlubCIKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0lUVF9ICisKKyNlbHNlICAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKy8vIElmIFVTRV9JVFRfQlVMSUQgaXMgbm90IGVuYWJsZWQsIFVTRV9JVFRfTk9USUZZIGNhbm5vdCBiZSBlaXRoZXIuCisvLyBCeSBkZWZpbmluZyB0aGVzZSB3ZSBhdm9pZCB1bnBsZWFzYW50IGlmZGVmIHRlc3RzIGluIG1hbnkgcGxhY2VzLgorIyBkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKCAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgICAgICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCAgb2JqICkgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICkgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9JVFRfSUdOT1JFKHN0bXQgKSBkbyB7IHN0bXQgfSB3aGlsZSAoMCkKKworIyBkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkKKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sIGIvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5pbmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhZmE2YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sCkBAIC0wLDAgKzEsMTEzMCBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmlubCAtLSBJbmxpbmUgZnVuY3Rpb25zIG9mIElUVCBOb3RpZnkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIElubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4gVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBpbnRvIGttcF9pdHQuaCBmaWxlIGZvciBwcm9kaWN0aW9uCisvLyBidWlsZCAodG8gbGV0IGNvbXBsaWxlciBpbmxpbmUgZnVuY3Rpb25zKSBvciBpbnRvIGttcF9pdHQuYyBmaWxlIGZvciBkZWJ1ZyBidWlsZCAodG8gcmVkdWNlCisvLyB0aGUgbnVtYmVyIG9mIGZpbGVzIHRvIHJlY29tcGlsZSBhbmQgc2F2ZSBidWlsZCB0aW1lKS4KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWYgS01QX0lUVF9ERUJVRworICAgIGV4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pdHRfZGVidWdfbG9jazsKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfTE9DSygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9pdHRfZGVidWdfbG9jayApOyAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBLTVBfSVRUX0RFQlVHX1BSSU5UKCAuLi4gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiMlMDJkOiAiLCBfX2ttcF9nZXRfZ3RpZCgpICk7ICAgICAgICAgICAgICBcCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgX19WQV9BUkdTX18gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZmbHVzaCggc3RkZXJyICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfaXR0X2RlYnVnX2xvY2sgKTsgICAgICBcCisgICAgfQorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfTE9DSygpCisgICAgI2RlZmluZSBLTVBfSVRUX0RFQlVHX1BSSU5UKCAuLi4gKQorI2VuZGlmIC8vIEtNUF9JVFRfREVCVUcKKworLy8gRW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9ucyBhcmUgc3RhdGljIGlmIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUKKy8vIGJlaW5nIGlubGluZWQuIE90aGVyd2lzZSB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIG1vcmUgdGhhbiBvbmUgZmlsZSwKKy8vIHNpbmNlIHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMuCisjaWYgS01QX0RFQlVHCisjIGRlZmluZSBMSU5LQUdFCisjZWxzZQorIyBkZWZpbmUgTElOS0FHRSBzdGF0aWMgaW5saW5lCisjZW5kaWYKKworLy8gWkNBIGludGVyZmFjZSB1c2VkIGJ5IEludGVsKFIpIEluc3BlY3Rvci4gSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyIHVzZXMgdGhpcworLy8gQVBJIHRvIHN1cHBvcnQgdXNlci1kZWZpbmVkIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLCBidXQgZG9lcyBub3QgdXNlIFpDQTsKKy8vIGl0IHdvdWxkIGJlIHNhZmUgdG8gdHVybiB0aGlzIG9mZiB1bnRpbCB3aWRlciBzdXBwb3J0IGJlY29tZXMgYXZhaWxhYmxlLgorI2lmIFVTRV9JVFRfWkNBCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorIyAgIGlmIF9fSU5URUxfQ09NUElMRVIgPj0gMTIwMAorIyAgICAgICB1bmRlZiBfX2l0dF9zeW5jX2FjcXVpcmVkCisjICAgICAgIHVuZGVmIF9faXR0X3N5bmNfcmVsZWFzaW5nCisjICAgICAgIGRlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkKGFkZHIpICAgIF9fbm90aWZ5X3pjX2ludHJpbnNpYygoY2hhciAqKSJzeW5jX2FjcXVpcmVkIiwgYWRkcikKKyMgICAgICAgZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nKGFkZHIpICAgX19ub3RpZnlfaW50cmluc2ljKChjaGFyICopInN5bmNfcmVsZWFzaW5nIiwgYWRkcikKKyMgICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190ICBtZXRhZGF0YV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBtZXRhZGF0YV9sb2NrICk7CisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZy4KKworICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyBzaG91bGQgYmUgY2FsbGVkIGJ5IG1hc3RlciB0aHJlYWQgb2YgYSB0ZWFtLiBFeGFjdCBtb21lbnQgb2YKKyAgICAgICAgICBjYWxsIGRvZXMgbm90IG1hdHRlciwgYnV0IGl0IHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIGFueSB0aHJlYWQgb2YgdGhpcyB0ZWFtIGNhbGxzCisgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZy4KKyAgICAgICAgKiBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nIHNob3VsZCBiZSBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgb2YgYSB0ZWFtIGp1c3QgYmVmb3JlIGVudGVyaW5nCisgICAgICAgICAgcGFyYWxsZWwgcmVnaW9uIGJvZHkuCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkIG9mIGEgdGVhbSByaWdodCBhZnRlciByZXR1cm5pbmcKKyAgICAgICAgICBmcm9tIHBhcmFsbGVsIHJlZ2lvbiBib2R5LgorICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fam9pbmVkIHNob3VsZCBiZSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBvZiBhIHRlYW0sIGFmdGVyIGFsbCB0aHJlYWRzCisgICAgICAgICAgY2FsbGVkIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQuCisKKyAgICBOb3RlOiBUaHJlYWQgd2FpdGluZyBhdCBqb2luIGJhcnJpZXIgKGFmdGVyIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQpIGNhbiBleGVjdXRlIHNvbWUgbW9yZQorICAgIHVzZXIgY29kZSAtLSBzdWNoIGEgdGhyZWFkIGNhbiBleGVjdXRlIHRhc2tzLgorCisgICAgTm90ZTogVGhlIG92ZXJoZWFkIG9mIGxvZ2dpbmcgcmVnaW9uX3N0YXJ0aW5nIGFuZCByZWdpb25fZmluaXNoZWQgaW4gZWFjaCB0aHJlYWQgaXMgdG9vIGxhcmdlLAorICAgIHNvIHRoZXNlIGNhbGxzIGFyZSBub3QgdXNlZC4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fZm9ya2luZyggaW50IGd0aWQsIGludCB0ZWFtX3NpemUsIGludCBiYXJyaWVycywgaW50IHNlcmlhbGl6ZWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBrbXBfdGVhbV90ICogICAgICB0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBpZiAodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArIHNlcmlhbGl6ZWQgPiAxKQorICAgIHsKKyAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlkZW50X3QgKiAgICAgICAgIGxvYyAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICktPnRoLnRoX2lkZW50OworICAgIGlmIChsb2MpIHsKKyAgICAgICAgLy8gVXNlIHRoZSByZXNlcnZlZF8yIGZpZWxkIHRvIHN0b3JlIHRoZSBpbmRleCB0byB0aGUgcmVnaW9uIGRvbWFpbi4KKyAgICAgICAgLy8gQXNzdW1lIHRoYXQgcmVzZXJ2ZWRfMiBjb250YWlucyB6ZXJvIGluaXRpYWxseS4gIFNpbmNlIHplcm8gaXMgc3BlY2lhbAorICAgICAgICAvLyB2YWx1ZSBoZXJlLCBzdG9yZSB0aGUgaW5kZXggaW50byBkb21haW4gYXJyYXkgaW5jcmVhc2VkIGJ5IDEuCisgICAgICAgIGlmIChsb2MtPnJlc2VydmVkXzIgPT0gMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9pZiAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJmxvYy0+cmVzZXJ2ZWRfMiwgMCwgZnJtICsgMSApKSB7CisgICAgICAgICAgICAgICAgLy8gICAgZnJtID0gbG9jLT5yZXNlcnZlZF8yIC0gMTsgICAvLyBnZXQgdmFsdWUgc2F2ZWQgYnkgb3RoZXIgdGhyZWFkIGZvciBzYW1lIGxvYworICAgICAgICAgICAgICAgIC8vfSAvLyBBQzogdGhpcyBibG9jayBpcyB0byByZXBsYWNlIG5leHQgdW5zeW5jaHJvbml6ZWQgbGluZQorCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzYXZlIGluZGV4ZXMgZm9yIGJvdGggcmVnaW9uIGFuZCBiYXJyaWVyIGZyYW1lcy4gV2UnbGwgdXNlIGxvYy0+cmVzZXJ2ZWRfMgorICAgICAgICAgICAgICAgIC8vIGZpZWxkIGJ1dCBwdXQgcmVnaW9uIGluZGV4IHRvIHRoZSBsb3cgdHdvIGJ5dGVzIGFuZCBiYXJyaWVyIGluZGV4ZXMgdG8gdGhlIGhpZ2gKKyAgICAgICAgICAgICAgICAvLyB0d28gYnl0ZXMuIEl0IGlzIE9LIGJlY2F1c2UgS01QX01BWF9GUkFNRV9ET01BSU5TID0gNTEyLgorICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSAibmV3IiB2YWx1ZQorCisgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgdG9vbHMgbW9yZSBvciBsZXNzIHN0YW5kYXJkaXplZCBvbjoKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGZ1bmM+JG9tcCRwYXJhbGxlbEBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCB0ZWFtX3NpemUsIHN0cl9sb2MuZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKworICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIGlmKCBiYXJyaWVycyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyQCVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgYmFycmllciBmcmFtZSBpbmRleCB0byB0aGUgaGlnaCB0d28gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBsb2MtPnJlc2VydmVkXzIgfD0gKGZybSArIDEpIDw8IDE2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gUmVnaW9uIGRvbWFpbiBleGlzdHMgZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRlYW0gc2l6ZSB3YXMgY2hhbmdlZC4gVGhlbiBjcmVhdGUgbmV3IHJlZ2lvbiBkb21haW4gZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgICAgICAgaWYoIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gIT0gdGVhbV9zaXplICkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5saW5lLCBzdHJfbG9jLmNvbCk7CisKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl90ZWFtX3NpemVbZnJtXSA9IHRlYW1fc2l6ZTsKKyAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbZnJtXSwgTlVMTCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBUZWFtIHNpemUgd2FzIG5vdCBjaGFuZ2VkLiBVc2UgZXhpc3RpbmcgZG9tYWluLgorICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX2JlZ2luX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltmcm0gYmVnXSBndGlkPSVkLCBpZHg9JXgsIHNlcmlhbGl6ZWQ6JWQsIGxvYzolcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBsb2MtPnJlc2VydmVkXzIsIHNlcmlhbGl6ZWQsIGxvYyApOworICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKiBsb2MsIGludCB0ZWFtX3NpemUsIGludCByZWdpb24gKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiggcmVnaW9uICkgeworICAgICAgICBrbXBfdGVhbV90ICogICAgICB0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgaW50IHNlcmlhbGl6ZWQgPSAoIHJlZ2lvbiA9PSAyID8gMSA6IDAgKTsKKyAgICAgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyBzZXJpYWxpemVkID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICAvL0NoZWNrIHJlZ2lvbiBkb21haW4gaGFzIG5vdCBiZWVuIGNyZWF0ZWQgYmVmb3JlLiBJdCdzIGluZGV4IGlzIHNhdmVkIGluIHRoZSBsb3cgdHdvIGJ5dGVzLgorICAgICAgICAgaWYgKChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSA9PSAwKSB7CisgICAgICAgICAgICAgaWYgKF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgaW50IGZybSA9IEtNUF9URVNUX1RIRU5fSU5DMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNhdmUgaW5kZXhlcyBmb3IgYm90aCByZWdpb24gYW5kIGJhcnJpZXIgZnJhbWVzLiBXZSdsbCB1c2UgbG9jLT5yZXNlcnZlZF8yCisgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGJ1dCBwdXQgcmVnaW9uIGluZGV4IHRvIHRoZSBsb3cgdHdvIGJ5dGVzIGFuZCBiYXJyaWVyIGluZGV4ZXMgdG8gdGhlIGhpZ2gKKyAgICAgICAgICAgICAgICAgLy8gdHdvIGJ5dGVzLiBJdCBpcyBPSyBiZWNhdXNlIEtNUF9NQVhfRlJBTUVfRE9NQUlOUyA9IDUxMi4KKyAgICAgICAgICAgICAgICAgbG9jLT5yZXNlcnZlZF8yIHw9IChmcm0gKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJHBhcmFsbGVsOnRlYW1fc2l6ZUBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MubGluZSwgc3RyX2xvYy5jb2wpOworCisgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gPSB0ZWFtX3NpemU7CisgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsgLy8gUmVnaW9uIGRvbWFpbiBleGlzdHMgZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgICAvLyBDaGVjayBpZiB0ZWFtIHNpemUgd2FzIGNoYW5nZWQuIFRoZW4gY3JlYXRlIG5ldyByZWdpb24gZG9tYWluIGZvciB0aGlzIGxvY2F0aW9uCisgICAgICAgICAgICAgaW50IGZybSA9IChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSAtIDE7CisgICAgICAgICAgICAgaWYoIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gIT0gdGVhbV9zaXplICkgeworICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKworICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dID0gdGVhbV9zaXplOworICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgIH0gZWxzZSB7IC8vIFRlYW0gc2l6ZSB3YXMgbm90IGNoYW5nZWQuIFVzZSBleGlzdGluZyBkb21haW4uCisgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3JlZyBzdWJdIGd0aWQ9JWQsIGlkeD0leCwgcmVnaW9uOiVkLCBsb2M6JXAsIGJlZzolbGx1LCBlbmQ6JWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yLCByZWdpb24sIGxvYywgYmVnaW4sIGVuZCApOworICAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7IC8vIGNhbGxlZCBmb3IgYmFycmllciByZXBvcnRpbmcKKyAgICAgICAgaWYgKGxvYykgeworICAgICAgICAgICAgaWYgKChsb2MtPnJlc2VydmVkXzIgJiAweEZGRkYwMDAwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBpZiAoZnJtID49IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgYmFycmllciBmcmFtZSBpbmRleCB0byB0aGUgaGlnaCB0d28gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSkgPDwgMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJGZyYW1lQFtmaWxlOl08bGluZT5bOjxjb2w+XSIKKyAgICAgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGltYmFsYW5jZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmX2ltYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmX2ltYiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyLWltYmFsYW5jZTolZEAlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmZfaW1iICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmZfaW1iICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJGJhcnJpZXJAJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgaXQgaXMgbm90IDAgdGhlbiBpdCBzaG91bGQgYmUgPD0gS01QX01BWF9GUkFNRV9ET01BSU5TCisgICAgICAgICAgICAgICAgaWYoIGltYmFsYW5jZSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9pbWJhbGFuY2VfZG9tYWluc1sgKGxvYy0+cmVzZXJ2ZWRfMiA+PiAxNikgLSAxIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2JhcnJpZXJfZG9tYWluc1sobG9jLT5yZXNlcnZlZF8yID4+IDE2KSAtIDFdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2ZybSBzdWJdIGd0aWQ9JWQsIGlkeD0leCwgbG9jOiVwLCBiZWc6JWxsdSwgZW5kOiVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGxvYy0+cmVzZXJ2ZWRfMiwgbG9jLCBiZWdpbiwgZW5kICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZSggaW50IGd0aWQsIGttcF91aW50NjQgYmVnaW4sIGttcF91aW50NjQgZW5kLCBrbXBfdWludDY0IGltYmFsYW5jZSwga21wX3VpbnQ2NCByZWR1Y3Rpb24gKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBtZXRhZGF0YV9sb2NrICk7CisgICAgICAgIGlmKCBtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgIG1ldGFkYXRhX2RvbWFpbiA9IF9faXR0X2RvbWFpbl9jcmVhdGUoICJPTVAgTWV0YWRhdGEiICk7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICB9CisKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICogc3RyaW5nX2hhbmRsZSA9IF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKCAib21wX21ldGFkYXRhX2ltYmFsYW5jZSIpOworCisgICAga21wX3VpbnQ2NCBpbWJhbGFuY2VfZGF0YVsgNCBdOworICAgIGltYmFsYW5jZV9kYXRhWyAwIF0gPSBiZWdpbjsKKyAgICBpbWJhbGFuY2VfZGF0YVsgMSBdID0gZW5kOworICAgIGltYmFsYW5jZV9kYXRhWyAyIF0gPSBpbWJhbGFuY2U7CisgICAgaW1iYWxhbmNlX2RhdGFbIDMgXSA9IHJlZHVjdGlvbjsKKworICAgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGUsIF9faXR0X21ldGFkYXRhX3U2NCwgNCwgaW1iYWxhbmNlX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9tZXRhZGF0YV9sb29wKCBpZGVudF90ICogbG9jLCBrbXBfdWludDY0IHNjaGVkX3R5cGUsIGttcF91aW50NjQgaXRlcmF0aW9ucywga21wX3VpbnQ2NCBjaHVuayApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmKCBtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICAgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgbWV0YWRhdGFfZG9tYWluID0gX19pdHRfZG9tYWluX2NyZWF0ZSggIk9NUCBNZXRhZGF0YSIgKTsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgIH0KKworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKiBzdHJpbmdfaGFuZGxlID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfbG9vcCIpOworICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisKKyAgICBrbXBfdWludDY0IGxvb3BfZGF0YVsgNSBdOworICAgIGxvb3BfZGF0YVsgMCBdID0gc3RyX2xvYy5saW5lOworICAgIGxvb3BfZGF0YVsgMSBdID0gc3RyX2xvYy5jb2w7CisgICAgbG9vcF9kYXRhWyAyIF0gPSBzY2hlZF90eXBlOworICAgIGxvb3BfZGF0YVsgMyBdID0gaXRlcmF0aW9uczsKKyAgICBsb29wX2RhdGFbIDQgXSA9IGNodW5rOworCisgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworCisgICAgX19pdHRfbWV0YWRhdGFfYWRkKG1ldGFkYXRhX2RvbWFpbiwgX19pdHRfbnVsbCwgc3RyaW5nX2hhbmRsZSwgX19pdHRfbWV0YWRhdGFfdTY0LCA1LCBsb29wX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfbWV0YWRhdGFfc2luZ2xlKCBpZGVudF90ICogbG9jICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgICAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBtZXRhZGF0YV9kb21haW4gPSBfX2l0dF9kb21haW5fY3JlYXRlKCAiT01QIE1ldGFkYXRhIiApOworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBtZXRhZGF0YV9sb2NrICk7CisgICAgfQorCisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGUgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9zaW5nbGUiKTsKKyAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgIGttcF91aW50NjQgc2luZ2xlX2RhdGFbIDIgXTsKKyAgICBzaW5nbGVfZGF0YVsgMCBdID0gc3RyX2xvYy5saW5lOworICAgIHNpbmdsZV9kYXRhWyAxIF0gPSBzdHJfbG9jLmNvbDsKKworICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKworICAgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGUsIF9faXR0X21ldGFkYXRhX3U2NCwgMiwgc2luZ2xlX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9zaW5nbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fc3RhcnRpbmcoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZCggaW50IGd0aWQsIGludCBzZXJpYWxpemVkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX3RlYW1fdCAqICAgICAgdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyBzZXJpYWxpemVkID4gMSkKKyAgICB7CisgICAgICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZGVudF90ICogICAgICAgICBsb2MgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pZGVudDsKKyAgICBpZiAobG9jICYmIGxvYy0+cmVzZXJ2ZWRfMikKKyAgICB7CisgICAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgICBpZihmcm0gPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICAgICAgX19pdHRfZnJhbWVfZW5kX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMKTsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbZnJtIGVuZF0gZ3RpZD0lZCwgaWR4PSV4LCBzZXJpYWxpemVkOiVkLCBsb2M6JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yLCBzZXJpYWxpemVkLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEJhcnJpZXJzIHJlcG9ydGluZy4KKworICAgIEEgYmFycmllciBjb25zaXN0cyBvZiB0d28gcGhhc2VzOgorCisgICAgICAgIDEuIEdhdGhlciAtLSBtYXN0ZXIgd2FpdHMgZm9yIGFycml2aW5nIG9mIGFsbCB0aGUgd29ya2VyIHRocmVhZHM7IGVhY2ggd29ya2VyIHRocmVhZAorICAgICAgICAgICByZWdpc3RlcnMgYXJyaXZhbCBhbmQgZ29lcyBmdXJ0aGVyLgorICAgICAgICAyLiBSZWxlYXNlIC0tIGVhY2ggd29ya2VyIHRocmVhZHMgd2FpdHMgdW50aWwgbWFzdGVyIGxldHMgaXQgZ287IG1hc3RlciBsZXRzIHdvcmtlciB0aHJlYWRzCisgICAgICAgICAgIGdvLgorCisgICAgRnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSBlYWNoIHRocmVhZDoKKworICAgICAgICAqIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCkgLS0gYmVmb3JlIGFycml2aW5nIHRvIHRoZSBnYXRoZXIgcGhhc2UuCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCkgICAtLSBiZXR3ZWVuIGdhdGhlciBhbmQgcmVsZWFzZSBwaGFzZXMuCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoKSAtLSBhZnRlciByZWxlYXNlIHBoYXNlLgorCisgICAgTm90ZTogQ2FsbCBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoKSBiZWZvcmUgY2FsbCB0byBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZygpIGFuZCBzYXZlCisgICAgcmVzdWx0IGluIGxvY2FsIHZhcmlhYmxlLiBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoKSwgYmVpbmcgY2FsbGVkIHRvbyBsYXRlIChlLiBnLiBhZnRlciBnYXRoZXIKKyAgICBwaGFzZSkgd291bGQgcmV0dXJuIGl0dCBzeW5jIG9iamVjdCBmb3IgdGhlIG5leHQgYmFycmllciEKKworICAgIElUVCBuZWVkIGFuIGFkZHJlc3MgKHZvaWQgKikgdG8gYmUgc3BlY2lmaWVkIGFzIGEgc3luYyBvYmplY3QuIE9wZW5NUCBSVEwgZG9lcyBub3QgaGF2ZQorICAgIGJhcnJpZXIgb2JqZWN0IG9yIGJhcnJpZXIgZGF0YSBzdHJ1Y3R1cmUuIEJhcnJpZXIgaXMganVzdCBhIGNvdW50ZXIgaW4gdGVhbSBhbmQgdGhyZWFkCisgICAgc3RydWN0dXJlcy4gV2UgY291bGQgdXNlIGFuIGFkZHJlc3Mgb2YgdGVhbSBzdHJ1Y3R1cmUgYXMgYW4gYmFycmllciBzeW5jIG9iamVjdCwgYnV0IElUVCB3YW50cworICAgIGRpZmZlcmVudCBvYmplY3RzIGZvciBkaWZmZXJlbnQgYmFycmllcnMgKGV2ZW4gd2hpdGhpbiB0aGUgc2FtZSB0ZWFtKS4gU28gbGV0IHVzIHVzZQorICAgIHRlYW0gYWRkcmVzcyBhcyBiYXJyaWVyIHN5bmMgb2JqZWN0IGZvciB0aGUgZmlyc3QgYmFycmllciwgdGhlbiBpbmNyZWFzZSBpdCBieSBvbmUgZm9yIHRoZSBuZXh0CisgICAgYmFycmllciwgYW5kIHNvIG9uIChidXQgd3JhcCBpdCBub3QgdG8gdXNlIGFkZHJlc3NlcyBvdXRzaWRlIG9mIHRlYW0gc3RydWN0dXJlKS4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZCAqCitfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoCisgICAgaW50ICBndGlkLAorICAgIGludCAgYnQsCisgICAgaW50ICBzZXRfbmFtZSwKKyAgICBpbnQgIGRlbHRhICAgIC8vIDAgKGN1cnJlbnQgYmFycmllcikgaXMgZGVmYXVsdCB2YWx1ZTsgc3BlY2lmeSAtMSB0byBnZXQgcHJldmlvdXMgYmFycmllci4KKykgeworICAgIHZvaWQgKiBvYmplY3QgPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX2luZm9fdCAqICAgIHRociAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3RlYW1fdCAqICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisKKyAgICAvLyBOT1RFOgorICAgIC8vIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBfX2ttcF9mb3JrX2JhcnJpZXIsIHRlYW0gcG9pbnRlciBjYW4gYmUgTlVMTC4gVGhpcyAiaWYiCisgICAgLy8gaGVscHMgdG8gYXZvaWQgY3Jhc2guIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGNvbXBsZXRlIHNvbHV0aW9uLCBhbmQgcmVwb3J0aW5nIGZvcmsvam9pbgorICAgIC8vIGJhcnJpZXJzIHRvIElUVCBzaG91bGQgYmUgcmV2aXNpdGVkLgorCisgICAgaWYgKCB0ZWFtICE9IE5VTEwgKSB7CisKKyAgICAgICAgLy8gTWFzdGVyIHRocmVhZCBpbmNyZWFzZXMgYl9hcnJpdmVkIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgZWFjaCB0aW1lLiBEaXZpZGUgYl9hcnJpdmVkCisgICAgICAgIC8vIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgdG8gZ2V0IHBsYWluIGJhcnJpZXIgY291bnRlci4KKyAgICAgICAga21wX3VpbnQ2NCBjb3VudGVyID0gdGVhbS0+dC50X2JhclsgYnQgXS5iX2Fycml2ZWQgLyBLTVBfQkFSUklFUl9TVEFURV9CVU1QICsgZGVsdGE7CisgICAgICAgIC8vIE5vdyBmb3JtIHRoZSBiYXJyaWVyIGlkLiBFbmNvZGUgYmFycmllciB0eXBlIChidCkgaW4gYmFycmllciBpZCB0b28sIHNvIGJhcnJpZXJzIG9mCisgICAgICAgIC8vIGRpZmZlcmVudCB0eXBlcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBpZHMuCisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZigga21wX3RlYW1fdCApID49IGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gVGhpcyBjb25kaXRvbiBpcyBhIG11c3QgKHdlIHdvdWxkIGhhdmUgemVybyBkaXZpZGUgb3RoZXJ3aXNlKS4KKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBrbXBfdGVhbV90ICkgPj0gMiAqIGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gTW9yZSBzdHJvbmcgY29uZGl0aW9uOiBtYWtlIHN1cmUgd2UgaGF2ZSByb29tIGF0IGxlYXN0IGZvciBmb3IgdHdvIGRpZmZlcnRlbnQgaWRzCisgICAgICAgICAgICAvLyAoZm9yIGVhY2ggYmFycmllciB0eXBlKS4KKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRlYW0gKQorICAgICAgICAgICAgICAgICAgICArIGNvdW50ZXIgJSAoIHNpemVvZigga21wX3RlYW1fdCApIC8gYnNfbGFzdF9iYXJyaWVyICkgKiBic19sYXN0X2JhcnJpZXIKKyAgICAgICAgICAgICAgICAgICAgKyBidAorICAgICAgICAgICAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG9ial0gdHlwZT0lZCwgY291bnRlcj0lbGxkLCBvYmplY3Q9JXBcbiIsIGJ0LCBjb3VudGVyLCBvYmplY3QgKTsKKworICAgICAgICBpZiAoIHNldF9uYW1lICkgeworICAgICAgICAgICAgaWRlbnRfdCBjb25zdCAqIGxvYyAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqICAgIHR5cGUgPSAiT01QIEJhcnJpZXIiOworICAgICAgICAgICAgc3dpdGNoICggYnQgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBic19wbGFpbl9iYXJyaWVyIDogeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcGxhaW4gYmFycmllciBjb21waWxlciBjYWxscyBfX2ttcGNfYmFycmllcigpIGZ1bmN0aW9uLCB3aGljaCBzYXZlcworICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbiBpbiB0aHItPnRoLnRoX2lkZW50LgorICAgICAgICAgICAgICAgICAgICBsb2MgPSB0aHItPnRoLnRoX2lkZW50OworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJhcnJpZXIgdHlwZSBmcm9tIGZsYWdzIHByb3ZpZGVkIGJ5IGNvbXBpbGVyLgorICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgICBleHBsID0gMDsKKyAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAgaW1wbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9jICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgID0gbG9jLT5wc291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwbCA9ICggbG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0VYUEwgKSAhPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW1wbCA9ICggbG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0lNUEwgKSAhPSAwOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoIGltcGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBsb2MtPmZsYWdzICYgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9NQVNLICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9GT1IgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEZvciBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TRUNUSU9OUyA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgU2VjdGlvbnMgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0lOR0xFIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBTaW5nbGUgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfV09SS1NIQVJFIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBXb3Jrc2hhcmUgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBJbXBsaWNpdCBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9OyAvKiBzd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggZXhwbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEV4cGxpY2l0IEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICB9OyAvKiBpZiAqLworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBic19mb3Jram9pbl9iYXJyaWVyIDogeworICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGZvcmsvam9pbiBiYXJyaWVyIHdlIGNhbiByZWFkIHRoci0+dGgudGhfaWRlbnQsIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbnMgbG9jYXRpb24gb2YgbGFzdCBwYXNzZWQgY29uc3RydWN0ICh3aGlsZSBqb2luIGJhcnJpZXIgaXMgbm90CisgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2ggb25lKS4gVXNlIHRoX2lkZW50IG9mIG1hc3RlciB0aHJlYWQgaW5zdGVhZCAtLSBfX2ttcF9qb2luX2NhbGwoKQorICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgc2F2ZXMgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIEFDOiBjYW5ub3QgcmVhZCBmcm9tIG1hc3RlciBiZWNhdXNlIF9fa21wX2pvaW5fY2FsbCBtYXkgYmUgbm90IGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAvLyAgICB5ZXQsIHNvIHdlIHJlYWQgdGhlIGxvY2F0aW9uIGZyb20gdGVhbS4gVGhpcyBpcyB0aGUgc2FtZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgQW5kIHRlYW0gaXMgdmFsaWQgYXQgdGhlIGVudGVyIHRvIGpvaW4gYmFycmllciB3aGVyZSB0aGlzIGhhcHBlbnMuCisgICAgICAgICAgICAgICAgICAgIGxvYyAgPSB0ZWFtLT50LnRfaWRlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9jICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgID0gbG9jLT5wc291cmNlOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBKb2luIEJhcnJpZXIiOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICAgICAgX19pdHRfc3luY19jcmVhdGUoIG9iamVjdCwgdHlwZSwgc3JjLCBfX2l0dF9hdHRyX2JhcnJpZXIgKTsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIHN0YV0gc2NyZSggJXAsIFwiJXNcIiwgXCIlc1wiLCBfX2l0dF9hdHRyX2JhcnJpZXIgKVxuIiwgb2JqZWN0LCB0eXBlLCBzcmMgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGlmCisjZW5kaWYKKyAgICByZXR1cm4gb2JqZWN0OworfSAvLyBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoICFLTVBfTUFTVEVSX0dUSUQoIGd0aWQgKSApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgc3RhXSBzcmVsKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgc3RhXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF9iYXJyaWVyX21pZGRsZSggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIEtNUF9NQVNURVJfR1RJRCggZ3RpZCApICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG1pZF0gc2FjcSggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG1pZF0gc3JlbCggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfSBlbHNlIHsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggS01QX01BU1RFUl9HVElEKCBndGlkICkgKSB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBlbmRdIHNhY3EoICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUYXNrd2FpdCByZXBvcnRpbmcuCisKKyAgICBJVFQgbmVlZCBhbiBhZGRyZXNzICh2b2lkICopIHRvIGJlIHNwZWNpZmllZCBhcyBhIHN5bmMgb2JqZWN0LiBPcGVuTVAgUlRMIGRvZXMgbm90IGhhdmUgdGFza3dhaXQKKyAgICBzdHJ1Y3R1cmUsIHNvIHdlIG5lZWQgdG8gY29uc3RydWN0IHNvbWV0aGluZy4KKworKi8KKwordm9pZCAqCitfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApIHsKKyAgICB2b2lkICogb2JqZWN0ID0gTlVMTDsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfaW5mb190ICogICAgIHRocmVhZCAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRhc2tkYXRhICkgKyB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciAlIHNpemVvZigga21wX3Rhc2tkYXRhX3QgKQorICAgICAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgcmV0dXJuIG9iamVjdDsKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdAorCit2b2lkCitfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoCisgICAgaW50ICAgICBndGlkLAorICAgIHZvaWQgKiAgb2JqZWN0CispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF9pbmZvX3QgKiAgICAgdGhyZWFkICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgaWRlbnRfdCBjb25zdCAqICBsb2MgICAgICA9IHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudDsKKyAgICBjaGFyIGNvbnN0ICogICAgIHNyYyAgICAgID0gKCBsb2MgPT0gTlVMTD8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsICJPTVAgVGFza3dhaXQiLCBzcmMsIDAgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3R3YSBzdGFdIHNjcmUoICVwLCBcIk9NUCBUYXNrd2FpdFwiLCBcIiVzXCIsIDAgKVxuIiwgb2JqZWN0LCBzcmMgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIHN0YV0gc3ByZSggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nCisKK3ZvaWQKK19fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCgKKyAgICBpbnQgICAgIGd0aWQsCisgICAgdm9pZCAqICBvYmplY3QKKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2EgZW5kXSBzYWNxKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2Rlc3Ryb3koIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIGVuZF0gc2RlcyggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGFzayByZXBvcnRpbmcuCisKKyAgICBPbmx5IHRob3NlIHRhc2tzIGFyZSByZXBvcnRlZCB3aGljaCBhcmUgZXhlY3V0ZWQgYnkgYSB0aHJlYWQgc3Bpbm5pbmcgYXQgYmFycmllciAob3IgdGFza3dhaXQpLgorICAgIFN5bmNoIG9iamVjdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIG11c3QgYmUgYmFycmllciBvZiB0YXNrd2FpdCB0aGUgdGhyZWFkcyB3YWl0aW5nIGF0LgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoCisgICAgdm9pZCAqIG9iamVjdCAgICAgLy8gSVRUIHN5bmMgb2JqZWN0OiBiYXJyaWVyIG9yIHRhc2t3YWl0LgorKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIG9iamVjdCAhPSBOVUxMICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3RzayBzdGFdIHNjYW4oICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfdGFza19maW5pc2hlZCgKKyAgICB2b2lkICogb2JqZWN0ICAgICAvLyBJVFQgc3luYyBvYmplY3Q6IGJhcnJpZXIgb3IgdGFza3dhaXQuCispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0c2sgZW5kXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza19maW5pc2hlZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTG9jayByZXBvcnRpbmcuCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggbG9jayApIHNob3VsZCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGZpcnN0IGxvY2sgb3BlcmF0aW9uCisgICAgICAgICAgKHNldC91bnNldCkuIEl0IGlzIG5vdCBhIHJlYWwgZXZlbnQgc2hvd24gdG8gdGhlIHVzZXIgYnV0IGp1c3Qgc2V0dGluZyBhIG5hbWUgZm9yCisgICAgICAgICAgc3luY2hyb25pemF0aW9uIG9iamVjdC4gYGxvY2snIGlzIGFuIGFkZHJlc3Mgb2Ygc3luYyBvYmplY3QsIHRoZSBzYW1lIGFkZHJlc3Mgc2hvdWxkIGJlCisgICAgICAgICAgdXNlZCBpbiBhbGwgc3Vic2VxdWVudCBjYWxscy4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc2V0dGluZyB0aGUgbG9jay4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX3JlYWxlYXNpbmcoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB1bnNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRocmVhZCBjYW5jZWxsZWQgd2FpdGluZyBmb3IgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGxvY2sgKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGxvY2sgb3BlcmF0aW9uLiBBZnRlcgorICAgICAgICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgpIGFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBhZGRyZXNzIHdpbGwgYmUgY29uc2lkZXJlZAorICAgICAgICAgIGFzIGFub3RoZXIgc3luYyBvYmplY3QsIG5vdCByZWxhdGVkIHdpdGggdGhlIG9yaWdpbmFsIG9uZS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisvLyBUYWtlcyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBkaXJlY3RseQorX19rbXBfaW5saW5lCit2b2lkCitfX19rbXBfaXR0X2xvY2tfaW5pdCgga21wX3VzZXJfbG9ja19wIGxvY2ssIGNoYXIgY29uc3QgKnR5cGUsIGNvbnN0IGlkZW50X3QgKmxvYyApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBjaGFyIGNvbnN0ICogICAgc3JjID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfY3JlYXRlKCBsb2NrLCB0eXBlLCBzcmMsIDAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltsY2sgaW5pXSBzY3JlKCAlcCwgXCIlc1wiLCBcIiVzXCIsIDAgKVxuIiwgbG9jaywgdHlwZSwgc3JjICk7CisgICAgfQorI2VuZGlmCit9CisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworLy8gSW50ZXJuYWwgZ3V0cyAtLSBjb21tb24gY29kZSBmb3IgbG9ja3MgYW5kIGNyaXRpY2FsIHNlY3Rpb25zLCBkbyBub3QgY2FsbCBkaXJlY3RseS4KK19fa21wX2lubGluZQordm9pZAorX19fa21wX2l0dF9sb2NrX2luaXQoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjaGFyIGNvbnN0ICogdHlwZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBpZGVudF90IGNvbnN0ICogbG9jID0gTlVMTDsKKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAhPSBOVUxMICkKKyAgICAgICAgICAgIGxvYyA9IF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fKCAobG9jaykgKTsKKyAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyA9ICggbG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSggbG9jaywgdHlwZSwgc3JjLCAwICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbbGNrIGluaV0gc2NyZSggJXAsIFwiJXNcIiwgXCIlc1wiLCAwIClcbiIsIGxvY2ssIHR5cGUsIHNyYyApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19fa21wX2l0dF9sb2NrX2luaXQKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBJbnRlcm5hbCBndXRzIC0tIGNvbW1vbiBjb2RlIGZvciBsb2NrcyBhbmQgY3JpdGljYWwgc2VjdGlvbnMsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LgorX19rbXBfaW5saW5lCit2b2lkCitfX19rbXBfaXR0X2xvY2tfZmluaSgga21wX3VzZXJfbG9ja19wIGxvY2ssIGNoYXIgY29uc3QgKiB0eXBlICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19kZXN0cm95KCBsb2NrICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltsY2sgZHN0XSBzZGVzKCAlcCApXG4iLCBsb2NrICk7CisjZW5kaWYKK30gLy8gX19fa21wX2l0dF9sb2NrX2ZpbmkKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSwordm9pZAorX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjb25zdCBpZGVudF90ICpsb2MgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2luaXQoIGxvY2ssICJPTVAgTG9jayIsIGxvYyApOworfQorI2Vsc2UKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX19rbXBfaXR0X2xvY2tfaW5pdCggbG9jaywgIk9NUCBMb2NrIiApOworfSAvLyBfX2ttcF9pdHRfbG9ja19jcmVhdGluZworI2VuZGlmCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAvLyBwb3N0cG9uZSBsb2NrIG9iamVjdCBhY2Nlc3MKKyAgICBpZiAoIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgKSB7CisgICAgICAgIGlmICggS01QX0VYVFJBQ1RfRF9UQUcobG9jaykgPT0gMCApIHsKKyAgICAgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICAgICAgX19pdHRfc3luY19wcmVwYXJlKCBpbGstPmxvY2sgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcHJlcGFyZSggbG9jayApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcKKwordm9pZAorX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gcG9zdHBvbmUgbG9jayBvYmplY3QgYWNjZXNzCisgICAgaWYgKCBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciApIHsKKyAgICAgICAgaWYgKCBLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwICkgeworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBpbGstPmxvY2sgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIGxvY2sgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgX19pdHRfc3luY19hY3F1aXJlZCggbG9jayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX3JlbGVhc2luZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciApIHsKKyAgICAgICAgaWYgKCBLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwICkgeworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggaWxrLT5sb2NrICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggbG9jayApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggbG9jayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZworCit2b2lkCitfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgKSB7CisgICAgICAgIGlmICggS01QX0VYVFJBQ1RfRF9UQUcobG9jaykgPT0gMCApIHsKKyAgICAgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIGlsay0+bG9jayApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIGxvY2sgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgX19pdHRfc3luY19jYW5jZWwoIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQKKwordm9pZAorX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX19rbXBfaXR0X2xvY2tfZmluaSggbG9jaywgIk9NUCBMb2NrIiApOworfSAvLyBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDcml0aWNhbCByZXBvcnRpbmcuCisKKyAgICBDcml0aWNhbCBzZWN0aW9ucyBhcmUgdHJlYXRlZCBleGFjdGx5IGFzIGxvY2tzIChidXQgaGF2ZSBkaWZmZXJlbnQgb2JqZWN0IHR5cGUpLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY29uc3QgaWRlbnRfdCAqbG9jICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIENyaXRpY2FsIiwgbG9jKTsKK30KKyNlbHNlCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIENyaXRpY2FsIiApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcKKyNlbmRpZgorCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZworCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2ZpbmkoIGxvY2ssICJPTVAgQ3JpdGljYWwiICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTaW5nbGUgcmVwb3J0aW5nLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3NpbmdsZV9zdGFydCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X21hcmtfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICBrbXBfaW5mb190ICogICB0aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCAoZ3RpZCkgKTsKKyAgICAgICAgaWRlbnRfdCAqICAgICAgbG9jID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgY2hhciBjb25zdCAqICAgc3JjID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAga21wX3N0cl9idWZfdCAgbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBuYW1lLCAiT01QIFNpbmdsZS0lcyIsIHNyYyApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgPSBfX2l0dF9tYXJrX2NyZWF0ZSggbmFtZS5zdHIgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzaW4gc3RhXSBtY3JlKCBcIiVzXCIpIC0+ICVkXG4iLCBuYW1lLnN0ciwgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIG5hbWUgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X21hcmsoIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlLCBOVUxMICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc2luIHN0YV0gbWFyayggJWQsIE5VTEwgKVxuIiwgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQKKwordm9pZAorX19rbXBfaXR0X3NpbmdsZV9lbmQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19pdHRfbWFya190eXBlICBtYXJrID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pdHRfbWFya19zaW5nbGU7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfbWFya19vZmYoIG1hcmsgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3NpbiBlbmRdIG1vZmYoICVkIClcbiIsIG1hcmsgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc2luZ2xlX2VuZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE9yZGVyZWQgcmVwb3J0aW5nLgorCisgICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCBpcyBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgKmJlZm9yZSogZmlyc3QgdXNpbmcgc3luYworICAgIG9iamVjdC4gSVRUIHRlYW0gd291bGQgbGlrZSBpdCB0byBiZSBjYWxsZWQgb25jZSwgYnV0IGl0IHJlcXVpcmVzIGV4dHJhIHN5bmNocm9uaXphdGlvbi4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAgaXMgY2FsbGVkIHdoZW4gdGhyZWFkIGlzIGdvaW5nIHRvIGVudGVyIG9yZGVyZWQgc2VjdGlvbgorICAgIChiZWZvcmUgc3luY2hyb25pemF0aW9uKS4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0IGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBlbnRlcmluZyB1c2VyIGNvZGUgKGFmdGVyCisgICAgc3luY2hyb25pemF0aW9uKS4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCBpcyBjYWxsZWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdXNlciBjb2RlLgorCisgICAgU3luYyBvYmplY3QgaXMgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50LgorCisgICAgRXZlbnRzIGFyZSBub3QgZ2VuZXJhdGVkIGluIGNhc2Ugb2Ygc2VyaWFsaXplZCB0ZWFtLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfaW5pdCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX2luZm9fdCAqICAgdGhyICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlkZW50X3QgY29uc3QgKiBsb2MgID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyAgPSAoIGxvYyA9PSBOVUxMID8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSgKKyAgICAgICAgICAgIHRoci0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQsICJPTVAgT3JkZXJlZCIsIHNyYywgMAorICAgICAgICApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfaW5pdAorCit2b2lkCitfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcHJlcGFyZSggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwCisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfc3RhcnQKKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfZW5kKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX2VuZAorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGhyZWFkcyByZXBvcnRpbmcuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpIHsKKyAgICBfX2l0dF90aHJfaWdub3JlKCk7Cit9IC8vIF9fa21wX2l0dF90aHJlYWRfaWdub3JlCisKK3ZvaWQKK19fa21wX2l0dF90aHJlYWRfbmFtZSggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIG5hbWUgKTsKKyAgICAgICAgaWYoIEtNUF9NQVNURVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBNYXN0ZXIgVGhyZWFkICMlZCIsIGd0aWQgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBXb3JrZXIgVGhyZWFkICMlZCIsIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfdGhyX25hbWVfc2V0KCBuYW1lLnN0ciwgbmFtZS51c2VkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdGhyIG5hbV0gbmFtZSggXCIlc1wiKVxuIiwgbmFtZS5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIG5hbWUgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF90aHJlYWRfbmFtZQorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTeXN0ZW0gb2JqZWN0IHJlcG9ydGluZy4KKworICAgIElUVCBjYXRjaGVzIG9wZXJhdGlvbnMgd2l0aCBzeXN0ZW0gc3luYyBvYmplY3RzIChsaWtlIFdpbmRvd3MqIE9TIG9uIElBLTMyCisgICAgYXJjaGl0ZWN0dXJlIEFQSSBjcml0aWNhbCBzZWN0aW9ucyBhbmQgZXZlbnRzKS4gV2Ugb25seSBuZWVkIHRvIHNwZWNpZnkKKyAgICBuYW1lICgiT01QIFNjaGVkdWxlciIpIGZvciB0aGUgb2JqZWN0IHRvIGxldCBJVFQga25vdyBpdCBpcyBhbiBvYmplY3QgdXNlZAorICAgIGJ5IE9wZW5NUCBSVEwgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCB2b2lkICogb2JqZWN0LCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsICJPTVAgU2NoZWR1bGVyIiwgbmFtZSwgMCApOworICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzeXMgb2JqXSBzY3JlKCAlcCwgXCJPTVAgU2NoZWR1bGVyXCIsIFwiJXNcIiwgMCApXG4iLCBvYmplY3QsIG5hbWUgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdGFjayBzdGl0Y2hpbmcgYXBpLgorCisgICAgTWFzdGVyIGNhbGxzICJjcmVhdGUiIGFuZCBwdXQgdGhlIHN0aXRjaGluZyBpZCBpbnRvIHRlYW0gc3RydWN0dXJlLgorICAgIFdvcmtlcnMgcmVhZCB0aGUgc3RpdGNoaW5nIGlkIGFuZCBjYWxsICJlbnRlciIgLyAibGVhdmUiIGFwaS4KKyAgICBNYXN0ZXIgY2FsbHMgImRlc3Ryb3kiIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK19faXR0X2NhbGxlcgorX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCAhX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9jYWxsZXIgaWQgPSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgY3JlXSAlcFxuIiwgaWQgKTsKKyAgICByZXR1cm4gaWQ7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCBfX2l0dF9jYWxsZXIgaWQgKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveSggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgZGVzXSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlciggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlciggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgZW50XSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgbGVhXSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDVlNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suY3BwCkBAIC0wLDAgKzEsNDIwOCBAQAorLyoKKyAqIGttcF9sb2NrLmNwcCAtLSBsb2NrLXJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorLy8gV2Ugc2hvdWxkIHJlYWxseSBpbmNsdWRlIDxmdXRleC5oPiwgYnV0IHRoYXQgY2F1c2VzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgb24gZGlmZmVyZW50CisvLyBMaW51eCogT1MgZGlzdHJpYnV0aW9ucyB0aGF0IGVpdGhlciByZXF1aXJlIHRoYXQgeW91IGluY2x1ZGUgKG9yIGJyZWFrIHdoZW4geW91IHRyeSB0byBpbmNsdWRlKQorLy8gPHBjaS90eXBlcy5oPi4KKy8vIFNpbmNlIGFsbCB3ZSBuZWVkIGlzIHRoZSB0d28gbWFjcm9zIGJlbG93ICh3aGljaCBhcmUgcGFydCBvZiB0aGUga2VybmVsIEFCSSwgc28gY2FuJ3QgY2hhbmdlKQorLy8gd2UganVzdCBkZWZpbmUgdGhlIGNvbnN0YW50cyBoZXJlIGFuZCBkb24ndCBpbmNsdWRlIDxmdXRleC5oPgorIyBpZm5kZWYgRlVURVhfV0FJVAorIyAgZGVmaW5lIEZVVEVYX1dBSVQgICAgMAorIyBlbmRpZgorIyBpZm5kZWYgRlVURVhfV0FLRQorIyAgZGVmaW5lIEZVVEVYX1dBS0UgICAgMQorIyBlbmRpZgorI2VuZGlmCisKKy8qIEltcGxlbWVudCBzcGluIGxvY2tzIGZvciBpbnRlcm5hbCBsaWJyYXJ5IHVzZS4gICAgICAgICAgICAgKi8KKy8qIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaXMgTGFtcG9ydCdzIGJha2VyeSBsb2NrIFsxOTc0XS4gKi8KKwordm9pZAorX19rbXBfdmFsaWRhdGVfbG9ja3MoIHZvaWQgKQoreworICAgIGludCBpOworICAgIGttcF91aW50MzIgIHgsIHk7CisKKyAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdW5zaWduZWQgYXJpdGhtZXRpYyBkb2VzIHdyYXBzIHByb3Blcmx5ICovCisgICAgeCA9IH4oKGttcF91aW50MzIpIDApIC0gMjsKKyAgICB5ID0geCAtIDI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpLCArK3gsICsreSkgeworICAgICAgICBrbXBfdWludDMyIHogPSAoeCAtIHkpOworICAgICAgICBLTVBfQVNTRVJUKCB6ID09IDIgKTsKKyAgICB9CisKKyAgICBLTVBfQVNTRVJUKCBvZmZzZXRvZigga21wX2Jhc2VfcXVldWluZ19sb2NrLCB0YWlsX2lkICkgJSA4ID09IDAgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRlc3QgYW5kIHNldCBsb2NrcyAqLworCisvLworLy8gRm9yIHRoZSBub24tbmVzdGVkIGxvY2tzLCB3ZSBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgNCBieXRlcyB3ZXJlCisvLyBhbGxvY2F0ZWQsIHNpbmNlIGdjYyBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciBvbXBfbG9ja190LCBhbmQgdGhlIEludGVsCisvLyBjb21waWxlciBvbmx5IGFsbG9jYXRlcyBhIDQgYnl0ZSBwb2ludGVyIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gIE9uCisvLyBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwgd2UgY2FuIGFzc3VtZSB0aGF0IGFsbCA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkLgorLy8KKy8vIGdjYyByZXNlcnZlcyA+PSA4IGJ5dGVzIGZvciBuZXN0ZWQgbG9ja3MsIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUKKy8vIGVudGlyZSA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkIGZvciBuZXN0ZWQgbG9ja3Mgb24gYWxsIDY0LWJpdCBwbGF0Zm9ybXMuCisvLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBLTVBfTE9DS19TVFJJUChUQ1JfNCggbGNrLT5say5wb2xsICkpIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSgga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsKKworI2lmZGVmIFVTRV9MT0NLX1BST0ZJTEUKKyAgICBrbXBfdWludDMyIGN1cnIgPSBUQ1JfNCggbGNrLT5say5wb2xsICk7CisgICAgaWYgKCAoIGN1cnIgIT0gMCApICYmICggY3VyciAhPSBndGlkICsgMSApICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrICk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgaWYgKCAoIGxjay0+bGsucG9sbCA9PSBLTVBfTE9DS19GUkVFKHRhcykgKQorICAgICAgJiYgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykgKSApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9CisKKyAgICBrbXBfdWludDMyIHNwaW5zOworICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICBpZiAoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApIHsKKyAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisKKyAgICB3aGlsZSAoICggbGNrLT5say5wb2xsICE9IEtNUF9MT0NLX0ZSRUUodGFzKSApIHx8CisgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykgKSApICkgeworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRSAtIHVzZSBleHBvbmVudGlhbCBiYWNrb2ZmIGhlcmUKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgICAgICBfX2ttcF94cHJvYyApICkgeworICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoICggbGNrLT5say5wb2xsID09IEtNUF9MT0NLX0ZSRUUodGFzKSApCisgICAgICAmJiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSApICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBLTVBfU1RfUkVMMzIoICYobGNrLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIFRDV180KCBsY2stPmxrLnBvbGwsIEtNUF9MT0NLX0ZSRUUodGFzKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGFzX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLnBvbGwgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfdGFzX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgdGVzdCBhbmQgc2V0IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgICAgfQorfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF90YXNfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV90YXNfbG9jayggbGNrLCBndGlkICk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUSUxMX0hFTEQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGFzX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90YXNfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrKCBsY2sgKTsKK30KKworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGZ1dGV4IGxvY2tzICovCisKKy8vIGZ1dGV4IGxvY2tzIGFyZSByZWFsbHkganVzdCB0ZXN0IGFuZCBzZXQgbG9ja3MsIHdpdGggYSBkaWZmZXJlbnQgbWV0aG9kCisvLyBvZiBoYW5kbGluZyBjb250ZW50aW9uLiAgVGhleSB0YWtlIHRoZSBzYW1lIGFtb3VudCBvZiBzcGFjZSBhcyB0ZXN0IGFuZAorLy8gc2V0IGxvY2tzLCBhbmQgYXJlIGFsbG9jYXRlZCB0aGUgc2FtZSB3YXkgKGkuZS4gdXNlIHRoZSBhcmVhIGFsbG9jYXRlZCBieQorLy8gdGhlIGNvbXBpbGVyIGZvciBub24tbmVzdGVkIGxvY2tzIC8gYWxsb2NhdGUgbmVzdGVkIGxvY2tzIG9uIHRoZSBoZWFwKS4KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUUklQKCggVENSXzQoIGxjay0+bGsucG9sbCApID4+IDEgKSkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX2ludDMyIGd0aWRfY29kZSA9ICggZ3RpZCArIDEgKSA8PCAxOworCisgICAgS01QX01CKCk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAga21wX3VpbnQzMiBjdXJyID0gVENSXzQoIGxjay0+bGsucG9sbCApOworICAgIGlmICggKCBjdXJyICE9IDAgKSAmJiAoIGN1cnIgIT0gZ3RpZF9jb2RlICkgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZW50ZXJpbmdcbiIsCisgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisKKyAgICBrbXBfaW50MzIgcG9sbF92YWw7CisKKyAgICB3aGlsZSAoICggcG9sbF92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRShmdXRleCksCisgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWShndGlkX2NvZGUsIGZ1dGV4KSApICkgIT0gS01QX0xPQ0tfRlJFRShmdXRleCkgKSB7CisKKyAgICAgICAga21wX2ludDMyIGNvbmQgPSBLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxOworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBwb2xsX3ZhbCA9IDB4JXggY29uZCA9IDB4JXhcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwsIGNvbmQgKSApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IGlmIHlvdSB0cnkgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGZvciB0aGlzIGJyYW5jaAorICAgICAgICAvLworICAgICAgICAvLyBpZiAoIHBvbGxfdmFsICYgMSA9PSAwICkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlbiB0aGUgMTIuMCBjb21waWxlciBoYXMgYSBidWcgd2hlcmUgdGhlIGZvbGxvd2luZyBibG9jayB3aWxsCisgICAgICAgIC8vIGFsd2F5cyBiZSBza2lwcGVkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgTFNCIG9mIHBvbGxfdmFsLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgY29uZCApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUcnkgdG8gc2V0IHRoZSBsc2IgaW4gdGhlIHBvbGwgdG8gaW5kaWNhdGUgdG8gdGhlIG93bmVyCisgICAgICAgICAgICAvLyB0aHJlYWQgdGhhdCB0aGV5IG5lZWQgdG8gd2FrZSB0aGlzIHRocmVhZCB1cC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCAmICggbGNrLT5say5wb2xsICksIHBvbGxfdmFsLCBwb2xsX3ZhbCB8IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgY2FuJ3Qgc2V0IGJpdCAwXG4iLAorICAgICAgICAgICAgICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9sbF92YWwgfD0gS01QX0xPQ0tfQlVTWSgxLCBmdXRleCk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGJpdCAwIHNldFxuIiwKKyAgICAgICAgICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgICAgICB9CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgYmVmb3JlIGZ1dGV4X3dhaXQoMHgleClcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworCisgICAgICAgIGttcF9pbnQzMiByYzsKKyAgICAgICAgaWYgKCAoIHJjID0gc3lzY2FsbCggX19OUl9mdXRleCwgJiAoIGxjay0+bGsucG9sbCApLCBGVVRFWF9XQUlULAorICAgICAgICAgIHBvbGxfdmFsLCBOVUxMLCBOVUxMLCAwICkgKSAhPSAwICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgZnV0ZXhfd2FpdCgweCV4KSBmYWlsZWQgKHJjPSVkIGVycm5vPSVkKVxuIiwKKyAgICAgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwsIHJjLCBlcnJubyApICk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGFmdGVyIGZ1dGV4X3dhaXQoMHgleClcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIHRocmVhZCBoYXMgbm93IGRvbmUgYSBzdWNjZXNzZnVsIGZ1dGV4IHdhaXQgY2FsbCBhbmQgd2FzCisgICAgICAgIC8vIGVudGVyZWQgb24gdGhlIE9TIGZ1dGV4IHF1ZXVlLiAgV2UgbXVzdCBub3cgcGVyZm9ybSBhIGZ1dGV4CisgICAgICAgIC8vIHdha2UgY2FsbCB3aGVuIHJlbGVhc2luZyB0aGUgbG9jaywgYXMgd2UgaGF2ZSBubyBpZGVhIGhvdyBtYW55CisgICAgICAgIC8vIG90aGVyIHRocmVhZHMgYXJlIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgZ3RpZF9jb2RlIHw9IDE7CisgICAgfQorCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBleGl0aW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIGZ1dGV4KSA8PCAxICkgKSB7CisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBlbnRlcmluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKworICAgIGttcF9pbnQzMiBwb2xsX3ZhbCA9IEtNUF9YQ0hHX0ZJWEVEMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRShmdXRleCkgKTsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIHJlbGVhc2VkIHBvbGxfdmFsID0gMHgleFxuIiwKKyAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsICkgKTsKKworICAgIGlmICggS01QX0xPQ0tfU1RSSVAocG9sbF92YWwpICYgMSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgZnV0ZXhfd2FrZSAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgbGNrLCBndGlkICkgKTsKKyAgICAgICAgc3lzY2FsbCggX19OUl9mdXRleCwgJiAoIGxjay0+bGsucG9sbCApLCBGVVRFWF9XQUtFLCBLTVBfTE9DS19CVVNZKDEsIGZ1dGV4KSwgTlVMTCwgTlVMTCwgMCApOworICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZXhpdGluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKworICAgIEtNUF9ZSUVMRCggVENSXzQoIF9fa21wX250aCApID4gKCBfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICBfX2ttcF94cHJvYyApICk7CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggKCBzaXplb2YgKCBrbXBfZnV0ZXhfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPj0gMCApCisgICAgICAmJiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBUQ1dfNCggbGNrLT5say5wb2xsLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2Z1dGV4X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5wb2xsID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIGZ1dGV4IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfZnV0ZXhfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggISBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZnV0ZXhfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrKCBsY2sgKTsKK30KKworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0aWNrZXQgKGJha2VyeSkgbG9ja3MgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gVENSXzQoIGxjay0+bGsub3duZXJfaWQgKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworc3RhdGljIGttcF91aW50MzIKK19fa21wX2Jha2VyeV9jaGVjayhrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpCit7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBwYXVzZTsKKworICAgIGlmICh2YWx1ZSA9PSBjaGVja2VyKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBmb3IgKHBhdXNlID0gY2hlY2tlciAtIHZhbHVlOyBwYXVzZSAhPSAwOyAtLXBhdXNlKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIGludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgbXlfdGlja2V0OworICAgIEtNUF9NQigpOworCisgICAgbXlfdGlja2V0ID0gS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSAmbGNrLT5say5uZXh0X3RpY2tldCApOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGlmICggVENSXzQoIGxjay0+bGsubm93X3NlcnZpbmcgKSAhPSBteV90aWNrZXQgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBpZiAoIFRDUl80KCBsY2stPmxrLm5vd19zZXJ2aW5nICkgPT0gbXlfdGlja2V0ICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KKyAgICBLTVBfV0FJVF9ZSUVMRCggJmxjay0+bGsubm93X3NlcnZpbmcsIG15X3RpY2tldCwgX19rbXBfYmFrZXJ5X2NoZWNrLCBsY2sgKTsKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfdGVzdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgbXlfdGlja2V0ID0gVENSXzQoIGxjay0+bGsubmV4dF90aWNrZXQgKTsKKyAgICBpZiAoIFRDUl80KCBsY2stPmxrLm5vd19zZXJ2aW5nICkgPT0gbXlfdGlja2V0ICkgeworICAgICAgICBrbXBfdWludDMyIG5leHRfdGlja2V0ID0gbXlfdGlja2V0ICsgMTsKKyAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIChrbXBfaW50MzIgKikgJmxjay0+bGsubmV4dF90aWNrZXQsCisgICAgICAgICAgbXlfdGlja2V0LCBuZXh0X3RpY2tldCApICkgeworICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyICBkaXN0YW5jZTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworICAgIGRpc3RhbmNlID0gKCBUQ1JfNCggbGNrLT5say5uZXh0X3RpY2tldCApIC0gVENSXzQoIGxjay0+bGsubm93X3NlcnZpbmcgKSApOworCisgICAgS01QX1NUX1JFTDMyKCAmKGxjay0+bGsubm93X3NlcnZpbmcpLCBsY2stPmxrLm5vd19zZXJ2aW5nICsgMSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfWUlFTEQoIGRpc3RhbmNlCisgICAgICA+IChrbXBfdWludDMyKSAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIFRDV180KCBsY2stPmxrLm5leHRfdGlja2V0LCAwICk7CisgICAgVENXXzQoIGxjay0+bGsubm93X3NlcnZpbmcsIDAgKTsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyAtMSA9PiBub3QgYSBuZXN0ZWQgbG9jay4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gKGttcF90aWNrZXRfbG9jayAqKWxjazsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiAgICA9IE5VTEw7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgdGlja2V0IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gKytsY2stPmxrLmRlcHRoX2xvY2tlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgICAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIGFjY2VzcyBmdW5jdGlvbnMgdG8gZmllbGRzIHdoaWNoIGRvbid0IGV4aXN0IGZvciBhbGwgbG9jayBraW5kcy4KKy8vCisKK3N0YXRpYyBpbnQKK19fa21wX2lzX3RpY2tldF9sb2NrX2luaXRpYWxpemVkKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrID09IGxjay0+bGsuaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF90aWNrZXRfbG9ja19sb2NhdGlvbigga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGlja2V0X2xvY2tfbG9jYXRpb24oIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QKK19fa21wX2dldF90aWNrZXRfbG9ja19mbGFncygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGlja2V0X2xvY2tfZmxhZ3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBxdWV1aW5nIGxvY2tzICovCisKKy8qCisgKiBGaXJzdCB0aGUgc3RhdGVzCisgKiAoaGVhZCx0YWlsKSA9ICAwLCAwICBtZWFucyBsb2NrIGlzIHVuaGVsZCwgbm9ib2R5IG9uIHF1ZXVlCisgKiAgIFVJTlRfTUFYIG9yIC0xLCAwICBtZWFucyBsb2NrIGlzIGhlbGQsIG5vYm9keSBvbiBxdWV1ZQorICogICAgICAgICAgICAgICAgaCwgaCAgbWVhbnMgbG9jayBpcyBoZWxkIG9yIGFib3V0IHRvIHRyYW5zaXRpb24sIDEgZWxlbWVudCBvbiBxdWV1ZQorICogICAgICAgICAgICAgICAgaCwgdCAgaCA8PiB0LCBtZWFucyBsb2NrIGlzIGhlbGQgb3IgYWJvdXQgdG8gdHJhbnNpdGlvbiwgPjEgZWxlbWVudHMgb24gcXVldWUKKyAqCisgKiBOb3cgdGhlIHRyYW5zaXRpb25zCisgKiAgICBBY3F1aXJlKDAsMCkgID0gLTEgLDAKKyAqICAgIFJlbGVhc2UoMCwwKSAgPSBFcnJvcgorICogICAgQWNxdWlyZSgtMSwwKSA9ICBoICxoICAgIGggPiAwCisgKiAgICBSZWxlYXNlKC0xLDApID0gIDAgLDAKKyAqICAgIEFjcXVpcmUoaCxoKSAgPSAgaCAsdCAgICBoID4gMCwgdCA+IDAsIGggPD4gdAorICogICAgUmVsZWFzZShoLGgpICA9IC0xICwwICAgIGggPiAwCisgKiAgICBBY3F1aXJlKGgsdCkgID0gIGggLHQnICAgaCA+IDAsIHQgPiAwLCB0JyA+IDAsIGggPD4gdCwgaCA8PiB0JywgdCA8PiB0JworICogICAgUmVsZWFzZShoLHQpICA9ICBoJyx0ICAgIGggPiAwLCB0ID4gMCwgaCA8PiB0LCBoIDw+IGgnLCBoJyBtYXliZSA9IHQKKyAqCisgKiBBbmQgcGljdG9yaWFsbHkKKyAqCisgKgorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfCAwLCAwfC0tLS0tLS0gcmVsZWFzZSAtLS0tLS0tPiBFcnJvcgorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgICB8ICBeCisgKiAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB2ICB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICB8LTEsIDB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICAgIHwgIF4KKyAqICAgICBhY3F1aXJlfCAgfHJlbGVhc2UKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHYgIHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgaCwgaHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgICAgfCAgXgorICogICAgIGFjcXVpcmV8ICB8cmVsZWFzZQorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgdiAgfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfCBoLCB0fC0tLS0tIGFjcXVpcmUsIHJlbGVhc2UgbG9vcGJhY2sgLS0tKworICogICAgICAgICAgKy0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqLworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworCisvKiBTdHVmZiBmb3IgY2lyY3VsYXIgdHJhY2UgYnVmZmVyICovCisjZGVmaW5lIFRSQUNFX0JVRl9FTEUJMTAyNAorc3RhdGljIGNoYXIgdHJhY2VzW1RSQUNFX0JVRl9FTEVdWzEyOF0gPSB7IDAgfQorc3RhdGljIGludCB0YyA9IDA7CisjZGVmaW5lIFRSQUNFX0xPQ0soWCxZKSAgICAgICAgICBLTVBfU05QUklOVEYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sIDEyOCwgICJ0JWQgYXQgJXNcbiIsIFgsIFkgKTsKKyNkZWZpbmUgVFJBQ0VfTE9DS19UKFgsWSxaKSAgICAgIEtNUF9TTlBSSU5URiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgMTI4LCAidCVkIGF0ICVzJWRcbiIsIFgsWSxaICk7CisjZGVmaW5lIFRSQUNFX0xPQ0tfSFQoWCxZLFosUSkgICBLTVBfU05QUklOVEYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sIDEyOCwgInQlZCBhdCAlcyAlZCwlZFxuIiwgWCwgWSwgWiwgUSApOworCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBoZWFkX2lkLCBrbXBfaW50MzIgdGFpbF9pZCApCit7CisgICAga21wX2ludDMyIHQsIGk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlxuX19rbXBfZHVtcF9xdWV1aW5nX2xvY2s6IFRSQUNFIEJFR0lOUyBIRVJFISBcbiIgKTsKKworICAgIGkgPSB0YyAlIFRSQUNFX0JVRl9FTEU7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICIlc1xuIiwgdHJhY2VzW2ldICk7CisgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB3aGlsZSAoIGkgIT0gKHRjICUgVFJBQ0VfQlVGX0VMRSkgKSB7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJXMiLCB0cmFjZXNbaV0gKTsKKyAgICAgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB9CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcbiIgKTsKKworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICJcbl9fa21wX2R1bXBfcXVldWluZ19sb2NrOiBndGlkKzE6JWQsIHNwaW5faGVyZTolZCwgbmV4dF93YWl0OiVkLCBoZWFkX2lkOiVkLCB0YWlsX2lkOiVkXG4iLAorICAgICAgICAgICAgIGd0aWQrMSwgdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSwgdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZywKKyAgICAgICAgICAgICBoZWFkX2lkLCB0YWlsX2lkICk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlx0XHRoZWFkOiAlZCAiLCBsY2stPmxrLmhlYWRfaWQgKTsKKworICAgIGlmICggbGNrLT5say5oZWFkX2lkID49IDEgKSB7CisgICAgICAgIHQgPSBfX2ttcF90aHJlYWRzW2xjay0+bGsuaGVhZF9pZC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB3aGlsZSAodCA+IDApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiLT4gJWQgIiwgdCApOworICAgICAgICAgICAgdCA9IF9fa21wX3RocmVhZHNbdC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiOyAgdGFpbDogJWQgIiwgbGNrLT5say50YWlsX2lkICk7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcblxuIiApOworfQorCisjZW5kaWYgLyogREVCVUdfUVVFVUlOR19MT0NLUyAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworLyogQWNxdWlyZSBhIGxvY2sgdXNpbmcgYSB0aGUgcXVldWluZyBsb2NrIGltcGxlbWVudGF0aW9uICovCit0ZW1wbGF0ZSA8Ym9vbCB0YWtlVGltZT4KKy8qIFtUTFddIFRoZSB1bnVzZWQgdGVtcGxhdGUgYWJvdmUgaXMgbGVmdCBiZWhpbmQgYmVjYXVzZSBvZiB3aGF0IEJFQiBiZWxpZXZlcyBpcyBhCisgICBwb3RlbnRpYWwgY29tcGlsZXIgcHJvYmxlbSB3aXRoIF9fZm9yY2VpbmxpbmUuICovCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoaXNfdGhyICAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgKmhlYWRfaWRfcCAgID0gJiBsY2stPmxrLmhlYWRfaWQ7CisgICAgdm9sYXRpbGUga21wX2ludDMyICAqdGFpbF9pZF9wICAgPSAmIGxjay0+bGsudGFpbF9pZDsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICpzcGluX2hlcmVfcDsKKyAgICBrbXBfaW50MzIgbmVlZF9tZiA9IDE7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3N0YXRlX3QgcHJldl9zdGF0ZSA9IG9tcHRfc3RhdGVfdW5kZWZpbmVkOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGVudGVyaW5nXG4iLCBsY2ssIGd0aWQgKSk7CisKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworICAgIHNwaW5faGVyZV9wID0gJiB0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnQiICk7CisgICAgaWYgKCAqc3Bpbl9oZXJlX3AgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoICEqc3Bpbl9oZXJlX3AgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKworCisgICAgLyogVGhlIGZvbGxvd2luZyBzdC5yZWwgdG8gc3Bpbl9oZXJlX3AgbmVlZHMgdG8gcHJlY2VkZSB0aGUgY21weGNoZy5hY3EgdG8gaGVhZF9pZF9wCisgICAgICAgdGhhdCBtYXkgZm9sbG93LCBub3QganVzdCBpbiBleGVjdXRpb24gb3JkZXIsIGJ1dCBhbHNvIGluIHZpc2liaWxpdHkgb3JkZXIuICBUaGlzIHdheSwKKyAgICAgICB3aGVuIGEgcmVsZWFzaW5nIHRocmVhZCBvYnNlcnZlcyB0aGUgY2hhbmdlcyB0byB0aGUgcXVldWUgYnkgdGhpcyB0aHJlYWQsIGl0IGNhbgorICAgICAgIHJpZ2h0bHkgYXNzdW1lIHRoYXQgc3Bpbl9oZXJlX3AgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gVFJVRSwgc28gdGhhdCB3aGVuIGl0IHNldHMKKyAgICAgICBzcGluX2hlcmVfcCB0byBGQUxTRSwgaXQgaXMgbm90IHByZW1hdHVyZS4gIElmIHRoZSByZWxlYXNpbmcgdGhyZWFkIHNldHMgc3Bpbl9oZXJlX3AKKyAgICAgICB0byBGQUxTRSBiZWZvcmUgdGhpcyB0aHJlYWQgc2V0cyBpdCB0byBUUlVFLCB0aGlzIHRocmVhZCB3aWxsIGhhbmcuCisgICAgKi8KKyAgICAqc3Bpbl9oZXJlX3AgPSBUUlVFOyAgLyogYmVmb3JlIGVucXVldWluZyB0byBwcmV2ZW50IHJhY2UgKi8KKworICAgIHdoaWxlKCAxICkgeworICAgICAgICBrbXBfaW50MzIgZW5xdWV1ZWQ7CisgICAgICAgIGttcF9pbnQzMiBoZWFkOworICAgICAgICBrbXBfaW50MzIgdGFpbDsKKworICAgICAgICBoZWFkID0gKmhlYWRfaWRfcDsKKworICAgICAgICBzd2l0Y2ggKCBoZWFkICkgeworCisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgeworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgcmVhZDogIiwgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgdGFpbCA9IDA7ICAvKiB0byBtYWtlIHN1cmUgbmV4dCBsaW5rIGFzeW5jaHJvbm91c2x5IHJlYWQgaXMgbm90IHNldCBhY2NpZGVudGFsbHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGFzc2lnbm1lbnQgcHJldmVudHMgdXMgZnJvbSBlbnRlcmluZyB0aGUgaWYgKCB0ID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gaW4gdGhlIGVucXVldWVkIGNhc2UgYmVsb3csIHdoaWNoIGlzIG5vdCBuZWNlc3NhcnkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0YXRlIHRyYW5zaXRpb24gKi8KKworICAgICAgICAgICAgICAgIG5lZWRfbWYgPSAwOworICAgICAgICAgICAgICAgIC8qIHRyeSAoLTEsMCktPih0aWQsdGlkKSAqLworICAgICAgICAgICAgICAgIGVucXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KCAodm9sYXRpbGUga21wX2ludDY0ICopIHRhaWxfaWRfcCwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCAtMSwgMCApLAorICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoIGd0aWQrMSwgZ3RpZCsxICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgICBpZiAoIGVucXVldWVkICkgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIGVucTogKC0xLDApLT4odGlkLHRpZCkiICk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhaWwgIT0gZ3RpZCArIDEgKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgcmVhZDogIiwgaGVhZCwgdGFpbCApOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAoIHRhaWwgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5lZWRfbWYgPSAwOworICAgICAgICAgICAgICAgICAgICAvKiB0cnkgKGgsdCkgb3IgKGgsaCktPihoLHRpZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIHRhaWxfaWRfcCwgdGFpbCwgZ3RpZCsxICk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGVucXVldWVkICkgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIGVucTogKGgsdCktPihoLHRpZCkiICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAwOiAvKiBlbXB0eSBxdWV1ZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF9pbnQzMiBncmFiYmVkX2xvY2s7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIHRyeSAoMCwwKS0+KC0xLDApICovCisKKyAgICAgICAgICAgICAgICAvKiBvbmx5IGxlZ2FsIHRyYW5zaXRpb24gb3V0IG9mIGhlYWQgPSAwIGlzIGhlYWQgPSAtMSB3aXRoIG5vIGNoYW5nZSB0byB0YWlsICovCisgICAgICAgICAgICAgICAgZ3JhYmJlZF9sb2NrID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCBoZWFkX2lkX3AsIDAsIC0xICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGdyYWJiZWRfbG9jayApIHsKKworICAgICAgICAgICAgICAgICAgICAqc3Bpbl9oZXJlX3AgPSBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IG5vIHF1ZXVpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgZXhpdDogIiwgaGVhZCwgMCApOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBwcmV2X3N0YXRlICE9IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgdGhlIHN0YXRlIGJlZm9yZSBjbGVhcmluZyB3YWl0X2lkICovCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IHByZXZfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOyAvKiBsb2NrIGhvbGRlciBjYW5ub3QgYmUgb24gcXVldWUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBwcmV2X3N0YXRlID09IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAvKiB0aGlzIHRocmVhZCB3aWxsIHNwaW47IHNldCB3YWl0X2lkIGJlZm9yZSBlbnRlcmluZyB3YWl0IHN0YXRlICovCisgICAgICAgICAgICBwcmV2X3N0YXRlID0gdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gKHVpbnQ2NF90KSBsY2s7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9sb2NrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoIGVucXVldWVkICkgeworICAgICAgICAgICAgaWYgKCB0YWlsID4gMCApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0YWlsX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIHRhaWwgLSAxICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggdGFpbF90aHIgIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHRhaWxfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSBndGlkKzE7CisgICAgICAgICAgICAgICAgLyogY29ycmVzcG9uZGluZyB3YWl0IGZvciB0aGlzIHdyaXRlIGluIHJlbGVhc2UgY29kZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCB3YWl0aW5nIGZvciBsb2NrXG4iLCBsY2ssIGd0aWQgKSk7CisKKworICAgICAgICAgICAgLyogVG9EbzogTWF5IHdhbnQgdG8gY29uc2lkZXIgdXNpbmcgX19rbXBfd2FpdF9zbGVlcCAgb3Igc29tZXRoaW5nIHRoYXQgc2xlZXBzIGZvcgorICAgICAgICAgICAgICogICAgICAgdGhyb3VnaHB1dCBvbmx5IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgS01QX1dBSVRfWUlFTEQoc3Bpbl9oZXJlX3AsIEZBTFNFLCBLTVBfRVEsIGxjayk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3Egc3BpbiIgKTsKKworICAgICAgICAgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDAgKQorICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBhZnRlciB3YWl0aW5nIG9uIHF1ZXVlXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBleGl0IDIiICk7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgLyogY2hhbmdlIHRoZSBzdGF0ZSBiZWZvcmUgY2xlYXJpbmcgd2FpdF9pZCAqLworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBwcmV2X3N0YXRlOworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisjZW5kaWYKKworICAgICAgICAgICAgLyogZ290IGxvY2ssIHdlIHdlcmUgZGVxdWV1ZWQgYnkgdGhlIHRocmVhZCB0aGF0IHJlbGVhc2VkIGxvY2sgKi8KKyAgICAgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFlpZWxkIGlmIG51bWJlciBvZiB0aHJlYWRzID4gbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycyAqLworICAgICAgICAvKiBUb0RvOiBOb3Qgc3VyZSB3aHkgdGhpcyBzaG91bGQgb25seSBiZSBpbiBvdmVyc3Vic2NyaXB0aW9uIGNhc2UsCisgICAgICAgICAgIG1heWJlIHNob3VsZCBiZSB0cmFkaXRpb25hbCBZSUVMRF9JTklUL1lJRUxEX1dIRU4gbG9vcCAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICAgICAgX19rbXBfeHByb2MgKSApOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIHJldHJ5IiApOworI2VuZGlmCisKKyAgICB9CisgICAgS01QX0FTU0VSVDIoIDAsICJzaG91bGQgbm90IGdldCBoZXJlIiApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxmYWxzZT4oIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQKK19fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wICA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIGttcF9pbnQzMiBoZWFkOworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBlbnRlcmluZ1xuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICB0aGlzX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggIXRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKTsKKyNlbmRpZgorCisgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyAgICBpZiAoIGhlYWQgPT0gMCApIHsgLyogbm9ib2R5IG9uIHF1ZXVlLCBub2JvZHkgaG9sZGluZyAqLworCisgICAgICAgIC8qIHRyeSAoMCwwKS0+KC0xLDApICovCisKKyAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIGhlYWRfaWRfcCwgMCwgLTEgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3Rlc3RfcXVldWluZ19sb2NrOiBUIyVkIGV4aXRpbmc6IGhvbGRpbmcgbG9ja1xuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBleGl0aW5nOiB3aXRob3V0IGxvY2tcbiIsIGd0aWQgKSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wID0gJiBsY2stPmxrLmhlYWRfaWQ7CisgICAgdm9sYXRpbGUga21wX2ludDMyICp0YWlsX2lkX3AgPSAmIGxjay0+bGsudGFpbF9pZDsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZW50ZXJpbmdcbiIsIGxjaywgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyAgICB0aGlzX3RociAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBlbnQiICk7CisKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoICF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisKKyAgICB3aGlsZSggMSApIHsKKyAgICAgICAga21wX2ludDMyIGRlcXVldWVkOworICAgICAgICBrbXBfaW50MzIgaGVhZDsKKyAgICAgICAga21wX2ludDMyIHRhaWw7CisKKyAgICAgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJyZWwgcmVhZDogIiwgaGVhZCwgdGFpbCApOworICAgICAgICBpZiAoIGhlYWQgPT0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCAhPSAwICk7IC8qIGhvbGRpbmcgdGhlIGxvY2ssIGhlYWQgbXVzdCBiZSAtMSBvciBxdWV1ZSBoZWFkICovCisKKyAgICAgICAgaWYgKCBoZWFkID09IC0xICkgeyAvKiBub2JvZHkgb24gcXVldWUgKi8KKworICAgICAgICAgICAgLyogdHJ5ICgtMSwwKS0+KDAsMCkgKi8KKyAgICAgICAgICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCBoZWFkX2lkX3AsIC0xLCAwICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBxdWV1ZSBlbXB0eVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGNrLCBndGlkICkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJyZWwgZXhpdDogIiwgMCwgMCApOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvIC0gbm8gb3RoZXIgdGhyZWFkIGlzIHRyeWluZyB0byBzaGlmdCBibGFtZSAqLworI2VuZGlmCisKKyAgICAgICAgICAgICAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXF1ZXVlZCA9IEZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgaWYgKCBoZWFkID09IHRhaWwgKSB7ICAvKiBvbmx5IG9uZSB0aHJlYWQgb24gdGhlIHF1ZXVlICovCisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgaWYgKCBoZWFkIDw9IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgKTsKKworICAgICAgICAgICAgICAgIC8qIHRyeSAoaCxoKS0+KC0xLDApICovCisgICAgICAgICAgICAgICAgZGVxdWV1ZWQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQoIChrbXBfaW50NjQgKikgdGFpbF9pZF9wLAorICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoIGhlYWQsIGhlYWQgKSwgS01QX1BBQ0tfNjQoIC0xLCAwICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGRlcTogKGgsaCktPigtMSwwKSIgKTsKKyNlbmRpZgorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSBrbXBfaW50MzIgKndhaXRpbmdfaWRfcDsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICAgICAgICAgKmhlYWRfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggaGVhZCAtIDEgKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkX3RociAhPSBOVUxMICk7CisgICAgICAgICAgICAgICAgd2FpdGluZ19pZF9wID0gJiBoZWFkX3Roci0+dGgudGhfbmV4dF93YWl0aW5nOworCisgICAgICAgICAgICAgICAgLyogRG9lcyB0aGlzIHJlcXVpcmUgc3luY2hyb25vdXMgcmVhZHM/ICovCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIGlmICggaGVhZCA8PSAwIHx8IHRhaWwgPD0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkID4gMCAmJiB0YWlsID4gMCApOworCisgICAgICAgICAgICAgICAgLyogdHJ5IChoLHQpLT4oaCcsdCkgb3IgKHQsdCkgKi8KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBlbnF1ZXVpbmcgdGhyZWFkIGhhcyB0aW1lIHRvIHVwZGF0ZSBuZXh0IHdhaXRpbmcgdGhyZWFkIGZpZWxkICovCisgICAgICAgICAgICAgICAgKmhlYWRfaWRfcCA9IEtNUF9XQUlUX1lJRUxEKCh2b2xhdGlsZSBrbXBfdWludDMyKil3YWl0aW5nX2lkX3AsIDAsIEtNUF9ORVEsIE5VTEwpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZGVxOiAoaCx0KS0+KGgnLHQpIiApOworI2VuZGlmCisgICAgICAgICAgICAgICAgZGVxdWV1ZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBkZXF1ZXVlZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKmhlYWRfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggaGVhZCAtIDEgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWRfdGhyICE9IE5VTEwgKTsKKworICAgICAgICAgICAgLyogRG9lcyB0aGlzIHJlcXVpcmUgc3luY2hyb25vdXMgcmVhZHM/ICovCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgaWYgKCBoZWFkIDw9IDAgfHwgdGFpbCA8PSAwICkgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgJiYgdGFpbCA+IDAgKTsKKworICAgICAgICAgICAgLyogRm9yIGNsZWFuIGNvZGUgb25seS4KKyAgICAgICAgICAgICAqIFRocmVhZCBub3QgcmVsZWFzZWQgdW50aWwgbmV4dCBzdGF0ZW1lbnQgcHJldmVudHMgcmFjZSB3aXRoIGFjcXVpcmUgY29kZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaGVhZF90aHItPnRoLnRoX25leHRfd2FpdGluZyA9IDA7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgVFJBQ0VfTE9DS19UKCBndGlkKzEsICJyZWwgbnc9MCBmb3IgdD0iLCBoZWFkICk7CisjZW5kaWYKKworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICAvKiByZXNldCBzcGluIHZhbHVlICovCisgICAgICAgICAgICBoZWFkX3Roci0+dGgudGhfc3Bpbl9oZXJlID0gRkFMU0U7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogYWZ0ZXIgZGVxdWV1aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZXhpdCAyIiApOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7CisgICAgICAgIH0KKyAgICAgICAgLyogS01QX0NQVV9QQVVTRSggKTsgIGRvbid0IHdhbnQgdG8gbWFrZSByZWxlYXNpbmcgdGhyZWFkIGhvbGQgdXAgYWNxdWlyaW5nIHRocmVhZHMgKi8KKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIHJldHJ5IiApOworI2VuZGlmCisKKyAgICB9IC8qIHdoaWxlICovCisgICAgS01QX0FTU0VSVDIoIDAsICJzaG91bGQgbm90IGdldCBoZXJlIiApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIGxjay0+bGsuaGVhZF9pZCA9IDA7CisgICAgbGNrLT5say50YWlsX2lkID0gMDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2Nrcy4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gbGNrOworCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X3F1ZXVpbmdfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgbGNrLT5say5oZWFkX2lkID0gMDsKKyAgICBsY2stPmxrLnRhaWxfaWQgPSAwOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgcXVldWluZyBsb2NrcworLy8KKworaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8ZmFsc2U+KCBsY2ssIGd0aWQgKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgICAgIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjayA9PSBsY2stPmxrLmluaXRpYWxpemVkOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gbG9jOworfQorCitzdGF0aWMga21wX2xvY2tfZmxhZ3NfdAorX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLyoKKyAgICBSVE0gQWRhcHRpdmUgbG9ja3MKKyovCisKKyNpZiBLTVBfQ09NUElMRVJfSUNDICYmIF9fSU5URUxfQ09NUElMRVIgPj0gMTMwMAorCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFNPRlRfQUJPUlRfTUFTSyAgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2Vsc2UKKworLy8gVmFsdWVzIGZyb20gdGhlIHN0YXR1cyByZWdpc3RlciBhZnRlciBmYWlsZWQgc3BlY3VsYXRpb24uCisjZGVmaW5lIF9YQkVHSU5fU1RBUlRFRCAgICAgICAgICAofjB1KQorI2RlZmluZSBfWEFCT1JUX0VYUExJQ0lUICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgX1hBQk9SVF9SRVRSWSAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIF9YQUJPUlRfQ09ORkxJQ1QgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBfWEFCT1JUX0NBUEFDSVRZICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgX1hBQk9SVF9ERUJVRyAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIF9YQUJPUlRfTkVTVEVEICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBfWEFCT1JUX0NPREUoeCkgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKSgoKHgpID4+IDI0KSAmIDB4RkYpKQorCisvLyBBYm9ydHMgZm9yIHdoaWNoIGl0J3Mgd29ydGggdHJ5aW5nIGFnYWluIGltbWVkaWF0ZWx5CisjZGVmaW5lIFNPRlRfQUJPUlRfTUFTSyAgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2RlZmluZSBTVFJJTkdJWkVfSU5URVJOQUwoYXJnKSAjYXJnCisjZGVmaW5lIFNUUklOR0laRShhcmcpIFNUUklOR0laRV9JTlRFUk5BTChhcmcpCisKKy8vIEFjY2VzcyB0byBSVE0gaW5zdHJ1Y3Rpb25zCisKKy8qCisgIEEgdmVyc2lvbiBvZiBYQmVnaW4gd2hpY2ggcmV0dXJucyAtMSBvbiBzcGVjdWxhdGlvbiwgYW5kIHRoZSB2YWx1ZSBvZiBFQVggb24gYW4gYWJvcnQuCisgIFRoaXMgaXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyB0aGUgY29tcGlsZXIgaW50cmluc2ljIHRoYXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXQgc29tZSBwb2ludC4KKyovCitzdGF0aWMgX19pbmxpbmUgaW50IF94YmVnaW4oKQoreworICAgIGludCByZXMgPSAtMTsKKworI2lmIEtNUF9PU19XSU5ET1dTCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAgX2FzbSB7CisgICAgICAgIF9lbWl0IDB4QzcKKyAgICAgICAgX2VtaXQgMHhGOAorICAgICAgICBfZW1pdCAyCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIGptcCAgIEwyCisgICAgICAgIG1vdiAgIHJlcywgZWF4CisgICAgTDI6CisgICAgfQorI2Vsc2UgLyogSUEzMiAqLworICAgIF9hc20geworICAgICAgICBfZW1pdCAweEM3CisgICAgICAgIF9lbWl0IDB4RjgKKyAgICAgICAgX2VtaXQgMgorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBqbXAgICBMMgorICAgICAgICBtb3YgICByZXMsIGVheAorICAgIEwyOgorICAgIH0KKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKyNlbHNlCisgICAgLyogTm90ZSB0aGF0ICVlYXggbXVzdCBiZSBub3RlZCBhcyBraWxsZWQgKGNsb2JiZXJlZCksIGJlY2F1c2UKKyAgICAgKiB0aGUgWFNSIGlzIHJldHVybmVkIGluICVlYXgoJXJheCkgb24gYWJvcnQuICBPdGhlciByZWdpc3RlcgorICAgICAqIHZhbHVlcyBhcmUgcmVzdG9yZWQsIHNvIGRvbid0IG5lZWQgdG8gYmUga2lsbGVkLgorICAgICAqCisgICAgICogV2UgbXVzdCBhbHNvIG1hcmsgJ3JlcycgYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dCwgc2luY2Ugb3RoZXJ3aXNlCisgICAgICogJ3Jlcz0tMScgbWF5IGJlIGRyb3BwZWQgYXMgYmVpbmcgZGVhZCwgd2hlcmVhcyB3ZSBkbyBuZWVkIHRoZQorICAgICAqIGFzc2lnbm1lbnQgb24gdGhlIHN1Y2Nlc3NmdWwgKGkuZS4sIG5vbi1hYm9ydCkgcGF0aC4KKyAgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiMTogLmJ5dGUgIDB4Qzc7IC5ieXRlIDB4Rjg7XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgIC5sb25nICAxZi0xYi02XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBqbXAgICAyZlxuIgorICAgICAgICAgICAgICAgICAgICAgICIxOiAgbW92bCAgJSVlYXgsJTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiMjoiCisgICAgICAgICAgICAgICAgICAgICAgOiIrciIocmVzKTo6Im1lbW9yeSIsIiVlYXgiKTsKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgIHJldHVybiByZXM7Cit9CisKKy8qCisgIFRyYW5zYWN0aW9uIGVuZAorKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIF94ZW5kKCkKK3sKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIF9fYXNtICB7CisgICAgICAgIF9lbWl0IDB4MGYKKyAgICAgICAgX2VtaXQgMHgwMQorICAgICAgICBfZW1pdCAweGQ1CisgICAgfQorI2Vsc2UKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiLmJ5dGUgMHgwZjsgLmJ5dGUgMHgwMTsgLmJ5dGUgMHhkNSIgOjo6Im1lbW9yeSIpOworI2VuZGlmCit9CisKKy8qCisgIFRoaXMgaXMgYSBtYWNybywgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBzaW5nbGUgYnl0ZSBjb25zdGFudCB3aGljaAorICBjYW4gYmUgZXZhbHVhdGVkIGJ5IHRoZSBpbmxpbmUgYXNzZW1ibGVyLCBzaW5jZSBpdCBpcyBlbWl0dGVkIGFzIGEKKyAgYnl0ZSBpbnRvIHRoZSBhc3NlbWJseSBjb2RlLgorKi8KKyNpZiBLTVBfT1NfV0lORE9XUworI2RlZmluZSBfeGFib3J0KEFSRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgMHhjNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgMHhmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgQVJHCisjZWxzZQorI2RlZmluZSBfeGFib3J0KEFSRykgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCIuYnl0ZSAweEM2OyAuYnl0ZSAweEY4OyAuYnl0ZSAiIFNUUklOR0laRShBUkcpIDo6OiJtZW1vcnkiKTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0NPTVBJTEVSX0lDQyAmJiBfX0lOVEVMX0NPTVBJTEVSID49IDEzMDAKKworLy8KKy8vICAgIFN0YXRpc3RpY3MgaXMgY29sbGVjdGVkIGZvciB0ZXN0aW5nIHB1cnBvc2UKKy8vCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFdlIGFjY3VtdWxhdGUgc3BlY3VsYXRpdmUgbG9jayBzdGF0aXN0aWNzIHdoZW4gdGhlIGxvY2sgaXMgZGVzdHJveWVkLgorLy8gV2Uga2VlcCBsb2NrcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZXN0cm95ZWQgaW4gdGhlIGxpdmVMb2NrcyBsaXN0CisvLyBzbyB0aGF0IHdlIGNhbiBncmFiIHRoZWlyIHN0YXRpc3RpY3MgdG9vLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCBkZXN0cm95ZWRTdGF0czsKKworLy8gVG8gaG9sZCB0aGUgbGlzdCBvZiBsaXZlIGxvY2tzLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCBsaXZlTG9ja3M7CisKKy8vIEEgbG9jayBzbyB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0aGUgbGlzdCBvZiBsb2Nrcy4KK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBjaGFpbl9sb2NrOworCisvLyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIHN0YXRzLgordm9pZAorX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICpsY2sgPSAmbGl2ZUxvY2tzOworCisgICAgbWVtc2V0KCAoIHZvaWQgKiApICYgKCBsY2stPnN0YXRzICksIDAsIHNpemVvZiggbGNrLT5zdGF0cyApICk7CisgICAgbGNrLT5zdGF0cy5uZXh0ID0gbGNrOworICAgIGxjay0+c3RhdHMucHJldiA9IGxjazsKKworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCit9CisKKy8vIEluc2VydCB0aGUgbG9jayBpbnRvIHRoZSBjaXJjdWxhciBsaXN0CitzdGF0aWMgdm9pZAorX19rbXBfcmVtZW1iZXJfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbGNrICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCisgICAgbGNrLT5zdGF0cy5uZXh0ID0gbGl2ZUxvY2tzLnN0YXRzLm5leHQ7CisgICAgbGNrLT5zdGF0cy5wcmV2ID0gJmxpdmVMb2NrczsKKworICAgIGxpdmVMb2Nrcy5zdGF0cy5uZXh0ID0gbGNrOworICAgIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiAgPSBsY2s7CisKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrICk7CisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5wcmV2LT5zdGF0cy5uZXh0ID09IGxjayApOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZvcmdldF9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2sgKQoreworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBuID0gbGNrLT5zdGF0cy5uZXh0OworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIHAgPSBsY2stPnN0YXRzLnByZXY7CisKKyAgICBuLT5zdGF0cy5wcmV2ID0gcDsKKyAgICBwLT5zdGF0cy5uZXh0ID0gbjsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3plcm9fc3BlY3VsYXRpdmVfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjayApCit7CisgICAgbWVtc2V0KCAoIHZvaWQgKiApJmxjay0+c3RhdHMsIDAsIHNpemVvZiggbGNrLT5zdGF0cyApICk7CisgICAgX19rbXBfcmVtZW1iZXJfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hZGRfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCAqIHQsIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjayApCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IHZvbGF0aWxlICpzID0gJmxjay0+c3RhdHM7CisKKyAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyArPSBsY2stPmFjcXVpcmVfYXR0ZW1wdHM7CisgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucyArPSBzLT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zOworICAgIHQtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnMgKz0gcy0+aGFyZEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgICB0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zICs9IHMtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArPSBzLT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzOworICAgIHQtPmxlbW1pbmdZaWVsZHMgICAgICAgICAgKz0gcy0+bGVtbWluZ1lpZWxkczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjY3VtdWxhdGVfc3BlY3VsYXRpdmVfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjaykKK3sKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKnQgPSAmZGVzdHJveWVkU3RhdHM7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCisgICAgX19rbXBfYWRkX3N0YXRzKCAmZGVzdHJveWVkU3RhdHMsIGxjayApOworICAgIF9fa21wX2ZvcmdldF9sb2NrKCBsY2sgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7Cit9CisKK3N0YXRpYyBmbG9hdAorcGVyY2VudCAoa21wX3VpbnQzMiBjb3VudCwga21wX3VpbnQzMiB0b3RhbCkKK3sKKyAgICByZXR1cm4gKHRvdGFsID09IDApID8gMC4wOiAoMTAwLjAgKiBjb3VudCkvdG90YWw7Cit9CisKK3N0YXRpYworRklMRSAqIF9fa21wX29wZW5fc3RhdHNfZmlsZSgpCit7CisgICAgaWYgKHN0cmNtcCAoX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLCAiLSIpID09IDApCisgICAgICAgIHJldHVybiBzdGRvdXQ7CisKKyAgICBzaXplX3QgYnVmZkxlbiA9IEtNUF9TVFJMRU4oIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApICsgMjA7CisgICAgY2hhciBidWZmZXJbYnVmZkxlbl07CisgICAgS01QX1NOUFJJTlRGICgmYnVmZmVyWzBdLCBidWZmTGVuLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsCisgICAgICAoa21wX2ludDMyKWdldHBpZCgpKTsKKyAgICBGSUxFICogcmVzdWx0ID0gZm9wZW4oJmJ1ZmZlclswXSwgInciKTsKKworICAgIC8vIE1heWJlIHdlIHNob3VsZCBpc3N1ZSBhIHdhcm5pbmcgaGVyZS4uLgorICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiBzdGRvdXQ7Cit9CisKK3ZvaWQKK19fa21wX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzKCkKK3sKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgIT0gbGtfYWRhcHRpdmUpCisgICAgICAgIHJldHVybjsKKworICAgIEZJTEUgKiBzdGF0c0ZpbGUgPSBfX2ttcF9vcGVuX3N0YXRzX2ZpbGUoKTsKKworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB0b3RhbCA9IGRlc3Ryb3llZFN0YXRzOworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqbGNrOworCisgICAgZm9yIChsY2sgPSBsaXZlTG9ja3Muc3RhdHMubmV4dDsgbGNrICE9ICZsaXZlTG9ja3M7IGxjayA9IGxjay0+c3RhdHMubmV4dCkgeworICAgICAgICBfX2ttcF9hZGRfc3RhdHMoICZ0b3RhbCwgbGNrICk7CisgICAgfQorICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCAqdCA9ICZ0b3RhbDsKKyAgICBrbXBfdWludDMyIHRvdGFsU2VjdGlvbnMgICAgID0gdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiB0b3RhbFNwZWN1bGF0aW9ucyA9IHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMgKyB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKworICAgIGZwcmludGYgKCBzdGF0c0ZpbGUsICJTcGVjdWxhdGl2ZSBsb2NrIHN0YXRpc3RpY3MgKGFsbCBhcHByb3hpbWF0ZSEpXG4iKTsKKyAgICBmcHJpbnRmICggc3RhdHNGaWxlLCAiIExvY2sgcGFyYW1ldGVyczogXG4iCisgICAgICAgICAgICAgIiAgIG1heF9zb2Z0X3JldHJpZXMgICAgICAgICAgICAgICA6ICUxMGRcbiIKKyAgICAgICAgICAgICAiICAgbWF4X2JhZG5lc3MgICAgICAgICAgICAgICAgICAgIDogJTEwZFxuIiwKKyAgICAgICAgICAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzLAorICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdHMgOiAlMTBkXG4iLCB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBUb3RhbCBjcml0aWNhbCBzZWN0aW9ucyAgICAgICAgICA6ICUxMGRcbiIsIHRvdGFsU2VjdGlvbnMgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU3VjY2Vzc2Z1bCBzcGVjdWxhdGlvbnMgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCB0b3RhbFNlY3Rpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmVzICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLCBwZXJjZW50KCB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLCB0b3RhbFNlY3Rpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTGVtbWluZyB5aWVsZHMgICAgICAgICAgICAgICAgICAgOiAlMTBkXG5cbiIsIHQtPmxlbW1pbmdZaWVsZHMgKTsKKworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHRzICAgICA6ICUxMGRcbiIsIHRvdGFsU3BlY3VsYXRpb25zICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFN1Y2Nlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgdG90YWxTcGVjdWxhdGlvbnMgKSApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTb2Z0IGZhaWx1cmVzICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsIHBlcmNlbnQoIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsIHRvdGFsU3BlY3VsYXRpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgSGFyZCBmYWlsdXJlcyAgICAgICAgICAgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucyApICk7CisKKyAgICBpZiAoc3RhdHNGaWxlICE9IHN0ZG91dCkKKyAgICAgICAgZmNsb3NlKCBzdGF0c0ZpbGUgKTsKK30KKworIyBkZWZpbmUgS01QX0lOQ19TVEFUKGxjayxzdGF0KSAoIGxjay0+bGsuYWRhcHRpdmUuc3RhdHMuc3RhdCsrICkKKyNlbHNlCisjIGRlZmluZSBLTVBfSU5DX1NUQVQobGNrLHN0YXQpCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICAvLyBJdCBpcyBlbm91Z2ggdG8gY2hlY2sgdGhhdCB0aGUgaGVhZF9pZCBpcyB6ZXJvLgorICAgIC8vIFdlIGRvbid0IGFsc28gbmVlZCB0byBjaGVjayB0aGUgdGFpbC4KKyAgICBib29sIHJlcyA9IGxjay0+bGsuaGVhZF9pZCA9PSAwOworCisgICAgLy8gV2UgbmVlZCBhIGZlbmNlIGhlcmUsIHNpbmNlIHdlIG11c3QgZW5zdXJlIHRoYXQgbm8gbWVtb3J5IG9wZXJhdGlvbnMKKyAgICAvLyBmcm9tIGxhdGVyIGluIHRoaXMgdGhyZWFkIGZsb2F0IGFib3ZlIHRoYXQgcmVhZC4KKyNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgX21tX21mZW5jZSgpOworI2Vsc2UKKyAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIGJhZG5lc3MKK3N0YXRpYyBfX2lubGluZSB2b2lkCitfX2ttcF91cGRhdGVfYmFkbmVzc19hZnRlcl9zdWNjZXNzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworICAgIC8vIFJlc2V0IHRoZSBiYWRuZXNzIHRvIHplcm8gc28gd2UgZWFnZXJseSB0cnkgdG8gc3BlY3VsYXRlIGFnYWluCisgICAgbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzID0gMDsKKyAgICBLTVBfSU5DX1NUQVQobGNrLHN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMpOworfQorCisvLyBDcmVhdGUgYSBiaXQgbWFzayB3aXRoIG9uZSBtb3JlIHNldCBiaXQuCitzdGF0aWMgX19pbmxpbmUgdm9pZAorX19rbXBfc3RlcF9iYWRuZXNzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworICAgIGttcF91aW50MzIgbmV3QmFkbmVzcyA9ICggbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzIDw8IDEgKSB8IDE7CisgICAgaWYgKCBuZXdCYWRuZXNzID4gbGNrLT5say5hZGFwdGl2ZS5tYXhfYmFkbmVzcykgeworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzID0gbmV3QmFkbmVzczsKKyAgICB9Cit9CisKKy8vIENoZWNrIHdoZXRoZXIgc3BlY3VsYXRpb24gc2hvdWxkIGJlIGF0dGVtcHRlZC4KK3N0YXRpYyBfX2lubGluZSBpbnQKK19fa21wX3Nob3VsZF9zcGVjdWxhdGUoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgYmFkbmVzcyA9IGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzczsKKyAgICBrbXBfdWludDMyIGF0dGVtcHRzPSBsY2stPmxrLmFkYXB0aXZlLmFjcXVpcmVfYXR0ZW1wdHM7CisgICAgaW50IHJlcyA9IChhdHRlbXB0cyAmIGJhZG5lc3MpID09IDA7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIG9ubHkgdGhlIHNwZWN1bGF0aXZlIGxvY2suCisvLyBEb2VzIG5vdCBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlIGxvY2suCisvLworc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKiBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0cmllcyA9IGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllczsKKworICAgIC8vIFdlIGRvbid0IGV4cGxpY2l0bHkgY291bnQgdGhlIHN0YXJ0IG9mIHNwZWN1bGF0aW9uLCByYXRoZXIgd2UgcmVjb3JkCisgICAgLy8gdGhlIHJlc3VsdHMgKHN1Y2Nlc3MsIGhhcmQgZmFpbCwgc29mdCBmYWlsKS4gVGhlIHN1bSBvZiBhbGwgb2YgdGhvc2UKKyAgICAvLyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHdlIHN0YXJ0ZWQgc3BlY3VsYXRpb24gc2luY2UgYWxsCisgICAgLy8gc3BlY3VsYXRpb25zIG11c3QgZW5kIG9uZSBvZiB0aG9zZSB3YXlzLgorICAgIGRvCisgICAgeworICAgICAgICBrbXBfdWludDMyIHN0YXR1cyA9IF94YmVnaW4oKTsKKyAgICAgICAgLy8gU3dpdGNoIHRoaXMgaW4gdG8gZGlzYWJsZSBhY3R1YWwgc3BlY3VsYXRpb24gYnV0IGV4ZXJjaXNlCisgICAgICAgIC8vIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHJlc3Qgb2YgdGhlIGNvZGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLi4uCisgICAgICAgIC8vIGttcF91aW50MzIgc3RhdHVzID0gX1hBQk9SVF9ORVNURUQ7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBfWEJFR0lOX1NUQVJURUQgKQorICAgICAgICB7IC8qIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgc3BlY3VsYXRpb24KKyAgICAgICAgICAgKiBDaGVjayB0aGF0IG5vLW9uZSBhY3F1aXJlZCB0aGUgbG9jayBmb3IgcmVhbCBiZXR3ZWVuIHdoZW4gd2UgbGFzdCBsb29rZWQKKyAgICAgICAgICAgKiBhbmQgbm93LiBUaGlzIGFsc28gZ2V0cyB0aGUgbG9jayBjYWNoZSBsaW5lIGludG8gb3VyIHJlYWQtc2V0LAorICAgICAgICAgICAqIHdoaWNoIHdlIG5lZWQgc28gdGhhdCB3ZSdsbCBhYm9ydCBpZiBhbnlvbmUgbGF0ZXIgY2xhaW1zIGl0IGZvciByZWFsLgorICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIExvY2sgaXMgbm93IHZpc2libHkgYWNxdWlyZWQsIHNvIHNvbWVvbmUgYmVhdCB1cyB0byBpdC4KKyAgICAgICAgICAgICAgICAvLyBBYm9ydCB0aGUgdHJhbnNhY3Rpb24gc28gd2UnbGwgcmVzdGFydCBmcm9tIF94YmVnaW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIHN0YXR1cy4KKyAgICAgICAgICAgICAgICBfeGFib3J0KDB4MDEpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOyAgIC8vIExvY2sgaGFzIGJlZW4gYWNxdWlyZWQgKHNwZWN1bGF0aXZlbHkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGFib3J0ZWQsIHVwZGF0ZSB0aGUgc3RhdGlzdGljcworICAgICAgICAgICAgaWYgKCBzdGF0dXMgJiBTT0ZUX0FCT1JUX01BU0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX0lOQ19TVEFUKGxjayxzb2Z0RmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgICAgICAgICAvLyBhbmQgbG9vcCByb3VuZCB0byByZXRyeS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5DX1NUQVQobGNrLGhhcmRGYWlsZWRTcGVjdWxhdGlvbnMpOworICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAgaWYgd2UgaGFkIGEgaGFyZCBmYWlsdXJlLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgd2hpbGUoIHJldHJpZXMtLSApOyAvLyBMb29wIHdoaWxlIHdlIGhhdmUgcmV0cmllcywgYW5kIGRpZG4ndCBmYWlsIGhhcmQuCisKKyAgICAvLyBFaXRoZXIgd2UgaGFkIGEgaGFyZCBmYWlsdXJlIG9yIHdlIGRpZG4ndCBzdWNjZWVkIHNvZnRseSBhZnRlcgorICAgIC8vIHRoZSBmdWxsIHNldCBvZiBhdHRlbXB0cywgc28gYmFjayBvZmYgdGhlIGJhZG5lc3MuCisgICAgX19rbXBfc3RlcF9iYWRuZXNzKCBsY2sgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBzcGVjdWxhdGl2ZSBsb2NrLCBvciBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlIG9uZQorLy8gaWYgdGhlIHNwZWN1bGF0aXZlIGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkLgorLy8gV2UgY2FuIHN1Y2NlZWQgc3BlY3VsYXRpdmVseSwgbm9uLXNwZWN1bGF0aXZlbHksIG9yIGZhaWwuCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vIEZpcnN0IHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkKKyAgICBpZiAoIF9fa21wX3Nob3VsZF9zcGVjdWxhdGUoIGxjaywgZ3RpZCApICYmIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2ssIGd0aWQgKSApCisgICAgICAgIHJldHVybiAxOworCisgICAgLy8gU3BlY3VsYXRpdmUgYWNxdWlzaXRpb24gZmFpbGVkLCBzbyB0cnkgdG8gYWNxdWlyZSBpdCBub24tc3BlY3VsYXRpdmVseS4KKyAgICAvLyBDb3VudCB0aGUgbm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdAorICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cysrOworCisgICAgLy8gVXNlIGJhc2UsIG5vbi1zcGVjdWxhdGl2ZSBsb2NrLgorICAgIGlmICggX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjayksIGd0aWQgKSApCisgICAgeworICAgICAgICBLTVBfSU5DX1NUQVQobGNrLG5vblNwZWN1bGF0aXZlQWNxdWlyZXMpOworICAgICAgICByZXR1cm4gMTsgICAgICAgLy8gTG9jayBpcyBhY3F1aXJlZCAobm9uLXNwZWN1bGF0aXZlbHkpCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOyAgICAgICAvLyBGYWlsZWQgdG8gYWNxdWlyZSB0aGUgbG9jaywgaXQncyBhbHJlYWR5IHZpc2libHkgbG9ja2VkLgorICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsucWxrLmluaXRpYWxpemVkICE9IEdFVF9RTEtfUFRSKGxjaykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsucWxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vIEJsb2NrIHVudGlsIHdlIGNhbiBhY3F1aXJlIGEgc3BlY3VsYXRpdmUsIGFkYXB0aXZlIGxvY2suCisvLyBXZSBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBiZSB0cnlpbmcgdG8gc3BlY3VsYXRlLgorLy8gSWYgd2Ugc2hvdWxkIGJlLCB3ZSBjaGVjayB0aGUgcmVhbCBsb2NrIHRvIHNlZSBpZiBpdCBpcyBmcmVlLAorLy8gYW5kLCBpZiBub3QsIHBhdXNlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBhY3F1aXJlIGl0IHVudGlsIGl0IGlzLgorLy8gVGhlbiB3ZSB0cnkgdGhlIHNwZWN1bGF0aXZlIGFjcXVpcmUuCisvLyBUaGlzIG1lYW5zIHRoYXQgYWx0aG91Z2ggd2Ugc3VmZmVyIGZyb20gbGVtbWluZ3MgYSBsaXR0bGUgKAorLy8gYmVjYXVzZSBhbGwgd2UgY2FuJ3QgYWNxdWlyZSB0aGUgbG9jayBzcGVjdWxhdGl2ZWx5IHVudGlsCisvLyB0aGUgcXVldWUgb2YgdGhyZWFkcyB3YWl0aW5nIGhhcyBjbGVhcmVkKSwgd2UgZG9uJ3QgZ2V0IGludG8gYQorLy8gc3RhdGUgd2hlcmUgd2UgY2FuIG5ldmVyIGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseSAoYmVjYXVzZSB3ZQorLy8gZm9yY2UgdGhlIHF1ZXVlIHRvIGNsZWFyIGJ5IHByZXZlbnRpbmcgbmV3IGFycml2YWxzIGZyb20gZW50ZXJpbmcgdGhlCisvLyBxdWV1ZSkuCisvLyBUaGlzIGRvZXMgbWVhbiB0aGF0IHdoZW4gd2UncmUgdHJ5aW5nIHRvIGJyZWFrIGxlbW1pbmdzLCB0aGUgbG9jaworLy8gaXMgbm8gbG9uZ2VyIGZhaXIuIEhvd2V2ZXIgT3Blbk1QIG1ha2VzIG5vIGd1YXJhbnRlZSB0aGF0IGl0cworLy8gbG9ja3MgYXJlIGZhaXIsIHNvIHRoaXMgaXNuJ3QgYSByZWFsIHByb2JsZW0uCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICogbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9zaG91bGRfc3BlY3VsYXRlKCBsY2ssIGd0aWQgKSApCisgICAgeworICAgICAgICBpZiAoIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSggbGNrICwgZ3RpZCApICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAvLyBXZSB0cmllZCBzcGVjdWxhdGlvbiBhbmQgZmFpbGVkLCBzbyBnaXZlIHVwLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdHJ5IHNwZWN1bGF0aW9uIHVudGlsIHRoZSBsb2NrIGlzIGZyZWUsIHNvIHdlCisgICAgICAgICAgICAvLyBwYXVzZSBoZXJlICh3aXRob3V0IHN1c3BlbmRpbmcgb24gdGhlIHF1ZXVlaW5nIGxvY2ssCisgICAgICAgICAgICAvLyB0byBhbGxvdyBpdCB0byBkcmFpbiwgdGhlbiB0cnkgYWdhaW4uCisgICAgICAgICAgICAvLyBBbGwgb3RoZXIgdGhyZWFkcyB3aWxsIGFsc28gc2VlIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAgICAgIC8vIHNob3VsZFNwZWN1bGF0ZSwgc28gd2lsbCBiZSBkb2luZyB0aGUgc2FtZSBpZiB0aGV5CisgICAgICAgICAgICAvLyB0cnkgdG8gY2xhaW0gdGhlIGxvY2sgZnJvbSBub3cgb24uCisgICAgICAgICAgICB3aGlsZSAoICEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssbGVtbWluZ1lpZWxkcyk7CisgICAgICAgICAgICAgICAgX19rbXBfeWllbGQgKFRSVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2ssIGd0aWQgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3BlY3VsYXRpdmUgYWNxdWlzaXRpb24gZmFpbGVkLCBzbyBhY3F1aXJlIGl0IG5vbi1zcGVjdWxhdGl2ZWx5LgorICAgIC8vIENvdW50IHRoZSBub24tc3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0CisgICAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzKys7CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxGQUxTRT4oIEdFVF9RTEtfUFRSKGxjayksIGd0aWQgKTsKKyAgICAvLyBXZSBoYXZlIGFjcXVpcmVkIHRoZSBiYXNlIGxvY2ssIHNvIGNvdW50IHRoYXQuCisgICAgS01QX0lOQ19TVEFUKGxjayxub25TcGVjdWxhdGl2ZUFjcXVpcmVzICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLnFsay5pbml0aWFsaXplZCAhPSBHRVRfUUxLX1BUUihsY2spICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBHRVRfUUxLX1BUUihsY2spICkgPT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgbGNrLT5say5xbGsub3duZXJfaWQgPSBndGlkICsgMTsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApICkKKyAgICB7ICAgLy8gSWYgdGhlIGxvY2sgZG9lc24ndCBsb29rIGNsYWltZWQgd2UgbXVzdCBiZSBzcGVjdWxhdGluZy4KKyAgICAgICAgLy8gKE9yIHRoZSB1c2VyJ3MgY29kZSBpcyBidWdneSBhbmQgdGhleSdyZSByZWxlYXNpbmcgd2l0aG91dCBsb2NraW5nOworICAgICAgICAvLyBpZiB3ZSBoYWQgWFRFU1Qgd2UnZCBiZSBhYmxlIHRvIGNoZWNrIHRoYXQgY2FzZS4uLikKKyAgICAgICAgX3hlbmQoKTsgICAgICAgIC8vIEV4aXQgc3BlY3VsYXRpb24KKyAgICAgICAgX19rbXBfdXBkYXRlX2JhZG5lc3NfYWZ0ZXJfc3VjY2VzcyggbGNrICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgLy8gU2luY2UgdGhlIGxvY2sgKmlzKiB2aXNpYmx5IGxvY2tlZCB3ZSdyZSBub3Qgc3BlY3VsYXRpbmcsCisgICAgICAgIC8vIHNvIHNob3VsZCB1c2UgdGhlIHVuZGVybHlpbmcgbG9jaydzIHJlbGVhc2Ugc2NoZW1lLgorICAgICAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSwgZ3RpZCApOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLnFsay5pbml0aWFsaXplZCAhPSBHRVRfUUxLX1BUUihsY2spICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBHRVRfUUxLX1BUUihsY2spICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBHRVRfUUxLX1BUUihsY2spICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIGxjay0+bGsucWxrLm93bmVyX2lkID0gMDsKKyAgICBfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApOworICAgIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA9IDA7CisgICAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzID0gMDsgLy9ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyA9IDA7CisgICAgbGNrLT5say5hZGFwdGl2ZS5tYXhfc29mdF9yZXRyaWVzID0gX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllczsKKyAgICBsY2stPmxrLmFkYXB0aXZlLm1heF9iYWRuZXNzICAgICAgPSBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFkbmVzczsKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBfX2ttcF96ZXJvX3NwZWN1bGF0aXZlX3N0YXRzKCAmbGNrLT5say5hZGFwdGl2ZSApOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2s6IGxvY2sgJXAgaW5pdGlhbGl6ZWRcbiIsIGxjaykpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2soIGxjayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIF9fa21wX2FjY3VtdWxhdGVfc3BlY3VsYXRpdmVfc3RhdHMoICZsY2stPmxrLmFkYXB0aXZlICk7CisjZW5kaWYKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayAoR0VUX1FMS19QVFIobGNrKSk7CisgICAgLy8gTm90aGluZyBuZWVkZWQgZm9yIHRoZSBzcGVjdWxhdGl2ZSBwYXJ0LgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggbGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jayggbGNrICk7Cit9CisKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIERSRFBBIHRpY2tldCBsb2NrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAiRFJEUEEiIG1lYW5zIER5bmFtaWNhbGx5IFJlY29uZmlndXJhYmxlIERpc3RyaWJ1dGVkIFBvbGxpbmcgQXJlYSAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lcigga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gVENSXzQoIGxjay0+bGsub3duZXJfaWQgKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSgga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5kZXB0aF9sb2NrZWQgIT0gLTE7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDY0IHRpY2tldCA9IEtNUF9URVNUX1RIRU5fSU5DNjQoKGttcF9pbnQ2NCAqKSZsY2stPmxrLm5leHRfdGlja2V0KTsKKyAgICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICpwb2xscworICAgICAgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgIFRDUl9QVFIobGNrLT5say5wb2xscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGlmIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSAhPSB0aWNrZXQpCisgICAgICAgIF9fa21wX3ByaW50ZigiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICAvLworICAgIC8vIE5vdyBzcGluLXdhaXQsIGJ1dCByZWxvYWQgdGhlIHBvbGxzIHBvaW50ZXIgYW5kIG1hc2ssIGluIGNhc2UgdGhlCisgICAgLy8gcG9sbGluZyBhcmVhIGhhcyBiZWVuIHJlY29uZmlndXJlZC4gIFVubGVzcyBpdCBpcyByZWNvbmZpZ3VyZWQsIHRoZQorICAgIC8vIHJlbG9hZHMgc3RheSBpbiBMMSBjYWNoZSBhbmQgYXJlIGNoZWFwLgorICAgIC8vCisgICAgLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIEtNUF9XQUlUX1lJRUxELCBpbiBrbXBfZGlzcGF0Y2guYyAhISEKKyAgICAvLworICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEtNUF9XQUlUX1lJRUxEIGRvZXNuJ3QgYWxsb3cgZm9yIG1hc2sKKyAgICAvLyBhbmQgcG9sbCB0byBiZSByZS1yZWFkIGV2ZXJ5IHNwaW4gaXRlcmF0aW9uLgorICAgIC8vCisgICAga21wX3VpbnQzMiBzcGluczsKKworICAgIEtNUF9GU1lOQ19QUkVQQVJFKGxjayk7CisgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworICAgIHdoaWxlIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXSkucG9sbCA8IHRpY2tldCkgeyAvLyB2b2xhdGlsZSBsb2FkCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10dXJuYXJvdW5kKSwgdGhlbiB5aWVsZC4KKyAgICAgICAgLy8gQ1BVIFBhdXNlIGlzIGluIHRoZSBtYWNyb3MgZm9yIHlpZWxkLgorICAgICAgICAvLworICAgICAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKQorICAgICAgICAgID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOworCisgICAgICAgIC8vIFJlLXJlYWQgdGhlIG1hc2sgYW5kIHRoZSBwb2xsIHBvaW50ZXIgZnJvbSB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgICAgIC8vCisgICAgICAgIC8vIE1ha2UgY2VydGFpbiB0aGF0ICJtYXNrIiBpcyByZWFkIGJlZm9yZSAicG9sbHMiICEhIQorICAgICAgICAvLworICAgICAgICAvLyBJZiBhbm90aGVyIHRocmVhZCBwaWNrcyByZWNvbmZpZ3VyZXMgdGhlIHBvbGxpbmcgYXJlYSBhbmQgdXBkYXRlcworICAgICAgICAvLyB0aGVpciB2YWx1ZXMsIGFuZCB3ZSBnZXQgdGhlIG5ldyB2YWx1ZSBvZiBtYXNrIGFuZCB0aGUgb2xkIHBvbGxzCisgICAgICAgIC8vIHBvaW50ZXIsIHdlIGNvdWxkIGFjY2VzcyBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9sZCBwb2xsaW5nCisgICAgICAgIC8vIGFyZWEuCisgICAgICAgIC8vCisgICAgICAgIG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICAgICAgcG9sbHMgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIH0KKworICAgIC8vCisgICAgLy8gQ3JpdGljYWwgc2VjdGlvbiBzdGFydHMgaGVyZQorICAgIC8vCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCBhY3F1aXJlZCBsb2NrICVwXG4iLAorICAgICAgdGlja2V0LCBsY2spKTsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gdGlja2V0OyAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisKKyAgICAvLworICAgIC8vIERlYWxsb2NhdGUgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSBpZiB3ZSBrbm93IHRoYXQgd2UgYXJlIHRoZSBsYXN0CisgICAgLy8gdGhyZWFkIHRoYXQgY291bGQgcG9zc2libHkgYWNjZXNzIGl0LgorICAgIC8vCisgICAgLy8gVGhlID49IGNoZWNrIGlzIGluIGNhc2UgX19rbXBfdGVzdF9kcmRwYV9sb2NrKCkgYWxsb2NhdGVkIHRoZSBjbGVhbnVwCisgICAgLy8gdGlja2V0LgorICAgIC8vCisgICAgaWYgKChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSAmJiAodGlja2V0ID49IGxjay0+bGsuY2xlYW51cF90aWNrZXQpKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLm9sZF9wb2xscyk7CisgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICAgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlY29uZmlndXJlIHRoZSBwb2xsaW5nIGFyZWEuCisgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSB0byBiZSBkZWFsbG9jYXRlZCBmcm9tIGEKKyAgICAvLyBwcmV2aW91cyByZWNvbmZpZ3VyYXRpb24sIGxldCBhIGxhdGVyIHRocmVhZCByZWNvbmZpZ3VyZSBpdC4KKyAgICAvLworICAgIGlmIChsY2stPmxrLm9sZF9wb2xscyA9PSBOVUxMKSB7CisgICAgICAgIGJvb2wgcmVjb25maWd1cmUgPSBmYWxzZTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKm9sZF9wb2xscyA9IHBvbGxzOworICAgICAgICBrbXBfdWludDMyIG51bV9wb2xscyA9IFRDUl80KGxjay0+bGsubnVtX3BvbGxzKTsKKworICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKQorICAgICAgICAgID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgYXJlIGluIG92ZXJzdWJzY3JpcHRpb24gbW9kZS4gIENvbnRyYWN0IHRoZSBwb2xsaW5nIGFyZWEKKyAgICAgICAgICAgIC8vIGRvd24gdG8gYSBzaW5nbGUgbG9jYXRpb24sIGlmIHRoYXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmIChudW1fcG9sbHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIG51bV9wb2xscyA9IFRDUl80KGxjay0+bGsubnVtX3BvbGxzKTsKKyAgICAgICAgICAgICAgICBtYXNrID0gMDsKKyAgICAgICAgICAgICAgICBudW1fcG9sbHMgPSAxOworICAgICAgICAgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgICAgICAgICAgcG9sbHNbMF0ucG9sbCA9IHRpY2tldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdW5kZXIvZnVsbHkgc3Vic2NyaWJlZCBtb2RlLiAgQ2hlY2sgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgLy8gdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBsb2NrLiAgVGhlIHNpemUgb2YgdGhlIHBvbGxpbmcgYXJlYQorICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB3YWl0aW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGttcF91aW50NjQgbnVtX3dhaXRpbmcgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KSAtIHRpY2tldCAtIDE7CisgICAgICAgICAgICBpZiAobnVtX3dhaXRpbmcgPiBudW1fcG9sbHMpIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIG9sZF9udW1fcG9sbHMgPSBudW1fcG9sbHM7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IChtYXNrIDw8IDEpIHwgMTsKKyAgICAgICAgICAgICAgICAgICAgbnVtX3BvbGxzICo9IDI7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobnVtX3BvbGxzIDw9IG51bV93YWl0aW5nKTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIG5ldyBwb2xsaW5nIGFyZWEsIGFuZCBjb3B5IHRoZSByZWxldmFudCBwb3J0aW9uCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIG9sZCBwb2xsaW5nIGFyZWEgdG8gdGhlIG5ldyBhcmVhLiAgX19rbXBfYWxsb2NhdGUoKQorICAgICAgICAgICAgICAgIC8vIHplcm9lcyB0aGUgbWVtb3J5IGl0IGFsbG9jYXRlcywgYW5kIG1vc3Qgb2YgdGhlIG9sZCBhcmVhIGlzCisgICAgICAgICAgICAgICAgLy8ganVzdCB6ZXJvIHBhZGRpbmcsIHNvIHdlIG9ubHkgY29weSB0aGUgcmVsZWFzZSBjb3VudGVycy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRfbnVtX3BvbGxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcG9sbHNbaV0ucG9sbCA9IG9sZF9wb2xsc1tpXS5wb2xsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWNvbmZpZ3VyZSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdyB3cml0ZSB0aGUgdXBkYXRlZCBmaWVsZHMgYmFjayB0byB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTWFrZSBjZXJ0YWluIHRoYXQgInBvbGxzIiBpcyB3cml0dGVuIGJlZm9yZSAibWFzayIgISEhCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgYW5vdGhlciB0aHJlYWQgcGlja3MgdXAgdGhlIG5ldyB2YWx1ZSBvZiBtYXNrIGFuZCB0aGUgb2xkCisgICAgICAgICAgICAvLyBwb2xscyBwb2ludGVyICwgaXQgY291bGQgYWNjZXNzIG1lbW9yeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgIC8vIG9sZCBwb2xsaW5nIGFyZWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT24geDg2LCB3ZSBuZWVkIG1lbW9yeSBmZW5jZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCByZWNvbmZpZ3VyaW5nIGxvY2sgJXAgdG8gJWQgcG9sbHNcbiIsCisgICAgICAgICAgICAgIHRpY2tldCwgbGNrLCBudW1fcG9sbHMpKTsKKworICAgICAgICAgICAgbGNrLT5say5vbGRfcG9sbHMgPSBvbGRfcG9sbHM7ICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKyAgICAgICAgICAgIGxjay0+bGsucG9sbHMgPSBwb2xsczsgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIGxjay0+bGsubnVtX3BvbGxzID0gbnVtX3BvbGxzOyAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICAgICAgICBsY2stPmxrLm1hc2sgPSBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIHN0b3JlCisKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT25seSBhZnRlciB0aGUgbmV3IHBvbGxpbmcgYXJlYSBhbmQgbWFzayBoYXZlIGJlZW4gZmx1c2hlZAorICAgICAgICAgICAgLy8gdG8gbWFpbiBtZW1vcnkgY2FuIHdlIHVwZGF0ZSB0aGUgY2xlYW51cCB0aWNrZXQgZmllbGQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZCAvIG5vbi12b2xhdGlsZSBzdG9yZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQKK19fa21wX3Rlc3RfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgLy8KKyAgICAvLyBGaXJzdCBnZXQgYSB0aWNrZXQsIHRoZW4gcmVhZCB0aGUgcG9sbHMgcG9pbnRlciBhbmQgdGhlIG1hc2suCisgICAgLy8gVGhlIHBvbGxzIHBvaW50ZXIgbXVzdCBiZSByZWFkIGJlZm9yZSB0aGUgbWFzayEhISAoU2VlIGFib3ZlKQorICAgIC8vCisgICAga21wX3VpbnQ2NCB0aWNrZXQgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KTsgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMKKyAgICAgID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIGlmIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSA9PSB0aWNrZXQpIHsKKyAgICAgICAga21wX3VpbnQ2NCBuZXh0X3RpY2tldCA9IHRpY2tldCArIDE7CisgICAgICAgIGlmIChLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoKGttcF9pbnQ2NCAqKSZsY2stPmxrLm5leHRfdGlja2V0LAorICAgICAgICAgIHRpY2tldCwgbmV4dF90aWNrZXQpKSB7CisgICAgICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfdGVzdF9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgYWNxdWlyZWQgbG9jayAlcFxuIiwKKyAgICAgICAgICAgICAgIHRpY2tldCwgbGNrKSk7CisgICAgICAgICAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gdGlja2V0OyAgICAgICAgICAgICAgIC8vIG5vbi12b2xhdGlsZSBzdG9yZQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2luY2Ugbm8gdGhyZWFkcyBhcmUgd2FpdGluZywgdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgdGhhdAorICAgICAgICAgICAgLy8gd2Ugd291bGQgd2FudCB0byByZWNvbmZpZ3VyZSB0aGUgcG9sbGluZyBhcmVhLiAgV2UgbWlnaHQKKyAgICAgICAgICAgIC8vIGhhdmUgdGhlIGNsZWFudXAgdGlja2V0IHZhbHVlICh3aGljaCBzYXlzIHRoYXQgaXQgaXMgbm93CisgICAgICAgICAgICAvLyBzYWZlIHRvIGRlYWxsb2NhdGUgb2xkX3BvbGxzKSwgYnV0IHdlJ2xsIGxldCBhIGxhdGVyIHRocmVhZAorICAgICAgICAgICAgLy8gd2hpY2ggY2FsbHMgX19rbXBfYWNxdWlyZV9sb2NrIGRvIHRoYXQgLSB0aGlzIHJvdXRpbmUKKyAgICAgICAgICAgIC8vIGlzbid0IHN1cHBvc2VkIHRvIGJsb2NrLCBhbmQgd2Ugd291bGQgcmlzayBibG9ja3MgaWYgd2UKKyAgICAgICAgICAgIC8vIGNhbGxlZCBfX2ttcF9mcmVlKCkgdG8gZG8gdGhlIGRlYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorCisgICAgaW50IHJldHZhbCA9IF9fa21wX3Rlc3RfZHJkcGFfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgLy8KKyAgICAvLyBSZWFkIHRoZSB0aWNrZXQgdmFsdWUgZnJvbSB0aGUgbG9jayBkYXRhIHN0cnVjdCwgdGhlbiB0aGUgcG9sbHMKKyAgICAvLyBwb2ludGVyIGFuZCB0aGUgbWFzay4gIFRoZSBwb2xscyBwb2ludGVyIG11c3QgYmUgcmVhZCBiZWZvcmUgdGhlCisgICAgLy8gbWFzayEhISAoU2VlIGFib3ZlKQorICAgIC8vCisgICAga21wX3VpbnQ2NCB0aWNrZXQgPSBsY2stPmxrLm5vd19zZXJ2aW5nICsgMTsgICAgICAgIC8vIG5vbi12b2xhdGlsZSBsb2FkCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzCisgICAgICA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX3JlbGVhc2VfZHJkcGFfbG9jazogdGlja2V0ICMlbGxkIHJlbGVhc2VkIGxvY2sgJXBcbiIsCisgICAgICAgdGlja2V0IC0gMSwgbGNrKSk7CisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworICAgIEtNUF9TVF9SRUw2NCgmKHBvbGxzW3RpY2tldCAmIG1hc2tdLnBvbGwpLCB0aWNrZXQpOyAvLyB2b2xhdGlsZSBzdG9yZQorICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBsY2stPmxrLm1hc2sgPSAwOworICAgIGxjay0+bGsubnVtX3BvbGxzID0gMTsKKyAgICBsY2stPmxrLnBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBfX2ttcF9hbGxvY2F0ZShsY2stPmxrLm51bV9wb2xscyAqIHNpemVvZigqKGxjay0+bGsucG9sbHMpKSk7CisgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgbGNrLT5say5vbGRfcG9sbHMgPSBOVUxMOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOyAgICAgIC8vIG5vIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzLgorICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBsY2s7CisKKyAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2luaXRfZHJkcGFfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZHJkcGFfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gTlVMTDsKKyAgICBsY2stPmxrLmxvY2F0aW9uICAgID0gTlVMTDsKKyAgICBpZiAobGNrLT5say5wb2xscyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLnBvbGxzKTsKKyAgICAgICAgbGNrLT5say5wb2xscyA9IE5VTEw7CisgICAgfQorICAgIGlmIChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLm9sZF9wb2xscyk7CisgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICB9CisgICAgbGNrLT5say5tYXNrID0gMDsKKyAgICBsY2stPmxrLm51bV9wb2xscyA9IDA7CisgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIGRyZHBhIHRpY2tldCBsb2NrcworLy8KKworaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfZHJkcGFfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGZpZWxkcyB3aGljaCBkb24ndCBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworCitzdGF0aWMgaW50CitfX2ttcF9pc19kcmRwYV9sb2NrX2luaXRpYWxpemVkKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2sgPT0gbGNrLT5say5pbml0aWFsaXplZDsKK30KKworc3RhdGljIGNvbnN0IGlkZW50X3QgKgorX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24oIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfZHJkcGFfbG9ja19sb2NhdGlvbigga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBsb2M7Cit9CisKK3N0YXRpYyBrbXBfbG9ja19mbGFnc190CitfX2ttcF9nZXRfZHJkcGFfbG9ja19mbGFncygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5mbGFnczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9kcmRwYV9sb2NrX2ZsYWdzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8vIERpcmVjdCBsb2NrIGluaXRpYWxpemVycy4gSXQgc2ltcGx5IHdyaXRlcyBhIHRhZyB0byB0aGUgbG93IDggYml0cyBvZiB0aGUgbG9jayB3b3JkLgorc3RhdGljIHZvaWQgX19rbXBfaW5pdF9kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2R5bmFfbG9ja3NlcV90IHNlcSkKK3sKKyAgICBUQ1dfNCgqbGNrLCBLTVBfR0VUX0RfVEFHKHNlcSkpOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2luaXRfZGlyZWN0X2xvY2s6IGluaXRpYWxpemVkIGRpcmVjdCBsb2NrIHdpdGggdHlwZSMlZFxuIiwgc2VxKSk7Cit9CisKKyNpZiBLTVBfVVNFX1RTWAorCisvLyBITEUgbG9jayBmdW5jdGlvbnMgLSBpbXBvcnRlZCBmcm9tIHRoZSB0ZXN0YmVkIHJ1bnRpbWUuCisjZGVmaW5lIEhMRV9BQ1FVSVJFICIuYnl0ZSAweGYyOyIKKyNkZWZpbmUgSExFX1JFTEVBU0UgIi5ieXRlIDB4ZjM7IgorCitzdGF0aWMgaW5saW5lIGttcF91aW50MzIKK3N3YXA0KGttcF91aW50MzIgdm9sYXRpbGUgKnAsIGttcF91aW50MzIgdikKK3sKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEhMRV9BQ1FVSVJFICJ4Y2hnICUxLCUwIgorICAgICAgICAgICAgICAgICAgICA6ICIrciIodiksICIrbSIoKnApCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X2hsZV9sb2NrKGttcF9keW5hX2xvY2tfdCAqbGNrKQoreworICAgIFRDV180KCpsY2ssIDApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9obGVfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgLy8gVXNlIGd0aWQgZm9yIEtNUF9MT0NLX0JVU1kgaWYgbmVjZXNzYXJ5CisgICAgaWYgKHN3YXA0KGxjaywgS01QX0xPQ0tfQlVTWSgxLCBobGUpKSAhPSBLTVBfTE9DS19GUkVFKGhsZSkpIHsKKyAgICAgICAgaW50IGRlbGF5ID0gMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgd2hpbGUgKCooa21wX3VpbnQzMiB2b2xhdGlsZSAqKWxjayAhPSBLTVBfTE9DS19GUkVFKGhsZSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZGVsYXk7IGkgIT0gMDsgLS1pKQorICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgZGVsYXkgPSAoKGRlbGF5IDw8IDEpIHwgMSkgJiA3OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChzd2FwNChsY2ssIEtNUF9MT0NLX0JVU1koMSwgaGxlKSkgIT0gS01QX0xPQ0tfRlJFRShobGUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2hsZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2hsZV9sb2NrKGxjaywgZ3RpZCk7IC8vIFRPRE86IGFkZCBjaGVja3MKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9obGVfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgX19hc21fXyB2b2xhdGlsZShITEVfUkVMRUFTRSAibW92bCAlMSwlMCIKKyAgICAgICAgICAgICAgICAgICAgOiAiPW0iKCpsY2spCisgICAgICAgICAgICAgICAgICAgIDogInIiKEtNUF9MT0NLX0ZSRUUoaGxlKSkKKyAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX2hsZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9obGVfbG9jayhsY2ssIGd0aWQpOyAvLyBUT0RPOiBhZGQgY2hlY2tzCit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfaGxlX2xvY2soa21wX2R5bmFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHJldHVybiBzd2FwNChsY2ssIEtNUF9MT0NLX0JVU1koMSwgaGxlKSkgPT0gS01QX0xPQ0tfRlJFRShobGUpOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2hsZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF9obGVfbG9jayhsY2ssIGd0aWQpOyAvLyBUT0RPOiBhZGQgY2hlY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKGxjayk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKQoreworICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKGxjayk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICB1bnNpZ25lZCByZXRyaWVzPTMsIHN0YXR1czsKKyAgICBkbyB7CisgICAgICAgIHN0YXR1cyA9IF94YmVnaW4oKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBfWEJFR0lOX1NUQVJURUQpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBfeGFib3J0KDB4ZmYpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdHVzICYgX1hBQk9SVF9FWFBMSUNJVCkgJiYgX1hBQk9SVF9DT0RFKHN0YXR1cykgPT0gMHhmZikgeworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBsb2NrIGJlY29tZXMgZnJlZQorICAgICAgICAgICAgd2hpbGUgKCEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKGxjaykpCisgICAgICAgICAgICAgICAgX19rbXBfeWllbGQoVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIShzdGF0dXMgJiBfWEFCT1JUX1JFVFJZKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKHJldHJpZXMtLSk7CisKKyAgICAvLyBGYWxsLWJhY2sgbm9uLXNwZWN1bGF0aXZlIGxvY2sgKHhjaGcpCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2sobGNrLCBndGlkKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfcnRtX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIF9fa21wX2FjcXVpcmVfcnRtX2xvY2sobGNrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9ydG1fbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgaWYgKF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhsY2spKSB7CisgICAgICAgIC8vIFJlbGVhc2luZyBmcm9tIHNwZWN1bGF0aW9uCisgICAgICAgIF94ZW5kKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBSZWxlYXNpbmcgZnJvbSBhIHJlYWwgbG9jaworICAgICAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayhsY2ssIGd0aWQpOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfcnRtX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3J0bV9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfcnRtX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHVuc2lnbmVkIHJldHJpZXM9Mywgc3RhdHVzOworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzID0gX3hiZWdpbigpOworICAgICAgICBpZiAoc3RhdHVzID09IF9YQkVHSU5fU1RBUlRFRCAmJiBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc3RhdHVzICYgX1hBQk9SVF9SRVRSWSkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9IHdoaWxlIChyZXRyaWVzLS0pOworCisgICAgcmV0dXJuIChfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSk/IDE6IDA7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfcnRtX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHJldHVybiBfX2ttcF90ZXN0X3J0bV9sb2NrKGxjaywgZ3RpZCk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX1RTWAorCisvLyBFbnRyeSBmdW5jdGlvbnMgZm9yIGluZGlyZWN0IGxvY2tzIChmaXJzdCBlbGVtZW50IG9mIGRpcmVjdCBsb2NrIGp1bXAgdGFibGVzKS4KK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsLCBrbXBfZHluYV9sb2Nrc2VxX3QgdGFnKTsKK3N0YXRpYyB2b2lkIF9fa21wX2Rlc3Ryb3lfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrKTsKK3N0YXRpYyB2b2lkIF9fa21wX3NldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgaW50ICBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgaW50ICBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyKTsKK3N0YXRpYyB2b2lkIF9fa21wX3NldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgaW50ICBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgaW50ICBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyKTsKKworLy8KKy8vIEp1bXAgdGFibGVzIGZvciB0aGUgaW5kaXJlY3QgbG9jayBmdW5jdGlvbnMuCisvLyBPbmx5IGZpbGwgaW4gdGhlIG9kZCBlbnRyaWVzLCB0aGF0IGF2b2lkcyB0aGUgbmVlZCB0byBzaGlmdCBvdXQgdGhlIGxvdyBiaXQuCisvLworCisvLyBpbml0IGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIDAsX19rbXBfaW5pdF9kaXJlY3RfbG9jaywKK3ZvaWQgKCpfX2ttcF9kaXJlY3RfaW5pdFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2R5bmFfbG9ja3NlcV90KQorICAgID0geyBfX2ttcF9pbml0X2luZGlyZWN0X2xvY2ssIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIGluaXQpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIGRlc3Ryb3kgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgMCwodm9pZCAoKikoa21wX2R5bmFfbG9ja190ICopKV9fa21wXyMjb3AjI18jI2wjI19sb2NrLAordm9pZCAoKl9fa21wX2RpcmVjdF9kZXN0cm95W10pKGttcF9keW5hX2xvY2tfdCAqKQorICAgID0geyBfX2ttcF9kZXN0cm95X2luZGlyZWN0X2xvY2ssIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIGRlc3Ryb3kpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIHNldC9hY3F1aXJlIGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIDAsKHZvaWQgKCopKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrLAorc3RhdGljIHZvaWQgKCpkaXJlY3Rfc2V0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3NldF9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCBhY3F1aXJlKSB9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApIDAsKHZvaWQgKCopKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrX3dpdGhfY2hlY2tzLAorc3RhdGljIHZvaWQgKCpkaXJlY3Rfc2V0X2NoZWNrW10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3NldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCBhY3F1aXJlKSB9OworI3VuZGVmIGV4cGFuZAorCisvLyB1bnNldC9yZWxlYXNlIGFuZCB0ZXN0IGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIDAsKGludCAgKCopKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrLAorc3RhdGljIGludCAoKmRpcmVjdF91bnNldFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKQorICAgID0geyBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCByZWxlYXNlKSB9Oworc3RhdGljIGludCAgKCpkaXJlY3RfdGVzdFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKQorICAgID0geyBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2ssIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIHRlc3QpIH07CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgMCwoaW50ICAoKikoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjX2xvY2tfd2l0aF9jaGVja3MsCitzdGF0aWMgaW50ICgqZGlyZWN0X3Vuc2V0X2NoZWNrW10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3Vuc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3MsIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIHJlbGVhc2UpIH07CitzdGF0aWMgaW50ICgqZGlyZWN0X3Rlc3RfY2hlY2tbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikKKyAgICA9IHsgX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCB0ZXN0KSB9OworI3VuZGVmIGV4cGFuZAorCisvLyBFeHBvc2VzIG9ubHkgb25lIHNldCBvZiBqdW1wIHRhYmxlcyAoKmxvY2sgb3IgKmxvY2tfd2l0aF9jaGVja3MpLgordm9pZCAoKigqX19rbXBfZGlyZWN0X3NldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpID0gMDsKK2ludCAoKigqX19rbXBfZGlyZWN0X3Vuc2V0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSAwOworaW50ICgqKCpfX2ttcF9kaXJlY3RfdGVzdCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpID0gMDsKKworLy8KKy8vIEp1bXAgdGFibGVzIGZvciB0aGUgaW5kaXJlY3QgbG9jayBmdW5jdGlvbnMuCisvLworI2RlZmluZSBleHBhbmQobCwgb3ApICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3ApKV9fa21wXyMjb3AjI18jI2wjI18jI2xvY2ssCit2b2lkICgqX19rbXBfaW5kaXJlY3RfaW5pdFtdKShrbXBfdXNlcl9sb2NrX3ApID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCBpbml0KSB9Owordm9pZCAoKl9fa21wX2luZGlyZWN0X2Rlc3Ryb3lbXSkoa21wX3VzZXJfbG9ja19wKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgZGVzdHJveSkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gc2V0L2FjcXVpcmUgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfIyNsb2NrLAorc3RhdGljIHZvaWQgKCppbmRpcmVjdF9zZXRbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCBhY3F1aXJlKSB9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjXyMjbG9ja193aXRoX2NoZWNrcywKK3N0YXRpYyB2b2lkICgqaW5kaXJlY3Rfc2V0X2NoZWNrW10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgYWNxdWlyZSkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gdW5zZXQvcmVsZWFzZSBhbmQgdGVzdCBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAoaW50ICAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI18jI2xvY2ssCitzdGF0aWMgaW50ICgqaW5kaXJlY3RfdW5zZXRbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCByZWxlYXNlKSB9Oworc3RhdGljIGludCAoKmluZGlyZWN0X3Rlc3RbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCB0ZXN0KSB9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApIChpbnQgICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjXyMjbG9ja193aXRoX2NoZWNrcywKK3N0YXRpYyBpbnQgKCppbmRpcmVjdF91bnNldF9jaGVja1tdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIHJlbGVhc2UpIH07CitzdGF0aWMgaW50ICgqaW5kaXJlY3RfdGVzdF9jaGVja1tdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIHRlc3QpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIEV4cG9zZXMgb25seSBvbmUganVtcCB0YWJsZXMgKCpsb2NrIG9yICpsb2NrX3dpdGhfY2hlY2tzKS4KK3ZvaWQgKCooKl9fa21wX2luZGlyZWN0X3NldCkpKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IDA7CitpbnQgKCooKl9fa21wX2luZGlyZWN0X3Vuc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0gMDsKK2ludCAoKigqX19rbXBfaW5kaXJlY3RfdGVzdCkpKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IDA7CisKKy8vIExvY2sgaW5kZXggdGFibGUuCitrbXBfaW5kaXJlY3RfbG9ja190YWJsZV90IF9fa21wX2lfbG9ja190YWJsZTsKKworLy8gU2l6ZSBvZiBpbmRpcmVjdCBsb2Nrcy4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtLTVBfTlVNX0lfTE9DS1NdID0geyAwIH07CisKKy8vIEp1bXAgdGFibGVzIGZvciBsb2NrIGFjY2Vzc29yL21vZGlmaWVyLgordm9pZCAoKl9fa21wX2luZGlyZWN0X3NldF9sb2NhdGlvbltLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKikgPSB7IDAgfTsKK3ZvaWQgKCpfX2ttcF9pbmRpcmVjdF9zZXRfZmxhZ3NbS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KSA9IHsgMCB9OworY29uc3QgaWRlbnRfdCAqICgqX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCkgPSB7IDAgfTsKK2ttcF9sb2NrX2ZsYWdzX3QgKCpfX2ttcF9pbmRpcmVjdF9nZXRfZmxhZ3NbS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wKSA9IHsgMCB9OworCisvLyBVc2UgZGlmZmVyZW50IGxvY2sgcG9vbHMgZm9yIGRpZmZlcmVudCBsb2NrIHR5cGVzLgorc3RhdGljIGttcF9pbmRpcmVjdF9sb2NrX3QgKiBfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbS01QX05VTV9JX0xPQ0tTXSA9IHsgMCB9OworCisvLyBVc2VyIGxvY2sgYWxsb2NhdG9yIGZvciBkeW5hbWljYWxseSBkaXNwYXRjaGVkIGluZGlyZWN0IGxvY2tzLgorLy8gRXZlcnkgZW50cnkgb2YgdGhlIGluZGlyZWN0IGxvY2sgdGFibGUgaG9sZHMgdGhlIGFkZHJlc3MgYW5kIHR5cGUgb2YgdGhlIGFsbG9jYXRlZCBpbmRyZWN0IGxvY2sKKy8vIChrbXBfaW5kaXJlY3RfbG9ja190KSwgYW5kIHRoZSBzaXplIG9mIHRoZSB0YWJsZSBkb3VibGVzIHdoZW4gaXQgaXMgZnVsbC4gQSBkZXN0cm95ZWQgaW5kaXJlY3QgbG9jaworLy8gb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSByZXVzYWJsZSBwb29sIG9mIGxvY2tzLCB1bmlxdWUgdG8gZWFjaCBsb2NrIHR5cGUuCitrbXBfaW5kaXJlY3RfbG9ja190ICoKK19fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2sodm9pZCAqKnVzZXJfbG9jaywga21wX2ludDMyIGd0aWQsIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QgdGFnKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmxjazsKKyAgICBrbXBfbG9ja19pbmRleF90IGlkeDsKKworICAgIF9fa21wX2FjcXVpcmVfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworCisgICAgaWYgKF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddICE9IE5VTEwpIHsKKyAgICAgICAgLy8gUmV1c2UgdGhlIGFsbG9jYXRlZCBhbmQgZGVzdHJveWVkIGxvY2sgb2JqZWN0CisgICAgICAgIGxjayA9IF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddOworICAgICAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpCisgICAgICAgICAgICBpZHggPSBsY2stPmxvY2stPnBvb2wuaW5kZXg7CisgICAgICAgIF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilsY2stPmxvY2stPnBvb2wubmV4dDsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jazogcmV1c2luZyBhbiBleGlzdGluZyBsb2NrICVwXG4iLCBsY2spKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZHggPSBfX2ttcF9pX2xvY2tfdGFibGUubmV4dDsKKyAgICAgICAgLy8gQ2hlY2sgY2FwYWNpdHkgYW5kIGRvdWJsZSB0aGUgc2l6ZSBpZiBpdCBpcyBmdWxsCisgICAgICAgIGlmIChpZHggPT0gX19rbXBfaV9sb2NrX3RhYmxlLnNpemUpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZSB1cCB0aGUgc3BhY2UgZm9yIGJsb2NrIHBvaW50ZXJzCisgICAgICAgICAgICBpbnQgcm93ID0gX19rbXBfaV9sb2NrX3RhYmxlLnNpemUvS01QX0lfTE9DS19DSFVOSzsKKyAgICAgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKipvbGRfdGFibGUgPSBfX2ttcF9pX2xvY2tfdGFibGUudGFibGU7CisgICAgICAgICAgICBfX2ttcF9pX2xvY2tfdGFibGUudGFibGUgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKilfX2ttcF9hbGxvY2F0ZSgyKnJvdypzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCAqKSk7CisgICAgICAgICAgICBLTVBfTUVNQ1BZKF9fa21wX2lfbG9ja190YWJsZS50YWJsZSwgb2xkX3RhYmxlLCByb3cqc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QgKikpOworICAgICAgICAgICAgX19rbXBfZnJlZShvbGRfdGFibGUpOworICAgICAgICAgICAgLy8gQWxsb2NhdGUgbmV3IG9iamVjdHMgaW4gdGhlIG5ldyBibG9ja3MKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByb3c7IGkgPCAyKnJvdzsgKytpKQorICAgICAgICAgICAgICAgICooX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlICsgaSkgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShLTVBfSV9MT0NLX0NIVU5LKnNpemVvZihrbXBfaW5kaXJlY3RfbG9ja190KSk7CisgICAgICAgICAgICBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSA9IDIqaWR4OworICAgICAgICB9CisgICAgICAgIF9fa21wX2lfbG9ja190YWJsZS5uZXh0Kys7CisgICAgICAgIGxjayA9IEtNUF9HRVRfSV9MT0NLKGlkeCk7CisgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IGJhc2UgbG9jayBvYmplY3QKKyAgICAgICAgbGNrLT5sb2NrID0gKGttcF91c2VyX2xvY2tfcClfX2ttcF9hbGxvY2F0ZShfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbdGFnXSk7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2s6IGFsbG9jYXRlZCBhIG5ldyBsb2NrICVwXG4iLCBsY2spKTsKKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkKTsKKworICAgIGxjay0+dHlwZSA9IHRhZzsKKworICAgIGlmIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkgeworICAgICAgICAqKChrbXBfbG9ja19pbmRleF90ICopdXNlcl9sb2NrKSA9IGlkeCA8PCAxOyAvLyBpbmRpcmVjdCBsb2NrIHdvcmQgbXVzdCBiZSBldmVuLgorICAgIH0gZWxzZSB7CisgICAgICAgICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopdXNlcl9sb2NrKSA9IGxjazsKKyAgICB9CisKKyAgICByZXR1cm4gbGNrOworfQorCisvLyBVc2VyIGxvY2sgbG9va3VwIGZvciBkeW5hbWljYWxseSBkaXNwYXRjaGVkIGxvY2tzLgorc3RhdGljIF9fZm9yY2VpbmxpbmUKK2ttcF9pbmRpcmVjdF9sb2NrX3QgKgorX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2sodm9pZCAqKnVzZXJfbG9jaywgY29uc3QgY2hhciAqZnVuYykKK3sKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmxjayA9IE5VTEw7CisgICAgICAgIGlmICh1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICAgICAgICB9CisgICAgICAgIGlmIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkgeworICAgICAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpZHggPSBLTVBfRVhUUkFDVF9JX0lOREVYKHVzZXJfbG9jayk7CisgICAgICAgICAgICBpZiAoaWR4ID49IF9fa21wX2lfbG9ja190YWJsZS5zaXplKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGNrID0gS01QX0dFVF9JX0xPQ0soaWR4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxjayA9ICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopdXNlcl9sb2NrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGNrOyAKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgICAgIHJldHVybiBLTVBfR0VUX0lfTE9DSyhLTVBfRVhUUkFDVF9JX0lOREVYKHVzZXJfbG9jaykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopdXNlcl9sb2NrKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfZHluYV9sb2Nrc2VxX3Qgc2VxKQoreworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBpZiAoc2VxID09IGxvY2tzZXFfYWRhcHRpdmUgJiYgIV9fa21wX2NwdWluZm8ucnRtKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFkYXB0aXZlTm90U3VwcG9ydGVkLCAia21wX2xvY2tzZXFfdCIsICJhZGFwdGl2ZSIpOworICAgICAgICBzZXEgPSBsb2Nrc2VxX3F1ZXVpbmc7CisgICAgfQorI2VuZGlmCisjaWYgS01QX1VTRV9UU1gKKyAgICBpZiAoc2VxID09IGxvY2tzZXFfcnRtICYmICFfX2ttcF9jcHVpbmZvLnJ0bSkgeworICAgICAgICBzZXEgPSBsb2Nrc2VxX3F1ZXVpbmc7CisgICAgfQorI2VuZGlmCisgICAga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcgPSBLTVBfR0VUX0lfVEFHKHNlcSk7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgX19rbXBfZW50cnlfZ3RpZCgpLCB0YWcpOworICAgIEtNUF9JX0xPQ0tfRlVOQyhsLCBpbml0KShsLT5sb2NrKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9pbml0X2luZGlyZWN0X2xvY2s6IGluaXRpYWxpemVkIGluZGlyZWN0IGxvY2sgd2l0aCB0eXBlIyVkXG4iLCBzZXEpKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrKQoreworICAgIGttcF91aW50MzIgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF9kZXN0cm95X2xvY2siKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMobCwgZGVzdHJveSkobC0+bG9jayk7CisgICAga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcgPSBsLT50eXBlOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7CisKKyAgICAvLyBVc2UgdGhlIGJhc2UgbG9jaydzIHNwYWNlIHRvIGtlZXAgdGhlIHBvb2wgY2hhaW4uCisgICAgbC0+bG9jay0+cG9vbC5uZXh0ID0gKGttcF91c2VyX2xvY2tfcClfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXTsKKyAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgbC0+bG9jay0+cG9vbC5pbmRleCA9IEtNUF9FWFRSQUNUX0lfSU5ERVgobG9jayk7CisgICAgfQorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddID0gbDsKKworICAgIF9fa21wX3JlbGVhc2VfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyIGd0aWQpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgIEtNUF9JX0xPQ0tfRlVOQyhsLCBzZXQpKGwtPmxvY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW50CitfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHVuc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHRlc3QpKGwtPmxvY2ssIGd0aWQpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyIGd0aWQpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2xvb2t1cF9pbmRpcmVjdF9sb2NrKCh2b2lkICoqKWxvY2ssICJvbXBfc2V0X2xvY2siKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMobCwgc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF91bnNldF9sb2NrIik7CisgICAgcmV0dXJuIEtNUF9JX0xPQ0tfRlVOQyhsLCB1bnNldCkobC0+bG9jaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF90ZXN0X2xvY2siKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHRlc3QpKGwtPmxvY2ssIGd0aWQpOworfQorCitrbXBfZHluYV9sb2Nrc2VxX3QgX19rbXBfdXNlcl9sb2NrX3NlcSA9IGxvY2tzZXFfcXVldWluZzsKKworLy8gVGhpcyBpcyB1c2VkIG9ubHkgaW4ga21wX2Vycm9yLmMgd2hlbiBjb25zaXN0ZW5jeSBjaGVja2luZyBpcyBvbi4KK2ttcF9pbnQzMgorX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcihrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfdWludDMyIHNlcSkKK3sKKyAgICBzd2l0Y2ggKHNlcSkgeworICAgICAgICBjYXNlIGxvY2tzZXFfdGFzOgorICAgICAgICBjYXNlIGxvY2tzZXFfbmVzdGVkX3RhczoKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoKGttcF90YXNfbG9ja190ICopbGNrKTsKKyNpZiBLTVBfSEFTX0ZVVEVYCisgICAgICAgIGNhc2UgbG9ja3NlcV9mdXRleDoKKyAgICAgICAgY2FzZSBsb2Nrc2VxX25lc3RlZF9mdXRleDoKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcigoa21wX2Z1dGV4X2xvY2tfdCAqKWxjayk7CisjZW5kaWYKKyAgICAgICAgY2FzZSBsb2Nrc2VxX3RpY2tldDoKKyAgICAgICAgY2FzZSBsb2Nrc2VxX25lc3RlZF90aWNrZXQ6CisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKChrbXBfdGlja2V0X2xvY2tfdCAqKWxjayk7CisgICAgICAgIGNhc2UgbG9ja3NlcV9xdWV1aW5nOgorICAgICAgICBjYXNlIGxvY2tzZXFfbmVzdGVkX3F1ZXVpbmc6CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxvY2tzZXFfYWRhcHRpdmU6CisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcigoa21wX3F1ZXVpbmdfbG9ja190ICopbGNrKTsKKyNlbmRpZgorICAgICAgICBjYXNlIGxvY2tzZXFfZHJkcGE6CisgICAgICAgIGNhc2UgbG9ja3NlcV9uZXN0ZWRfZHJkcGE6CisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoKGttcF9kcmRwYV9sb2NrX3QgKilsY2spOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvLyBJbml0aWFsaXplcyBkYXRhIGZvciBkeW5hbWljIHVzZXIgbG9ja3MuCit2b2lkCitfX2ttcF9pbml0X2R5bmFtaWNfdXNlcl9sb2NrcygpCit7CisgICAgLy8gSW5pdGlhbGl6ZSBqdW1wIHRhYmxlIGZvciB0aGUgbG9jayBmdW5jdGlvbnMKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIF9fa21wX2RpcmVjdF9zZXQgICAgID0gZGlyZWN0X3NldF9jaGVjazsKKyAgICAgICAgX19rbXBfZGlyZWN0X3Vuc2V0ICAgPSBkaXJlY3RfdW5zZXRfY2hlY2s7CisgICAgICAgIF9fa21wX2RpcmVjdF90ZXN0ICAgID0gZGlyZWN0X3Rlc3RfY2hlY2s7CisgICAgICAgIF9fa21wX2luZGlyZWN0X3NldCAgID0gaW5kaXJlY3Rfc2V0X2NoZWNrOworICAgICAgICBfX2ttcF9pbmRpcmVjdF91bnNldCA9IGluZGlyZWN0X3Vuc2V0X2NoZWNrOworICAgICAgICBfX2ttcF9pbmRpcmVjdF90ZXN0ICA9IGluZGlyZWN0X3Rlc3RfY2hlY2s7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9kaXJlY3Rfc2V0ICAgICA9IGRpcmVjdF9zZXQ7CisgICAgICAgIF9fa21wX2RpcmVjdF91bnNldCAgID0gZGlyZWN0X3Vuc2V0OworICAgICAgICBfX2ttcF9kaXJlY3RfdGVzdCAgICA9IGRpcmVjdF90ZXN0OworICAgICAgICBfX2ttcF9pbmRpcmVjdF9zZXQgICA9IGluZGlyZWN0X3NldDsKKyAgICAgICAgX19rbXBfaW5kaXJlY3RfdW5zZXQgPSBpbmRpcmVjdF91bnNldDsKKyAgICAgICAgX19rbXBfaW5kaXJlY3RfdGVzdCAgPSBpbmRpcmVjdF90ZXN0OworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgbG9jayBpbmRleCB0YWJsZQorICAgIF9fa21wX2lfbG9ja190YWJsZS5zaXplID0gS01QX0lfTE9DS19DSFVOSzsKKyAgICBfX2ttcF9pX2xvY2tfdGFibGUudGFibGUgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCAqKSk7CisgICAgKihfX2ttcF9pX2xvY2tfdGFibGUudGFibGUpID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShLTVBfSV9MT0NLX0NIVU5LKnNpemVvZihrbXBfaW5kaXJlY3RfbG9ja190KSk7IAorICAgIF9fa21wX2lfbG9ja190YWJsZS5uZXh0ID0gMDsKKworICAgIC8vIEluZGlyZWN0IGxvY2sgc2l6ZQorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX3RpY2tldF0gICAgICAgICA9IHNpemVvZihrbXBfdGlja2V0X2xvY2tfdCk7CisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfcXVldWluZ10gICAgICAgID0gc2l6ZW9mKGttcF9xdWV1aW5nX2xvY2tfdCk7CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2FkYXB0aXZlXSAgICAgICA9IHNpemVvZihrbXBfYWRhcHRpdmVfbG9ja190KTsKKyNlbmRpZgorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2RyZHBhXSAgICAgICAgICA9IHNpemVvZihrbXBfZHJkcGFfbG9ja190KTsKKyNpZiBLTVBfVVNFX1RTWAorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX3J0bV0gICAgICAgICAgICA9IHNpemVvZihrbXBfcXVldWluZ19sb2NrX3QpOworI2VuZGlmCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3Rhc10gICAgID0gc2l6ZW9mKGttcF90YXNfbG9ja190KTsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX2Z1dGV4XSAgID0gc2l6ZW9mKGttcF9mdXRleF9sb2NrX3QpOworI2VuZGlmCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3RpY2tldF0gID0gc2l6ZW9mKGttcF90aWNrZXRfbG9ja190KTsKKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfcXVldWluZ10gPSBzaXplb2Yoa21wX3F1ZXVpbmdfbG9ja190KTsKKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfZHJkcGFdICAgPSBzaXplb2Yoa21wX2RyZHBhX2xvY2tfdCk7CisKKyAgICAvLyBJbml0aWFsaXplIGxvY2sgYWNjZXNzb3IvbW9kaWZpZXIKKyNkZWZpbmUgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBzZXApIHsgICAgICAgICAgICBcCisgICAgdGFibGVbbG9ja3RhZyMjc2VwIyN0aWNrZXRdICA9IGV4cGFuZCh0aWNrZXQpOyAgXAorICAgIHRhYmxlW2xvY2t0YWcjI3NlcCMjcXVldWluZ10gPSBleHBhbmQocXVldWluZyk7IFwKKyAgICB0YWJsZVtsb2NrdGFnIyNzZXAjI2RyZHBhXSAgID0gZXhwYW5kKGRyZHBhKTsgICBcCit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjIGRlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpIHsgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgXAorICAgIHRhYmxlW2xvY2t0YWdfYWRhcHRpdmVdID0gZXhwYW5kKHF1ZXVpbmcpOyBcCisgICAgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBfbmVzdGVkXyk7ICAgICAgIFwKK30KKyNlbHNlCisjIGRlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpIHsgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgXAorICAgIGZpbGxfanVtcHModGFibGUsIGV4cGFuZCwgX25lc3RlZF8pOyAgICAgICBcCit9CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjZGVmaW5lIGV4cGFuZChsKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopKV9fa21wX3NldF8jI2wjI19sb2NrX2xvY2F0aW9uCisgICAgZmlsbF90YWJsZShfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb24sIGV4cGFuZCk7CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KSlfX2ttcF9zZXRfIyNsIyNfbG9ja19mbGFncworICAgIGZpbGxfdGFibGUoX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzLCBleHBhbmQpOworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCkgKGNvbnN0IGlkZW50X3QgKiAoKikoa21wX3VzZXJfbG9ja19wKSlfX2ttcF9nZXRfIyNsIyNfbG9ja19sb2NhdGlvbgorICAgIGZpbGxfdGFibGUoX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uLCBleHBhbmQpOworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCkgKGttcF9sb2NrX2ZsYWdzX3QgKCopKGttcF91c2VyX2xvY2tfcCkpX19rbXBfZ2V0XyMjbCMjX2xvY2tfZmxhZ3MKKyAgICBmaWxsX3RhYmxlKF9fa21wX2luZGlyZWN0X2dldF9mbGFncywgZXhwYW5kKTsKKyN1bmRlZiBleHBhbmQKKworICAgIF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IFRSVUU7Cit9CisKKy8vIENsZWFuIHVwIHRoZSBsb2NrIHRhYmxlLgordm9pZAorX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCkKK3sKKyAgICBrbXBfbG9ja19pbmRleF90IGk7CisgICAgaW50IGs7CisKKyAgICAvLyBDbGVhbiB1cCBsb2NrcyBpbiB0aGUgcG9vbHMgZmlyc3QgKHRoZXkgd2VyZSBhbHJlYWR5IGRlc3Ryb3llZCBiZWZvcmUgZ29pbmcgaW50byB0aGUgcG9vbHMpLgorICAgIGZvciAoayA9IDA7IGsgPCBLTVBfTlVNX0lfTE9DS1M7ICsraykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW2tdOworICAgICAgICB3aGlsZSAobCAhPSBOVUxMKSB7CisgICAgICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsbCA9IGw7CisgICAgICAgICAgICBsID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilsLT5sb2NrLT5wb29sLm5leHQ7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jbGVhbnVwX2luZGlyZWN0X3VzZXJfbG9ja3M6IGZyZWVpbmcgJXAgZnJvbSBwb29sXG4iLCBsbCkpOworICAgICAgICAgICAgX19rbXBfZnJlZShsbC0+bG9jayk7CisgICAgICAgICAgICBsbC0+bG9jayA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW2tdID0gTlVMTDsKKyAgICB9CisgICAgLy8gQ2xlYW4gdXAgdGhlIHJlbWFpbmluZyB1bmRlc3Ryb3llZCBsb2Nrcy4KKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfaV9sb2NrX3RhYmxlLm5leHQ7IGkrKykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gS01QX0dFVF9JX0xPQ0soaSk7CisgICAgICAgIGlmIChsLT5sb2NrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIExvY2tzIG5vdCBkZXN0cm95ZWQgZXhwbGljaXRseSBuZWVkIHRvIGJlIGRlc3Ryb3llZCBoZXJlLgorICAgICAgICAgICAgS01QX0lfTE9DS19GVU5DKGwsIGRlc3Ryb3kpKGwtPmxvY2spOworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzOiBkZXN0cm95L2ZyZWVpbmcgJXAgZnJvbSB0YWJsZVxuIiwgbCkpOworICAgICAgICAgICAgX19rbXBfZnJlZShsLT5sb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGcmVlIHRoZSB0YWJsZQorICAgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSAvIEtNUF9JX0xPQ0tfQ0hVTks7IGkrKykKKyAgICAgICAgX19rbXBfZnJlZShfX2ttcF9pX2xvY2tfdGFibGUudGFibGVbaV0pOworICAgIF9fa21wX2ZyZWUoX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlKTsKKworICAgIF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IEZBTFNFOworfQorCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7ICAgICAgICAgICAgIC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdXNlciBsb2NrcworICoKKyAqIFRoZXkgYXJlIGltcGxlbWVudGVkIGFzIGEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIHNldCB0byB0aGUKKyAqIGxvY2sgZnVuY3Rpb25zIG9mIHRoZSBhcHByb3ByaWF0ZSBraW5kLCBvbmNlIHRoYXQgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KKyAqLworCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworCitzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IDA7CitzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemUgPSAwOworCitrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK2ludCAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CitpbnQgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworaW50ICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOworaW50ICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworCitpbnQgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworY29uc3QgaWRlbnRfdCAqICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApID0gTlVMTDsKK2ttcF9sb2NrX2ZsYWdzX3QgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApID0gTlVMTDsKKwordm9pZCBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBrbXBfbG9ja19raW5kX3QgdXNlcl9sb2NrX2tpbmQgKQoreworICAgIHN3aXRjaCAoIHVzZXJfbG9ja19raW5kICkgeworICAgICAgICBjYXNlIGxrX2RlZmF1bHQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsKKworICAgICAgICBjYXNlIGxrX3RhczogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfdGFzX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF90YXNfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0YXMpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyh0YXMpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0sodGFzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGFzX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKyAgICAgICAgY2FzZSBsa19mdXRleDogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfZnV0ZXhfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Z1dGV4X2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9mdXRleF9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhmdXRleCk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhmdXRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0soZnV0ZXgpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0soZnV0ZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9mdXRleF9sb2NrICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisgICAgICAgIGNhc2UgbGtfdGlja2V0OiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV90aWNrZXRfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3RpY2tldF9sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKHRpY2tldCk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0aWNrZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKHRpY2tldCk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyh0aWNrZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayApOworCisgICAgICAgICAgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgICAgICAgICAoIGludCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfaXNfdGlja2V0X2xvY2tfaW5pdGlhbGl6ZWQgKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfdGlja2V0X2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfdGlja2V0X2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF90aWNrZXRfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfcXVldWluZzogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfcXVldWluZ19sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhxdWV1aW5nKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKHF1ZXVpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKHF1ZXVpbmcpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0socXVldWluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayApOworCisgICAgICAgICAgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgICAgICAgICAoIGludCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgIGNhc2UgbGtfYWRhcHRpdmU6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX2FkYXB0aXZlX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhhZGFwdGl2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0soYWRhcHRpdmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrICk7CisKKyAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAoIGludCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9pc19xdWV1aW5nX2xvY2tfaW5pdGlhbGl6ZWQgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfZmxhZ3MgKTsKKworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworICAgICAgICBjYXNlIGxrX2RyZHBhOiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9kcmRwYV9sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfZHJkcGFfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGRyZHBhKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGRyZHBhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyhkcmRwYSk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyhkcmRwYSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX2RyZHBhX2xvY2tfaW5pdGlhbGl6ZWQgKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZHJkcGFfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9kcmRwYV9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9kcmRwYV9sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9kcmRwYV9sb2NrX2ZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9jayB0YWJsZSAmIGxvY2sgYWxsb2NhdGlvbgorCitrbXBfbG9ja190YWJsZV90IF9fa21wX3VzZXJfbG9ja190YWJsZSA9IHsgMSwgMCwgTlVMTCB9Owora21wX3VzZXJfbG9ja19wIF9fa21wX2xvY2tfcG9vbCA9IE5VTEw7CisKKy8vIExvY2sgYmxvY2stYWxsb2NhdGlvbiBzdXBwb3J0Lgora21wX2Jsb2NrX29mX2xvY2tzKiBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CitpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrID0gMTsgICAgICAgICAgICAgLy8gRklYTUUgLSB0dW5lIHRoaXMgdmFsdWUKKworc3RhdGljIGttcF9sb2NrX2luZGV4X3QKK19fa21wX2xvY2tfdGFibGVfaW5zZXJ0KCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICAvLyBBc3N1bWUgdGhhdCBrbXBfZ2xvYmFsX2xvY2sgaXMgaGVsZCB1cG9uIGVudHJ5L2V4aXQuCisgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleDsKKyAgICBpZiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID49IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKSB7CisgICAgICAgIGttcF9sb2NrX2luZGV4X3Qgc2l6ZTsKKyAgICAgICAga21wX3VzZXJfbG9ja19wICp0YWJsZTsKKyAgICAgICAgLy8gUmVhbGxvY2F0ZSBsb2NrIHRhYmxlLgorICAgICAgICBpZiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPT0gMCApIHsKKyAgICAgICAgICAgIHNpemUgPSAxMDI0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2l6ZSA9IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKiAyOworICAgICAgICB9CisgICAgICAgIHRhYmxlID0gKGttcF91c2VyX2xvY2tfcCAqKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGttcF91c2VyX2xvY2tfcCApICogc2l6ZSApOworICAgICAgICBLTVBfTUVNQ1BZKCB0YWJsZSArIDEsIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSArIDEsIHNpemVvZigga21wX3VzZXJfbG9ja19wICkgKiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkIC0gMSApICk7CisgICAgICAgIHRhYmxlWyAwIF0gPSAoa21wX3VzZXJfbG9ja19wKV9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZTsKKyAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBmcmVlIHRoZSBwcmV2aW91cyB0YWJsZSBub3csIHNpbmNlIGl0IG1heSBiZSBpbiB1c2UgYnkgb3RoZXIKKyAgICAgICAgICAgIC8vIHRocmVhZHMuIFNvIHNhdmUgdGhlIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHRhYmxlIGluIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZQorICAgICAgICAgICAgLy8gbmV3IHRhYmxlLiBBbGwgdGhlIHRhYmxlcyB3aWxsIGJlIG9yZ2FuaXplZCBpbnRvIGEgbGlzdCwgYW5kIGNvdWxkIGJlIGZyZWVkIHdoZW4KKyAgICAgICAgICAgIC8vIGxpYnJhcnkgc2h1dHRpbmcgZG93bi4KKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gdGFibGU7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSBzaXplOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA8IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKTsKKyAgICBpbmRleCA9IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVsgaW5kZXggXSA9IGxjazsKKyAgICArKyBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZDsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBrbXBfdXNlcl9sb2NrX3AKK19fa21wX2xvY2tfYmxvY2tfYWxsb2NhdGUoKQoreworICAgIC8vIEFzc3VtZSB0aGF0IGttcF9nbG9iYWxfbG9jayBpcyBoZWxkIHVwb24gZW50cnkvZXhpdC4KKyAgICBzdGF0aWMgaW50IGxhc3RfaW5kZXggPSAwOworICAgIGlmICggKCBsYXN0X2luZGV4ID49IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayApCisgICAgICB8fCAoIF9fa21wX2xvY2tfYmxvY2tzID09IE5VTEwgKSApIHsKKyAgICAgICAgLy8gUmVzdGFydCB0aGUgaW5kZXguCisgICAgICAgIGxhc3RfaW5kZXggPSAwOworICAgICAgICAvLyBOZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSA+IDAgKTsKKyAgICAgICAgc2l6ZV90IHNwYWNlX2Zvcl9sb2NrcyA9IF9fa21wX3VzZXJfbG9ja19zaXplICogX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrOworICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopX19rbXBfYWxsb2NhdGUoIHNwYWNlX2Zvcl9sb2NrcyArIHNpemVvZigga21wX2Jsb2NrX29mX2xvY2tzICkgKTsKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBuZXcgYmxvY2suCisgICAgICAgIGttcF9ibG9ja19vZl9sb2NrcyAqbmV3X2Jsb2NrID0gKGttcF9ibG9ja19vZl9sb2NrcyAqKSgmIGJ1ZmZlcltzcGFjZV9mb3JfbG9ja3NdKTsKKyAgICAgICAgbmV3X2Jsb2NrLT5uZXh0X2Jsb2NrID0gX19rbXBfbG9ja19ibG9ja3M7CisgICAgICAgIG5ld19ibG9jay0+bG9ja3MgPSAodm9pZCAqKWJ1ZmZlcjsKKyAgICAgICAgLy8gUHVibGlzaCB0aGUgbmV3IGJsb2NrLgorICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgX19rbXBfbG9ja19ibG9ja3MgPSBuZXdfYmxvY2s7CisgICAgfQorICAgIGttcF91c2VyX2xvY2tfcCByZXQgPSAoa21wX3VzZXJfbG9ja19wKSgmICggKCAoY2hhciAqKSggX19rbXBfbG9ja19ibG9ja3MtPmxvY2tzICkgKQorICAgICAgWyBsYXN0X2luZGV4ICogX19rbXBfdXNlcl9sb2NrX3NpemUgXSApICk7CisgICAgbGFzdF9pbmRleCsrOworICAgIHJldHVybiByZXQ7Cit9CisKKy8vCisvLyBHZXQgbWVtb3J5IGZvciBhIGxvY2suIEl0IG1heSBiZSBmcmVzaGx5IGFsbG9jYXRlZCBtZW1vcnkgb3IgcmV1c2VkIG1lbW9yeQorLy8gZnJvbSBsb2NrIHBvb2wuCisvLwora21wX3VzZXJfbG9ja19wCitfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLAorICBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdXNlcl9sb2NrICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgaWYgKCBfX2ttcF9sb2NrX3Bvb2wgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gTG9jayBwb29sIGlzIGVtcHR5LiBBbGxvY2F0ZSBuZXcgbWVtb3J5LgorICAgICAgICBpZiAoIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA8PSAxICkgeyAvLyBUdW5lIHRoaXMgY3V0b2ZmIHBvaW50LgorICAgICAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCkgX19rbXBfYWxsb2NhdGUoIF9fa21wX3VzZXJfbG9ja19zaXplICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsY2sgPSBfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnNlcnQgbG9jayBpbiB0aGUgdGFibGUgc28gdGhhdCBpdCBjYW4gYmUgZnJlZWQgaW4gX19rbXBfY2xlYW51cCwKKyAgICAgICAgLy8gYW5kIGRlYnVnZ2VyIGhhcyBpbmZvIG9uIGFsbCBhbGxvY2F0ZWQgbG9ja3MuCisgICAgICAgIGluZGV4ID0gX19rbXBfbG9ja190YWJsZV9pbnNlcnQoIGxjayApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gUGljayB1cCBsb2NrIGZyb20gcG9vbC4KKyAgICAgICAgbGNrID0gX19rbXBfbG9ja19wb29sOworICAgICAgICBpbmRleCA9IF9fa21wX2xvY2tfcG9vbC0+cG9vbC5pbmRleDsKKyAgICAgICAgX19rbXBfbG9ja19wb29sID0gX19rbXBfbG9ja19wb29sLT5wb29sLm5leHQ7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSBjb3VsZCBwb3RlbnRpYWxseSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbmVzdGVkIGFuZCByZWd1bGFyIGxvY2tzCisgICAgLy8gaGVyZSwgYW5kIGRvIHRoZSBsb2NrIHRhYmxlIGxvb2t1cCBmb3IgcmVndWxhciBsb2NrcyBvbmx5LgorICAgIC8vCisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAgKiAoIChrbXBfbG9ja19pbmRleF90ICopIHVzZXJfbG9jayApID0gaW5kZXg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqICggKGttcF91c2VyX2xvY2tfcCAqKSB1c2VyX2xvY2sgKSA9IGxjazsKKyAgICB9CisKKyAgICAvLyBtYXJrIHRoZSBsb2NrIGlmIGl0IGlzIGNyaXRpY2FsIHNlY3Rpb24gbG9jay4KKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzKCBsY2ssIGZsYWdzICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsgLy8gQUM6IFRPRE86IG1vdmUgdGhpcyBsaW5lIHVwcGVyCisKKyAgICByZXR1cm4gbGNrOworfQorCisvLyBQdXQgbG9jaydzIG1lbW9yeSB0byBwb29sIGZvciByZXVzaW5nLgordm9pZAorX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB1c2VyX2xvY2sgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIGxjay0+cG9vbC5uZXh0ID0gX19rbXBfbG9ja19wb29sOworICAgIF9fa21wX2xvY2tfcG9vbCA9IGxjazsKKyAgICBpZiAoIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopICkgeworICAgICAgICBrbXBfbG9ja19pbmRleF90IGluZGV4ID0gKiAoIChrbXBfbG9ja19pbmRleF90ICopIHVzZXJfbG9jayApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwIDwgaW5kZXggJiYgaW5kZXggPD0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKTsKKyAgICAgICAgbGNrLT5wb29sLmluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7Cit9CisKK2ttcF91c2VyX2xvY2tfcAorX19rbXBfbG9va3VwX3VzZXJfbG9jayggdm9pZCAqKnVzZXJfbG9jaywgY2hhciBjb25zdCAqZnVuYyApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjayA9IE5VTEw7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB1c2VyX2xvY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleCA9ICooIChrbXBfbG9ja19pbmRleF90ICopdXNlcl9sb2NrICk7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYgKCAhICggMCA8IGluZGV4ICYmIGluZGV4IDwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwIDwgaW5kZXggJiYgaW5kZXggPCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSA+IDAgKTsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlW2luZGV4XTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxjayA9ICooIChrbXBfdXNlcl9sb2NrX3AgKil1c2VyX2xvY2sgKTsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxjazsKK30KKwordm9pZAorX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCB2b2lkICkKK3sKKyAgICAvLworICAgIC8vIFJlc2V0IGxvY2sgcG9vbC4gRG8gbm90IHdvcnJ5IGFib3V0IGxvY2sgaW4gdGhlIHBvb2wgLS0gd2Ugd2lsbCBmcmVlCisgICAgLy8gdGhlbSB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIGxvY2sgdGFibGUgKGl0IGluY2x1ZGVzIGFsbCB0aGUgbG9ja3MsCisgICAgLy8gZGVhZCBvciBhbGl2ZSkuCisgICAgLy8KKyAgICBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisjZGVmaW5lIElTX0NSSVRJQ0FMKGxjaykgXAorICAgICAgICAoICggX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gIT0gTlVMTCApICYmIFwKKyAgICAgICAgKCAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBsY2sgKSAmIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uICkgKQorCisgICAgLy8KKyAgICAvLyBMb29wIHRocm91Z2ggbG9jayB0YWJsZSwgZnJlZSBhbGwgbG9ja3MuCisgICAgLy8KKyAgICAvLyBEbyBub3QgZnJlZSBpdGVtIFswXSwgaXQgaXMgcmVzZXJ2ZWQgZm9yIGxvY2sgdGFibGVzIGxpc3QuCisgICAgLy8KKyAgICAvLyBGSVhNRSAtIHdlIGFyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGxpc3Qgb2YgKHBvaW50ZXJzIHRvKSBvYmplY3RzIG9mCisgICAgLy8gdHlwZSB1bmlvbiBrbXBfdXNlcl9sb2NrLCBidXQgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZQorICAgIC8vIGJhc2UgdHlwZSBpcyBjdXJyZW50bHkgInBvb2wiIG9yIHdoYXRldmVyIHRoZSBnbG9iYWwgdXNlciBsb2NrIHR5cGUKKyAgICAvLyBpcy4KKyAgICAvLworICAgIC8vIFdlIGFyZSByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgZm9yIGFsbCBvZiB0aGUgdXNlciBsb2NrIHR5cGVzCisgICAgLy8gKGV4Y2VwdCAidGFzIiksIHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgbG9jayBzdHJ1Y3QgaXMgdGhlICJpbml0aWFsaXplZCIKKyAgICAvLyBmaWVsZCwgd2hpY2ggaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NrIG9iamVjdCBpdHNlbGYgd2hlbgorICAgIC8vIHRoZSBsb2NrIGlzIGluaXRpYWxpemVkLiAgV2hlbiB0aGUgdW5pb24gaXMgb2YgdHlwZSAicG9vbCIsIHRoZQorICAgIC8vIGZpcnN0IGZpZWxkIGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGZyZWUgbGlzdCwgd2hpY2gKKyAgICAvLyB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhZGRyZXNzIGFzIHRoZSBvYmplY3QgaXRzZWxmLgorICAgIC8vCisgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjaGVjayAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGxjayApCisgICAgLy8gd2lsbCBmYWlsIGZvciAicG9vbCIgb2JqZWN0cyBvbiB0aGUgZnJlZSBsaXN0LiAgVGhpcyBtdXN0IGhhcHBlbiBhcworICAgIC8vIHRoZSAibG9jYXRpb24iIGZpZWxkIG9mIHJlYWwgdXNlciBsb2NrcyBvdmVybGFwcyB0aGUgImluZGV4IiBmaWVsZAorICAgIC8vIG9mICJwb29sIiBvYmplY3RzLgorICAgIC8vCisgICAgLy8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHJ1biB0aHJvdWdoIHRoZSBmcmVlIGxpc3QsIGFuZCByZW1vdmUgYWxsICJwb29sIgorICAgIC8vIG9iamVjdHMgZnJvbSB0aGUgbG9jayB0YWJsZSBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgbG9vcC4gIEhvd2V2ZXIsCisgICAgLy8gInBvb2wiIG9iamVjdHMgZG8gbm90IGFsd2F5cyBoYXZlIHRoZWlyIGluZGV4IGZpZWxkIHNldCAob25seSBvbgorICAgIC8vIGxpbl8zMmUpLCBhbmQgSSBkb24ndCB3YW50IHRvIHNlYXJjaCB0aGUgbG9jayB0YWJsZSBmb3IgdGhlIGFkZHJlc3MKKyAgICAvLyBvZiBldmVyeSAicG9vbCIgb2JqZWN0IG9uIHRoZSBmcmVlIGxpc3QuCisgICAgLy8KKyAgICB3aGlsZSAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID4gMSApIHsKKyAgICAgICAgY29uc3QgaWRlbnQgKmxvYzsKKworICAgICAgICAvLworICAgICAgICAvLyByZWR1Y2UgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgYmVmb3JlIGZyZWVpbmcgdGhlIGxvY2ssCisgICAgICAgIC8vIHNvIHRoYXQgc3RhdGUgb2YgbG9ja3MgaXMgY29uc2lzdGVudAorICAgICAgICAvLworICAgICAgICBrbXBfdXNlcl9sb2NrX3AgbGNrID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlWworICAgICAgICAgIC0tX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgXTsKKworICAgICAgICBpZiAoICggX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyAhPSBOVUxMICkgJiYKKyAgICAgICAgICAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGxjayApICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElzc3VlIGEgd2FybmluZyBpZjogS01QX0NPTlNJU1RFTkNZX0NIRUNLIEFORCBsb2NrIGlzCisgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBBTkQgaXQgaXMgTk9UIGEgY3JpdGljYWwgc2VjdGlvbiAodXNlciBpcyBub3QKKyAgICAgICAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBkZXN0cm95aW5nIGNyaXRpY2FscykgQU5EIHdlIGtub3cgc291cmNlCisgICAgICAgICAgICAvLyBsb2NhdGlvbiB0byByZXBvcnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgKCAhIElTX0NSSVRJQ0FMKCBsY2sgKSApICYmCisgICAgICAgICAgICAgICggKCBsb2MgPSBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2sgKSApICE9IE5VTEwgKSAmJgorICAgICAgICAgICAgICAoIGxvYy0+cHNvdXJjZSAhPSBOVUxMICkgKSB7CisgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDAgKTsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQ25zTG9ja05vdERlc3Ryb3llZCwgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmxpbmUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYgKCBJU19DUklUSUNBTCggbGNrICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2NsZWFudXBfdXNlcl9sb2NrczogZnJlZSBjcml0aWNhbCBzZWN0aW9uIGxvY2sgJXAgKCVwKVxuIiwgbGNrLCAqKHZvaWQqKilsY2sgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2NsZWFudXBfdXNlcl9sb2NrczogZnJlZSBsb2NrICVwICglcClcbiIsIGxjaywgKih2b2lkKiopbGNrICkgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENsZWFudXAgaW50ZXJuYWwgbG9jayBkeW5hbWljIHJlc291cmNlcworICAgICAgICAgICAgLy8gKGZvciBkcmRwYSBsb2NrcyBwYXJ0aWN1bGFybHkpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrKCBsY2sgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZyZWUgdGhlIGxvY2sgaWYgYmxvY2sgYWxsb2NhdGlvbiBvZiBsb2NrcyBpcyBub3QgdXNlZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggbGNrICk7CisgICAgICAgIH0KKyAgICB9CisKKyN1bmRlZiBJU19DUklUSUNBTAorCisgICAgLy8KKyAgICAvLyBkZWxldGUgbG9jayB0YWJsZShzKS4KKyAgICAvLworICAgIGttcF91c2VyX2xvY2tfcCAqdGFibGVfcHRyID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IE5VTEw7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9IDA7CisKKyAgICB3aGlsZSAoIHRhYmxlX3B0ciAhPSBOVUxMICkgeworICAgICAgICAvLworICAgICAgICAvLyBJbiB0aGUgZmlyc3QgZWxlbWVudCB3ZSBzYXZlZCB0aGUgcG9pbnRlciB0byB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gKHNtYWxsZXIpIGxvY2sgdGFibGUuCisgICAgICAgIC8vCisgICAgICAgIGttcF91c2VyX2xvY2tfcCAqbmV4dCA9IChrbXBfdXNlcl9sb2NrX3AgKikoIHRhYmxlX3B0clsgMCBdICk7CisgICAgICAgIF9fa21wX2ZyZWUoIHRhYmxlX3B0ciApOworICAgICAgICB0YWJsZV9wdHIgPSBuZXh0OworICAgIH0KKworICAgIC8vCisgICAgLy8gRnJlZSBidWZmZXJzIGFsbG9jYXRlZCBmb3IgYmxvY2tzIG9mIGxvY2tzLgorICAgIC8vCisgICAga21wX2Jsb2NrX29mX2xvY2tzX3QgKmJsb2NrX3B0ciA9IF9fa21wX2xvY2tfYmxvY2tzOworICAgIF9fa21wX2xvY2tfYmxvY2tzID0gTlVMTDsKKworICAgIHdoaWxlICggYmxvY2tfcHRyICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9ibG9ja19vZl9sb2Nrc190ICpuZXh0ID0gYmxvY2tfcHRyLT5uZXh0X2Jsb2NrOworICAgICAgICBfX2ttcF9mcmVlKCBibG9ja19wdHItPmxvY2tzICk7CisgICAgICAgIC8vCisgICAgICAgIC8vICpibG9ja19wdHIgaXRzZWxmIHdhcyBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbG9ja3MgdmVjdG9yLgorICAgICAgICAvLworCWJsb2NrX3B0ciA9IG5leHQ7CisgICAgfQorCisgICAgVENXXzQoX19rbXBfaW5pdF91c2VyX2xvY2tzLCBGQUxTRSk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMDFkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKQEAgLTAsMCArMSwxMjczIEBACisvKgorICoga21wX2xvY2suaCAtLSBsb2NrIGhlYWRlciBmaWxlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0xPQ0tfSAorI2RlZmluZSBLTVBfTE9DS19ICisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gICAgLy8gQ0hBUl9CSVQKKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgLy8gb2Zmc2V0b2YKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhdmUgdG8gY29weSB0aGVzZSBkZWZpbml0aW9ucyBmcm9tIGttcC5oIGJlY2F1c2Uga21wLmggY2Fubm90IGJlIGluY2x1ZGVkCisvLyBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzLiAgV2lsbCB1bmRlZiB0aGVzZSBhdCBlbmQgb2YgZmlsZS4KKworI2RlZmluZSBLTVBfUEFEKHR5cGUsIHN6KSAgICAgKHNpemVvZih0eXBlKSArIChzeiAtICgoc2l6ZW9mKHR5cGUpIC0gMSkgJSAoc3opKSAtIDEpKQorI2RlZmluZSBLTVBfR1RJRF9ETkUgKC0yKQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGlkZW50IGFuZCBpZGVudF90CisKK3N0cnVjdCBpZGVudDsKK3R5cGVkZWYgc3RydWN0IGlkZW50IGlkZW50X3Q7CisKKy8vIEVuZCBvZiBjb3BpZWQgY29kZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIFdlIG5lZWQgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgYXJlYSB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIGNvbXBpbGVyKHMpCisvLyBhbGxvY2F0ZWQgZm9yIG9iZWN0cyBvZiB0eXBlIG9tcF9sb2NrX3QgYW5kIG9tcF9uZXN0X2xvY2tfdC4gIFRoZSBJbnRlbAorLy8gY29tcGlsZXIgYWx3YXlzIGFsbG9jYXRlcyBhIHBvaW50ZXItc2l6ZWQgYXJlYSwgYXMgZG9lcyB2aXN1YWwgc3R1ZGlvLgorLy8KKy8vIGdjYyBob3dldmVyLCBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciByZWd1bGFyIGxvY2tzLCBldmVuIG9uIDY0LWJpdAorLy8gaW50ZWwgYXJjaHMuICBJdCBhbGxvY2F0ZXMgYXQgbGVhc3QgOCBieXRlcyBmb3IgbmVzdGVkIGxvY2sgKG1vcmUgb24KKy8vIHJlY2VudCB2ZXJzaW9ucyksIGJ1dCB3ZSBhcmUgYm91bmRlZCBieSB0aGUgcG9pbnRlci1zaXplZCBjaHVua3MgdGhhdAorLy8gdGhlIEludGVsIGNvbXBpbGVyIGFsbG9jYXRlcy4KKy8vCisKKyNpZiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisjIGRlZmluZSBPTVBfTE9DS19UX1NJWkUgICAgICAgIHNpemVvZihpbnQpCisjIGRlZmluZSBPTVBfTkVTVF9MT0NLX1RfU0laRSAgIHNpemVvZih2b2lkICopCisjZWxzZQorIyBkZWZpbmUgT01QX0xPQ0tfVF9TSVpFICAgICAgICBzaXplb2Yodm9pZCAqKQorIyBkZWZpbmUgT01QX05FU1RfTE9DS19UX1NJWkUgICBzaXplb2Yodm9pZCAqKQorI2VuZGlmCisKKy8vCisvLyBUaGUgSW50ZWwgY29tcGlsZXIgYWxsb2NhdGVzIGEgMzItYnl0ZSBjaHVuayBmb3IgYSBjcml0aWNhbCBzZWN0aW9uLgorLy8gQm90aCBnY2MgYW5kIHZpc3VhbCBzdHVkaW8gb25seSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGEgcG9pbnRlci4KKy8vIFNvbWV0aW1lcyB3ZSBrbm93IHRoYXQgdGhlIHNwYWNlIHdhcyBhbGxvY2F0ZWQgYnkgdGhlIEludGVsIGNvbXBpbGVyLgorLy8KKyNkZWZpbmUgT01QX0NSSVRJQ0FMX1NJWkUgICAgICAgc2l6ZW9mKHZvaWQgKikKKyNkZWZpbmUgSU5URUxfQ1JJVElDQUxfU0laRSAgICAgMzIKKworLy8KKy8vIGxvY2sgZmxhZ3MKKy8vCit0eXBlZGVmIGttcF91aW50MzIga21wX2xvY2tfZmxhZ3NfdDsKKworI2RlZmluZSBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiAxCisKKy8vCisvLyBXaGVuIGEgbG9jayB0YWJsZSBpcyB1c2VkLCB0aGUgaW5kaWNlcyBhcmUgb2Yga21wX2xvY2tfaW5kZXhfdAorLy8KK3R5cGVkZWYga21wX3VpbnQzMiBrbXBfbG9ja19pbmRleF90OworCisvLworLy8gV2hlbiBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2NrcyBhcmUgb24gdGhlIGxvY2sgcG9vbCAoZnJlZSBsaXN0KSwKKy8vIGl0IGlzIHRyZWF0ZWQgYXMgc3RydWN0cyBvZiB0aGlzIHR5cGUuCisvLworc3RydWN0IGttcF9sb2NrX3Bvb2wgeworICAgIHVuaW9uIGttcF91c2VyX2xvY2sgKm5leHQ7CisgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleDsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NrX3Bvb2wga21wX2xvY2tfcG9vbF90OworCisKK2V4dGVybiB2b2lkIF9fa21wX3ZhbGlkYXRlX2xvY2tzKCB2b2lkICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBUaGVyZSBhcmUgNSBsb2NrIGltcGxlbWVudGF0aW9uczoKKy8vCisvLyAgICAgICAxLiBUZXN0IGFuZCBzZXQgbG9ja3MuCisvLyAgICAgICAyLiBmdXRleCBsb2NrcyAoTGludXgqIE9TIG9uIHg4NiBhbmQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgYXJjaGl0ZWN0dXJlKQorLy8gICAgICAgMy4gVGlja2V0IChMYW1wb3J0IGJha2VyeSkgbG9ja3MuCisvLyAgICAgICA0LiBRdWV1aW5nIGxvY2tzICh3aXRoIHNlcGFyYXRlIHNwaW4gZmllbGRzKS4KKy8vICAgICAgIDUuIERSUEEgKER5bmFtaWNhbGx5IFJlY29uZmlndXJhYmxlIERpc3RyaWJ1dGVkIFBvbGxpbmcgQXJlYSkgbG9ja3MKKy8vCisvLyAgIGFuZCAzIGxvY2sgcHVycG9zZXM6CisvLworLy8gICAgICAgMS4gQm9vdHN0cmFwIGxvY2tzIC0tIFVzZWQgZm9yIGEgZmV3IGxvY2tzIGF2YWlsYWJsZSBhdCBsaWJyYXJ5IHN0YXJ0dXAtc2h1dGRvd24gdGltZS4KKy8vICAgICAgICAgIFRoZXNlIGRvIG5vdCByZXF1aXJlIG5vbi1uZWdhdGl2ZSBnbG9iYWwgdGhyZWFkIElEJ3MuCisvLyAgICAgICAyLiBJbnRlcm5hbCBSVEwgbG9ja3MgLS0gVXNlZCBldmVyeXdoZXJlIGVsc2UgaW4gdGhlIFJUTAorLy8gICAgICAgMy4gVXNlciBsb2NrcyAoaW5jbHVkZXMgY3JpdGljYWwgc2VjdGlvbnMpCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgaW1wbGVtZW50YXRpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vCisvLyBOb24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrcyBkaWZmZXIgZnJvbSB0aGUgb3RoZXIgbG9jayBraW5kcyAoZXhjZXB0CisvLyBmdXRleCkgaW4gdGhhdCB3ZSB1c2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywKKy8vIHJhdGhlciB0aGFuIGEgcG9pbnRlciB0byBpdC4KKy8vCisvLyBPbiBsaW4zMiwgbGluXzMyZSwgYW5kIHdpbl8zMiwgdGhlIHNwYWNlIGFsbG9jYXRlZCBtYXkgYmUgYXMgc21hbGwgYXMgNAorLy8gYnl0ZXMsIHNvIHdlIGhhdmUgdG8gdXNlIGEgbG9jayB0YWJsZSBmb3IgbmVzdGVkIGxvY2tzLCBhbmQgYXZvaWQgYWNjZXNzaW5nCisvLyB0aGUgZGVwdGhfbG9ja2VkIGZpZWxkIGZvciBub24tbmVzdGVkIGxvY2tzLgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwKKy8vIGxvY2sgdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGgKKy8vIHRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIHsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgcG9sbDsgICAgICAgICAvLyAwID0+IHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9ja2VkOiAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkCisgICAga21wX2ludDMyICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIGttcF9iYXNlX3Rhc19sb2NrX3Q7CisKK3VuaW9uIGttcF90YXNfbG9jayB7CisgICAga21wX2Jhc2VfdGFzX2xvY2tfdCBsazsKKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsgICAvLyBtYWtlIGNlcnRhaW4gc3RydWN0IGlzIGxhcmdlIGVub3VnaAorICAgIGRvdWJsZSBsa19hbGlnbjsgICAgICAgIC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNhY2hlIGxpbmUgcGFkZGluZworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGFzX2xvY2sga21wX3Rhc19sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHRlc3QgYW5kIHNldCBsb2NrIHZhcmlhYmxlcy4gVXNhZ2U6CisvLyAgICBrbXBfdGFzX2xvY2tfdCB4bG9jayA9IEtNUF9UQVNfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKy8vCisjZGVmaW5lIEtNUF9UQVNfTE9DS19JTklUSUFMSVpFUiggbG9jayApIHsgeyAwLCAwIH0gfQorCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworCisjZGVmaW5lIEtNUF9MT0NLX1JFTEVBU0VEICAgICAgIDEKKyNkZWZpbmUgS01QX0xPQ0tfU1RJTExfSEVMRCAgICAgMAorI2RlZmluZSBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVCAxCisjZGVmaW5lIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQgIDAKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnV0ZXggbG9ja3MuICBmdXRleCBsb2NrcyBhcmUgb25seSBhdmFpbGFibGUgb24gTGludXgqIE9TLgorLy8KKy8vIExpa2Ugbm9uLW5lc3RlZCB0ZXN0IGFuZCBzZXQgbG9jaywgbm9uLW5lc3RlZCBmdXRleCBsb2NrcyB1c2UgdGhlIG1lbW9yeQorLy8gYWxsb2NhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgdGhlIGxvY2ssIHJhdGhlciB0aGFuIGEgcG9pbnRlciB0byBpdC4KKy8vCisvLyBJbmZvcm1hdGlvbiBub3JtYWxseSBhdmFpbGFibGUgdG8gdGhlIHRvb2xzLCBzdWNoIGFzIGxvY2sgbG9jYXRpb24sCisvLyBsb2NrIHVzYWdlIChub3JtYWwgbG9jayB2cy4gY3JpdGljYWwgc2VjdGlvbiksIGV0Yy4gaXMgbm90IGF2YWlsYWJsZSB3aXRoCisvLyB0ZXN0IGFuZCBzZXQgbG9ja3MuICBXaXRoIG5vbi1uZXN0ZWQgZnV0ZXggbG9ja3MsIHRoZSBsb2NrIG93bmVyIGlzIG5vdAorLy8gZXZlbiBhdmFpbGFibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV9mdXRleF9sb2NrIHsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgcG9sbDsgICAgICAgICAvLyAwID0+IHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiooZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9ja2VkOiAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkCisgICAga21wX2ludDMyICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2Z1dGV4X2xvY2sga21wX2Jhc2VfZnV0ZXhfbG9ja190OworCit1bmlvbiBrbXBfZnV0ZXhfbG9jayB7CisgICAga21wX2Jhc2VfZnV0ZXhfbG9ja190IGxrOworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOyAgIC8vIG1ha2UgY2VydGFpbiBzdHJ1Y3QgaXMgbGFyZ2UgZW5vdWdoCisgICAgZG91YmxlIGxrX2FsaWduOyAgICAgICAgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gY2FjaGUgbGluZSBwYWRkaW5nCit9OworCit0eXBlZGVmIHVuaW9uIGttcF9mdXRleF9sb2NrIGttcF9mdXRleF9sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIGZ1dGV4IGxvY2sgdmFyaWFibGVzLiBVc2FnZToKKy8vICAgIGttcF9mdXRleF9sb2NrX3QgeGxvY2sgPSBLTVBfRlVURVhfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKy8vCisjZGVmaW5lIEtNUF9GVVRFWF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IDAsIDAgfSB9CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRpY2tldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3RpY2tldF9sb2NrIHsKKyAgICAvLyBgaW5pdGlhbGl6ZWQnIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIHZvbGF0aWxlIHVuaW9uIGttcF90aWNrZXRfbG9jayAqIGluaXRpYWxpemVkOyAgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlCisgICAgaWRlbnRfdCBjb25zdCAqICAgICBsb2NhdGlvbjsgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5leHRfdGlja2V0OyAgLy8gdGlja2V0IG51bWJlciB0byBnaXZlIHRvIG5leHQgdGhyZWFkIHdoaWNoIGFjcXVpcmVzCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBub3dfc2VydmluZzsgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgb3duZXJfaWQ7ICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5CisgICAga21wX2xvY2tfZmxhZ3NfdCAgICBmbGFnczsgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGlja2V0X2xvY2sga21wX2Jhc2VfdGlja2V0X2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aWNrZXRfbG9jayB7CisgICAga21wX2Jhc2VfdGlja2V0X2xvY2tfdCBsazsgICAgICAgLy8gVGhpcyBmaWVsZCBtdXN0IGJlIGZpcnN0IHRvIGFsbG93IHN0YXRpYyBpbml0aWFsaXppbmcuCisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX3RpY2tldF9sb2NrX3QsIENBQ0hFX0xJTkUgKSBdOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGlja2V0X2xvY2sga21wX3RpY2tldF9sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHNpbXBsZSB0aWNrZXQgbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX3RpY2tldF9sb2NrX3QgeGxvY2sgPSBLTVBfVElDS0VUX0xPQ0tfSU5JVElBTElaRVIoIHhsb2NrICk7CisvLyBOb3RlIHRoZSBtYWNybyBhcmd1bWVudC4gSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgdmFyIHByb3Blcmx5IGluaXRpYWxpemVkLgorLy8KKyNkZWZpbmUgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IChrbXBfdGlja2V0X2xvY2tfdCAqKSAmIChsb2NrKSwgTlVMTCwgMCwgMCwgMCwgLTEgfSB9CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF90aWNrZXRfbG9ja193aXRoX2NoZWtzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWV1aW5nIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfaW5mbyBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3Q7CisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3MgeworICAgIC8qIFNvIHdlIGNhbiBnZXQgc3RhdHMgZnJvbSBsb2NrcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZXN0cm95ZWQuICovCisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbmV4dDsKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBwcmV2OworCisgICAgLyogT3RoZXIgc3RhdGlzdGljcyAqLworICAgIGttcF91aW50MzIgc3VjY2Vzc2Z1bFNwZWN1bGF0aW9uczsKKyAgICBrbXBfdWludDMyIGhhcmRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiBzb2Z0RmFpbGVkU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgbm9uU3BlY3VsYXRpdmVBY3F1aXJlczsKKyAgICBrbXBfdWludDMyIG5vblNwZWN1bGF0aXZlQWNxdWlyZUF0dGVtcHRzOworICAgIGttcF91aW50MzIgbGVtbWluZ1lpZWxkczsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3Mga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190OworCitleHRlcm4gdm9pZCBfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpOworCisjZW5kaWYgLy8gS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvCit7CisgICAgLyogVmFsdWVzIHVzZWQgZm9yIGFkYXB0aXZpdHkuCisgICAgICogQWx0aG91Z2ggdGhlc2UgYXJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyB3ZSBkb24ndCBhY2Nlc3MgdGhlbSBhdG9taWNhbGx5LAorICAgICAqIGJlY2F1c2UgaWYgd2UgbWlzcyB1cGRhdGVzIGl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyIG11Y2guIChJdCBqdXN0IGFmZmVjdHMgb3VyCisgICAgICogZGVjaXNpb24gYWJvdXQgd2hldGhlciB0byB0cnkgc3BlY3VsYXRpb24gb24gdGhlIGxvY2spLgorICAgICAqLworICAgIGttcF91aW50MzIgdm9sYXRpbGUgYmFkbmVzczsKKyAgICBrbXBfdWludDMyIHZvbGF0aWxlIGFjcXVpcmVfYXR0ZW1wdHM7CisgICAgLyogUGFyYW1ldGVycyBvZiB0aGUgbG9jay4gKi8KKyAgICBrbXBfdWludDMyIG1heF9iYWRuZXNzOworICAgIGttcF91aW50MzIgbWF4X3NvZnRfcmV0cmllczsKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB2b2xhdGlsZSBzdGF0czsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworCitzdHJ1Y3Qga21wX2Jhc2VfcXVldWluZ19sb2NrIHsKKworICAgIC8vICBgaW5pdGlhbGl6ZWQnIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIHZvbGF0aWxlIHVuaW9uIGttcF9xdWV1aW5nX2xvY2sgKmluaXRpYWxpemVkOyAvLyBQb2ludHMgdG8gdGhlIGxvY2sgdW5pb24gaWYgaW4gaW5pdGlhbGl6ZWQgc3RhdGUuCisKKyAgICBpZGVudF90IGNvbnN0ICogICAgIGxvY2F0aW9uOyAgICAgLy8gU291cmNlIGNvZGUgbG9jYXRpb24gb2Ygb21wX2luaXRfbG9jaygpLgorCisgICAgS01QX0FMSUdOKCA4ICkgICAgICAgICAgICAgICAgICAgIC8vIHRhaWxfaWQgIG11c3QgYmUgOC1ieXRlIGFsaWduZWQhCisKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgIHRhaWxfaWQ7ICAgICAgLy8gKGd0aWQrMSkgb2YgdGhyZWFkIGF0IHRhaWwgb2Ygd2FpdCBxdWV1ZSwgMCBpZiBlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIG5vIHBhZGRpbmcgaGVyZSBzaW5jZSBoZWFkL3RhaWwgdXNlZCBpbiA4LWJ5dGUgQ0FTCisgICAgdm9sYXRpbGUga21wX2ludDMyICBoZWFkX2lkOyAgICAgIC8vIChndGlkKzEpIG9mIHRocmVhZCBhdCBoZWFkIG9mIHdhaXQgcXVldWUsIDAgaWYgZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVjbCBvcmRlciBhc3N1bWVzIGxpdHRsZSBlbmRpYW4KKyAgICAvLyBiYWtlcnktc3R5bGUgbG9jaworICAgIHZvbGF0aWxlIGttcF91aW50MzIgbmV4dF90aWNrZXQ7ICAvLyB0aWNrZXQgbnVtYmVyIHRvIGdpdmUgdG8gbmV4dCB0aHJlYWQgd2hpY2ggYWNxdWlyZXMKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5vd19zZXJ2aW5nOyAgLy8gdGlja2V0IG51bWJlciBmb3IgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBsb2NrCisgICAgdm9sYXRpbGUga21wX2ludDMyICBvd25lcl9pZDsgICAgIC8vIChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQsIDAgaWYgdW5sb2NrZWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKKworICAgIGttcF9sb2NrX2ZsYWdzX3QgICAgZmxhZ3M7ICAgICAgICAvLyBsb2NrIHNwZWNpZmljcywgZS5nLiBjcml0aWNhbCBzZWN0aW9uIGxvY2sKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3F1ZXVpbmdfbG9jayBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdDsKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCB0YWlsX2lkICkgJSA4ID09IDAgKTsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9xdWV1aW5nX2xvY2sgeworICAgIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190IGxrOyAgICAgICAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4KKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgbGtfYWxpZ247IC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBDQUNIRV9MSU5FICkgXTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3F1ZXVpbmdfbG9jayBrbXBfcXVldWluZ19sb2NrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWRhcHRpdmUgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJ1Y3Qga21wX2Jhc2VfYWRhcHRpdmVfbG9jayB7CisgICAga21wX2Jhc2VfcXVldWluZ19sb2NrIHFsazsKKyAgICBLTVBfQUxJR04oQ0FDSEVfTElORSkKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgYWRhcHRpdmU7ICAgICAvLyBJbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWN1bGF0aXZlIGFkYXB0aXZlIGxvY2sKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2FkYXB0aXZlX2xvY2sga21wX2Jhc2VfYWRhcHRpdmVfbG9ja190OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2FkYXB0aXZlX2xvY2sgeworICAgIGttcF9iYXNlX2FkYXB0aXZlX2xvY2tfdCBsazsKKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgbGtfYWxpZ247CisgICAgY2hhciBsa19wYWRbIEtNUF9QQUQoa21wX2Jhc2VfYWRhcHRpdmVfbG9ja190LCBDQUNIRV9MSU5FKSBdOworfTsKK3R5cGVkZWYgdW5pb24ga21wX2FkYXB0aXZlX2xvY2sga21wX2FkYXB0aXZlX2xvY2tfdDsKKworIyBkZWZpbmUgR0VUX1FMS19QVFIobCkgKChrbXBfcXVldWluZ19sb2NrX3QgKikgJiAobCktPmxrLnFsaykKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRFJEUEEgdGlja2V0IGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jayB7CisgICAgLy8KKyAgICAvLyBBbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgZmlyc3QgY2FjaGUgbGluZSBhcmUgb25seSB3cml0dGVuIHdoZW4KKyAgICAvLyBpbml0aWFsaXppbmcgb3IgcmVjb25maWd1cmluZyB0aGUgbG9jay4gIFRoZXNlIGFyZSByZWxhdGl2ZWx5IHJhcmUKKyAgICAvLyBvcGVyYXRpb25zLCBzbyBkYXRhIGZyb20gdGhlIGZpcnN0IGNhY2hlIGxpbmUgd2lsbCB1c3VhbGx5IHN0YXkKKyAgICAvLyByZXNpZGVudCBpbiB0aGUgY2FjaGUgb2YgZWFjaCB0aHJlYWQgdHJ5aW5nIHRvIGFjcXVpcmUgdGhlIGxvY2suCisgICAgLy8KKyAgICAvLyBpbml0aWFsaXplZCBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAgdm9sYXRpbGUgdW5pb24ga21wX2RyZHBhX2xvY2sgKiBpbml0aWFsaXplZDsgICAgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlCisgICAgaWRlbnRfdCBjb25zdCAqICAgICAgICAgICAgICAgICBsb2NhdGlvbjsgICAgICAgLy8gU291cmNlIGNvZGUgbG9jYXRpb24gb2Ygb21wX2luaXRfbG9jaygpLgorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfbG9ja19wb2xsIHsKKyAgICAgICAga21wX3VpbnQ2NCBwb2xsOworICAgIH0gKiB2b2xhdGlsZSBwb2xsczsKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgICAgICAgIG1hc2s7ICAgICAgICAgICAvLyBpcyAyKipudW1fcG9sbHMtMSBmb3IgbW9kIG9wCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwX3RpY2tldDsgLy8gdGhyZWFkIHdpdGggY2xlYW51cCB0aWNrZXQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2xvY2tfcG9sbCAqIG9sZF9wb2xsczsgICAgICAvLyB3aWxsIGRlYWxsb2NhdGUgb2xkX3BvbGxzCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBudW1fcG9sbHM7ICAgICAgLy8gbXVzdCBiZSBwb3dlciBvZiAyCisKKyAgICAvLworICAgIC8vIG5leHRfdGlja2V0IGl0IG5lZWRzIHRvIGV4aXN0IGluIGEgc2VwYXJhdGUgY2FjaGUgbGluZSwgYXMgaXQgaXMKKyAgICAvLyBpbnZhbGlkYXRlZCBldmVyeSB0aW1lIGEgdGhyZWFkIHRha2VzIGEgbmV3IHRpY2tldC4KKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgICAgICAgICBuZXh0X3RpY2tldDsKKworICAgIC8vCisgICAgLy8gbm93X3NlcnZpbmcgaXMgdXNlZCB0byBzdG9yZSBvdXIgdGlja2V0IHZhbHVlIHdoaWxlIHdlIGhvbGQgdGhlIGxvY2suCisgICAgLy8gSXQgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG1lYW5pbmcgaW4gdGhlIERSRFBBIHRpY2tldCBsb2NrcyAod2hlcmUKKyAgICAvLyBpdCBpcyB3cml0dGVuIGJ5IHRoZSBhY3F1aXJpbmcgdGhyZWFkKSB0aGFuIGl0IGRvZXMgaW4gdGhlIHNpbXBsZQorICAgIC8vIHRpY2tldCBsb2NrcyAod2hlcmUgaXQgaXMgd3JpdHRlbiBieSB0aGUgcmVsZWFzaW5nIHRocmVhZCkuCisgICAgLy8KKyAgICAvLyBTaW5jZSBub3dfc2VydmluZyBpcyBvbmx5IHJlYWQgYW4gd3JpdHRlbiBpbiB0aGUgY3JpdGljYWwgc2VjdGlvbiwKKyAgICAvLyBpdCBpcyBub24tdm9sYXRpbGUsIGJ1dCBpdCBuZWVkcyB0byBleGlzdCBvbiBhIHNlcGFyYXRlIGNhY2hlIGxpbmUsCisgICAgLy8gYXMgaXQgaXMgaW52YWxpZGF0ZWQgYXQgZXZlcnkgbG9jayBhY3F1aXJlLgorICAgIC8vCisgICAgLy8gTGlrZXdpc2UsIHRoZSB2YXJzIHVzZWQgZm9yIG5lc3RlZCBsb2NrcyAob3duZXJfaWQgYW5kIGRlcHRoX2xvY2tlZCkKKyAgICAvLyBhcmUgb25seSB3cml0dGVuIGJ5IHRoZSB0aHJlYWQgb3duaW5nIHRoZSBsb2NrLCBzbyB0aGV5IGFyZSBwdXQgaW4KKyAgICAvLyB0aGlzIGNhY2hlIGxpbmUuICBvd25lcl9pZCBpcyByZWFkIGJ5IG90aGVyIHRocmVhZHMsIHNvIGl0IG11c3QgYmUKKyAgICAvLyBkZWNsYXJlZCB2b2xhdGlsZS4KKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgICAgICAgICBub3dfc2VydmluZzsgICAgLy8gZG9lc24ndCBoYXZlIHRvIGJlIHZvbGF0aWxlCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgICAgICAgICBvd25lcl9pZDsgICAgICAgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfbG9ja2VkOyAgIC8vIGRlcHRoIGxvY2tlZAorICAgIGttcF9sb2NrX2ZsYWdzX3QgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jayBrbXBfYmFzZV9kcmRwYV9sb2NrX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZHJkcGFfbG9jayB7CisgICAga21wX2Jhc2VfZHJkcGFfbG9ja190IGxrOyAgICAgICAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4gKi8KKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgbGtfYWxpZ247IC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgIGNoYXIgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX2RyZHBhX2xvY2tfdCwgQ0FDSEVfTElORSApIF07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9kcmRwYV9sb2NrIGttcF9kcmRwYV9sb2NrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgcHVycG9zZXMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQm9vdHN0cmFwIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBCb290c3RyYXAgbG9ja3MgLS0gdmVyeSBmZXcgbG9ja3MgdXNlZCBhdCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbWUuCisvLyBCb290c3RyYXAgbG9ja3MgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MuCisvLyBUaGV5IGNvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgYXMgdGVzdCBhbmQgc2V0IGxvY2ssIGJ1dCBjYW5ub3QgYmUKKy8vIGltcGxlbWVudGVkIHdpdGggb3RoZXIgbG9jayBraW5kcyBhcyB0aGV5IHJlcXVpcmUgZ3RpZHMgd2hpY2ggYXJlIG5vdAorLy8gYXZhaWxhYmxlIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuCisKK3R5cGVkZWYga21wX3RpY2tldF9sb2NrX3Qga21wX2Jvb3RzdHJhcF9sb2NrX3Q7CisKKyNkZWZpbmUgS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCAobG9jaykgKQorCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygga21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgS01QX0dUSURfRE5FICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBLTVBfR1RJRF9ETkUgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIEtNUF9HVElEX0RORSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIFJUTCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIEludGVybmFsIFJUTCBsb2NrcyBhcmUgYWxzbyBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MsIGZvciBub3cuCisvLworLy8gRklYTUUgLSBXZSBzaG91bGQgZ28gdGhyb3VnaCBhbmQgZmlndXJlIG91dCB3aGljaCBsb2NrIGtpbmQgd29ya3MgYmVzdCBmb3IKKy8vIGVhY2ggaW50ZXJuYWwgbG9jaywgYW5kIHVzZSB0aGUgdHlwZSBkZWNsYXJhdGlvbiBhbmQgZnVuY3Rpb24gY2FsbHMgZm9yCisvLyB0aGF0IGV4cGxpY2l0IGxvY2sga2luZCAoYW5kIGdldCByaWQgb2YgdGhpcyBzZWN0aW9uKS4KKy8vCisKK3R5cGVkZWYga21wX3RpY2tldF9sb2NrX3Qga21wX2xvY2tfdDsKKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX2FjcXVpcmVfbG9jaygga21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9pbml0X2xvY2soIGttcF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV9sb2NrKCBrbXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBEbyBub3QgYWxsb2NhdGUgb2JqZWN0cyBvZiB0eXBlIHVuaW9uIGttcF91c2VyX2xvY2shISEKKy8vIFRoaXMgd2lsbCB3YXN0ZSBzcGFjZSB1bmxlc3MgX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZHJkcGEuCisvLyBJbnN0ZWFkLCBjaGVjayB0aGUgdmFsdWUgb2YgX19rbXBfdXNlcl9sb2NrX2tpbmQgYW5kIGFsbG9jYXRlIG9iamVjdHMgb2YKKy8vIHRoZSB0eXBlIG9mIHRoZSBhcHByb3ByaWF0ZSB1bmlvbiBtZW1iZXIsIGFuZCBjYXN0IHRoZWlyIGFkZHJlc3NlcyB0bworLy8ga21wX3VzZXJfbG9ja19wLgorLy8KKworZW51bSBrbXBfbG9ja19raW5kIHsKKyAgICBsa19kZWZhdWx0ID0gMCwKKyAgICBsa190YXMsCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGxrX2Z1dGV4LAorI2VuZGlmCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgS01QX1VTRV9UU1gKKyAgICBsa19obGUsCisgICAgbGtfcnRtLAorI2VuZGlmCisgICAgbGtfdGlja2V0LAorICAgIGxrX3F1ZXVpbmcsCisgICAgbGtfZHJkcGEsCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGxrX2FkYXB0aXZlCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworfTsKKwordHlwZWRlZiBlbnVtIGttcF9sb2NrX2tpbmQga21wX2xvY2tfa2luZF90OworCitleHRlcm4ga21wX2xvY2tfa2luZF90IF9fa21wX3VzZXJfbG9ja19raW5kOworCit1bmlvbiBrbXBfdXNlcl9sb2NrIHsKKyAgICBrbXBfdGFzX2xvY2tfdCAgICAgdGFzOworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBrbXBfZnV0ZXhfbG9ja190ICAgZnV0ZXg7CisjZW5kaWYKKyAgICBrbXBfdGlja2V0X2xvY2tfdCAgdGlja2V0OworICAgIGttcF9xdWV1aW5nX2xvY2tfdCBxdWV1aW5nOworICAgIGttcF9kcmRwYV9sb2NrX3QgICBkcmRwYTsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAga21wX2FkYXB0aXZlX2xvY2tfdCAgICAgYWRhcHRpdmU7CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGttcF9sb2NrX3Bvb2xfdCAgICBwb29sOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdXNlcl9sb2NrICprbXBfdXNlcl9sb2NrX3A7CisKKyNpZiAhIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKK2V4dGVybiBzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZTsKK2V4dGVybiBzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemU7CisKK2V4dGVybiBrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcigga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIGludCAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworI2RlZmluZSBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcyhsY2ssZ3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICYmIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCAhPSAtMSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggbGNrLT50YXMubGsucG9sbCAtIDEgPT0gZ3RpZCApICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSB7ICAgICAgICAgICAgXAorICAgICAgICAgICAga21wX3VpbnQzMiBzcGluczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgIHsgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApIHsgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKK30KKyNlbmRpZgorCitleHRlcm4gaW50ICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisjaW5jbHVkZSAia21wX2kxOG4uaCIgICAgICAgICAgICAgICAgICAgICAgIC8qIEFDOiBLTVBfRkFUQUwgZGVmaW5pdGlvbiAqLworZXh0ZXJuIGludCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2s7ICAgICAvKiBBQzogY29weSBmcm9tIGttcC5oIGhlcmUgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgeworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgICAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKCAoIGxjay0+dGFzLmxrLnBvbGwgPT0gMCApICYmCisgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApICggbGNrLCBndGlkICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCisvLworLy8gV2UgbmVlZCBhIG5vbi1jaGVja2luZyB2ZXJzaW9uIG9mIGRlc3Ryb3kgbG9jayBmb3Igd2hlbiB0aGUgUlRMIGlzCisvLyBkb2luZyB0aGUgY2xlYW51cCBhcyBpdCBjYW4ndCBhbHdheXMgdGVsbCBpZiB0aGUgbG9jayBpcyBuZXN0ZWQgb3Igbm90LgorLy8KK2V4dGVybiB2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV91c2VyX2xvY2soIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGxjayApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIGludCAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisKKyNkZWZpbmUgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGxjayxndGlkLGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICYmIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9PSAtMSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKmRlcHRoID0gS01QX0xPQ0tfQUNRVUlSRURfTkVYVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgeyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdoaWxlICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSB7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpkZXB0aCA9IEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqZGVwdGggPSAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQsIGludCogZGVwdGggKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICpkZXB0aCA9ICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSB7CisgICAgICAgIGludCByZXR2YWw7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyAgICAgICAgaWYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgeyAgIC8qIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCAqLworICAgICAgICAgICAgcmV0dXJuICsrbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkOyAgLyogc2FtZSBvd25lciwgZGVwdGggaW5jcmVhc2VkICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gKCAoIGxjay0+dGFzLmxrLnBvbGwgPT0gMCApICYmCisgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICk7CisgICAgICAgIGlmICggcmV0dmFsICkgeworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgICAgIHJldHVybiAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworICAgIH0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworLy8KKy8vIHVzZXIgbG9jayBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IG5lY2Vzc2FyaWx5IGV4aXN0IGZvciBhbGwgbG9jayBraW5kcy4KKy8vCisvLyBUaGUgInNldCIgZnVuY3Rpb25zIHVzdWFsbHkgaGF2ZSB3cmFwcGVyIHJvdXRpbmVzIHRoYXQgY2hlY2sgZm9yIGEgTlVMTCBzZXQKKy8vIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIGNhbGwgaXQgaWYgbm9uLU5VTEwuCisvLworLy8gSW4gc29tZSBjYXNlcywgaXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBhICJnZXQiIHdyYXBwZXIgZnVuY3Rpb24gY2hlY2sgZm9yIGEKKy8vIE5VTEwgZ2V0IGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHJldHVybiBOVUxMIC8gaW52YWxpZCB2YWx1ZSAvIGVycm9yIGNvZGUgaWYKKy8vIHRoZSBmdW5jdGlvbiBwb2ludGVyIGlzIE5VTEwuCisvLworLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSBjYWxsaW5nIGNvZGUgcmVhbGx5IHNob3VsZCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4KKy8vIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gYW5kIG9uZSB0aGF0IGlzIGltcGxlbWVudGVkIGJ1dCByZXR1cm5pbmcgTlVMTCAvCisvLyBpbnZhbGllZCB2YWx1ZS4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIG5vIGdldCBmdW5jdGlvbiB3cmFwcGVyIGV4aXN0cy4KKy8vCisKK2V4dGVybiBpbnQgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKKy8vIG5vIHNldCBmdW5jdGlvbjsgZmllbGRzIHNldCBkdXJpbmluZyBsb2NhbCBhbGxvY2F0aW9uCisKK2V4dGVybiBjb25zdCBpZGVudF90ICogKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIGNvbnN0IGlkZW50X3QgKgorX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbigga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgaWYgKCBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAgIT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGxjayApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGlmICggX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gICE9IE5VTEwgKSB7CisgICAgICAgICggKl9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGxjaywgbG9jICk7CisgICAgfQorfQorCitleHRlcm4ga21wX2xvY2tfZmxhZ3NfdCAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK2V4dGVybiB2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBpZiAoIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfICAhPSBOVUxMICkgeworICAgICAgICAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBsY2ssIGZsYWdzICk7CisgICAgfQorfQorCisvLworLy8gVGhlIGZ1Y3Rpb24gd2hpY2ggc2V0cyB1cCBhbGwgb2YgdGhlIHZ0YmwgcG9pbnRlcnMgZm9yIGttcF91c2VyX2xvY2tfdC4KKy8vCitleHRlcm4gdm9pZCBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBrbXBfbG9ja19raW5kX3QgdXNlcl9sb2NrX2tpbmQgKTsKKworLy8KKy8vIE1hY3JvcyBmb3IgYmluZGluZyB1c2VyIGxvY2sgZnVuY3Rpb25zLgorLy8KKyNkZWZpbmUgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKG5lc3QsIGtpbmQsIHN1ZmZpeCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlIyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfID0gKCBpbnQgKCopKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZSMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlIyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfID0gKCBpbnQgKCopKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZSMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgIFwKKyAgICBfX2ttcF90ZXN0IyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfICAgID0gKCBpbnQgKCopKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGVzdCMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgICAgIFwKKyAgICBfX2ttcF9pbml0IyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfICAgID0gKCB2b2lkICgqKSgga21wX3VzZXJfbG9ja19wICkgKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdCMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgICAgIFwKKyAgICBfX2ttcF9kZXN0cm95IyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfID0gKCB2b2lkICgqKSgga21wX3VzZXJfbG9ja19wICkgKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZGVzdHJveSMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgIFwKK30KKworI2RlZmluZSBLTVBfQklORF9VU0VSX0xPQ0soa2luZCkgICAgICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfLCBraW5kLCBsb2NrKQorI2RlZmluZSBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1Moa2luZCkgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfLCBraW5kLCBsb2NrX3dpdGhfY2hlY2tzKQorI2RlZmluZSBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKGtpbmQpICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfbmVzdGVkXywga2luZCwgbG9jaykKKyNkZWZpbmUgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhraW5kKSBLTVBfQklORF9VU0VSX0xPQ0tfVEVNUExBVEUoX25lc3RlZF8sIGtpbmQsIGxvY2tfd2l0aF9jaGVja3MpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9jayB0YWJsZSAmIGxvY2sgYWxsb2NhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIE9uIDY0LWJpdCBMaW51eCogT1MgKGFuZCBPUyBYKikgR05VIGNvbXBpbGVyIGFsbG9jYXRlcyBvbmx5IDQgYnl0ZW1zIG1lbW9yeSBmb3IgbG9jayB2YXJpYWJsZSwgd2hpY2gKKyAgICBpcyBub3QgZW5vdWdoIHRvIHN0b3JlIGEgcG9pbnRlciwgc28gd2UgaGF2ZSB0byB1c2UgbG9jayBpbmRleGVzIGluc3RlYWQgb2YgcG9pbnRlcnMgYW5kCisgICAgbWFpbnRhaW4gbG9jayB0YWJsZSB0byBtYXAgaW5kZXhlcyB0byBwb2ludGVycy4KKworCisgICAgTm90ZTogVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHRhYmxlIGlzIG5vdCBhIHBvaW50ZXIgdG8gbG9jayEgSXQgaXMgYSBwb2ludGVyIHRvIHByZXZpb3VzbHkKKyAgICBhbGxvY2F0ZWQgdGFibGUgKG9yIE5VTEwgaWYgaXQgaXMgdGhlIGZpcnN0IHRhYmxlKS4KKworICAgIFVzYWdlOgorCisgICAgICAgIGlmICggT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKCA8bG9jaz4gKSApIHsgLy8gb3IgT01QX05FU1RfTE9DS19UX1NJWkUKKyAgICAgICAgICAgIExvY2sgdGFibGUgaXMgZnVsbHkgdXRpbGl6ZWQuIFVzZXIgbG9ja3MgYXJlIGluZGV4ZXMsIHNvIHRhYmxlIGlzCisgICAgICAgICAgICB1c2VkIG9uIHVzZXIgbG9jayBvcGVyYXRpb24uCisgICAgICAgICAgICBOb3RlOiBpdCBtYXkgYmUgdGhlIGNhc2UgKGxpbl8zMikgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHVzZSBhIGxvY2sKKyAgICAgICAgICAgIHRhYmxlIGZvciByZWd1bGFyIGxvY2tzLCBidXQgZG8gbmVlZCB0aGUgdGFibGUgZm9yIG5lc3RlZCBsb2Nrcy4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExvY2sgdGFibGUgaW5pdGlhbGl6ZWQgYnV0IG5vdCBhY3R1YWxseSB1c2VkLgorICAgICAgICB9CisqLworCitzdHJ1Y3Qga21wX2xvY2tfdGFibGUgeworICAgIGttcF9sb2NrX2luZGV4X3QgIHVzZWQ7ICAgICAgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMKKyAgICBrbXBfbG9ja19pbmRleF90ICBhbGxvY2F0ZWQ7IC8vIE51bWJlciBvZiBhbGxvY2F0ZWQgZWxlbWVudHMKKyAgICBrbXBfdXNlcl9sb2NrX3AgKiB0YWJsZTsgICAgIC8vIExvY2sgdGFibGUuCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbG9ja190YWJsZSBrbXBfbG9ja190YWJsZV90OworCitleHRlcm4ga21wX2xvY2tfdGFibGVfdCBfX2ttcF91c2VyX2xvY2tfdGFibGU7CitleHRlcm4ga21wX3VzZXJfbG9ja19wIF9fa21wX2xvY2tfcG9vbDsKKworc3RydWN0IGttcF9ibG9ja19vZl9sb2NrcyB7CisgICAgc3RydWN0IGttcF9ibG9ja19vZl9sb2NrcyAqIG5leHRfYmxvY2s7CisgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgICAgIGxvY2tzOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jsb2NrX29mX2xvY2tzIGttcF9ibG9ja19vZl9sb2Nrc190OworCitleHRlcm4ga21wX2Jsb2NrX29mX2xvY2tzX3QgKl9fa21wX2xvY2tfYmxvY2tzOworZXh0ZXJuIGludCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2s7CisKK2V4dGVybiBrbXBfdXNlcl9sb2NrX3AgX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApOworZXh0ZXJuIHZvaWQgX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CitleHRlcm4ga21wX3VzZXJfbG9ja19wIF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHZvaWQgKip1c2VyX2xvY2ssIGNoYXIgY29uc3QgKmZ1bmMgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFudXBfdXNlcl9sb2NrcygpOworCisjZGVmaW5lIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggISBUQ1JfNCggX19rbXBfaW5pdF91c2VyX2xvY2tzICkgKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOyAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfdXNlcl9sb2NrcyApICkgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfdXNlcl9sb2NrcywgVFJVRSApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOyAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworI3VuZGVmIEtNUF9QQUQKKyN1bmRlZiBLTVBfR1RJRF9ETkUKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8vCisvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSyBlbmFibGVzIGR5bmFtaWMgZGlzcGF0Y2ggb2YgbG9jayBmdW5jdGlvbnMgd2l0aG91dCBicmVha2luZyB0aGUgY3VycmVudAorLy8gY29tcGF0aWJpbGl0eS4gRXNzZW50aWFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBuZXcgY29kZSBpcyBkeW5hbWljIGRpc3BhdGNoLCBidXQgaXQgYWxzbworLy8gaW1wbGVtZW50cyAob3IgZW5hYmxlcyBpbXBsZW1lbnRhdGlvbiBvZikgaGludGVkIHVzZXIgbG9jayBhbmQgY3JpdGljYWwgc2VjdGlvbiB3aGljaCB3aWxsIGJlCisvLyBwYXJ0IG9mIE9NUCA0LjEgc29vbi4KKy8vCisvLyBMb2NrIHR5cGUgY2FuIGJlIGRlY2lkZWQgYXQgY3JlYXRpb24gdGltZSAoaS5lLiwgbG9jayBpbml0aWFsaXphdGlvbiksIGFuZCBzdWJzZXF1ZW50IGxvY2sKKy8vIGZ1bmN0aW9uIGNhbGwgb24gdGhlIGNyZWF0ZWQgbG9jayBvYmplY3QgcmVxdWlyZXMgdHlwZSBleHRyYWN0aW9uIGFuZCBjYWxsIHRocm91Z2gganVtcCB0YWJsZQorLy8gdXNpbmcgdGhlIGV4dHJhY3RlZCB0eXBlLiBUaGlzIHR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHR3byBkaWZmZXJlbnQgd2F5cyBkZXBlbmRpbmcgb24KKy8vIHRoZSBzaXplIG9mIHRoZSBsb2NrIG9iamVjdCwgYW5kIHdlIGRpZmZlcmVudGlhdGUgbG9jayB0eXBlcyBieSB0aGlzIHNpemUgcmVxdWlyZW1lbnQgLSBkaXJlY3QKKy8vIGFuZCBpbmRpcmVjdCBsb2Nrcy4KKy8vCisvLyBEaXJlY3QgbG9ja3M6CisvLyBBIGRpcmVjdCBsb2NrIG9iamVjdCBmaXRzIGludG8gdGhlIHNwYWNlIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciBhbiBvbXBfbG9ja190IG9iamVjdCwgYW5kCisvLyBUQVMvRnV0ZXggbG9jayBmYWxscyBpbnRvIHRoaXMgY2F0ZWdvcnkuIFdlIHVzZSBsb3cgb25lIGJ5dGUgb2YgdGhlIGxvY2sgb2JqZWN0IGFzIHRoZSBzdG9yYWdlCisvLyBmb3IgdGhlIGxvY2sgdHlwZSwgYW5kIGFwcHJvcHJpYXRlIGJpdCBvcGVyYXRpb24gaXMgcmVxdWlyZWQgdG8gYWNjZXNzIHRoZSBkYXRhIG1lYW5pbmdmdWwgdG8KKy8vIHRoZSBsb2NrIGFsZ29yaXRobXMuIEFsc28sIHRvIGRpZmZlcmVudGlhdGUgZGlyZWN0IGxvY2sgZnJvbSBpbmRpcmVjdCBsb2NrLCAxIGlzIHdyaXR0ZW4gdG8gTFNCCisvLyBvZiB0aGUgbG9jayBvYmplY3QuIFRoZSBuZXdseSBpbnRyb2R1Y2VkICJobGUiIGxvY2sgaXMgYWxzbyBhIGRpcmVjdCBsb2NrLgorLy8KKy8vIEluZGlyZWN0IGxvY2tzOgorLy8gQW4gaW5kaXJlY3QgbG9jayBvYmplY3QgcmVxdWlyZXMgbW9yZSBzcGFjZSB0aGFuIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgc3BhY2UsIGFuZCBpdCBzaG91bGQgYmUKKy8vIGFsbG9jYXRlZCBmcm9tIGhlYXAuIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcGlsZXItZ2VuZXJhdGVkIHNwYWNlIGZvciB0aGUgbG9jayAoaS5lLiwKKy8vIHNpemUgb2Ygb21wX2xvY2tfdCksIHRoaXMgb21wX2xvY2tfdCBvYmplY3Qgc3RvcmVzIGVpdGhlciB0aGUgYWRkcmVzcyBvZiB0aGUgaGVhcC1hbGxvY2F0ZWQKKy8vIGluZGlyZWN0IGxvY2sgKHZvaWQgKiBmaXRzIGluIHRoZSBvYmplY3QpIG9yIGFuIGluZGV4IHRvIHRoZSBpbmRpcmVjdCBsb2NrIHRhYmxlIGVudHJ5IHRoYXQKKy8vIGhvbGRzIHRoZSBhZGRyZXNzLiBUaWNrZXQvUXVldWluZy9EUkRQQS9BZGFwdGl2ZSBsb2NrIGZhbGxzIGludG8gdGhpcyBjYXRlZ29yeSwgYW5kIHRoZSBuZXdseQorLy8gaW50cm9kdWNlZCAicnRtIiBsb2NrIGlzIGFsc28gYW4gaW5kaXJlY3QgbG9jayB3aGljaCB3YXMgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZSBRdWV1aW5nIGxvY2suCisvLyBXaGVuIHRoZSBvbXBfbG9ja190IG9iamVjdCBob2xkcyBhbiBpbmRleCAobm90IGxvY2sgYWRkcmVzcyksIDAgaXMgd3JpdHRlbiB0byBMU0IgdG8KKy8vIGRpZmZlcmVudGlhdGUgdGhlIGxvY2sgZnJvbSBhIGRpcmVjdCBsb2NrLCBhbmQgdGhlIHJlbWFpbmluZyBwYXJ0IGlzIHRoZSBhY3R1YWwgaW5kZXggdG8gdGhlCisvLyBpbmRpcmVjdCBsb2NrIHRhYmxlLgorLy8KKworI2luY2x1ZGUgPHN0ZGludC5oPiAvLyBmb3IgdWludHB0cl90CisKKy8vIFNob3J0Y3V0cworI2RlZmluZSBLTVBfVVNFX0ZVVEVYICAgICAgICAgIChLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpKQorI2RlZmluZSBLTVBfVVNFX0lOTElORURfVEFTICAgIChLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSkgJiYgMQorI2RlZmluZSBLTVBfVVNFX0lOTElORURfRlVURVggIEtNUF9VU0VfRlVURVggJiYgMAorCisvLyBMaXN0IG9mIGxvY2sgZGVmaW5pdGlvbnM7IGFsbCBuZXN0ZWQgbG9ja3MgYXJlIGluZGlyZWN0IGxvY2tzLgorLy8gaGxlIGxvY2sgaXMgeGNoZyBsb2NrIHByZWZpeGVkIHdpdGggWEFDUVVJUkUvWFJFTEVBU0UuCisvLyBBbGwgbmVzdGVkIGxvY2tzIGFyZSBpbmRpcmVjdCBsb2NrIHR5cGVzLgorI2lmIEtNUF9VU0VfVFNYCisjIGlmIEtNUF9VU0VfRlVURVgKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKSBtKGZ1dGV4LCBhKSBtKGhsZSwgYSkKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9JX0xPQ0sobSwgYSkgIG0odGlja2V0LCBhKSBtKHF1ZXVpbmcsIGEpIG0oYWRhcHRpdmUsIGEpIG0oZHJkcGEsIGEpIG0ocnRtLCBhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90YXMsIGEpIG0obmVzdGVkX2Z1dGV4LCBhKSBtKG5lc3RlZF90aWNrZXQsIGEpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfcXVldWluZywgYSkgbShuZXN0ZWRfZHJkcGEsIGEpCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKSAgICAgICAgICAgICBtKGhsZSwgYSkKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9JX0xPQ0sobSwgYSkgIG0odGlja2V0LCBhKSBtKHF1ZXVpbmcsIGEpIG0oYWRhcHRpdmUsIGEpIG0oZHJkcGEsIGEpIG0ocnRtLCBhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90YXMsIGEpICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90aWNrZXQsIGEpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfcXVldWluZywgYSkgbShuZXN0ZWRfZHJkcGEsIGEpCisjIGVuZGlmIC8vIEtNUF9VU0VfRlVURVgKKyMgZGVmaW5lIEtNUF9MQVNUX0RfTE9DSyBsb2Nrc2VxX2hsZQorI2Vsc2UKKyMgaWYgS01QX1VTRV9GVVRFWAorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0RfTE9DSyhtLCBhKSAgbSh0YXMsIGEpIG0oZnV0ZXgsIGEpCisjICBkZWZpbmUgS01QX0ZPUkVBQ0hfSV9MT0NLKG0sIGEpICBtKHRpY2tldCwgYSkgbShxdWV1aW5nLCBhKSAgICAgICAgICAgICAgICBtKGRyZHBhLCBhKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfdGFzLCBhKSBtKG5lc3RlZF9mdXRleCwgYSkgbShuZXN0ZWRfdGlja2V0LCBhKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3F1ZXVpbmcsIGEpIG0obmVzdGVkX2RyZHBhLCBhKQorIyAgZGVmaW5lIEtNUF9MQVNUX0RfTE9DSyBsb2Nrc2VxX2Z1dGV4CisjIGVsc2UKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKQorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0lfTE9DSyhtLCBhKSAgbSh0aWNrZXQsIGEpIG0ocXVldWluZywgYSkgICAgICAgICAgICAgICAgbShkcmRwYSwgYSkgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RhcywgYSkgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RpY2tldCwgYSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF9xdWV1aW5nLCBhKSBtKG5lc3RlZF9kcmRwYSwgYSkKKyMgIGRlZmluZSBLTVBfTEFTVF9EX0xPQ0sgbG9ja3NlcV90YXMKKyMgZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorI2VuZGlmIC8vIEtNUF9VU0VfVFNYCisKKy8vIEluZm9ybWF0aW9uIHVzZWQgaW4gZHluYW1pYyBkaXNwYXRjaAorI2RlZmluZSBLTVBfTE9DS19TSElGVCAgIDggLy8gbnVtYmVyIG9mIGxvdyBiaXRzIHRvIGJlIHVzZWQgYXMgdGFnIGZvciBkaXJlY3QgbG9ja3MKKyNkZWZpbmUgS01QX0ZJUlNUX0RfTE9DSyBsb2Nrc2VxX3RhcworI2RlZmluZSBLTVBfRklSU1RfSV9MT0NLIGxvY2tzZXFfdGlja2V0CisjZGVmaW5lIEtNUF9MQVNUX0lfTE9DSyAgbG9ja3NlcV9uZXN0ZWRfZHJkcGEKKyNkZWZpbmUgS01QX05VTV9JX0xPQ0tTICAobG9ja3RhZ19uZXN0ZWRfZHJkcGErMSkgLy8gbnVtYmVyIG9mIGluZGlyZWN0IGxvY2sgdHlwZXMKKworLy8gQmFzZSB0eXBlIGZvciBkeW5hbWljIGxvY2tzLgordHlwZWRlZiBrbXBfdWludDMyIGttcF9keW5hX2xvY2tfdDsKKworLy8gTG9jayBzZXF1ZW5jZSB0aGF0IGVudW1lcmF0ZXMgYWxsIGxvY2sga2luZHMuCisvLyBBbHdheXMgbWFrZSB0aGlzIGVudW1lcmF0aW9uIGNvbnNpc3RlbnQgd2l0aCBrbXBfbG9ja3NlcV90IGluIHRoZSBpbmNsdWRlIGRpcmVjdG9yeS4KK3R5cGVkZWYgZW51bSB7CisgICAgbG9ja3NlcV9pbmRpcmVjdCA9IDAsCisjZGVmaW5lIGV4cGFuZF9zZXEobCxhKSBsb2Nrc2VxXyMjbCwKKyAgICBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kX3NlcSwgMCkKKyAgICBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kX3NlcSwgMCkKKyN1bmRlZiBleHBhbmRfc2VxCit9IGttcF9keW5hX2xvY2tzZXFfdDsKKworLy8gRW51bWVyYXRlcyBpbmRpcmVjdCBsb2NrIHRhZ3MuCit0eXBlZGVmIGVudW0geworI2RlZmluZSBleHBhbmRfdGFnKGwsYSkgbG9ja3RhZ18jI2wsCisgICAgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZF90YWcsIDApCisjdW5kZWYgZXhwYW5kX3RhZworfSBrbXBfaW5kaXJlY3RfbG9ja3RhZ190OworCisvLyBVdGlsaXR5IG1hY3JvcyB0aGF0IGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBsb2NrIHNlcXVlbmNlcy4KKyNkZWZpbmUgS01QX0lTX0RfTE9DSyhzZXEpICgoc2VxKSA+PSBLTVBfRklSU1RfRF9MT0NLICYmIChzZXEpIDw9IEtNUF9MQVNUX0RfTE9DSykKKyNkZWZpbmUgS01QX0lTX0lfTE9DSyhzZXEpICgoc2VxKSA+PSBLTVBfRklSU1RfSV9MT0NLICYmIChzZXEpIDw9IEtNUF9MQVNUX0lfTE9DSykKKyNkZWZpbmUgS01QX0dFVF9JX1RBRyhzZXEpIChrbXBfaW5kaXJlY3RfbG9ja3RhZ190KSgoc2VxKSAtIEtNUF9GSVJTVF9JX0xPQ0spCisjZGVmaW5lIEtNUF9HRVRfRF9UQUcoc2VxKSAoKHNlcSk8PDEgfCAxKQorCisvLyBFbnVtZXJhdGVzIGRpcmVjdCBsb2NrIHRhZ3Mgc3RhcnRpbmcgZnJvbSBpbmRpcmVjdCB0YWcuCit0eXBlZGVmIGVudW0geworI2RlZmluZSBleHBhbmRfdGFnKGwsYSkgbG9ja3RhZ18jI2wgPSBLTVBfR0VUX0RfVEFHKGxvY2tzZXFfIyNsKSwKKyAgICBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kX3RhZywgMCkKKyN1bmRlZiBleHBhbmRfdGFnCit9IGttcF9kaXJlY3RfbG9ja3RhZ190OworCisvLyBJbmRpcmVjdCBsb2NrIHR5cGUKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbG9jazsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja3RhZ190IHR5cGU7Cit9IGttcF9pbmRpcmVjdF9sb2NrX3Q7CisKKy8vIEZ1bmN0aW9uIHRhYmxlcyBmb3IgZGlyZWN0IGxvY2tzLiBTZXQvdW5zZXQvdGVzdCBkaWZmZXJlbnRpYXRlIGZ1bmN0aW9ucyB3aXRoL3dpdGhvdXQgY29uc2lzdGVuY3kgY2hlY2tpbmcuCitleHRlcm4gdm9pZCAoKl9fa21wX2RpcmVjdF9pbml0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfZHluYV9sb2Nrc2VxX3QpOworZXh0ZXJuIHZvaWQgKCpfX2ttcF9kaXJlY3RfZGVzdHJveVtdKShrbXBfZHluYV9sb2NrX3QgKik7CitleHRlcm4gdm9pZCAoKigqX19rbXBfZGlyZWN0X3NldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2RpcmVjdF91bnNldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2RpcmVjdF90ZXN0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMik7CisKKy8vIEZ1bmN0aW9uIHRhYmxlcyBmb3IgaW5kaXJlY3QgbG9ja3MuIFNldC91bnNldC90ZXN0IGRpZmZlcmVudGlhdGUgZnVuY3Rpb25zIHdpdGgvd2l0aHVvdCBjb25zaXN0ZW5jeSBjaGVja2luZy4KK2V4dGVybiB2b2lkICgqX19rbXBfaW5kaXJlY3RfaW5pdFtdKShrbXBfdXNlcl9sb2NrX3ApOworZXh0ZXJuIHZvaWQgKCpfX2ttcF9pbmRpcmVjdF9kZXN0cm95W10pKGttcF91c2VyX2xvY2tfcCk7CitleHRlcm4gdm9pZCAoKigqX19rbXBfaW5kaXJlY3Rfc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2luZGlyZWN0X3Vuc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2luZGlyZWN0X3Rlc3QpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMik7CisKKy8vIEV4dHJhY3RzIGRpcmVjdCBsb2NrIHRhZyBmcm9tIGEgdXNlciBsb2NrIHBvaW50ZXIKKyNkZWZpbmUgS01QX0VYVFJBQ1RfRF9UQUcobCkgICAoKigoa21wX2R5bmFfbG9ja190ICopKGwpKSAmICgoMTw8S01QX0xPQ0tfU0hJRlQpLTEpICYgLSgqKChrbXBfZHluYV9sb2NrX3QgKikobCkpICYgMSkpCisKKy8vIEV4dHJhY3RzIGluZGlyZWN0IGxvY2sgaW5kZXggZnJvbSBhIHVzZXIgbG9jayBwb2ludGVyCisjZGVmaW5lIEtNUF9FWFRSQUNUX0lfSU5ERVgobCkgKCooa21wX2xvY2tfaW5kZXhfdCAqKShsKSA+PiAxKQorCisvLyBSZXR1cm5zIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGRpcmVjdCBsb2NrIGZ1bmN0aW9uIHdpdGggbCAoa21wX2R5bmFfbG9ja190ICopIGFuZCBvcCAob3BlcmF0aW9uIHR5cGUpLgorI2RlZmluZSBLTVBfRF9MT0NLX0ZVTkMobCwgb3ApIF9fa21wX2RpcmVjdF8jI29wW0tNUF9FWFRSQUNUX0RfVEFHKGwpXQorCisvLyBSZXR1cm5zIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IGxvY2sgZnVuY3Rpb24gd2l0aCBsIChrbXBfaW5kaXJlY3RfbG9ja190ICopIGFuZCBvcCAob3BlcmF0aW9uIHR5cGUpLgorI2RlZmluZSBLTVBfSV9MT0NLX0ZVTkMobCwgb3ApIF9fa21wX2luZGlyZWN0XyMjb3BbKChrbXBfaW5kaXJlY3RfbG9ja190ICopKGwpKS0+dHlwZV0KKworLy8gSW5pdGlhbGl6ZXMgYSBkaXJlY3QgbG9jayB3aXRoIHRoZSBnaXZlbiBsb2NrIHBvaW50ZXIgYW5kIGxvY2sgc2VxdWVuY2UuCisjZGVmaW5lIEtNUF9JTklUX0RfTE9DSyhsLCBzZXEpIF9fa21wX2RpcmVjdF9pbml0W0tNUF9HRVRfRF9UQUcoc2VxKV0oKGttcF9keW5hX2xvY2tfdCAqKWwsIHNlcSkKKworLy8gSW5pdGlhbGl6ZXMgYW4gaW5kaXJlY3QgbG9jayB3aXRoIHRoZSBnaXZlbiBsb2NrIHBvaW50ZXIgYW5kIGxvY2sgc2VxdWVuY2UuCisjZGVmaW5lIEtNUF9JTklUX0lfTE9DSyhsLCBzZXEpIF9fa21wX2RpcmVjdF9pbml0WzBdKChrbXBfZHluYV9sb2NrX3QgKikobCksIHNlcSkKKworLy8gUmV0dXJucyAiZnJlZSIgbG9jayB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxvY2sgdHlwZS4KKyNkZWZpbmUgS01QX0xPQ0tfRlJFRSh0eXBlKSAgICAgIChsb2NrdGFnXyMjdHlwZSkKKworLy8gUmV0dXJucyAiYnVzeSIgbG9jayB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxvY2sgdGV5cC4KKyNkZWZpbmUgS01QX0xPQ0tfQlVTWSh2LCB0eXBlKSAgICgodik8PEtNUF9MT0NLX1NISUZUIHwgbG9ja3RhZ18jI3R5cGUpCisKKy8vIFJldHVybnMgbG9jayB2YWx1ZSBhZnRlciByZW1vdmluZyAoc2hpZnRpbmcpIGxvY2sgdGFnLgorI2RlZmluZSBLTVBfTE9DS19TVFJJUCh2KSAgICAgICAgKCh2KT4+S01QX0xPQ0tfU0hJRlQpCisKKy8vIEluaXRpYWxpemVzIGdsb2JhbCBzdGF0ZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgbWFuYWdpbmcgZHluYW1pYyB1c2VyIGxvY2tzLgorZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKTsKKworLy8gQWxsb2NhdGVzIGFuZCByZXR1cm5zIGFuIGluZGlyZWN0IGxvY2sgd2l0aCB0aGUgZ2l2ZW4gaW5kaXJlY3QgbG9jayB0YWcuCitleHRlcm4ga21wX2luZGlyZWN0X2xvY2tfdCAqIF9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2sodm9pZCAqKiwga21wX2ludDMyLCBrbXBfaW5kaXJlY3RfbG9ja3RhZ190KTsKKworLy8gQ2xlYW5zIHVwIGdsb2JhbCBzdGF0ZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgbWFuYWdpbmcgZHluYW1pYyB1c2VyIGxvY2tzLgorZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCk7CisKKy8vIERlZmF1bHQgdXNlciBsb2NrIHNlcXVlbmNlIHdoZW4gbm90IHVzaW5nIGhpbnRlZCBsb2Nrcy4gCitleHRlcm4ga21wX2R5bmFfbG9ja3NlcV90IF9fa21wX3VzZXJfbG9ja19zZXE7CisKKy8vIEp1bXAgdGFibGUgZm9yICJzZXQgbG9jayBsb2NhdGlvbiIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiB2b2lkICgqX19rbXBfaW5kaXJlY3Rfc2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqKTsKKyNkZWZpbmUgS01QX1NFVF9JX0xPQ0tfTE9DQVRJT04obGNrLCBsb2MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb25bKGxjayktPnR5cGVdICE9IE5VTEwpICAgICAgICAgICBcCisgICAgICAgIF9fa21wX2luZGlyZWN0X3NldF9sb2NhdGlvblsobGNrKS0+dHlwZV0oKGxjayktPmxvY2ssIGxvYyk7IFwKK30KKworLy8gSnVtcCB0YWJsZSBmb3IgInNldCBsb2NrIGZsYWdzIiwgYXZhaWxhYmxlIG9ubHkgZm9yIGluZGlyZWN0IGxvY2tzLgorZXh0ZXJuIHZvaWQgKCpfX2ttcF9pbmRpcmVjdF9zZXRfZmxhZ3NbS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KTsKKyNkZWZpbmUgS01QX1NFVF9JX0xPQ0tfRkxBR1MobGNrLCBmbGFnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzWyhsY2spLT50eXBlXSAhPSBOVUxMKSAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzWyhsY2spLT50eXBlXSgobGNrKS0+bG9jaywgZmxhZyk7IFwKK30KKworLy8gSnVtcCB0YWJsZSBmb3IgImdldCBsb2NrIGxvY2F0aW9uIiwgYXZhaWxhYmxlIG9ubHkgZm9yIGluZGlyZWN0IGxvY2tzLgorZXh0ZXJuIGNvbnN0IGlkZW50X3QgKiAoKl9fa21wX2luZGlyZWN0X2dldF9sb2NhdGlvbltLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3ApOworI2RlZmluZSBLTVBfR0VUX0lfTE9DS19MT0NBVElPTihsY2spICggX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uWyhsY2spLT50eXBlXSAhPSBOVUxMICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfX2ttcF9pbmRpcmVjdF9nZXRfbG9jYXRpb25bKGxjayktPnR5cGVdKChsY2spLT5sb2NrKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCApCisKKy8vIEp1bXAgdGFibGUgZm9yICJnZXQgbG9jayBmbGFncyIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiBrbXBfbG9ja19mbGFnc190ICgqX19rbXBfaW5kaXJlY3RfZ2V0X2ZsYWdzW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCk7CisjZGVmaW5lIEtNUF9HRVRfSV9MT0NLX0ZMQUdTKGxjaykgKCBfX2ttcF9pbmRpcmVjdF9nZXRfZmxhZ3NbKGxjayktPnR5cGVdICE9IE5VTEwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9fa21wX2luZGlyZWN0X2dldF9mbGFnc1sobGNrKS0+dHlwZV0oKGxjayktPmxvY2spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMICkKKworI2RlZmluZSBLTVBfSV9MT0NLX0NIVU5LIDEwMjQgICAgICAgLy8gbnVtYmVyIG9mIGttcF9pbmRpcmVjdF9sb2NrX3Qgb2JqZWN0cyB0byBiZSBhbGxvY2F0ZWQgdG9nZXRoZXIKKworLy8gTG9jayB0YWJsZSBmb3IgaW5kaXJlY3QgbG9ja3MuCit0eXBlZGVmIHN0cnVjdCBrbXBfaW5kaXJlY3RfbG9ja190YWJsZSB7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqKnRhYmxlOyAgICAvLyBibG9ja3Mgb2YgaW5kaXJlY3QgbG9ja3MgYWxsb2NhdGVkCisgICAga21wX2xvY2tfaW5kZXhfdCBzaXplOyAgICAgICAgICAvLyBzaXplIG9mIHRoZSBpbmRpcmVjdCBsb2NrIHRhYmxlCisgICAga21wX2xvY2tfaW5kZXhfdCBuZXh0OyAgICAgICAgICAvLyBpbmRleCB0byB0aGUgbmV4dCBsb2NrIHRvIGJlIGFsbG9jYXRlZAorfSBrbXBfaW5kaXJlY3RfbG9ja190YWJsZV90OworCitleHRlcm4ga21wX2luZGlyZWN0X2xvY2tfdGFibGVfdCBfX2ttcF9pX2xvY2tfdGFibGU7CisKKy8vIFJldHVybnMgdGhlIGluZGlyZWN0IGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbmRleC4KKyNkZWZpbmUgS01QX0dFVF9JX0xPQ0soaW5kZXgpICgqKF9fa21wX2lfbG9ja190YWJsZS50YWJsZSArIChpbmRleCkvS01QX0lfTE9DS19DSFVOSykgKyAoaW5kZXgpJUtNUF9JX0xPQ0tfQ0hVTkspCisKKy8vIE51bWJlciBvZiBsb2NrcyBpbiBhIGxvY2sgYmxvY2ssIHdoaWNoIGlzIGZpeGVkIHRvICIxIiBub3cuCisvLyBUT0RPOiBObyBsb2NrIGJsb2NrIGltcGxlbWVudGF0aW9uIG5vdy4gSWYgd2UgZG8gc3VwcG9ydCwgd2UgbmVlZCB0byBtYW5hZ2UgbG9jayBibG9jayBkYXRhCisvLyBzdHJ1Y3R1cmUgZm9yIGVhY2ggaW5kaXJlY3QgbG9jayB0eXBlLgorZXh0ZXJuIGludCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2s7CisKKy8vIEZhc3QgbG9jayB0YWJsZSBsb29rdXAgd2l0aG91dCBjb25zaXN0ZW5jeSBjaGVja2luZworI2RlZmluZSBLTVBfTE9PS1VQX0lfTE9DSyhsKSAoIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gS01QX0dFVF9JX0xPQ0soS01QX0VYVFJBQ1RfSV9JTkRFWChsKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKikobCkpICkKKworLy8gVXNlZCBvbmNlIGluIGttcF9lcnJvci5jCitleHRlcm4ga21wX2ludDMyCitfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKGttcF91c2VyX2xvY2tfcCwga21wX3VpbnQzMik7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgZGVmaW5lIEtNUF9MT0NLX0JVU1kodiwgdHlwZSkgICAgKHYpCisjIGRlZmluZSBLTVBfTE9DS19GUkVFKHR5cGUpICAgICAgIDAKKyMgZGVmaW5lIEtNUF9MT0NLX1NUUklQKHYpICAgICAgICAgKHYpCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfTE9DS19IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vbXAuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzRkZTBmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX29tcC5oCkBAIC0wLDAgKzEsMjMzIEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX29tcC5oIC0tIE9wZW5NUCBkZWZpbml0aW9uIGZvciBrbXBfb21wX3N0cnVjdF9pbmZvX3QuCisgKiAgICAgICAgICAgICAgVGhpcyBpcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgcnVudGltZSBsaWJyYXJ5IHN0cnVjdHVyZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qIFRISVMgRklMRSBTSE9VTEQgTk9UIEJFIE1PRElGSUVEIElOIElEQiBJTlRFUkZBQ0UgTElCUkFSWSBDT0RFCisgKiBJdCBzaG91bGQgaW5zdGVhZCBiZSBtb2RpZmllZCBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUgYW5kIGNvcGllZAorICogdG8gdGhlIGludGVyZmFjZSBsaWJyYXJ5IGNvZGUuICBUaGlzIHdheSB3ZSBjYW4gbWluaW1pemUgdGhlCisgKiBwcm9ibGVtcyB0aGF0IHRoaXMgaXMgc3VyZSB0byBjYXVzZSBoYXZpbmcgdHdvIGNvcGllcyBvZiB0aGUKKyAqIHNhbWUgZmlsZS4KKyAqCisgKiBmaWxlcyBsaXZlIGluIGxpYm9tcCBhbmQgbGlib21wX2RiL3NyYy9pbmNsdWRlCisgKi8KKworLyogQ0hBTkdFIFRISVMgV0hFTiBTVFJVQ1RVUkVTIEJFTE9XIENIQU5HRQorICogQmVmb3JlIHdlIHJlbGVhc2UgdGhpcyB0byBhIGN1c3RvbWVyLCBwbGVhc2UgZG9uJ3QgY2hhbmdlIHRoaXMgdmFsdWUuICBBZnRlciBpdCBpcyByZWxlYXNlZCBhbmQKKyAqIHN0YWJsZSwgdGhlbiBhbnkgbmV3IHVwZGF0ZXMgdG8gdGhlIHN0cnVjdHVyZXMgb3IgZGF0YSBzdHJ1Y3R1cmUgdHJhdmVyc2FsIGFsZ29yaXRobXMgbmVlZCB0bworICogY2hhbmdlIHRoaXMgdmFsdWUuCisgKi8KKyNkZWZpbmUgS01QX09NUF9WRVJTSU9OIDkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF9pbnQzMiAgb2Zmc2V0OworICAgIGttcF9pbnQzMiAgc2l6ZTsKK30gb2Zmc2V0X2FuZF9zaXplX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfdWludDY0ICAgIGFkZHI7CisgICAga21wX2ludDMyICAgICBzaXplOworICAgIGttcF9pbnQzMiAgICAgcGFkZGluZzsKK30gYWRkcl9hbmRfc2l6ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX3VpbnQ2NCAgIGZsYWdzOyAgICAgICAgIC8vIEZsYWdzIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4KKyAgICBrbXBfdWludDY0ICAgZmlsZTsgICAgICAgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBwYXJhbGxlbCByZWdpb24gaXMuCisgICAga21wX3VpbnQ2NCAgIGZ1bmM7ICAgICAgICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiByb3V0aW5lIHdoZXJlIHRoZSBwYXJhbGxlbCByZWdpb24gaXMuCisgICAga21wX2ludDMyICAgIGJlZ2luOyAgICAgICAgIC8vIEJlZ2lubmluZyBvZiBzb3VyY2UgbGluZSByYW5nZS4KKyAgICBrbXBfaW50MzIgICAgZW5kOyAgICAgICAgICAgLy8gRW5kIG9mIHNvdXJjZSBsaW5lIHJhbmdlLgorICAgIGttcF9pbnQzMiAgICBudW1fdGhyZWFkczsgICAvLyBTcGVjaWZpZWQgbnVtYmVyIG9mIHRocmVhZHMuCit9IGttcF9vbXBfbnRocl9pdGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfaW50MzIgICAgIG51bTsgICAgICAgICAgLy8gTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhcnJyYXkuCisgICAga21wX3VpbnQ2NCAgICBhcnJheTsgICAgICAgIC8vIEFkZHJlc3Mgb2YgYXJyYXkgb2Yga21wX29tcF9udW1fdGhyZWFkc19pdGVtX3QuCit9IGttcF9vbXBfbnRocl9pbmZvX3Q7CisKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMga25vd24gdG8gdGhlIGlkYiBpbnRlcmZhY2UgbGlicmFyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgLyogQ2hhbmdlIHRoaXMgb25seSBpZiB5b3UgbWFrZSBhIGZ1bmRhbWVudGFsIGRhdGEgc3RydWN0dXJlIGNoYW5nZSBoZXJlICovCisgICAga21wX2ludDMyICAgICAgICAgIGxpYl92ZXJzaW9uOworCisgICAgLyogc2FuaXR5IGNoZWNrLiAgT25seSBzaG91bGQgYmUgY2hlY2tlZCBpZiB2ZXJzaW9ucyBhcmUgaWRlbnRpY2FsCisgICAgICogVGhpcyBpcyBhbHNvIHVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gZ2V0IHRoZSBydW50aW1lCisgICAgICogc3RydWN0dXJlIHNpemUgaWYgaXQgdGhlIHJ1bnRpbWUgaXMgb2xkZXIgdGhhbiB0aGUgaW50ZXJmYWNlICovCisgICAga21wX2ludDMyICAgICAgICAgIHNpemVvZl90aGlzX3N0cnVjdHVyZTsKKworICAgIC8qIE9wZW5NUCBSVEwgdmVyc2lvbiBpbmZvLiAqLworICAgIGFkZHJfYW5kX3NpemVfdCAgICBtYWpvcjsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgbWlub3I7CisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIGJ1aWxkOworICAgIGFkZHJfYW5kX3NpemVfdCAgICBvcGVubXBfdmVyc2lvbjsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgYmFubmVyOworCisgICAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICAgIGFkZHJfYW5kX3NpemVfdCAgdGhyZWFkczsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX3RocmVhZHMuCisgICAgYWRkcl9hbmRfc2l6ZV90ICByb290czsgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfcm9vdC4KKyAgICBhZGRyX2FuZF9zaXplX3QgIGNhcGFjaXR5OyAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LgorICAgIGFkZHJfYW5kX3NpemVfdCAgbW9uaXRvcjsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX21vbml0b3IuCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGFkZHJfYW5kX3NpemVfdCAgbG9ja190YWJsZTsgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX2xvY2tfdGFibGUuCisjZW5kaWYKKyAgICBhZGRyX2FuZF9zaXplX3QgIGZ1bmNfbWljcm90YXNrOworICAgIGFkZHJfYW5kX3NpemVfdCAgZnVuY19mb3JrOworICAgIGFkZHJfYW5kX3NpemVfdCAgZnVuY19mb3JrX3RlYW1zOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGVhbV9jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGFza19jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgbnRocl9pbmZvOworICAgIGttcF9pbnQzMiAgICAgICAgYWRkcmVzc193aWR0aDsKKyAgICBrbXBfaW50MzIgICAgICAgIGluZGV4ZWRfbG9ja3M7CisgICAga21wX2ludDMyICAgICAgICBsYXN0X2JhcnJpZXI7ICAgICAgIC8vIFRoZSBlbmQgaW4gZW51bSBiYXJyaWVyX3R5cGUKKyAgICBrbXBfaW50MzIgICAgICAgIGRlcXVlX3NpemU7ICAgICAgICAgLy8gVEFTS19ERVFVRV9TSVpFCisKKyAgICAvKiB0aHJlYWQgc3RydWN0dXJlIGluZm9ybWF0aW9uLiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0aF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9pbmZvOyAgICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfdGVhbTsgICAgICAgICAgLy8gdGVhbSBmb3IgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfcm9vdDsgICAgICAgICAgLy8gcm9vdCBmb3IgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfc2VyaWFsX3RlYW07ICAgLy8gc2VyaWFsIHRlYW0gdW5kZXIgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfaWRlbnQ7ICAgICAgICAgLy8gbG9jYXRpb24gZm9yIHRoaXMgdGhyZWFkIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3NwaW5faGVyZTsgICAgIC8vIGlzIHRocmVhZCB3YWl0aW5nIGZvciBsb2NrIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX25leHRfd2FpdGluZzsgIC8vIG5leHQgdGhyZWFkIHdhaXRpbmcgZm9yIGxvY2sgKGlmIGF2YWlsYWJsZSkKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfdGFza190ZWFtOyAgICAgLy8gdGFzayB0ZWFtIHN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9jdXJyZW50X3Rhc2s7ICAvLyBpbm5lcm1vc3QgdGFzayBiZWluZyBleGVjdXRlZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF90YXNrX3N0YXRlOyAgICAvLyBhbHRlcm5hdGluZyAwLzEgZm9yIHRhc2sgdGVhbSBpZGVudGlmaWNhdGlvbgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9iYXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2Jfd29ya2VyX2Fycml2ZWQ7IC8vIHRoZSB3b3JrZXIgaW5jcmVhc2VzIGl0IGJ5IDEgd2hlbiBpdCBhcnJpdmVzIHRvIHRoZSBiYXJyaWVyCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8qIHRlYW1zIGluZm9ybWF0aW9uICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfdGVhbXNfbWljcm90YXNrOy8vIGVudHJ5IGFkZHJlc3MgZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3RlYW1zX2xldmVsOyAgICAvLyBpbml0aWFsIGxldmVsIG9mIHRlYW1zIGNvbnN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3RlYW1zX250ZWFtczsgICAvLyBudW1iZXIgb2YgdGVhbXMgaW4gYSBsZWFndWUKKyAgICBvZmZzZXRfYW5kX3NpemVfdCB0aF90ZWFtc19udGg7ICAgICAgLy8gbnVtYmVyIG9mIHRocmVhZHMgaW4gZWFjaCB0ZWFtIG9mIHRoZSBsZWFndWUKKyNlbmRpZgorCisgICAgLyoga21wX2Rlc2Mgc3RydWN0dXJlIChmb3IgaW5mbyBmaWVsZCBhYm92ZSkgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgZHNfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfdGlkOyAgICAgICAgICAgLy8gdGVhbSB0aHJlYWQgaWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfZ3RpZDsgICAgICAgICAgLy8gZ2xvYmFsIHRocmVhZCBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkc190aHJlYWQ7ICAgICAgICAvLyBuYXRpdmUgdGhyZWFkIGlkCisKKyAgICAvKiB0ZWFtIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0X3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfbWFzdGVyX3RpZDsgICAgIC8vIHRpZCBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9pZGVudDsgICAgICAgICAgLy8gbG9jYXRpb24gb2YgcGFyYWxsZWwgcmVnaW9uCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfcGFyZW50OyAgICAgICAgIC8vIHBhcmVudCB0ZWFtCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfbnByb2M7ICAgICAgICAgIC8vICMgdGVhbSB0aHJlYWRzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfdGhyZWFkczsgICAgICAgIC8vIGFycmF5IG9mIHRocmVhZHMKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9zZXJpYWxpemVkOyAgICAgLy8gIyBsZXZlbHMgb2Ygc2VyaWFsaXplZCB0ZWFtcworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2lkOyAgICAgICAgICAgICAvLyB1bmlxdWUgdGVhbSBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3BrZm47CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfdGFza190ZWFtOyAgICAgIC8vIHRhc2sgdGVhbSBzdHJ1Y3R1cmUKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9pbXBsaWNpdF90YXNrOyAgLy8gdGFza2RhdGEgZm9yIHRoZSB0aHJlYWQncyBpbXBsaWNpdCB0YXNrCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9jYW5jZWxfcmVxdWVzdDsKKyNlbmRpZgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2JhcjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iX21hc3Rlcl9hcnJpdmVkOyAvLyBpbmNyZWFzZWQgYnkgMSB3aGVuIG1hc3RlciBhcnJpdmVzIHRvIGEgYmFycmllcgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2JfdGVhbV9hcnJpdmVkOyAgIC8vIGluY3JlYXNlZCBieSBvbmUgd2hlbiBhbGwgdGhlIHRocmVhZHMgYXJyaXZlZAorCisgICAgLyogcm9vdCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgcl9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3Jvb3RfdGVhbTsgICAgICAvLyB0ZWFtIGF0IHJvb3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9ob3RfdGVhbTsgICAgICAgLy8gaG90IHRlYW0gZm9yIHRoaXMgcm9vdAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3ViZXJfdGhyZWFkOyAgICAvLyByb290IHRocmVhZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3Jvb3RfaWQ7ICAgICAgICAvLyB1bmlxdWUgcm9vdCBpZCAoaWYgYXZhaWxhYmxlKQorCisgICAgLyogaWRlbnQgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIGlkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGlkX3Bzb3VyY2U7ICAgICAgIC8qIGFkZHJlc3Mgb2Ygc3RyaW5nICI7ZmlsZTtmdW5jO2xpbmUxO2xpbmUyOzsiLiAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBpZF9mbGFnczsKKworICAgIC8qIGxvY2sgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIGxrX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2luaXRpYWxpemVkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19sb2NhdGlvbjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfdGFpbF9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfaGVhZF9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbmV4dF90aWNrZXQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX25vd19zZXJ2aW5nOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19vd25lcl9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfZGVwdGhfbG9ja2VkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19sb2NrX2ZsYWdzOworCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIC8qIGxvY2tfdGFibGVfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsdF9zaXplX29mX3N0cnVjdDsgICAgLyogU2l6ZSBhbmQgbGF5b3V0IG9mIGttcF9sb2NrX3RhYmxlX3QuICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X3VzZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X2FsbG9jYXRlZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbHRfdGFibGU7CisjZW5kaWYKKworICAgIC8qIHRhc2tfdGVhbV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIHR0X3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X3RocmVhZHNfZGF0YTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfZm91bmRfdGFza3M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X25wcm9jOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF91bmZpbmlzaGVkX3RocmVhZHM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X2FjdGl2ZTsKKworICAgIC8qIGttcF90YXNrZGF0YV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIHRkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2tfaWQ7ICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9mbGFnczsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgZmxhZ3MKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGVhbTsgICAgICAgICAgICAgICAgICAgICAvLyB0ZWFtIGZvciB0aGlzIHRhc2sKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfcGFyZW50OyAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgdGFzaworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9sZXZlbDsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgdGVzdGluZyBsZXZlbAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9pZGVudDsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgaWRlbnRpZmllcgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3M7ICAgIC8vIGNoaWxkIHRhc2tzICgrIGN1cnJlbnQgdGFzaykgbm90IHlldCBkZWFsbG9jYXRlZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzOyAgIC8vIGNoaWxkIHRhc2tzIG5vdCB5ZXQgY29tcGxldGUKKworICAgIC8qIFRhc2t3YWl0ICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2t3YWl0X2lkZW50OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF9jb3VudGVyOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF90aHJlYWQ7ICAgICAgICAgIC8vIGd0aWQgKyAxIG9mIHRocmVhZCBlbmNvdW50ZXJlZCB0YXNrd2FpdAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBUYXNrZ3JvdXAgKi8KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza2dyb3VwOyAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRhc2tncm91cAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrX2NvdW50OyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBhbGxvY2F0ZWQgYW5kIG5vdCB5ZXQgY29tcGxldGUgdGFza3MKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfY2FuY2VsOyAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGZvciBjYW5jZWxsYXRpb24gb2YgdGhpcyB0YXNrZ3JvdXAKKworICAgIC8qIFRhc2sgZGVwZW5kZW5jeSAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9kZXBub2RlOyAgICAgICAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gZ3JhcGggbm9kZSBpZiB0aGUgdGFzayBoYXMgZGVwZW5kZW5jaWVzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25vZGU7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25leHQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3N1Y2Nlc3NvcnM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3Rhc2s7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25wcmVkZWNlc3NvcnM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25yZWZzOworI2VuZGlmCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3JvdXRpbmU7CisKKyAgICAvKiBrbXBfdGhyZWFkX2RhdGFfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBoZF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfaGVhZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfdGFpbDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfbnRhc2tzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV9sYXN0X3N0b2xlbjsKKworICAgIC8vIFRoZSBsYXN0IGZpZWxkIG9mIHN0YWJsZSB2ZXJzaW9uLgorICAgIGttcF91aW50NjQgICAgICAgICBsYXN0X2ZpZWxkOworCit9IGttcF9vbXBfc3RydWN0X2luZm9fdDsKKworI2VuZGlmIC8qIFVTRV9ERUJVR0dFUiAqLworCisvKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX29zLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTdlYWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX29zLmgKQEAgLTAsMCArMSw3MTEgQEAKKy8qCisgKiBrbXBfb3MuaCAtLSBLUFRTIHJ1bnRpbWUgaGVhZGVyIGZpbGUuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX09TX0gKKyNkZWZpbmUgS01QX09TX0gKKworI2luY2x1ZGUgImttcF9jb25maWcuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBLTVBfRlROX1BMQUlOICAgMQorI2RlZmluZSBLTVBfRlROX0FQUEVORCAgMgorI2RlZmluZSBLTVBfRlROX1VQUEVSICAgMworLyoKKyNkZWZpbmUgS01QX0ZUTl9QUkVQRU5EIDQKKyNkZWZpbmUgS01QX0ZUTl9VQVBQRU5EIDUKKyovCisKKyNkZWZpbmUgS01QX1BUUl9TS0lQICAgIChzaXplb2Yodm9pZCopKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciB2YXJpYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9PRkYJCQkJMAorI2RlZmluZSBLTVBfT04JCQkJMQorCisjZGVmaW5lIEtNUF9NRU1fQ09OU19WT0xBVElMRQkJMAorI2RlZmluZSBLTVBfTUVNX0NPTlNfRkVOQ0UJCTEKKworI2lmbmRlZiBLTVBfTUVNX0NPTlNfTU9ERUwKKyMgZGVmaW5lIEtNUF9NRU1fQ09OU19NT0RFTAkgS01QX01FTV9DT05TX1ZPTEFUSUxFCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMAorI2RlZmluZSBLTVBfQ09NUElMRVJfR0NDIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX0NMQU5HIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX01TVkMgMAorCisjaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisjIHVuZGVmIEtNUF9DT01QSUxFUl9JQ0MKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMQorI2VsaWYgZGVmaW5lZCggX19jbGFuZ19fICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX0NMQU5HCisjIGRlZmluZSBLTVBfQ09NUElMRVJfQ0xBTkcgMQorI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQorIyB1bmRlZiBLTVBfQ09NUElMRVJfR0NDCisjIGRlZmluZSBLTVBfQ09NUElMRVJfR0NDIDEKKyNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX01TVkMKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9NU1ZDIDEKKyNlbHNlCisjIGVycm9yIFVua25vd24gY29tcGlsZXIKKyNlbmRpZgorCisjaWYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykgJiYgIUtNUF9PU19DTksgJiYgIUtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEIDEKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0dST1VQX0FGRklOSVRZICAgIDEKKyMgZWxzZQorIyAgZGVmaW5lIEtNUF9HUk9VUF9BRkZJTklUWSAgICAwCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAwCisjIGRlZmluZSBLTVBfR1JPVVBfQUZGSU5JVFkgICAgIDAKKyNlbmRpZgorCisvKiBDaGVjayBmb3IgcXVhZC1wcmVjaXNpb24gZXh0ZW5zaW9uLiAqLworI2RlZmluZSBLTVBfSEFWRV9RVUFEIDAKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjIGlmIEtNUF9DT01QSUxFUl9JQ0MKKyAgIC8qIF9RdWFkIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgaWNjICovCisjICB1bmRlZiAgS01QX0hBVkVfUVVBRAorIyAgZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorIyBlbGlmIEtNUF9DT01QSUxFUl9DTEFORworICAgLyogQ2xhbmcgZG9lc24ndCBzdXBwb3J0IGEgc29mdHdhcmUtaW1wbGVtZW50ZWQKKyAgICAgIDEyOC1iaXQgZXh0ZW5kZWQgcHJlY2lzaW9uIHR5cGUgeWV0ICovCisgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9RdWFkOworIyBlbGlmIEtNUF9DT01QSUxFUl9HQ0MKKyAgIHR5cGVkZWYgX19mbG9hdDEyOCBfUXVhZDsKKyMgIHVuZGVmICBLTVBfSEFWRV9RVUFECisjICBkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjIGVsaWYgS01QX0NPTVBJTEVSX01TVkMKKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjIGVuZGlmCisjZWxzZQorIyBpZiBfX0xEQkxfTUFYX0VYUF9fID49IDE2Mzg0ICYmIEtNUF9DT01QSUxFUl9HQ0MKKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjICB1bmRlZiAgS01QX0hBVkVfUVVBRAorIyAgZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorIyBlbmRpZgorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAga21wX2ludDg7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAga21wX3VpbnQ4OworICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgIGttcF9pbnQxNjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICBrbXBfdWludDE2OworICB0eXBlZGVmIGludCAgICAgICAgICAgICAgIGttcF9pbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICBrbXBfdWludDMyOworIyBkZWZpbmUgS01QX0lOVDMyX1NQRUMgICAgICJkIgorIyBkZWZpbmUgS01QX1VJTlQzMl9TUEVDICAgICJ1IgorIyBpZm5kZWYgS01QX1NUUlVDVDY0CisgICB0eXBlZGVmIF9faW50NjQgCQlrbXBfaW50NjQ7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgCWttcF91aW50NjQ7CisgICAjZGVmaW5lIEtNUF9JTlQ2NF9TUEVDIAkiSTY0ZCIKKyAgICNkZWZpbmUgS01QX1VJTlQ2NF9TUEVDCSJJNjR1IgorIyBlbHNlCisgICBzdHJ1Y3Qga21wX3N0cnVjdDY0IHsKKyAgICBrbXBfaW50MzIgICBhLGI7CisgICB9OworICAgdHlwZWRlZiBzdHJ1Y3Qga21wX3N0cnVjdDY0IGttcF9pbnQ2NDsKKyAgIHR5cGVkZWYgc3RydWN0IGttcF9zdHJ1Y3Q2NCBrbXBfdWludDY0OworICAgLyogTm90IHN1cmUgd2hhdCB0byB1c2UgZm9yIEtNUF9bVV1JTlQ2NF9TUEVDIGhlcmUgKi8KKyMgZW5kaWYKKyMgaWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0lOVFBUUiAxCisgICB0eXBlZGVmIF9faW50NjQgICAgICAgICAJa21wX2ludHB0cl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0CWttcF91aW50cHRyX3Q7CisjICBkZWZpbmUgS01QX0lOVFBUUl9TUEVDICAJIkk2NGQiCisjICBkZWZpbmUgS01QX1VJTlRQVFJfU1BFQyAJIkk2NHUiCisjIGVuZGlmCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9PU19VTklYCisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgIGttcF9pbnQ4OworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICBrbXBfdWludDg7CisgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgIGttcF9pbnQxNjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAga21wX3VpbnQxNjsKKyAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAga21wX2ludDMyOworICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBrbXBfdWludDMyOworICB0eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICBrbXBfaW50NjQ7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGttcF91aW50NjQ7CisjIGRlZmluZSBLTVBfSU5UMzJfU1BFQyAgICAgICJkIgorIyBkZWZpbmUgS01QX1VJTlQzMl9TUEVDICAgICAidSIKKyMgZGVmaW5lIEtNUF9JTlQ2NF9TUEVDCSAgICAgImxsZCIKKyMgZGVmaW5lIEtNUF9VSU5UNjRfU1BFQyAgICAgImxsdSIKKyNlbmRpZiAvKiBLTVBfT1NfVU5JWCAqLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorIyBkZWZpbmUgS01QX1NJWkVfVF9TUEVDIEtNUF9VSU5UMzJfU1BFQworI2VsaWYgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQKKyMgZGVmaW5lIEtNUF9TSVpFX1RfU1BFQyBLTVBfVUlOVDY0X1NQRUMKKyNlbHNlCisjIGVycm9yICJDYW4ndCBkZXRlcm1pbmUgc2l6ZV90IHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyLiIKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2CisjIGRlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRikKKyNlbHNlCisjIGRlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRkZGRkZGRkZGKQorI2VuZGlmCisKK3R5cGVkZWYgc2l6ZV90ICBrbXBfc2l6ZV90OwordHlwZWRlZiBmbG9hdCAgIGttcF9yZWFsMzI7Cit0eXBlZGVmIGRvdWJsZSAga21wX3JlYWw2NDsKKworI2lmbmRlZiBLTVBfSU5UUFRSCisjIGRlZmluZSBLTVBfSU5UUFRSIDEKKyAgdHlwZWRlZiBsb25nICAgICAgICAgICAgIGttcF9pbnRwdHJfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgIGttcF91aW50cHRyX3Q7CisjIGRlZmluZSBLTVBfSU5UUFRSX1NQRUMgICAibGQiCisjIGRlZmluZSBLTVBfVUlOVFBUUl9TUEVDICAibHUiCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0k4CisgIHR5cGVkZWYga21wX2ludDY0ICAgICAga21wX2ludDsKKyAgdHlwZWRlZiBrbXBfdWludDY0ICAgICBrbXBfdWludDsKKyNlbHNlCisgIHR5cGVkZWYga21wX2ludDMyICAgICAga21wX2ludDsKKyAgdHlwZWRlZiBrbXBfdWludDMyICAgICBrbXBfdWludDsKKyNlbmRpZiAvKiBCVUlMRF9JOCAqLworI2RlZmluZSAgS01QX0lOVF9NQVggICAgICgoa21wX2ludDMyKTB4N0ZGRkZGRkYpCisjZGVmaW5lICBLTVBfSU5UX01JTiAgICAgKChrbXBfaW50MzIpMHg4MDAwMDAwMCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gdGVtcGxhdGUgZm9yIGRlYnVnIHByaW50cyBzcGVjaWZpY2F0aW9uICggZCwgdSwgbGxkLCBsbHUgKSwgYW5kIHRvIG9idGFpbgorICAgIC8vIHNpZ25lZC91bnNpZ25lZCBmbGF2b3JzIG9mIGEgdHlwZQorICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgdHJhaXRzX3QgeworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgVCAgICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiBzcGVjOworICAgIH07CisgICAgLy8gaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgc2lnbmVkIGludCA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgaW50ICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBkb3VibGUgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICBzcGVjOworICAgIH07CisgICAgLy8gdW5zaWduZWQgaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgdW5zaWduZWQgaW50ID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGRvdWJsZSAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgIHNwZWM7CisgICAgfTsKKyAgICAvLyBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCBzaWduZWQgbG9uZyBsb25nID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgICAgICAgIHNwZWM7CisgICAgfTsKKyAgICAvLyB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgICAgICAgICBmbG9hdGluZ190OworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCAqICAgICAgICAgc3BlYzsKKyAgICB9OworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgS01QX0VYUE9SVAlleHRlcm4JLyogZXhwb3J0IGRlY2xhcmF0aW9uIGluIGd1aWRlIGxpYnJhcmllcyAqLworCisjaWYgX19HTlVDX18gPj0gNAorICAgICNkZWZpbmUgX19mb3JjZWlubGluZSBfX2lubGluZQorI2VuZGlmCisKKyNkZWZpbmUgUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAoMHg0MDAwKQorI2RlZmluZSBQQUdFX0FMSUdORUQoX2FkZHIpICAgICAoICEgKChzaXplX3QpIF9hZGRyICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKyNkZWZpbmUgQUxJR05fVE9fUEFHRSh4KSAgICh2b2lkICopKCgoc2l6ZV90KSh4KSkgJiB+KChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0IGZvciBjYWNoZSBhbGlnbm1lbnQsIHBhZGRpbmcsIGV0Yy4gLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgSU5URVJOT0RFX0NBQ0hFX0xJTkUgNDA5NiAvKiBmb3IgbXVsdGktbm9kZSBzeXN0ZW1zICovCisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBjYWNoZSBsaW5lICovCisjaWZuZGVmIENBQ0hFX0xJTkUKKyAgICAjZGVmaW5lIENBQ0hFX0xJTkUgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAvKiBjYWNoZSBsaW5lIHNpemUgaW4gYnl0ZXMgKi8KKyNlbHNlCisgICAgI2lmICggQ0FDSEVfTElORSA8IDY0ICkgJiYgISBkZWZpbmVkKCBLTVBfT1NfREFSV0lOICkKKyAgICAgICAgLy8gMjAwNi0wMi0xMzogVGhpcyBwcm9kdWNlcyB0b28gbWFueSB3YXJuaW5ncyBvbiBPUyBYKi4gRGlzYWJsZSBpdCBmb3IgYSB3aGlsZS4uLgorICAgICAgICAjd2FybmluZyBDQUNIRV9MSU5FIGlzIHRvbyBzbWFsbC4KKyAgICAjZW5kaWYKKyNlbmRpZiAvKiBDQUNIRV9MSU5FICovCisKKyNkZWZpbmUgS01QX0NBQ0hFX1BSRUZFVENIKEFERFIpIAkvKiBub3RoaW5nICovCisKKy8qIFRlbXBvcmFyeSBub3RlOiBpZiBwZXJmb3JtYW5jZSB0ZXN0aW5nIG9mIHRoaXMgcGFzc2VzLCB3ZSBjYW4gcmVtb3ZlCisgICBhbGwgcmVmZXJlbmNlcyB0byBLTVBfRE9fQUxJR04gYW5kIHJlcGxhY2Ugd2l0aCBLTVBfQUxJR04uICAqLworI2lmIEtNUF9PU19VTklYICYmIGRlZmluZWQoX19HTlVDX18pCisjIGRlZmluZSBLTVBfRE9fQUxJR04oYnl0ZXMpICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKGJ5dGVzKSkpCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKENBQ0hFX0xJTkUpKSkKKyMgZGVmaW5lIEtNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChJTlRFUk5PREVfQ0FDSEVfTElORSkpKQorIyBkZWZpbmUgS01QX0FMSUdOKGJ5dGVzKSAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChieXRlcykpKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ET19BTElHTihieXRlcykgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2RlY2xzcGVjKCBhbGlnbihDQUNIRV9MSU5FKSApCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFICAgICAgX19kZWNsc3BlYyggYWxpZ24oSU5URVJOT0RFX0NBQ0hFX0xJTkUpICkKKyMgZGVmaW5lIEtNUF9BTElHTihieXRlcykgICAgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjZW5kaWYKKworLyogR2VuZXJhbCBwdXJwb3NlIGZlbmNlIHR5cGVzIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAqLworZW51bSBrbXBfbWVtX2ZlbmNlX3R5cGUgeworICAgIGttcF9ub19mZW5jZSwgICAgICAgICAvKiBObyBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfYWNxdWlyZV9mZW5jZSwgICAgLyogQWNxdWlyZSAocmVhZCkgbWVtb3J5IGZlbmNlICovCisgICAga21wX3JlbGVhc2VfZmVuY2UsICAgIC8qIFJlbGVhc2UgKHdyaXRlKSBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfZnVsbF9mZW5jZSAgICAgICAgLyogRnVsbCAocmVhZCt3cml0ZSkgbWVtb3J5IGZlbmNlICovCit9OworCisKKy8vCisvLyBTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcworLy8KKworI2lmIEtNUF9BU01fSU5UUklOUyAmJiBLTVBfT1NfV0lORE9XUworCisjaW5jbHVkZSA8V2luZG93cy5oPgorCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UpCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZTY0KQorCisvLworLy8gVXNpbmcgSW50ZXJsb2NrZWRJbmNyZW1lbnQgLyBJbnRlcmxvY2tlZERlY3JlbWVudCBjYXVzZXMgYSBsaWJyYXJ5IGxvYWRpbmcKKy8vIG9yZGVyaW5nIHByb2JsZW0sIHNvIHdlIHVzZSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkIGluc3RlYWQuCisvLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgKHYpICkKKworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hZGQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9vcjgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2ICk7CitleHRlcm4ga21wX2ludDggX19rbXBfdGVzdF90aGVuX2FuZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2ICk7CisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSggKHZvbGF0aWxlIGxvbmcgKikocCksKGxvbmcpKHN2KSwobG9uZykoY3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZSggKHZvbGF0aWxlIGxvbmcgKikocCksIChsb25nKSh2KSApCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlNjQoICh2b2xhdGlsZSBrbXBfaW50NjQgKikocCksIChrbXBfaW50NjQpKHYpICkKKworaW5saW5lIGttcF9yZWFsMzIgS01QX1hDSEdfUkVBTDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpCit7CisgICAga21wX2ludDMyIHRtcCA9IEludGVybG9ja2VkRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopcCwgKihsb25nICopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsMzIqKSZ0bXA7Cit9CisKKy8vCisvLyBSb3V0aW5lcyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gaW1wbGVtZW50IGluIGFzc2VtYmx5LgorLy8KK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIGN2LCBrbXBfaW50OCAgc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdiApOworZXh0ZXJuIGttcF9yZWFsNjQgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdiApOworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ4KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkOCggKHApLCAodikgKQorCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yOCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kOCggKHApLCAodikgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1EzMihwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF82NChwKSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTY0KHApICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDRMTCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjY0KCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIChwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwxNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorCisjIGlmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHZvbGF0aWxlIGttcF9pbnQzMiopKHApLCAoa21wX2ludDMyKShjdiksIChrbXBfaW50MzIpKHN2KSApCisjIGVsc2UgLyogNjQgYml0IHBvaW50ZXJzICovCisjICBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAodm9sYXRpbGUga21wX2ludDY0KikocCksIChrbXBfaW50NjQpKGN2KSwgKGttcF9pbnQ2NCkoc3YpICkKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggKHApLCAoY3YpLCAoc3YpICkKKy8vIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ4KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDgoICh2b2xhdGlsZSBrbXBfaW50OCopKHApLCAoa21wX2ludDgpKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMTYoIChwKSwgKHYpICk7CisvLyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQzMiggKHApLCAodikgKTsKKy8vIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDY0KCAocCksICh2KSApOworLy8jIGRlZmluZSBLTVBfWENIR19SRUFMMzIocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX3JlYWwzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUw2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDY0KCAocCksICh2KSApOworCisKKyNlbGlmIChLTVBfQVNNX0lOVFJJTlMgJiYgS01QX09TX1VOSVgpIHx8ICEoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREOChwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDggKikocCksICh2KSApCisKKy8qIGNhc3QgcCB0byBjb3JyZWN0IHR5cGUgc28gdGhhdCBwcm9wZXIgaW50cmluc2ljIHdpbGwgYmUgdXNlZCAqLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjgocCwgdikgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9vciggKGttcF9pbnQ4ICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hbmQoIChrbXBfaW50OCAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX3N1YiggKGttcF9pbnQ2NCAqKShwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50MzIgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCggKGttcF9pbnQzMiAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50NjQgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCggKGttcF9pbnQ2NCAqKShwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksKGttcF91aW50OCkoY3YpLChrbXBfdWludDgpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwoa21wX3VpbnQxNikoY3YpLChrbXBfdWludDE2KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLChrbXBfdWludDMyKShjdiksKGttcF91aW50MzIpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwoa21wX3VpbnQzMikoY3YpLChrbXBfdWludDMyKShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLChrbXBfdWludDY0KShjdiksKGttcF91aW50NjQpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUgdm9pZCAqKikocCksKHZvaWQgKikoY3YpLCh2b2lkICopKHN2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksKGttcF91aW50MzIpKGN2KSwoa21wX3VpbnQzMikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKworI2RlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLCAoa21wX3VpbnQ4KSh2KSApCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLCAoa21wX3VpbnQxNikodikgKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwgKGttcF91aW50MzIpKHYpICkKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksIChrbXBfdWludDY0KSh2KSApCisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYgKTsKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hbmQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworaW5saW5lIGttcF9yZWFsMzIgS01QX1hDSEdfUkVBTDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpCit7CisgICAga21wX2ludDMyIHRtcCA9IF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKGttcF9pbnQzMiopcCwgKihrbXBfaW50MzIqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDMyKikmdG1wOworfQorCitpbmxpbmUga21wX3JlYWw2NCBLTVBfWENIR19SRUFMNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdikKK3sKKyAgICBrbXBfaW50NjQgdG1wID0gX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAoa21wX2ludDY0KilwLCAqKGttcF9pbnQ2NCopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsNjQqKSZ0bXA7Cit9CisKKyNlbHNlCisKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIGN2LCBrbXBfaW50OCAgc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdiApOworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDgoIChwKSwgKHYpICkKK2V4dGVybiBrbXBfcmVhbDY0IF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYgKTsKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjgocCwgdikgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yOCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDgoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SMzIocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3IzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3I2NCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBpZiBLTVBfQVJDSF9YODYKKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoICh2b2xhdGlsZSBrbXBfaW50MzIqKShwKSwgKGttcF9pbnQzMikoY3YpLCAoa21wX2ludDMyKShzdikgKQorIyBlbHNlIC8qIDY0IGJpdCBwb2ludGVycyAqLworIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCopKHApLCAoa21wX2ludDY0KShjdiksIChrbXBfaW50NjQpKHN2KSApCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCAocCksIChjdiksIChzdikgKQorCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkOCggKHZvbGF0aWxlIGttcF9pbnQ4KikocCksIChrbXBfaW50OCkodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQxNiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ2NCggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUwzMihwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDMyKCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfUkVBTDY0KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsNjQoIChwKSwgKHYpICk7CisKKyNlbmRpZiAvKiBLTVBfQVNNX0lOVFJJTlMgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tIHJlbGF4ZWQgY29uc2lzdGVuY3kgbWVtb3J5IG1vZGVsIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWZkZWYgX19BQlNPRlRfV0lOCisjICAgZGVmaW5lIEtNUF9NQigpICAgICBhc20gKCJub3AiKQorIyAgIGRlZmluZSBLTVBfSU1CKCkgICAgYXNtICgibm9wIikKKyMgZWxzZQorIyAgIGRlZmluZSBLTVBfTUIoKSAgICAgLyogX2FzbXsgbm9wIH0gKi8KKyMgICBkZWZpbmUgS01QX0lNQigpICAgIC8qIF9hc217IG5vcCB9ICovCisjIGVuZGlmCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0CisjIGRlZmluZSBLTVBfTUIoKSAgICAgICBfX3N5bmNfc3luY2hyb25pemUoKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX01CCisjIGRlZmluZSBLTVBfTUIoKSAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfSU1CCisjIGRlZmluZSBLTVBfSU1CKCkgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfU1RfUkVMMzIKKyMgZGVmaW5lIEtNUF9TVF9SRUwzMihBLEQpICAgICAgKCAqKEEpID0gKEQpICkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9TVF9SRUw2NAorIyBkZWZpbmUgS01QX1NUX1JFTDY0KEEsRCkgICAgICAoICooQSkgPSAoRCkgKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX0xEX0FDUTMyCisjIGRlZmluZSBLTVBfTERfQUNRMzIoQSkgICAgICAgICggKihBKSApCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTERfQUNRNjQKKyMgZGVmaW5lIEtNUF9MRF9BQ1E2NChBKSAgICAgICAgKCAqKEEpICkKKyNlbmRpZgorCisjZGVmaW5lIFRDUl8xKGEpICAgICAgICAgICAgKGEpCisjZGVmaW5lIFRDV18xKGEsYikgICAgICAgICAgKGEpID0gKGIpCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vCisvLyBGSVhNRSAtIG1heWJlIHRoaXMgc2hvdWxkIHRoaXMgYmUKKy8vCisvLyAjZGVmaW5lIFRDUl80KGEpICAgICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSgmYSkpCisvLyAjZGVmaW5lIFRDV180KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSYoYikpCisvLworLy8gI2RlZmluZSBUQ1JfOChhKSAgICAoKih2b2xhdGlsZSBrbXBfaW50NjQgKikoYSkpCisvLyAjZGVmaW5lIFRDV184KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmYikpCisvLworLy8gSSdtIGZhaXJseSBjZXJ0YWluIHRoaXMgaXMgdGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8sIGJ1dCBJJ20gYWZyYWlkCisvLyBvZiBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucy4KKy8vCisKKyNkZWZpbmUgVENSXzQoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzQoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENSXzgoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzgoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENSX1NZTkNfNChhKSAgICAgICAoYSkKKyNkZWZpbmUgVENXX1NZTkNfNChhLGIpICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENYX1NZTkNfNChhLGIsYykgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKSh2b2xhdGlsZSB2b2lkICopJihhKSwgKGttcF9pbnQzMikoYiksIChrbXBfaW50MzIpKGMpKQorI2RlZmluZSBUQ1JfU1lOQ184KGEpICAgICAgIChhKQorI2RlZmluZSBUQ1dfU1lOQ184KGEsYikgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ1hfU1lOQ184KGEsYixjKSAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHZvbGF0aWxlIHZvaWQgKikmKGEpLCAoa21wX2ludDY0KShiKSwgKGttcF9pbnQ2NCkoYykpCisKKyNpZiBLTVBfQVJDSF9YODYKKy8vIFdoYXQgYWJvdXQgQVJNPworICAgICNkZWZpbmUgVENSX1BUUihhKSAgICAgICAgICAoKHZvaWQgKilUQ1JfNChhKSkKKyAgICAjZGVmaW5lIFRDV19QVFIoYSxiKSAgICAgICAgVENXXzQoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDUl9TWU5DX1BUUihhKSAgICAgKCh2b2lkICopVENSX1NZTkNfNChhKSkKKyAgICAjZGVmaW5lIFRDV19TWU5DX1BUUihhLGIpICAgVENXX1NZTkNfNCgoYSksKGIpKQorICAgICNkZWZpbmUgVENYX1NZTkNfUFRSKGEsYixjKSAoKHZvaWQgKilUQ1hfU1lOQ180KChhKSwoYiksKGMpKSkKKworI2Vsc2UgLyogNjQgYml0IHBvaW50ZXJzICovCisKKyAgICAjZGVmaW5lIFRDUl9QVFIoYSkgICAgICAgICAgKCh2b2lkICopVENSXzgoYSkpCisgICAgI2RlZmluZSBUQ1dfUFRSKGEsYikgICAgICAgIFRDV184KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1JfU1lOQ19QVFIoYSkgICAgICgodm9pZCAqKVRDUl9TWU5DXzgoYSkpCisgICAgI2RlZmluZSBUQ1dfU1lOQ19QVFIoYSxiKSAgIFRDV19TWU5DXzgoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDWF9TWU5DX1BUUihhLGIsYykgKCh2b2lkICopVENYX1NZTkNfOCgoYSksKGIpLChjKSkpCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworLyoKKyAqIElmIHRoZXNlIEZUTl97VFJVRSxGQUxTRX0gdmFsdWVzIGNoYW5nZSwgbWF5IG5lZWQgdG8KKyAqIGNoYW5nZSBzZXZlcmFsIHBsYWNlcyB3aGVyZSB0aGV5IGFyZSB1c2VkIHRvIGNoZWNrIHRoYXQKKyAqIGxhbmd1YWdlIGlzIEZvcnRyYW4sIG5vdCBDLgorICovCisKKyNpZm5kZWYgRlROX1RSVUUKKyMgZGVmaW5lIEZUTl9UUlVFICAgICAgIFRSVUUKKyNlbmRpZgorCisjaWZuZGVmIEZUTl9GQUxTRQorIyBkZWZpbmUgRlROX0ZBTFNFICAgICAgRkFMU0UKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgICAgKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICpucHIsIC4uLiApOworCisjaWZkZWYgVVNFX1ZPTEFUSUxFX0NBU1QKKyMgZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgICAgICAgICh2b2xhdGlsZSB4KQorI2Vsc2UKKyMgZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgICAgICAgICh4KQorI2VuZGlmCisKKyNkZWZpbmUgS01QX1dBSVRfWUlFTEQgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNAorI2RlZmluZSBLTVBfRVEgICAgICAgICAgICAgICAgICAgX19rbXBfZXFfNAorI2RlZmluZSBLTVBfTkVRICAgICAgICAgICAgICAgICAgX19rbXBfbmVxXzQKKyNkZWZpbmUgS01QX0xUICAgICAgICAgICAgICAgICAgIF9fa21wX2x0XzQKKyNkZWZpbmUgS01QX0dFICAgICAgICAgICAgICAgICAgIF9fa21wX2dlXzQKKyNkZWZpbmUgS01QX0xFICAgICAgICAgICAgICAgICAgIF9fa21wX2xlXzQKKworLyogV29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgY29kZSBnZW4gYnVnIHdoZW4gdGFraW5nIGFkZHJlc3Mgb2Ygc3RhdGljIGFycmF5IChJbnRlbChSKSA2NCBUcmFja2VyICMxMzgpICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9QUEM2NCkgJiYgS01QX09TX0xJTlVYCisjIGRlZmluZSBTVEFUSUNfRUZJMl9XT1JLQVJPVU5ECisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0VGSTJfV09SS0FST1VORCBzdGF0aWMKKyNlbmRpZgorCisvLyBTdXBwb3J0IG9mIEJHRVQgdXNhZ2UKKyNpZm5kZWYgS01QX1VTRV9CR0VUCisjZGVmaW5lIEtNUF9VU0VfQkdFVCAxCisjZW5kaWYKKworCisvLyBTd2l0Y2hlcyBmb3IgT1NTIGJ1aWxkcworI2lmbmRlZiBVU0VfU1lTRlNfSU5GTworIyBkZWZpbmUgVVNFX1NZU0ZTX0lORk8gIDAKKyNlbmRpZgorI2lmbmRlZiBVU0VfQ01QWENIR19GSVgKKyMgZGVmaW5lIFVTRV9DTVBYQ0hHX0ZJWCAxCisjZW5kaWYKKworLy8gRW5hYmxlIGR5bmFtaWMgdXNlciBsb2NrCisjaWYgT01QXzQxX0VOQUJMRUQKKyMgZGVmaW5lIEtNUF9VU0VfRFlOQU1JQ19MT0NLIDEKKyNlbmRpZgorCisvLyBFbmFibGUgVFNYIGlmIGR5bmFtaWMgdXNlciBsb2NrIGlzIHR1cm5lZCBvbgorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisvLyBWaXN1YWwgc3R1ZGlvIGNhbid0IGhhbmRsZSB0aGUgYXNtIHNlY3Rpb25zIGluIHRoaXMgY29kZQorIyBkZWZpbmUgS01QX1VTRV9UU1ggICAgICAgICAgICAgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICFLTVBfQ09NUElMRVJfTVNWQworIyBpZmRlZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjICB1bmRlZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjIGVuZGlmCisjIGRlZmluZSBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTIEtNUF9VU0VfVFNYCisjZW5kaWYKKworLy8gRW5hYmxlIHRpY2sgdGltZSBjb252ZXJzaW9uIG9mIHRpY2tzIHRvIHNlY29uZHMKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorIyBkZWZpbmUgS01QX0hBVkVfVElDS19USU1FIChLTVBfT1NfTElOVVggJiYgKEtNUF9NSUMgfHwgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkpCisjZW5kaWYKKworLy8gV2FybmluZyBsZXZlbHMKK2VudW0ga21wX3dhcm5pbmdzX2xldmVsIHsKKyAgICBrbXBfd2FybmluZ3Nfb2ZmID0gMCwJCS8qIE5vIHdhcm5pbmdzICovCisgICAga21wX3dhcm5pbmdzX2xvdywJCQkvKiBNaW5pbWFsIHdhcm5pbmdzIChkZWZhdWx0KSAqLworICAgIGttcF93YXJuaW5nc19leHBsaWNpdCA9IDYsCQkvKiBFeHBsaWNpdGx5IHNldCB0byBPTiAtIG1vcmUgd2FybmluZ3MgKi8KKyAgICBrbXBfd2FybmluZ3NfdmVyYm9zZQkJLyogcmVzZXJ2ZWQgKi8KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9PU19IICovCisvLyBTYWZlIEMgQVBJCisjaW5jbHVkZSAia21wX3NhZmVfY19hcGkuaCIKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3BsYXRmb3JtLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmExOWRjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3BsYXRmb3JtLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBrbXBfcGxhdGZvcm0uaCAtLSBoZWFkZXIgZm9yIGRldGVybWluaW5nIG9wZXJhdGluZyBzeXN0ZW0gYW5kIGFyY2hpdGVjdHVyZQorICovCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgS01QX1BMQVRGT1JNX0gKKyNkZWZpbmUgS01QX1BMQVRGT1JNX0gKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpbmcgc3lzdGVtIHJlY29nbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfT1NfTElOVVggICAgMAorI2RlZmluZSBLTVBfT1NfRlJFRUJTRCAgMAorI2RlZmluZSBLTVBfT1NfTkVUQlNEICAgMAorI2RlZmluZSBLTVBfT1NfREFSV0lOICAgMAorI2RlZmluZSBLTVBfT1NfV0lORE9XUyAgMAorI2RlZmluZSBLTVBfT1NfQ05LICAgICAgMAorI2RlZmluZSBLTVBfT1NfVU5JWCAgICAgMCAgLyogZGlzanVuY3Rpb24gb2YgS01QX09TX0xJTlVYLCBLTVBfT1NfREFSV0lOIGV0Yy4gKi8KKworCisjaWZkZWYgX1dJTjMyCisjIHVuZGVmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBLTVBfT1NfV0lORE9XUyAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXyApCisjIHVuZGVmIEtNUF9PU19EQVJXSU4KKyMgZGVmaW5lIEtNUF9PU19EQVJXSU4gMQorI2VuZGlmCisKKy8vIGluIHNvbWUgcHBjNjQgbGludXggaW5zdGFsbGF0aW9ucywgb25seSB0aGUgc2Vjb25kIGNvbmRpdGlvbiBpcyBtZXQKKyNpZiAoIGRlZmluZWQgX19saW51eCApCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbGlmICggZGVmaW5lZCBfX2xpbnV4X18pCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbHNlCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0ZyZWVCU0RfXyApCisjIHVuZGVmIEtNUF9PU19GUkVFQlNECisjIGRlZmluZSBLTVBfT1NfRlJFRUJTRCAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX05ldEJTRF9fICkKKyMgdW5kZWYgS01QX09TX05FVEJTRAorIyBkZWZpbmUgS01QX09TX05FVEJTRCAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX2JncV9fICkKKyMgdW5kZWYgS01QX09TX0NOSworIyBkZWZpbmUgS01QX09TX0NOSyAxCisjZW5kaWYKKworI2lmICgxICE9IEtNUF9PU19MSU5VWCArIEtNUF9PU19GUkVFQlNEICsgS01QX09TX05FVEJTRCArIEtNUF9PU19EQVJXSU4gKyBLTVBfT1NfV0lORE9XUykKKyMgZXJyb3IgVW5rbm93biBPUworI2VuZGlmCisKKyNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCB8fCBLTVBfT1NfREFSV0lOCisjIHVuZGVmIEtNUF9PU19VTklYCisjIGRlZmluZSBLTVBfT1NfVU5JWCAxCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBcmNoaXRlY3R1cmUgcmVjb2duaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9BUkNIX1g4NiAgICAgICAgMAorI2RlZmluZSBLTVBfQVJDSF9YODZfNjQgICAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfQUFSQ0g2NCAgICAwCisjZGVmaW5lIEtNUF9BUkNIX1BQQzY0X0JFICAgMAorI2RlZmluZSBLTVBfQVJDSF9QUEM2NF9MRSAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfUFBDNjQgKEtNUF9BUkNIX1BQQzY0X0xFIHx8IEtNUF9BUkNIX1BQQzY0X0JFKQorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWYgZGVmaW5lZCBfTV9BTUQ2NAorIyAgdW5kZWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2XzY0IDEKKyMgZWxzZQorIyAgdW5kZWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2IDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKyMgaWYgZGVmaW5lZCBfX3g4Nl82NAorIyAgdW5kZWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2XzY0IDEKKyMgZWxpZiBkZWZpbmVkIF9faTM4NgorIyAgdW5kZWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2IDEKKyMgZWxpZiBkZWZpbmVkIF9fcG93ZXJwYzY0X18KKyMgIGlmIGRlZmluZWQgX19MSVRUTEVfRU5ESUFOX18KKyMgICB1bmRlZiBLTVBfQVJDSF9QUEM2NF9MRQorIyAgIGRlZmluZSBLTVBfQVJDSF9QUEM2NF9MRSAxCisjICBlbHNlCisjICAgdW5kZWYgS01QX0FSQ0hfUFBDNjRfQkUKKyMgICBkZWZpbmUgS01QX0FSQ0hfUFBDNjRfQkUgMQorIyAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkIF9fYWFyY2g2NF9fCisjICB1bmRlZiBLTVBfQVJDSF9BQVJDSDY0CisjICBkZWZpbmUgS01QX0FSQ0hfQUFSQ0g2NCAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF83X18pICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdSX18pICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjcpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZKX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNktfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82WktfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY2IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNikgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNUVfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjUpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNCAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjQpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzNfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzNNX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WMyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjMpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzJfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVYyIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WMikKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NSUNfXykgfHwgZGVmaW5lZChfX01JQzJfXykKKyMgZGVmaW5lIEtNUF9NSUMgIDEKKyMgaWYgX19NSUMyX18gfHwgX19LTkNfXworIyAgZGVmaW5lIEtNUF9NSUMxIDAKKyMgIGRlZmluZSBLTVBfTUlDMiAxCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfTUlDMSAxCisjICBkZWZpbmUgS01QX01JQzIgMAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEtNUF9NSUMgIDAKKyMgZGVmaW5lIEtNUF9NSUMxIDAKKyMgZGVmaW5lIEtNUF9NSUMyIDAKKyNlbmRpZgorCisvKiBTcGVjaWZ5IDMyIGJpdCBhcmNoaXRlY3R1cmVzIGhlcmUgKi8KKyNkZWZpbmUgS01QXzMyX0JJVF9BUkNIIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNKQorCisvLyBUT0RPOiBGaXhtZSAtIFRoaXMgaXMgY2xldmVyLCBidXQgcmVhbGx5IGZ1Z2x5CisjaWYgKDEgIT0gS01QX0FSQ0hfWDg2ICsgS01QX0FSQ0hfWDg2XzY0ICsgS01QX0FSQ0hfQVJNICsgS01QX0FSQ0hfUFBDNjQgKyBLTVBfQVJDSF9BQVJDSDY0KQorIyBlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfUExBVEZPUk1fSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3J1bnRpbWUuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkZGVlNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmMKQEAgLTAsMCArMSw3NjU3IEBACisvKgorICoga21wX3J1bnRpbWUuYyAtLSBLUFRTIHJ1bnRpbWUgc3VwcG9ydCBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvKiB0aGVzZSBhcmUgdGVtcG9yYXJ5IGlzc3VlcyB0byBiZSBkZWFsdCB3aXRoICovCisjZGVmaW5lIEtNUF9VU0VfUFJDVEwgMAorI2RlZmluZSBLTVBfVVNFX1BPT0xFRF9BTExPQyAwCisKKyNpZiBLTVBfT1NfV0lORE9XUworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9hbHRfY29tcFtdID0gS01QX1ZFUlNJT05fUFJFRklYICJhbHRlcm5hdGl2ZSBjb21waWxlciBzdXBwb3J0OiB5ZXMiOworI2VuZGlmIC8qIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fb21wX2FwaVtdID0gS01QX1ZFUlNJT05fUFJFRklYICJBUEkgdmVyc2lvbjogIgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgIjQuMCAoMjAxMzA3KSI7CisjZWxzZQorICAgICIzLjEgKDIwMTEwNykiOworI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9sb2NrW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImxvY2sgdHlwZTogcnVuIHRpbWUgc2VsZWN0YWJsZSI7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKworI2RlZmluZSBLTVBfTUlOKCB4LCB5ICkgKCAoeCkgPCAoeSkgPyAoeCkgOiAoeSkgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfaW5mb190IF9fa21wX21vbml0b3I7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3ZvaWQgX19rbXBfY2xlYW51cCggdm9pZCApOworCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0aWFsaXplX2luZm8oIGttcF9pbmZvX3QgKiwga21wX3RlYW1fdCAqLCBpbnQgdGlkLCBpbnQgZ3RpZCApOworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCBrbXBfdGVhbV90ICogdGVhbSwgaW50IG5ld19ucHJvYywga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLCBpZGVudF90ICogbG9jICk7CisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgX19rbXBfcGFydGl0aW9uX3BsYWNlcygga21wX3RlYW1fdCAqdGVhbSApOworI2VuZGlmCitzdGF0aWMgdm9pZCBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApOwordm9pZCBfX2ttcF9mb3JrX2JhcnJpZXIoIGludCBndGlkLCBpbnQgdGlkICk7Cit2b2lkIF9fa21wX2pvaW5fYmFycmllciggaW50IGd0aWQgKTsKK3ZvaWQgX19rbXBfc2V0dXBfaWN2X2NvcHkoIGttcF90ZWFtX3QgKnRlYW0sIGludCBuZXdfbnByb2MsIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBuZXdfaWN2cywgaWRlbnRfdCAqbG9jICk7CisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitzdGF0aWMgaW50IF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygga21wX3Jvb3RfdCAqIHJvb3QsIGludCBzZXRfbnByb2MgKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fa21wX2V4cGFuZF90aHJlYWRzKGludCBuV2lzaCwgaW50IG5OZWVkKTsKKyNpZiBLTVBfT1NfV0lORE9XUworc3RhdGljIGludCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKCBpbnQgZ3RpZCApOworI2VuZGlmCitzdGF0aWMgdm9pZCBfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkoIHZvaWQgKTsgLy8gY2FsbGVkIGJ5IF9fa21wX2ludGVybmFsX2VuZCgpCitzdGF0aWMgdm9pZCBfX2ttcF9yZWFwX3RocmVhZCgga21wX2luZm9fdCAqIHRocmVhZCwgaW50IGlzX3Jvb3QgKTsKK3N0YXRpYyBrbXBfaW5mb190ICpfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDYWxjdWxhdGUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGN1cnJlbnQgdGhyZWFkICovCisvKiBmYXN0IChhbmQgc29tZXdoYXQgcG9ydGFibGUpIHdheSB0byBnZXQgdW5pcXVlICovCisvKiBpZGVudGlmaWVyIG9mIGV4ZWN1dGluZyB0aHJlYWQuICAgICAgICAgICAgICAgICovCisvKiByZXR1cm5zIEtNUF9HVElEX0RORSBpZiB3ZSBoYXZlbid0IGJlZW4gYXNzaWduZWQgYSBndGlkICAgKi8KKworaW50CitfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCggKQoreworICAgIGludCBpOworICAgIGttcF9pbmZvX3QgICAqKm90aGVyX3RocmVhZHM7CisgICAgc2l6ZV90ICAgICAgICAgc3RhY2tfZGF0YTsKKyAgICBjaGFyICAgICAgICAgICpzdGFja19hZGRyOworICAgIHNpemVfdCAgICAgICAgIHN0YWNrX3NpemU7CisgICAgY2hhciAgICAgICAgICAqc3RhY2tfYmFzZTsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IGVudGVyaW5nLCBucHJvYz0lZCAgYWxsX25wcm9jPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX250aCwgX19rbXBfYWxsX250aCApKTsKKworICAgIC8qIEpQSCAtIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBfX2ttcGNfZW5kKDApIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBwcmlvciB0byBhCisgICAgICAgICAgICAgcGFyYWxsZWwgcmVnaW9uLCBtYWRlIGl0IHJldHVybiBLTVBfR1RJRF9ETkUgdG8gZm9yY2Ugc2VyaWFsX2luaXRpYWxpemUgYnkKKyAgICAgICAgICAgICBjYWxsZXIuICBIYWQgdG8gaGFuZGxlIEtNUF9HVElEX0RORSBhdCBhbGwgY2FsbC1zaXRlcywgb3IgZWxzZSBndWFyYW50ZWUKKyAgICAgICAgICAgICBfX2ttcF9pbml0X2d0aWQgZm9yIHRoaXMgdG8gd29yay4gICovCisKKyAgICBpZiAoICFUQ1JfNChfX2ttcF9pbml0X2d0aWQpICkgcmV0dXJuIEtNUF9HVElEX0RORTsKKworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDMpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcgVERBVEFcbiIgKSk7CisgICAgICAgIHJldHVybiBfX2ttcF9ndGlkOworICAgIH0KKyNlbmRpZgorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAyKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IHVzaW5nIGtleWVkIFRMU1xuIiApKTsKKyAgICAgICAgcmV0dXJuIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgfQorICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IHVzaW5nIGludGVybmFsIGFsZy5cbiIgKSk7CisKKyAgICBzdGFja19hZGRyICAgID0gKGNoYXIqKSAmIHN0YWNrX2RhdGE7CisgICAgb3RoZXJfdGhyZWFkcyA9IF9fa21wX3RocmVhZHM7CisKKyAgICAvKgorICAgICAgICBBVFQ6IFRoZSBjb2RlIGJlbG93IGlzIGEgc291cmNlIG9mIHBvdGVudGlhbCBidWdzIGR1ZSB0byB1bnN5bmNocm9uaXplZCBhY2Nlc3MgdG8KKyAgICAgICAgX19rbXBfdGhyZWFkcyBhcnJheS4gRm9yIGV4YW1wbGU6CisgICAgICAgICAgICAxLiBDdXJyZW50IHRocmVhZCBsb2FkcyBvdGhlcl90aHJlYWRzW2ldIHRvIHRociBhbmQgY2hlY2tzIGl0LCBpdCBpcyBub24tTlVMTC4KKyAgICAgICAgICAgIDIuIEN1cnJlbnQgdGhyZWFkIGlzIHN1c3BlbmRlZCBieSBPUy4KKyAgICAgICAgICAgIDMuIEFub3RoZXIgdGhyZWFkIHVucmVnaXN0ZXJzIGFuZCBmaW5pc2hlcyAoZGVidWcgdmVyc2lvbnMgb2YgZnJlZSgpIG1heSBmaWxsIG1lbW9yeQorICAgICAgICAgICAgICAgd2l0aCBzb21ldGhpbmcgbGlrZSAweEVGKS4KKyAgICAgICAgICAgIDQuIEN1cnJlbnQgdGhyZWFkIGlzIHJlc3VtZWQuCisgICAgICAgICAgICA1LiBDdXJyZW50IHRocmVhZCByZWFkcyBqdW5rIGZyb20gKnRoci4KKyAgICAgICAgVE9ETzogRml4IGl0LgorICAgICAgICAtLWxuCisgICAgKi8KKworICAgIGZvciggaSA9IDAgOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA7IGkrKyApIHsKKworICAgICAgICBrbXBfaW5mb190ICp0aHIgPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihvdGhlcl90aHJlYWRzW2ldKTsKKyAgICAgICAgaWYoICF0aHIgKSBjb250aW51ZTsKKworICAgICAgICBzdGFja19zaXplID0gIChzaXplX3QpVENSX1BUUih0aHItPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplKTsKKyAgICAgICAgc3RhY2tfYmFzZSA9ICAoY2hhciAqKVRDUl9QVFIodGhyLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSk7CisKKyAgICAgICAgLyogc3RhY2sgZ3Jvd3MgZG93biAtLSBzZWFyY2ggdGhyb3VnaCBhbGwgb2YgdGhlIGFjdGl2ZSB0aHJlYWRzICovCisKKyAgICAgICAgaWYoIHN0YWNrX2FkZHIgPD0gc3RhY2tfYmFzZSApIHsKKyAgICAgICAgICAgIHNpemVfdCBzdGFja19kaWZmID0gc3RhY2tfYmFzZSAtIHN0YWNrX2FkZHI7CisKKyAgICAgICAgICAgIGlmKCBzdGFja19kaWZmIDw9IHN0YWNrX3NpemUgKSB7CisgICAgICAgICAgICAgICAgLyogVGhlIG9ubHkgd2F5IHdlIGNhbiBiZSBjbG9zZXIgdGhhbiB0aGUgYWxsb2NhdGVkICovCisgICAgICAgICAgICAgICAgLyogc3RhY2sgc2l6ZSBpcyBpZiB3ZSBhcmUgcnVubmluZyBvbiB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpID09IGkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBzcGVjaWZpYyB0byB0cnkgYW5kIGRldGVybWluZSBvdXIgZ3RpZCAqLworICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IGludGVybmFsIGFsZy4gZmFpbGVkIHRvIGZpbmQgIgorICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQsIHVzaW5nIFRMU1xuIiApKTsKKyAgICBpID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKworICAgIC8qZnByaW50Ziggc3RkZXJyLCAiPT09ICVkXG4iLCBpICk7ICAqLyAvKiBHUk9PICovCisKKyAgICAvKiBpZiB3ZSBoYXZuJ3QgYmVlbiBhc3NpZ25lZCBhIGd0aWQsIHRoZW4gcmV0dXJuIGNvZGUgKi8KKyAgICBpZiggaTwwICkgcmV0dXJuIGk7CisKKyAgICAvKiBkeW5hbWljYWxseSB1cGRhdGVkIHN0YWNrIHdpbmRvdyBmb3IgdWJlciB0aHJlYWRzIHRvIGF2b2lkIGdldF9zcGVjaWZpYyBjYWxsICovCisgICAgaWYoICEgVENSXzQob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cpICkgeworICAgICAgICBLTVBfRkFUQUwoIFN0YWNrT3ZlcmZsb3csIGkgKTsKKyAgICB9CisKKyAgICBzdGFja19iYXNlID0gKGNoYXIgKikgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgaWYoIHN0YWNrX2FkZHIgPiBzdGFja19iYXNlICkgeworICAgICAgICBUQ1dfUFRSKG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCBzdGFja19hZGRyKTsKKyAgICAgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSArIHN0YWNrX2FkZHIgLSBzdGFja19iYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ1dfUFRSKG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCBzdGFja19iYXNlIC0gc3RhY2tfYWRkcik7CisgICAgfQorCisgICAgLyogUmVwcmludCBzdGFjayBib3VuZHMgZm9yIHViZXJtYXN0ZXIgc2luY2UgdGhleSBoYXZlIGJlZW4gcmVmaW5lZCAqLworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgIGNoYXIgKnN0YWNrX2VuZCA9IChjaGFyICopIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlOworICAgICAgICBjaGFyICpzdGFja19iZWcgPSBzdGFja19lbmQgLSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggaSwgc3RhY2tfYmVnLCBzdGFja19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQgc3RhY2sgKHJlZmluZW1lbnQpIiwgaSApOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworaW50CitfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcoICkKK3sKKyAgICBpbnQgZ3RpZDsKKworICAgIGlmICggIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBndGlkID0gS01QX0dUSURfRE5FOworICAgIH0gZWxzZQorI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDMgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiB1c2luZyBUREFUQVxuIiApKTsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWQ7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMiApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IHVzaW5nIGtleWVkIFRMU1xuIiApKTsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IHVzaW5nIGludGVybmFsIGFsZy5cbiIgKSk7CisgICAgICAgIGd0aWQgPSBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpOworICAgIH0KKworICAgIC8qIHdlIG11c3QgYmUgYSBuZXcgdWJlciBtYXN0ZXIgc2libGluZyB0aHJlYWQgKi8KKyAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9ETkUgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiBFbmNvdW50ZXJlZCBuZXcgcm9vdCB0aHJlYWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpc3RlcmluZyBhIG5ldyBndGlkLlxuIiApKTsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgaWYoICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgICAgICBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGd0aWQgPSBfX2ttcF9yZWdpc3Rlcl9yb290KEZBTFNFKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICAvKl9fa21wX3ByaW50ZiggIisrKyAlZFxuIiwgZ3RpZCApOyAqLyAvKiBHUk9PICovCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PTAgKTsKKworICAgIHJldHVybiBndGlkOworfQorCisvKiBjYWxsZXIgbXVzdCBob2xkIGZvcmtqb2luX2xvY2sgKi8KK3ZvaWQKK19fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgZjsKKyAgICBjaGFyICpzdGFja19iZWcgPSBOVUxMOworICAgIGNoYXIgKnN0YWNrX2VuZCA9IE5VTEw7CisgICAgaW50IGd0aWQ7CisKKyAgICBLQV9UUkFDRSgxMCwoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IGNhbGxlZFxuIikpOworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgIHN0YWNrX2VuZCA9IChjaGFyICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgc3RhY2tfYmVnID0gc3RhY2tfZW5kIC0gdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplOworCisgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApOworCisgICAgICAgIGlmIChndGlkID09IEtNUF9HVElEX01PTklUT1IpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHN0YWNrX2JlZywgc3RhY2tfZW5kLCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVzIHN0YWNrICglcykiLCAibW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdyApID8gImluaXRpYWwiIDogImFjdHVhbCIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHN0YWNrX2JlZywgc3RhY2tfZW5kLCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrICglcykiLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93ICkgPyAiaW5pdGlhbCIgOiAiYWN0dWFsIiApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm8gcG9pbnQgaW4gY2hlY2tpbmcgdWJlcm1hc3RlciB0aHJlYWRzIHNpbmNlIHRoZXkgdXNlIHJlZmluZW1lbnQgYW5kIGNhbm5vdCBvdmVybGFwICovCisgICAgZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICk7CisgICAgaWYgKCBfX2ttcF9lbnZfY2hlY2tzID09IFRSVUUgJiYgIUtNUF9VQkVSX0dUSUQoZ3RpZCkpCisgICAgeworICAgICAgICBLQV9UUkFDRSgxMCwoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IHBlcmZvcm1pbmcgZXh0ZW5zaXZlIGNoZWNraW5nXG4iKSk7CisgICAgICAgIGlmICggc3RhY2tfYmVnID09IE5VTEwgKSB7CisgICAgICAgICAgICBzdGFja19lbmQgPSAoY2hhciAqKSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgICAgICAgICBzdGFja19iZWcgPSBzdGFja19lbmQgLSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemU7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGY9MCA7IGYgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDsgZisrICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqZl90aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZl0pOworCisgICAgICAgICAgICBpZiggZl90aCAmJiBmX3RoICE9IHRoICkgeworICAgICAgICAgICAgICAgIGNoYXIgKm90aGVyX3N0YWNrX2VuZCA9IChjaGFyICopVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSk7CisgICAgICAgICAgICAgICAgY2hhciAqb3RoZXJfc3RhY2tfYmVnID0gb3RoZXJfc3RhY2tfZW5kIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KVRDUl9QVFIoZl90aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUpOworICAgICAgICAgICAgICAgIGlmKChzdGFja19iZWcgPiBvdGhlcl9zdGFja19iZWcgJiYgc3RhY2tfYmVnIDwgb3RoZXJfc3RhY2tfZW5kKSB8fAorICAgICAgICAgICAgICAgICAgIChzdGFja19lbmQgPiBvdGhlcl9zdGFja19iZWcgJiYgc3RhY2tfZW5kIDwgb3RoZXJfc3RhY2tfZW5kKSkgeworCisgICAgICAgICAgICAgICAgICAgIC8qIFByaW50IHRoZSBvdGhlciBzdGFjayB2YWx1ZXMgYmVmb3JlIHRoZSBhYm9ydCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCBvdGhlcl9zdGFja19iZWcsIG90aGVyX3N0YWNrX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KVRDUl9QVFIoZl90aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZCBzdGFjayAob3ZlcmxhcHBlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIGZfdGggKSApOworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBLTVBfTVNHKCBTdGFja092ZXJsYXAgKSwgS01QX0hOVCggQ2hhbmdlU3RhY2tMaW1pdCApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSgxMCwoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IHJldHVybmluZ1xuIikpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfaW5maW5pdGVfbG9vcCggdm9pZCApCit7CisgICAgc3RhdGljIGludCBkb25lID0gRkFMU0U7CisKKyAgICB3aGlsZSAoISBkb25lKSB7CisgICAgICAgIEtNUF9ZSUVMRCggMSApOworICAgIH0KK30KKworI2RlZmluZSBNQVhfTUVTU0FHRSAgICAgNTEyCisKK3ZvaWQKK19fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGludCBndGlkLCB2b2lkICpwMSwgdm9pZCAqcDIsIHNpemVfdCBzaXplLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLikgeworICAgIGNoYXIgYnVmZmVyW01BWF9NRVNTQUdFXTsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQpOworICAgIEtNUF9TTlBSSU5URiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIk9NUCBzdG9yYWdlIG1hcDogJXAgJXAlOGx1ICVzXG4iLCBwMSwgcDIsICh1bnNpZ25lZCBsb25nKSBzaXplLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBidWZmZXIsIGFwICk7CisjaWYgS01QX1BSSU5UX0RBVEFfUExBQ0VNRU5UCisgICAgaW50IG5vZGU7CisgICAgaWYoZ3RpZCA+PSAwKSB7CisgICAgICAgIGlmKHAxIDw9IHAyICYmIChjaGFyKilwMiAtIChjaGFyKilwMSA9PSBzaXplKSB7CisgICAgICAgICAgICBpZiggX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSApIHsKKyAgICAgICAgICAgICAgICBub2RlID0gX19rbXBfZ2V0X2hvc3Rfbm9kZShwMSk7CisgICAgICAgICAgICAgICAgaWYobm9kZSA8IDApICAvKiBkb2Vzbid0IHdvcmssIHNvIGRvbid0IHRyeSB0aGlzIG5leHQgdGltZSAqLworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmxhc3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvY2FsUHJvYyA9IF9fa21wX2dldF9jcHVfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICAgICAgICAgICAgICAgIHAxID0gKHZvaWQgKikoIChzaXplX3QpcDEgJiB+KChzaXplX3QpUEFHRV9TSVpFIC0gMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgcDIgPSAodm9pZCAqKSggKChzaXplX3QpIHAyIC0gMSkgJiB+KChzaXplX3QpUEFHRV9TSVpFIC0gMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9jYWxQcm9jID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICBHVElEICVkIGxvY2FsTm9kZSAlZFxuIiwgZ3RpZCwgbG9jYWxQcm9jPj4xKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgR1RJRCAlZFxuIiwgZ3RpZCk7CisjIGlmIEtNUF9VU0VfUFJDVEwKKy8qIFRoZSBtb3JlIGVsYWJvcmF0ZSBmb3JtYXQgaXMgZGlzYWJsZWQgZm9yIG5vdyBiZWNhdXNlIG9mIHRoZSBwcmN0bCBoYW5naW5nIGJ1Zy4gKi8KKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHAxOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBsb29wIGNvbGxhdGVzIGFkamFjZW50IHBhZ2VzIHdpdGggdGhlIHNhbWUgaG9zdCBub2RlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwMSArPSBQQUdFX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHAxIDw9IHAyICYmIChub2RlID0gX19rbXBfZ2V0X2hvc3Rfbm9kZShwMSkpID09IGxhc3ROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwMSAtIDEsIGxhc3ROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZShwMSA8PSBwMik7CisjIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgICAlcC0lcCBtZW1Ob2RlICVkXG4iLCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxICsgKFBBR0VfU0laRSAtIDEpLCBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHAxIDwgcDIpICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAgICVwLSVwIG1lbU5vZGUgJWRcbiIsIHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAyICsgKFBBR0VfU0laRSAtIDEpLCBfX2ttcF9nZXRfaG9zdF9ub2RlKHAyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgJXNcbiIsIEtNUF9JMThOX1NUUiggU3RvcmFnZU1hcFdhcm5pbmcgKSApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfUFJJTlRfREFUQV9QTEFDRU1FTlQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKK30KKwordm9pZAorX19rbXBfd2FybiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICkKK3sKKyAgICBjaGFyIGJ1ZmZlcltNQVhfTUVTU0FHRV07CisgICAgdmFfbGlzdCBhcDsKKworICAgIGlmICggX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZiApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0ICk7CisKKyAgICBLTVBfU05QUklOVEYoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLCAiT01QIHdhcm5pbmc6ICVzXG4iLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBidWZmZXIsIGFwICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisKKyAgICB2YV9lbmQoIGFwICk7Cit9CisKK3ZvaWQKK19fa21wX2Fib3J0X3Byb2Nlc3MoKQoreworCisgICAgLy8gTGF0ZXIgdGhyZWFkcyBtYXkgc3RhbGwgaGVyZSwgYnV0IHRoYXQncyBvayBiZWNhdXNlIGFib3J0KCkgd2lsbCBraWxsIHRoZW0uCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9leGl0X2xvY2sgKTsKKworICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIEtNUF9PU19XSU5ET1dTICkgeworICAgICAgICAvLyBMZXQgb3RoZXIgdGhyZWFkcyBrbm93IG9mIGFibm9ybWFsIHRlcm1pbmF0aW9uIGFuZCBwcmV2ZW50IGRlYWRsb2NrCisgICAgICAgIC8vIGlmIGFib3J0IGhhcHBlbmVkIGR1cmluZyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIG9yIHNodXRkb3duCisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSBTSUdBQlJUOworCisgICAgICAgIC8qCisgICAgICAgICAgICBPbiBXaW5kb3dzKiBPUyBieSBkZWZhdWx0IGFib3J0KCkgY2F1c2VzIHBvcC11cCBlcnJvciBib3gsIHdoaWNoIHN0YWxscyBuaWdodGx5IHRlc3RpbmcuCisgICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3QgcmVsaWFibHkgc3VwcHJlc3MgcG9wLXVwIGVycm9yIGJveGVzLiBfc2V0X2Fib3J0X2JlaGF2aW9yKCkKKyAgICAgICAgICAgIHdvcmtzIHdlbGwsIGJ1dCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gVlM3ICh0aGlzIGlzIG5vdCBwcm9ibGVtIGZvciBETEwsIGJ1dAorICAgICAgICAgICAgaXQgaXMgYSBwcm9ibGVtIGZvciBzdGF0aWMgT3Blbk1QIFJUTCkuIFNldEVycm9yTW9kZSAoYW5kIHNvLCB0aW1lbGltaXQgdXRpbGl0eSkgZG9lcworICAgICAgICAgICAgbm90IGhlbHAsIGF0IGxlYXN0IGluIHNvbWUgdmVyc2lvbnMgb2YgTVMgQyBSVEwuCisKKyAgICAgICAgICAgIEl0IHNlZW1zIGZvbGxvd2luZyBzZXF1ZW5jZSBpcyB0aGUgb25seSB3YXkgdG8gc2ltdWxhdGUgYWJvcnQoKSBhbmQgYXZvaWQgcG9wLXVwIGVycm9yCisgICAgICAgICAgICBib3guCisgICAgICAgICovCisgICAgICAgIHJhaXNlKCBTSUdBQlJUICk7CisgICAgICAgIF9leGl0KCAzICk7ICAgIC8vIEp1c3QgaW4gY2FzZSwgaWYgc2lnbmFsIGlnbm9yZWQsIGV4aXQgYW55d2F5LgorICAgIH0gZWxzZSB7CisgICAgICAgIGFib3J0KCk7CisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2V4aXRfbG9jayApOworCit9IC8vIF9fa21wX2Fib3J0X3Byb2Nlc3MKKwordm9pZAorX19rbXBfYWJvcnRfdGhyZWFkKCB2b2lkICkKK3sKKyAgICAvLyBUT0RPOiBFbGltaW5hdGUgZ19hYm9ydCBnbG9iYWwgdmFyaWFibGUgYW5kIHRoaXMgZnVuY3Rpb24uCisgICAgLy8gSW4gY2FzZSBvZiBhYm9ydCBqdXN0IGNhbGwgYWJvcnQoKSwgaXQgd2lsbCBraWxsIGFsbCB0aGUgdGhyZWFkcy4KKyAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7Cit9IC8vIF9fa21wX2Fib3J0X3RocmVhZAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFByaW50IG91dCB0aGUgc3RvcmFnZSBtYXAgZm9yIHRoZSBtYWpvciBrbXBfaW5mb190IHRocmVhZCBkYXRhIHN0cnVjdHVyZXMKKyAqIHRoYXQgYXJlIGFsbG9jYXRlZCB0b2dldGhlci4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfdGhyZWFkX3N0b3JhZ2VfbWFwKCBrbXBfaW5mb190ICp0aHIsIGludCBndGlkICkKK3sKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCB0aHIsIHRociArIDEsIHNpemVvZihrbXBfaW5mb190KSwgInRoXyVkIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfaW5mbywgJnRoci0+dGgudGhfdGVhbSwgc2l6ZW9mKGttcF9kZXNjX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQudGhfaW5mbyIsIGd0aWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2xvY2FsLCAmdGhyLT50aC50aF9wcmlfaGVhZCwgc2l6ZW9mKGttcF9sb2NhbF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkLnRoX2xvY2FsIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfYmFyWzBdLCAmdGhyLT50aC50aF9iYXJbYnNfbGFzdF9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCkgKiBic19sYXN0X2JhcnJpZXIsICJ0aF8lZC50aF9iYXIiLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9iYXJbYnNfcGxhaW5fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHItPnRoLnRoX2Jhcltic19wbGFpbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSwgInRoXyVkLnRoX2JhcltwbGFpbl0iLCBndGlkKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoci0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3QpLCAidGhfJWQudGhfYmFyW2Zvcmtqb2luXSIsIGd0aWQpOworCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHItPnRoLnRoX2Jhcltic19yZWR1Y3Rpb25fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCksICJ0aF8lZC50aF9iYXJbcmVkdWN0aW9uXSIsIGd0aWQpOworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorfQorCisvKgorICogUHJpbnQgb3V0IHRoZSBzdG9yYWdlIG1hcCBmb3IgdGhlIG1ham9yIGttcF90ZWFtX3QgdGVhbSBkYXRhIHN0cnVjdHVyZXMKKyAqIHRoYXQgYXJlIGFsbG9jYXRlZCB0b2dldGhlci4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfdGVhbV9zdG9yYWdlX21hcCggY29uc3QgY2hhciAqaGVhZGVyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGVhbV9pZCwgaW50IG51bV90aHIgKQoreworICAgIGludCBudW1fZGlzcF9idWZmID0gdGVhbS0+dC50X21heF9ucHJvYyA+IDEgPyBLTVBfTUFYX0RJU1BfQlVGIDogMjsKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgdGVhbSwgdGVhbSArIDEsIHNpemVvZihrbXBfdGVhbV90KSwgIiVzXyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbMF0sICZ0ZWFtLT50LnRfYmFyW2JzX2xhc3RfYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCkgKiBic19sYXN0X2JhcnJpZXIsICIlc18lZC50X2JhciIsIGhlYWRlciwgdGVhbV9pZCApOworCisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbYnNfcGxhaW5fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCksICIlc18lZC50X2JhcltwbGFpbl0iLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19mb3Jram9pbl9iYXJyaWVyXSwgJnRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdGVhbV90KSwgIiVzXyVkLnRfYmFyW2Zvcmtqb2luXSIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpLCAiJXNfJWQudF9iYXJbcmVkdWN0aW9uXSIsIGhlYWRlciwgdGVhbV9pZCApOworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfZGlzcGF0Y2hbMF0sICZ0ZWFtLT50LnRfZGlzcGF0Y2hbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfZGlzcF90KSAqIG51bV90aHIsICIlc18lZC50X2Rpc3BhdGNoIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF90aHJlYWRzWzBdLCAmdGVhbS0+dC50X3RocmVhZHNbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfaW5mb190ICopICogbnVtX3RociwgIiVzXyVkLnRfdGhyZWFkcyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbMF0sICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbbnVtX2Rpc3BfYnVmZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmYsICIlc18lZC50X2Rpc3BfYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICAvKgorICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9ucHJvY1swXSwgJnRlYW0tPnQudF9zZXRfbnByb2NbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X25wcm9jIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfZHluYW1pY1swXSwgJnRlYW0tPnQudF9zZXRfZHluYW1pY1tudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfZHluYW1pYyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X25lc3RlZFswXSwgJnRlYW0tPnQudF9zZXRfbmVzdGVkW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9uZXN0ZWQiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9ibG9ja3RpbWVbMF0sICZ0ZWFtLT50LnRfc2V0X2Jsb2NrdGltZVtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfbnByb2MiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHNbMF0sICZ0ZWFtLT50LnRfc2V0X2J0X2ludGVydmFsc1tudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfZHluYW1pYyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X2J0X3NldFswXSwgJnRlYW0tPnQudF9zZXRfYnRfc2V0W251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9uZXN0ZWQiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIC8vX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzWzBdLCAmdGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVsc1tudW1fdGhyXSwKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfc2NoZWRbMF0sICZ0ZWFtLT50LnRfc2V0X3NjaGVkW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX3Jfc2NoZWRfdCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfc2NoZWQiLCBoZWFkZXIsIHRlYW1faWQgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9wcm9jX2JpbmRbMF0sICZ0ZWFtLT50LnRfc2V0X3Byb2NfYmluZFtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9wcm9jX2JpbmRfdCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfcHJvY19iaW5kIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisjZW5kaWYKKyAgICAqLworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfdGFza3EsICZ0ZWFtLT50LnRfY29weXByaXZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF90YXNrcV90KSwgIiVzXyVkLnRfdGFza3EiLCBoZWFkZXIsIHRlYW1faWQgKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5pdF9hbGxvY2F0b3IoKSB7fQorc3RhdGljIHZvaWQgX19rbXBfZmluaV9hbGxvY2F0b3IoKSB7fQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEtNUF9EWU5BTUlDX0xJQgorIyBpZiBLTVBfT1NfV0lORE9XUworCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZXNldF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCogbGNrICkgeworICAgIC8vIFRPRE86IENoYW5nZSB0byBfX2ttcF9icmVha19ib290c3RyYXBfbG9jaygpLgorICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soIGxjayApOyAvLyBtYWtlIHRoZSBsb2NrIHJlbGVhc2VkCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggaW50IGd0aWRfcmVxICkgeworICAgIGludCBpOworICAgIGludCB0aHJlYWRfY291bnQ7CisKKyAgICAvLyBQUk9DRVNTX0RFVEFDSCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgYnkgYSB0aHJlYWQKKyAgICAvLyB0aGF0IGV4ZWN1dGVzIFByb2Nlc3NFeGl0KCkgb3IgRnJlZUxpYnJhcnkoKS4KKyAgICAvLyBPUyB0ZXJtaW5hdGVzIG90aGVyIHRocmVhZHMgKGV4Y2VwdCB0aGUgb25lIGNhbGxpbmcgUHJvY2Vzc0V4aXQgb3IgRnJlZUxpYnJhcnkpLgorICAgIC8vIFNvLCBpdCBtaWdodCBiZSBzYWZlIHRvIGFjY2VzcyB0aGUgX19rbXBfdGhyZWFkc1tdIHdpdGhvdXQgdGFraW5nIHRoZSBmb3Jram9pbl9sb2NrLgorICAgIC8vIEhvd2V2ZXIsIGluIGZhY3QsIHNvbWUgdGhyZWFkcyBjYW4gYmUgc3RpbGwgYWxpdmUgaGVyZSwgYWx0aG91Z2ggYmVpbmcgYWJvdXQgdG8gYmUgdGVybWluYXRlZC4KKyAgICAvLyBUaGUgdGhyZWFkcyBpbiB0aGUgYXJyYXkgd2l0aCBkc190aHJlYWQ9PTAgYXJlIG1vc3Qgc3VzcGljaW91cy4KKyAgICAvLyBBY3R1YWxseSwgaXQgY2FuIGJlIG5vdCBzYWZlIHRvIGFjY2VzcyB0aGUgX19rbXBfdGhyZWFkc1tdLgorCisgICAgLy8gVE9ETzogZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNoZWNrIF9fa21wX3Jvb3RzW10gPworCisgICAgLy8gTGV0J3MgY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIgYWxpdmUgdGhyZWFkcyByZWdpc3RlcmVkIHdpdGggdGhlIE9NUCBsaWIuCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIHRocmVhZF9jb3VudCA9IDA7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2kgKSB7CisgICAgICAgICAgICBpZiggIV9fa21wX3RocmVhZHMgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGttcF9pbmZvX3QqIHRoID0gX19rbXBfdGhyZWFkc1sgaSBdOworICAgICAgICAgICAgaWYoIHRoID09IE5VTEwgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGludCBndGlkID0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICAgICAgICAgIGlmKCBndGlkID09IGd0aWRfcmVxICkgY29udGludWU7CisgICAgICAgICAgICBpZiggZ3RpZCA8IDAgKSBjb250aW51ZTsKKyAgICAgICAgICAgIERXT1JEIGV4aXRfdmFsOworICAgICAgICAgICAgaW50IGFsaXZlID0gX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBpZiggYWxpdmUgKSB7CisgICAgICAgICAgICArK3RocmVhZF9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggdGhyZWFkX2NvdW50ID09IDAgKSBicmVhazsgLy8gc3VjY2VzcworICAgIH0KKworICAgIC8vIEFzc3VtZSB0aGF0IEknbSBhbG9uZS4KKworICAgIC8vIE5vdyBpdCBtaWdodCBiZSBwcm9iYWJseSBzYWZlIHRvIGNoZWNrIGFuZCByZXNldCBsb2Nrcy4KKyAgICAvLyBfX2ttcF9mb3Jram9pbl9sb2NrIGFuZCBfX2ttcF9zdGRpb19sb2NrIGFyZSBleHBlY3RlZCB0byBiZSByZXNldC4KKyAgICBfX2ttcF9yZXNldF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICBfX2ttcF9yZXNldF9sb2NrKCAmX19rbXBfc3RkaW9fbG9jayApOworICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKworCit9CisKK0JPT0wgV0lOQVBJCitEbGxNYWluKCBISU5TVEFOQ0UgaEluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwUmVzZXJ2ZWQgKSB7CisgICAgLy9fX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgc3dpdGNoKCBmZHdSZWFzb24gKSB7CisKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogUFJPQ0VTU19BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFBST0NFU1NfREVUQUNIIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpICkpOworCisgICAgICAgICAgICBpZiggbHBSZXNlcnZlZCAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBscFJlc2VydmVkIGlzIHVzZWQgZm9yIHRlbGxpbmcgdGhlIGRpZmZlcmVuY2U6CisgICAgICAgICAgICAgICAgLy8gIGxwUmVzZXJ2ZWQgPT0gTlVMTCB3aGVuIEZyZWVMaWJyYXJ5KCkgd2FzIGNhbGxlZCwKKyAgICAgICAgICAgICAgICAvLyAgbHBSZXNlcnZlZCAhPSBOVUxMIHdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcy4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIEZyZWVMaWJyYXJ5KCkgaXMgY2FsbGVkLCB3b3JrZXIgdGhyZWFkcyByZW1haW4gYWxpdmUuCisgICAgICAgICAgICAgICAgLy8gU28gdGhleSB3aWxsIHJlbGVhc2UgdGhlIGZvcmtqb2luIGxvY2sgYnkgdGhlbXNlbHZlcy4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMsIHdvcmtlciB0aHJlYWRzIGRpc2FwcGVhciB0cmlnZ2VyaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIHByb2JsZW0gb2YgdW5yZWxlYXNlZCBmb3Jram9pbiBsb2NrIGFzIGRlc2NyaWJlZCBiZWxvdy4KKworICAgICAgICAgICAgICAgIC8vIEEgd29ya2VyIHRocmVhZCBjYW4gdGFrZSB0aGUgZm9ya2pvaW4gbG9jaworICAgICAgICAgICAgICAgIC8vIGluIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoKS0+X19rbXBfcm1sX2RlY3JlYXNlX2xvYWRfYmVmb3JlX3NsZWVwKCkuCisgICAgICAgICAgICAgICAgLy8gVGhlIHByb2JsZW0gY29tZXMgdXAgaWYgdGhhdCB3b3JrZXIgdGhyZWFkIGJlY29tZXMgZGVhZAorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdCByZWxlYXNlcyB0aGUgZm9ya2pvaW4gbG9jay4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZm9ya2pvaW4gbG9jayByZW1haW5zIHRha2VuLCB3aGlsZSB0aGUgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nIERsbE1haW4oKS0+UFJPQ0VTU19ERVRBQ0gtPl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCkgYmVsb3cKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSB0byB0YWtlIHRoZSBmb3Jram9pbiBsb2NrIGFuZCB3aWxsIGFsd2F5cyBmYWlsLAorICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmV2ZXIgZmluaXNoIFtub3JtYWxseV0uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzY2VuYXJpbyBpcyBwb3NzaWJsZSBpZiBfX2ttcGNfZW5kKCkgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgaXQncyBub3QgYSBjb3JuZXIgY2FzZSwgYnV0IGNvbW1vbiBjYXNlczoKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBhbiBhbHRlcm5hdGl2ZSBjb21waWxlcjsKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBpY2wgYnV0IHdpdGhvdXQgL1FvcGVubXAgKGFwcGxpY2F0aW9uIHdpdGggcGx1Z2lucyk7CisgICAgICAgICAgICAgICAgLy8gLSBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzIGJ5IGNhbGxpbmcgQyBleGl0KCksIEZvcnRyYW4gQ0FMTCBFWElUKCkgb3IgRm9ydHJhbiBTVE9QLgorICAgICAgICAgICAgICAgIC8vIC0gYWxpdmUgZm9yZWlnbiB0aHJlYWQgcHJldmVudGVkIF9fa21wY19lbmQgZnJvbSBkb2luZyBjbGVhbnVwLgorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogISEhIHRvIGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlci4KKyAgICAgICAgICAgICAgICBfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFRIUkVBRF9BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIC8qIGlmIHdlIHdhbnRlZCB0byByZWdpc3RlciBuZXcgc2libGluZ3MgYWxsIHRoZSB0aW1lIGhlcmUgY2FsbAorICAgICAgICAgICAgICogX19rbXBfZ2V0X2d0aWQoKTsgKi8KKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogVEhSRUFEX0RFVEFDSCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApKTsKKworICAgICAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBLTVBfRFlOQU1JQ19MSUIgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ2hhbmdlIHRoZSBsaWJyYXJ5IHR5cGUgdG8gInN0YXR1cyIgYW5kIHJldHVybiB0aGUgb2xkIHR5cGUgKi8KKy8qIGNhbGxlZCBmcm9tIHdpdGhpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lcyB3aGVyZSBfX2ttcF9pbml0el9sb2NrIGlzIGhlbGQgKi8KK2ludAorX19rbXBfY2hhbmdlX2xpYnJhcnkoIGludCBzdGF0dXMgKQoreworICAgIGludCBvbGRfc3RhdHVzOworCisgICAgb2xkX3N0YXR1cyA9IF9fa21wX3lpZWxkX2luaXQgJiAxOyAgLy8gY2hlY2sgd2hldGhlciBLTVBfTElCUkFSWT10aHJvdWdocHV0IChldmVuIGluaXQgY291bnQpCisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIF9fa21wX3lpZWxkX2luaXQgfD0gMTsgIC8vIHRocm91Z2hwdXQgPT4gdHVybmFyb3VuZCAob2RkIGluaXQgY291bnQpCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF95aWVsZF9pbml0ICY9IH4xOyAvLyB0dXJuYXJvdW5kID0+IHRocm91Z2hwdXQgKGV2ZW4gaW5pdCBjb3VudCkKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3N0YXR1czsgIC8vIHJldHVybiBwcmV2aW91cyBzZXR0aW5nIG9mIHdoZXRoZXIgS01QX0xJQlJBUlk9dGhyb3VnaHB1dAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBfX2ttcF9wYXJhbGxlbF9kZW8gLS0KKyAqIFdhaXQgdW50aWwgaXQncyBvdXIgdHVybi4KKyAqLwordm9pZAorX19rbXBfcGFyYWxsZWxfZGVvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyNlbmRpZiAvKiBCVUlMRF9QQVJBTExFTF9PUkRFUkVEICovCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcm9vdC0+ci5yX2FjdGl2ZSApCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwgbG9jX3JlZiwgTlVMTCwgMCApOworI2Vsc2UKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwgbG9jX3JlZiwgTlVMTCApOworI2VuZGlmCisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiggIXRlYW0tPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRlYW0tPnQudF9vcmRlcmVkLmR0LnRfdmFsdWUsIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSwgS01QX0VRLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogX19rbXBfcGFyYWxsZWxfZHhvIC0tCisgKiBTaWduYWwgdGhlIG5leHQgdGFzay4KKyAqLworCit2b2lkCitfX2ttcF9wYXJhbGxlbF9keG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICAgIGludCB0aWQgPSAgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290LT5yLnJfYWN0aXZlICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLCBsb2NfcmVmICk7CisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiAoICEgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIHVzZSB0aGUgdGlkIG9mIHRoZSBuZXh0IHRocmVhZCBpbiB0aGlzIHRlYW0gKi8KKyAgICAgICAgLyogVE9ETyByZXBsZWFjZSB3aXRoIGdlbmVyYWwgcmVsZWFzZSBwcm9jZWR1cmUgKi8KKyAgICAgICAgdGVhbS0+dC50X29yZGVyZWQuZHQudF92YWx1ZSA9ICgodGlkICsgMSkgJSB0ZWFtLT50LnRfbnByb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKSB7CisgICAgICAgICAgICAvKiBhY2NlcHQgYmxhbWUgZm9yICJvcmRlcmVkIiB3YWl0aW5nICovCisgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkKSgKKyAgICAgICAgICAgICAgICB0aGlzX3RocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhlIEJBUlJJRVIgZm9yIGEgU0lOR0xFIHByb2Nlc3Mgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworCitpbnQKK19fa21wX2VudGVyX3NpbmdsZSggaW50IGd0aWQsIGlkZW50X3QgKmlkX3JlZiwgaW50IHB1c2hfd3MgKQoreworICAgIGludCBzdGF0dXM7CisgICAga21wX2luZm9fdCAqdGg7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKworICAgIGlmKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgdGggICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgc3RhdHVzID0gMDsKKworICAgIHRoLT50aC50aF9pZGVudCA9IGlkX3JlZjsKKworICAgIGlmICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIHN0YXR1cyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2ludDMyIG9sZF90aGlzID0gdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworCisgICAgICAgICsrdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworICAgICAgICAvKiB0cnkgdG8gc2V0IHRlYW0gY291bnQgdG8gdGhyZWFkIGNvdW50LS1zdWNjZXNzIG1lYW5zIHRocmVhZCBnb3QgdGhlCisgICAgICAgICAgIHNpbmdsZSBibG9jaworICAgICAgICAqLworICAgICAgICAvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisgICAgICAgIHN0YXR1cyA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmdGVhbS0+dC50X2NvbnN0cnVjdCwgb2xkX3RoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QpOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgJiYgS01QX01BU1RFUl9HVElEKGd0aWQpICYmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDEgKQorICAgICAgICB7ICAgLy8gT25seSByZXBvcnQgbWV0YWRhdGEgYnkgbWFzdGVyIG9mIGFjdGl2ZSB0ZWFtIGF0IGxldmVsIDEKKyAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9zaW5nbGUoIGlkX3JlZiApOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIH0KKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmIChzdGF0dXMgJiYgcHVzaF93cykgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGd0aWQsIGN0X3BzaW5nbGUsIGlkX3JlZiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfY2hlY2tfd29ya3NoYXJlKCBndGlkLCBjdF9wc2luZ2xlLCBpZF9yZWYgKTsKKyAgICAgICAgfQorICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQoIGd0aWQgKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK19fa21wX2V4aXRfc2luZ2xlKCBpbnQgZ3RpZCApCit7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zaW5nbGVfZW5kKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBjdF9wc2luZ2xlLCBOVUxMICk7Cit9CisKKworLyoKKyAqIGRldGVybWluZSBpZiB3ZSBjYW4gZ28gcGFyYWxsZWwgb3IgbXVzdCB1c2UgYSBzZXJpYWxpemVkIHBhcmFsbGVsIHJlZ2lvbiBhbmQKKyAqIGhvdyBtYW55IHRocmVhZHMgd2UgY2FuIHVzZQorICogc2V0X25wcm9jIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtCisgKiByZXR1cm5zIDAgaWYgd2Ugc2hvdWxkIHNlcmlhbGl6ZSBvciBvbmx5IHVzZSBvbmUgdGhyZWFkLAorICogb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UKKyAqIFRoZSBmb3Jram9pbiBsb2NrIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4KKyAqLworc3RhdGljIGludAorX19rbXBfcmVzZXJ2ZV90aHJlYWRzKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICpwYXJlbnRfdGVhbSwKKyAgIGludCBtYXN0ZXJfdGlkLCBpbnQgc2V0X250aHJlYWRzCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgLCBpbnQgZW50ZXJfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworKQoreworICAgIGludCBjYXBhY2l0eTsKKyAgICBpbnQgbmV3X250aHJlYWRzOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCAmJiBwYXJlbnRfdGVhbSApOworCisgICAgLy8KKyAgICAvLyBJZiBkeW4tdmFyIGlzIHNldCwgZHluYW1pY2FsbHkgYWRqdXN0IHRoZSBudW1iZXIgb2YgZGVzaXJlZCB0aHJlYWRzLAorICAgIC8vIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSBkeW5hbWljX21vZGUuCisgICAgLy8KKyAgICBuZXdfbnRocmVhZHMgPSBzZXRfbnRocmVhZHM7CisgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApICkgeworICAgICAgICA7CisgICAgfQorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19sb2FkX2JhbGFuY2UgKSB7CisgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYyggcm9vdCwgc2V0X250aHJlYWRzICk7CisgICAgICAgIGlmICggbmV3X250aHJlYWRzID09IDEgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBsb2FkIGJhbGFuY2UgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgbG9hZCBiYWxhbmNlIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCwgbmV3X250aHJlYWRzICkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY190aHJlYWRfbGltaXQgKSB7CisgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2F2YWlsX3Byb2MgLSBfX2ttcF9udGggKyAocm9vdC0+ci5yX2FjdGl2ZSA/IDEKKyAgICAgICAgICA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPD0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHRocmVhZCBsaW1pdCByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPCBzZXRfbnRocmVhZHMgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCB0aHJlYWQgbGltaXQgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkLCBuZXdfbnRocmVhZHMgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSBzZXRfbnRocmVhZHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfcmFuZG9tICkgeworICAgICAgICBpZiAoIHNldF9udGhyZWFkcyA+IDIgKSB7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSBfX2ttcF9nZXRfcmFuZG9tKCBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHNbbWFzdGVyX3RpZF0gKTsKKyAgICAgICAgICAgIG5ld19udGhyZWFkcyA9ICggbmV3X250aHJlYWRzICUgc2V0X250aHJlYWRzICkgKyAxOworICAgICAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBkeW5hbWljIHJhbmRvbSByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGR5bmFtaWMgcmFuZG9tIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aWQsIG5ld19udGhyZWFkcyApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVCggMCApOworICAgIH0KKworICAgIC8vCisgICAgLy8gUmVzcGVjdCBLTVBfQUxMX1RIUkVBRFMsIEtNUF9NQVhfVEhSRUFEUywgT01QX1RIUkVBRF9MSU1JVC4KKyAgICAvLworICAgIGlmICggX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApID4gX19rbXBfbWF4X250aCApIHsKKyAgICAgICAgaW50IHRsX250aHJlYWRzID0gX19rbXBfbWF4X250aCAtIF9fa21wX250aCArICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgICAgIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgIGlmICggdGxfbnRocmVhZHMgPD0gMCApIHsKKyAgICAgICAgICAgIHRsX250aHJlYWRzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIGR5bi12YXIgaXMgZmFsc2UsIGVtaXQgYSAxLXRpbWUgd2FybmluZy4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApCisgICAgICAgICAgJiYgKCAhIF9fa21wX3Jlc2VydmVfd2FybiApICkgeworICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgdGxfbnRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBVbnNldF9BTExfVEhSRUFEUyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGlmICggdGxfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIEtNUF9BTExfVEhSRUFEUyByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgS01QX0FMTF9USFJFQURTIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICBtYXN0ZXJfdGlkLCB0bF9udGhyZWFkcyApKTsKKyAgICAgICAgbmV3X250aHJlYWRzID0gdGxfbnRocmVhZHM7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIENoZWNrIGlmIHRoZSB0aHJlYWRzIGFycmF5IGlzIGxhcmdlIGVub3VnaCwgb3IgbmVlZHMgZXhwYW5kaW5nLgorICAgIC8vCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gX19rbXBfcmVnaXN0ZXJfcm9vdCgpIGFib3V0IHRoZSBhZGp1c3RtZW50IGlmCisgICAgLy8gX19rbXBfdGhyZWFkc1swXSA9PSBOVUxMLgorICAgIC8vCisgICAgY2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgIGlmICggVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLWNhcGFjaXR5OworICAgIH0KKyAgICBpZiAoIF9fa21wX250aCArIG5ld19udGhyZWFkcyAtICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSA+IGNhcGFjaXR5ICkgeworICAgICAgICAvLworICAgICAgICAvLyBFeHBhbmQgdGhlIHRocmVhZHMgYXJyYXkuCisgICAgICAgIC8vCisgICAgICAgIGludCBzbG90c1JlcXVpcmVkID0gX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSAtIGNhcGFjaXR5OworICAgICAgICBpbnQgc2xvdHNBZGRlZCA9IF9fa21wX2V4cGFuZF90aHJlYWRzKHNsb3RzUmVxdWlyZWQsIHNsb3RzUmVxdWlyZWQpOworICAgICAgICBpZiAoIHNsb3RzQWRkZWQgPCBzbG90c1JlcXVpcmVkICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZSB0aHJlYWRzIGFycmF5IHdhcyBub3QgZXhwYW5kZWQgZW5vdWdoLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG5ld19udGhyZWFkcyAtPSAoIHNsb3RzUmVxdWlyZWQgLSBzbG90c0FkZGVkICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCBuZXdfbnRocmVhZHMgPj0gMSApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgZHluLXZhciBpcyBmYWxzZSwgZW1pdCBhIDEtdGltZSB3YXJuaW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggISBnZXRfX2R5bmFtaWNfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKQorICAgICAgICAgICAgICAmJiAoICEgX19rbXBfcmVzZXJ2ZV93YXJuICkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBTZXRfQUxMX1RIUkVBRFBSSVZBVEUsIF9fa21wX3RwX2NhcGFjaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBTeXN0ZW1MaW1pdE9uVGhyZWFkcyApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIG5ld19udGhyZWFkcyA9PSAxICkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBzZXJpYWxpemluZyB0ZWFtIGFmdGVyIHJlY2xhaW1pbmcgZGVhZCByb290cyBhbmQgcmVjaGVja2luZzsgcmVxdWVzdGVkICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBzZXRfbnRocmVhZHMgKSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBhbGxvY2F0aW5nICVkIHRocmVhZHM7IHJlcXVlc3RlZCAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfbnRocmVhZHMsIHNldF9udGhyZWFkcyApKTsKKyAgICByZXR1cm4gbmV3X250aHJlYWRzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBhbGxvY2F0ZSB0aHJlYWRzIGZyb20gdGhlIHRocmVhZCBwb29sIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgbmV3IHRlYW0gKi8KKy8qIHdlIGFyZSBhc3N1cmVkIHRoYXQgdGhlcmUgYXJlIGVub3VnaCB0aHJlYWRzIGF2YWlsYWJsZSwgYmVjYXVzZSB3ZQorICogY2hlY2tlZCBvbiB0aGF0IGVhcmxpZXIgd2l0aGluIGNyaXRpY2FsIHNlY3Rpb24gZm9ya2pvaW4gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2ZvcmtfdGVhbV90aHJlYWRzKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCwgaW50IG1hc3Rlcl9ndGlkICkKK3sKKyAgICBpbnQgICAgICAgICBpOworICAgIGludCB1c2VfaG90X3RlYW07CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZm9ya190ZWFtX3RocmVhZHM6IG5ld19ucHJvY3MgPSAlZFxuIiwgdGVhbS0+dC50X25wcm9jICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBmaXJzdCwgbGV0J3Mgc2V0dXAgdGhlIG1hc3RlciB0aHJlYWQgKi8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IDA7CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtICAgICAgICAgICAgPSB0ZWFtOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYyAgICAgID0gdGVhbS0+dC50X25wcm9jOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9tYXN0ZXIgICAgID0gbWFzdGVyX3RoOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gRkFMU0U7CisgICAgbWFzdGVyX3RoLT50aC50aF9kaXNwYXRjaCAgICAgICAgPSAmIHRlYW0tPnQudF9kaXNwYXRjaFsgMCBdOworCisgICAgLyogbWFrZSBzdXJlIHdlIGFyZSBub3QgdGhlIG9wdGltaXplZCBob3QgdGVhbSAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgdXNlX2hvdF90ZWFtID0gMDsKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtcyA9IG1hc3Rlcl90aC0+dGgudGhfaG90X3RlYW1zOworICAgIGlmKCBob3RfdGVhbXMgKSB7ICAvLyBob3QgdGVhbXMgYXJyYXkgaXMgbm90IGFsbG9jYXRlZCBpZiBLTVBfSE9UX1RFQU1TX01BWF9MRVZFTD0wCisgICAgICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgLSAxOyAgICAvLyBpbmRleCBpbiBhcnJheSBvZiBob3QgdGVhbXMKKyAgICAgICAgaWYoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeyAgICAvLyBhcmUgd2UgaW5zaWRlIHRoZSB0ZWFtcz8KKyAgICAgICAgICAgIGlmKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSApIHsKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2ZfbWFzdGVycworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsID09IHRlYW0tPnQudF9sZXZlbCApIHsKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2Zfd29ya2VycyBiZWZvcmUgdGhlIHBhcmFsbGVsCisgICAgICAgICAgICB9ICAgICAgICAgICAgLy8gdGVhbS0+dC50X2xldmVsIHdpbGwgYmUgaW5jcmVhc2VkIGluc2lkZSBwYXJhbGxlbAorICAgICAgICB9CisgICAgICAgIGlmKCBsZXZlbCA8IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKSB7CisgICAgICAgICAgICBpZiggaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSApIHsKKyAgICAgICAgICAgICAgICAvLyBob3QgdGVhbSBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBmb3IgZ2l2ZW4gbGV2ZWwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gPT0gdGVhbSk7CisgICAgICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMTsgLy8gdGhlIHRlYW0gaXMgcmVhZHkgdG8gdXNlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDA7IC8vIEFDOiB0aHJlYWRzIGFyZSBub3QgYWxsb2NhdGVkIHlldAorICAgICAgICAgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gPSB0ZWFtOyAvLyByZW1lbWJlciBuZXcgaG90IHRlYW0KKyAgICAgICAgICAgICAgICBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHVzZV9ob3RfdGVhbSA9IHRlYW0gPT0gcm9vdC0+ci5yX2hvdF90ZWFtOworI2VuZGlmCisgICAgaWYgKCAhdXNlX2hvdF90ZWFtICkgeworCisgICAgICAgIC8qIGluc3RhbGwgdGhlIG1hc3RlciB0aHJlYWQgKi8KKyAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIDAgXSAgICA9IG1hc3Rlcl90aDsKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBtYXN0ZXJfdGgsIHRlYW0sIDAsIG1hc3Rlcl9ndGlkICk7CisKKyAgICAgICAgLyogbm93LCBpbnN0YWxsIHRoZSB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICBmb3IgKCBpPTEgOyAgaSA8IHRlYW0tPnQudF9ucHJvYyA7IGkrKyApIHsKKworICAgICAgICAgICAgLyogZm9yayBvciByZWFsbG9jYXRlIGEgbmV3IHRocmVhZCBhbmQgaW5zdGFsbCBpdCBpbiB0ZWFtICovCisgICAgICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIHJvb3QsIHRlYW0sIGkgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWyBpIF0gPSB0aHI7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHIgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoci0+dGgudGhfdGVhbSA9PSB0ZWFtICk7CisgICAgICAgICAgICAvKiBhbGlnbiB0ZWFtIGFuZCB0aHJlYWQgYXJyaXZlZCBzdGF0ZXMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX3RlYW1fdGhyZWFkczogVCMlZCglZDolZCkgaW5pdCBhcnJpdmVkIFQjJWQoJWQ6JWQpIGpvaW4gPSVsbHUsIHBsYWluPSVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggMCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggaSwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBic19wbGFpbl9iYXJyaWVyIF0uYl9hcnJpdmVkICkgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzazsKKyAgICAgICAgICAgIHRoci0+dGgudGhfdGVhbXNfbGV2ZWwgICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbDsKKyAgICAgICAgICAgIHRoci0+dGgudGhfdGVhbXNfc2l6ZSAgICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplOworI2VuZGlmCisgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgdGhyZWFkcycgYmFycmllciBkYXRhLgorICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IHRlYW0tPnQudF90aHJlYWRzWyBpIF0tPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgYmFsaWduWyBiIF0uYmIuYl9hcnJpdmVkICAgICAgICA9IHRlYW0tPnQudF9iYXJbIGIgXS5iX2Fycml2ZWQ7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfd29ya2VyX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9OyAvLyBmb3IgYgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIHRlYW0gKTsKKyNlbmRpZgorCisgICAgfQorCisgICAgS01QX01CKCk7Cit9CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLworLy8gUHJvcGFnYXRlIGFueSBjaGFuZ2VzIHRvIHRoZSBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVycyBvdXQgdG8gdGhlIHRlYW0KKy8vIFdlIHRyeSB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3cml0ZXMgdG8gdGhlIHJlbGV2YW50IGNhY2hlIGxpbmUgaW4gdGhlIHRlYW0gc3RydWN0dXJlLAorLy8gc28gd2UgZG9uJ3QgbWFrZSBjaGFuZ2VzIHVubGVzcyB0aGV5IGFyZSBuZWVkZWQuCisvLworaW5saW5lIHN0YXRpYyB2b2lkCitwcm9wYWdhdGVGUENvbnRyb2woa21wX3RlYW1fdCAqIHRlYW0pCit7CisgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgKSB7CisgICAgICAgIGttcF9pbnQxNiB4ODdfZnB1X2NvbnRyb2xfd29yZDsKKyAgICAgICAga21wX3VpbnQzMiBteGNzcjsKKworICAgICAgICAvLyBHZXQgbWFzdGVyIHZhbHVlcyBvZiBGUFUgY29udHJvbCBmbGFncyAoYm90aCBYODcgYW5kIHZlY3RvcikKKyAgICAgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ4ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9zdG9yZV9teGNzciggJm14Y3NyICk7CisgICAgICAgIG14Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKworICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCBsb29raW5nIGF0IHRfZnBfY29udHJvbF9zYXZlZCBoZXJlLgorICAgICAgICAvLyBJZiBpdCBpcyBUUlVFLCB3ZSBzdGlsbCBoYXZlIHRvIHVwZGF0ZSB0aGUgdmFsdWVzIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHdlIG5vdyBoYXZlLgorICAgICAgICAvLyBJZiBpdCBpcyBGQUxTRSB3ZSBkaWRuJ3Qgc2F2ZSBhbnl0aGluZyB5ZXQsIGJ1dCBvdXIgb2JqZWN0aXZlIGlzIHRoZSBzYW1lLiBXZSBoYXZlIHRvIGVuc3VyZQorICAgICAgICAvLyB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIHRlYW0gYXJlIHRoZSBzYW1lIGFzIHRob3NlIHdlIGhhdmUuCisgICAgICAgIC8vIFNvLCB0aGlzIGNvZGUgYWNoaWV2ZXMgd2hhdCB3ZSBuZWVkIHdoZXRoZXIgb3Igbm90IHRfZnBfY29udHJvbF9zYXZlZCBpcyB0cnVlLgorICAgICAgICAvLyBCeSBjaGVja2luZyB3aGV0aGVyIHRoZSB2YWx1ZSBuZWVkcyB1cGRhdGluZyB3ZSBhdm9pZCB1bm5lY2Vzc2FyeSB3cml0ZXMgdGhhdCB3b3VsZCBwdXQgdGhlCisgICAgICAgIC8vIGNhY2hlLWxpbmUgaW50byBhIHdyaXR0ZW4gc3RhdGUsIGNhdXNpbmcgYWxsIHRocmVhZHMgaW4gdGhlIHRlYW0gdG8gaGF2ZSB0byByZWFkIGl0IGFnYWluLgorICAgICAgICBpZiAoIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCAhPSB4ODdfZnB1X2NvbnRyb2xfd29yZCApIHsKKyAgICAgICAgICAgIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCA9IHg4N19mcHVfY29udHJvbF93b3JkOworICAgICAgICB9CisgICAgICAgIGlmICggdGVhbS0+dC50X214Y3NyICE9IG14Y3NyICkgeworICAgICAgICAgICAgdGVhbS0+dC50X214Y3NyID0gbXhjc3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgdmFsdWUsIG90aGVyIGNvZGUgaW4gdGhlIHJ1bnRpbWUgd2FudHMgdG8ga25vdyB3aGV0aGVyIGl0IHNob3VsZCByZXN0b3JlIHRoZW0uCisgICAgICAgIC8vIFNvIHdlIG11c3QgZW5zdXJlIGl0IGlzIGNvcnJlY3QuCisgICAgICAgIGlmICghdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQpIHsKKyAgICAgICAgICAgIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gU2ltaWxhcmx5IGhlcmUuIERvbid0IHdyaXRlIHRvIHRoaXMgY2FjaGUtbGluZSBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUgdW5sZXNzIHdlIGhhdmUgdG8uCisgICAgICAgIGlmICh0ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCkKKyAgICAgICAgICAgIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkID0gRkFMU0U7CisgICAgfQorfQorCisvLyBEbyB0aGUgb3Bwb3NpdGUsIHNldHRpbmcgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyB0byB0aGUgdXBkYXRlZCB2YWx1ZXMgZnJvbSB0aGUgdGVhbS4KK2lubGluZSBzdGF0aWMgdm9pZAordXBkYXRlSFdGUENvbnRyb2woa21wX3RlYW1fdCAqIHRlYW0pCit7CisgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE9ubHkgcmVzZXQgdGhlIGZwIGNvbnRyb2wgcmVncyBpZiB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkIGluIHRoZSB0ZWFtLgorICAgICAgICAvLyB0aGUgcGFyYWxsZWwgcmVnaW9uIHRoYXQgd2UgYXJlIGV4aXRpbmcuCisgICAgICAgIC8vCisgICAgICAgIGttcF9pbnQxNiB4ODdfZnB1X2NvbnRyb2xfd29yZDsKKyAgICAgICAga21wX3VpbnQzMiBteGNzcjsKKyAgICAgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ4ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9zdG9yZV9teGNzciggJm14Y3NyICk7CisgICAgICAgIG14Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKworICAgICAgICBpZiAoIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCAhPSB4ODdfZnB1X2NvbnRyb2xfd29yZCApIHsKKyAgICAgICAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ0ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGVhbS0+dC50X214Y3NyICE9IG14Y3NyICkgeworICAgICAgICAgICAgX19rbXBfbG9hZF9teGNzciggJnRlYW0tPnQudF9teGNzciApOworICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKKyMgZGVmaW5lIHByb3BhZ2F0ZUZQQ29udHJvbCh4KSAoKHZvaWQpMCkKKyMgZGVmaW5lIHVwZGF0ZUhXRlBDb250cm9sKHgpICAoKHZvaWQpMCkKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgcmVhbGxvYyApOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCisKKy8qCisgKiBSdW4gYSBwYXJhbGxlbCByZWdpb24gdGhhdCBoYXMgYmVlbiBzZXJpYWxpemVkLCBzbyBydW5zIG9ubHkgaW4gYSB0ZWFtIG9mIHRoZSBzaW5nbGUgbWFzdGVyIHRocmVhZC4KKyAqLwordm9pZAorX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIGttcF90ZWFtX3QgKnNlcmlhbF90ZWFtOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBjYWxsZWQgYnkgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvKiBTa2lwIGFsbCB0aGlzIGNvZGUgZm9yIGF1dG9wYXIgc2VyaWFsaXplZCBsb29wcyBzaW5jZSBpdCByZXN1bHRzIGluCisgICAgICAgdW5hY2NlcHRhYmxlIG92ZXJoZWFkICovCisgICAgaWYoIGxvYyAhPSBOVUxMICYmIChsb2MtPmZsYWdzICYgS01QX0lERU5UX0FVVE9QQVIgKSApCisgICAgICAgIHJldHVybjsKKworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aGlzX3RociAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAgc2VyaWFsX3RlYW0gID0gdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtOworCisgICAgLyogdXRpbGl6ZSB0aGUgc2VyaWFsaXplZCB0ZWFtIGhlbGQgYnkgdGhpcyB0aHJlYWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSApOworICAgIEtNUF9NQigpOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSA9PSBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcHVzaGluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwLCBuZXcgdGFza190ZWFtID0gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyLT50aC50aF90ZWFtICkgKTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQ7CisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9PSBwcm9jX2JpbmRfZmFsc2UgKSB7CisgICAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSB3YXMgc3BlY2lmaWVkLCBzbyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgLy8gb2YgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24uCisgICAgICAgIC8vCisgICAgICAgIHByb2NfYmluZCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kOworICAgIH0KKyAgICAvLworICAgIC8vIFJlc2V0IGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbgorICAgIC8vCisgICAgdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtICE9IHNlcmlhbF90ZWFtICkgeworICAgICAgICAvLyBOZXN0ZWQgbGV2ZWwgd2lsbCBiZSBhbiBpbmRleCBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5CisgICAgICAgIGludCBsZXZlbCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7CisKKyAgICAgICAgaWYoIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIC8qIHRoaXMgc2VyaWFsIHRlYW0gd2FzIGFscmVhZHkgdXNlZAorICAgICAgICAgICAgICogVE9ETyBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBtYWtpbmcgdGhpcyBsb2NrcyBtb3JlIHNwZWNpZmljICovCisgICAgICAgICAgICBrbXBfdGVhbV90ICpuZXdfdGVhbTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQgPSBfX29tcHRfcGFyYWxsZWxfaWRfbmV3KGdsb2JhbF90aWQpOworI2VuZGlmCisKKyAgICAgICAgICAgIG5ld190ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbSh0aGlzX3Roci0+dGgudGhfcm9vdCwgMSwgMSwKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2JpbmQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCBuZXdfdGVhbSApOworCisgICAgICAgICAgICAvKiBzZXR1cCBuZXcgc2VyaWFsaXplZCB0ZWFtIGFuZCBpbnN0YWxsIGl0ICovCisgICAgICAgICAgICBuZXdfdGVhbS0+dC50X3RocmVhZHNbMF0gPSB0aGlzX3RocjsKKyAgICAgICAgICAgIG5ld190ZWFtLT50LnRfcGFyZW50ID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBzZXJpYWxfdGVhbSA9IG5ld190ZWFtOworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtID0gc2VyaWFsX3RlYW07CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgYWxsb2NhdGVkIG5ldyBzZXJpYWwgdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSApICk7CisKKworICAgICAgICAgICAgLyogVE9ETyB0aGUgYWJvdmUgYnJlYWtzIHRoZSByZXF1aXJlbWVudCB0aGF0IGlmIHdlIHJ1biBvdXQgb2YKKyAgICAgICAgICAgICAqIHJlc291cmNlcywgdGhlbiB3ZSBjYW4gc3RpbGwgZ3VhcmFudGVlIHRoYXQgc2VyaWFsaXplZCB0ZWFtcworICAgICAgICAgICAgICogYXJlIG9rLCBzaW5jZSB3ZSBtYXkgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmV1c2luZyBjYWNoZWQgc2VyaWFsIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0gKSApOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgaGF2ZSB0byBpbml0aWFsaXplIHRoaXMgc2VyaWFsIHRlYW0gKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9PSB0aGlzX3RociApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAhPSBzZXJpYWxfdGVhbSApOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2lkZW50ICAgICAgICAgPSBsb2M7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCAgICA9IDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfbnByb2MgICAgICAgICA9IDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfcGFyZW50ICAgICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X3NjaGVkICAgICAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NjaGVkOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbSAgICAgICAgICAgPSBzZXJpYWxfdGVhbTsKKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9tYXN0ZXJfdGlkICAgID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkOworCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjZCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisgICAgICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3Rociwgc2VyaWFsX3RlYW0sIDAgKTsKKworICAgICAgICAvKiBUT0RPOiBHRUg6IGRvIHRoZSBJQ1ZzIHdvcmsgZm9yIG5lc3RlZCBzZXJpYWxpemVkIHRlYW1zPyAgRG9uJ3Qgd2UgbmVlZCBhbiBpbXBsaWNpdCB0YXNrIGZvcgorICAgICAgICAgICBlYWNoIHNlcmlhbGl6ZWQgdGFzayByZXByZXNlbnRlZCBieSB0ZWFtLT50LnRfc2VyaWFsaXplZD8gKi8KKyAgICAgICAgY29weV9pY3ZzKAorICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9wYXJlbnQtPnRkX2ljdnMgKTsKKworICAgICAgICAvLyBUaHJlYWQgdmFsdWUgZXhpc3RzIGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkgZm9yIHRoZSBuZXh0IG5lc3RlZCBsZXZlbAorICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9udGgudXNlZCAmJiAoIGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9udGgudXNlZCApICkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyA9IF9fa21wX25lc3RlZF9udGgubnRoWyBsZXZlbCArIDEgXTsKKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kCisgICAgICAgICAgICAgICAgPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbIGxldmVsICsgMSBdOworICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICBzZXJpYWxfdGVhbS0+dC50X3BrZm4gPSAobWljcm90YXNrX3QpKCB+MCApOyAvLyBGb3IgdGhlIGRlYnVnZ2VyLgorI2VuZGlmCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9IDA7CisKKyAgICAgICAgLyogc2V0IHRocmVhZCBjYWNoZSB2YWx1ZXMgKi8KKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MgICAgID0gMTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyICAgID0gdGhpc190aHI7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSAxOworCisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfbGV2ZWwgICAgICAgID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9sZXZlbCArIDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9hY3RpdmVfbGV2ZWw7CisKKyAgICAgICAgcHJvcGFnYXRlRlBDb250cm9sIChzZXJpYWxfdGVhbSk7CisKKyAgICAgICAgLyogY2hlY2sgaWYgd2UgbmVlZCB0byBhbGxvY2F0ZSBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIGlmICggIXNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyICkgeworICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCApICk7CisgICAgICAgIH0KKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaDsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZCA9IF9fb21wdF9wYXJhbGxlbF9pZF9uZXcoZ2xvYmFsX3RpZCk7CisgICAgICAgIF9fb21wdF90ZWFtX2Fzc2lnbl9pZChzZXJpYWxfdGVhbSwgb21wdF9wYXJhbGxlbF9pZCk7CisjZW5kaWYKKworICAgICAgICBLTVBfTUIoKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRoaXMgc2VyaWFsaXplZCB0ZWFtIGlzIGFscmVhZHkgYmVpbmcgdXNlZCwKKyAgICAgICAgICogdGhhdCdzIGZpbmUsIGp1c3QgYWRkIGFub3RoZXIgbmVzdGVkIGxldmVsICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtID09IHNlcmlhbF90ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkcyApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIgKTsKKyAgICAgICAgKysgc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgICAgIC8vIE5lc3RlZCBsZXZlbCB3aWxsIGJlIGFuIGluZGV4IGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkKKyAgICAgICAgaW50IGxldmVsID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgLy8gVGhyZWFkIHZhbHVlIGV4aXN0cyBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5IGZvciB0aGUgbmV4dCBuZXN0ZWQgbGV2ZWwKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFsgbGV2ZWwgKyAxIF07CisgICAgICAgIH0KKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9sZXZlbCsrOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIGluY3JlYXNpbmcgbmVzdGluZyBsZXZlbCBvZiBzZXJpYWwgdGVhbSAlcCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtLCBzZXJpYWxfdGVhbS0+dC50X2xldmVsICkgKTsKKworICAgICAgICAvKiBhbGxvY2F0ZS9wdXNoIGRpc3BhdGNoIGJ1ZmZlcnMgc3RhY2sgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICAgICAgeworICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKiBkaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKQorICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKTsKKyAgICAgICAgICAgIGRpc3BfYnVmZmVyLT5uZXh0ID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IGRpc3BfYnVmZmVyOworICAgICAgICB9CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2g7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKCBnbG9iYWxfdGlkLCBOVUxMICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgLy8gTWFyayB0aGUgc3RhcnQgb2YgdGhlICJwYXJhbGxlbCIgcmVnaW9uIGZvciBWVHVuZS4gT25seSB1c2Ugb25lIG9mIGZyYW1lIG5vdGlmaWNhdGlvbiBzY2hlbWUgYXQgdGhlIG1vbWVudAorICAgIGlmICggc2VyaWFsX3RlYW0tPnQudF9sZXZlbCA9PSAxCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgJiYgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMCisjZW5kaWYKKyAgICApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBTYXZlIHRoZSBzdGFydCBvZiB0aGUgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBUaGlzIGlzIHRoZSBmcmFtZSBiZWdpbiBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICBpZiAoICggX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmCisgICAgICAgICAgICAoIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMSApICkKKyAgICAgICAgeworICAgICAgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfcmVnaW9uX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZV9zZXJpYWxpemVkID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICB9IGVsc2UgLy8gb25seSBvbmUgbm90aWZpY2F0aW9uIHNjaGVtZSAoZWl0aGVyICJzdWJtaXQiIG9yICJmb3JraW5nL2pvaW5lZCIsIG5vdCBib3RoKQorI2VuZGlmCisgICAgICAgIGlmICggKCBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmCisgICAgICAgICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzICYmICEgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgICAgICAvLyAwIC0gbm8gYmFycmllcnM7IDEgLSBzZXJpYWxpemVkIHBhcmFsbGVsCisgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcoIGdsb2JhbF90aWQsIHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jLCAwLCAxICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisvKiBtb3N0IG9mIHRoZSB3b3JrIGZvciBhIGZvcmsgKi8KKy8qIHJldHVybiB0cnVlIGlmIHdlIHJlYWxseSB3ZW50IHBhcmFsbGVsLCBmYWxzZSBpZiBzZXJpYWxpemVkICovCitpbnQKK19fa21wX2ZvcmtfY2FsbCgKKyAgICBpZGVudF90ICAgKiBsb2MsCisgICAgaW50ICAgICAgICAgZ3RpZCwKKyAgICBlbnVtIGZvcmtfY29udGV4dF9lICBjYWxsX2NvbnRleHQsIC8vIEludGVsLCBHTlUsIC4uLgorICAgIGttcF9pbnQzMiAgIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgdm9pZCAgICAgICAqdW53cmFwcGVkX3Rhc2ssCisjZW5kaWYKKyAgICBtaWNyb3Rhc2tfdCBtaWNyb3Rhc2ssCisgICAgbGF1bmNoX3QgICAgaW52b2tlciwKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgIHZhX2xpc3QgICAqIGFwCisjZWxzZQorICAgIHZhX2xpc3QgICAgIGFwCisjZW5kaWYKKyAgICApCit7CisgICAgdm9pZCAgICAgICAgICAqKmFyZ3Y7CisgICAgaW50ICAgICAgICAgICAgIGk7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl90aWQ7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl90aGlzX2NvbnM7CisgICAga21wX3RlYW1fdCAgICAgKnRlYW07CisgICAga21wX3RlYW1fdCAgICAgKnBhcmVudF90ZWFtOworICAgIGttcF9pbmZvX3QgICAgICptYXN0ZXJfdGg7CisgICAga21wX3Jvb3RfdCAgICAgKnJvb3Q7CisgICAgaW50ICAgICAgICAgICAgIG50aHJlYWRzOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfYWN0aXZlOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisgICAgaW50ICAgICAgICAgICAgIGxldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaW50ICAgICAgICAgICAgIGFjdGl2ZV9sZXZlbDsKKyAgICBpbnQgICAgICAgICAgICAgdGVhbXNfbGV2ZWw7CisjZW5kaWYKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAqKnBfaG90X3RlYW1zOworI2VuZGlmCisgICAgeyAvLyBLTVBfVElNRV9CTE9DSworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfZm9ya19jYWxsKTsKKyAgICBLTVBfQ09VTlRfVkFMVUUoT01QX1BBUkFMTEVMX2FyZ3MsIGFyZ2MpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBpZiAoIF9fa21wX3N0a3BhZGRpbmcgPiAwICYmICBfX2ttcF9yb290W2d0aWRdICE9IE5VTEwgKSB7CisgICAgICAgIC8qIFNvbWUgc3lzdGVtcyBwcmVmZXIgdGhlIHN0YWNrIGZvciB0aGUgcm9vdCB0aHJlYWQocykgdG8gc3RhcnQgd2l0aCAqLworICAgICAgICAvKiBzb21lIGdhcCBmcm9tIHRoZSBwYXJlbnQgc3RhY2sgdG8gcHJldmVudCBmYWxzZSBzaGFyaW5nLiAqLworICAgICAgICB2b2lkICpkdW1teSA9IEtNUF9BTExPQ0EoX19rbXBfc3RrcGFkZGluZyk7CisgICAgICAgIC8qIFRoZXNlIDIgbGluZXMgYmVsb3cgYXJlIHNvIHRoaXMgZG9lcyBub3QgZ2V0IG9wdGltaXplZCBvdXQgKi8KKyAgICAgICAgaWYgKCBfX2ttcF9zdGtwYWRkaW5nID4gS01QX01BWF9TVEtQQURESU5HICkKKyAgICAgICAgICAgIF9fa21wX3N0a3BhZGRpbmcgKz0gKHNob3J0KSgoa21wX2ludDY0KWR1bW15KTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIGlmIG5lZWRlZCAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7IC8vIEFDOiBwb3RlbnRpYWxseSB1bnNhZmUsIG5vdCBpbiBzeW5jIHdpdGggc2h1dGRvd24KKyAgICBpZiggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07IC8vIEFDOiBwb3RlbnRpYWxseSB1bnNhZmUsIG5vdCBpbiBzeW5jIHdpdGggc2h1dGRvd24KKyAgICBwYXJlbnRfdGVhbSAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgIG1hc3Rlcl90aWQgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkOworICAgIG1hc3Rlcl90aGlzX2NvbnMgPSBtYXN0ZXJfdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworICAgIHJvb3QgICAgICAgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3Jvb3Q7CisgICAgbWFzdGVyX2FjdGl2ZSA9IHJvb3QtPnIucl9hY3RpdmU7CisgICAgbWFzdGVyX3NldF9udW10aHJlYWRzID0gbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2M7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZDsKKyAgICBvbXB0X3Rhc2tfaWRfdCBvbXB0X3Rhc2tfaWQ7CisgICAgb21wdF9mcmFtZV90ICpvbXB0X2ZyYW1lOworICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBvbXB0X3BhcmFsbGVsX2lkID0gX19vbXB0X3BhcmFsbGVsX2lkX25ldyhndGlkKTsKKyAgICAgICAgb21wdF90YXNrX2lkID0gX19vbXB0X2dldF90YXNrX2lkX2ludGVybmFsKDApOworICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gTmVzdGVkIGxldmVsIHdpbGwgYmUgYW4gaW5kZXggaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheQorICAgIGxldmVsICAgICAgICAgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgYWN0aXZlX2xldmVsICA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsOyAvLyBpcyB1c2VkIHRvIGxhdW5jaCBub24tc2VyaWFsIHRlYW1zIGV2ZW4gaWYgbmVzdGVkIGlzIG5vdCBhbGxvd2VkCisgICAgdGVhbXNfbGV2ZWwgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOyAvLyBuZWVkZWQgdG8gY2hlY2sgbmVzdGluZyBpbnNpZGUgdGhlIHRlYW1zCisjZW5kaWYKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIHBfaG90X3RlYW1zICAgPSAmbWFzdGVyX3RoLT50aC50aF9ob3RfdGVhbXM7CisgICAgaWYoICpwX2hvdF90ZWFtcyA9PSBOVUxMICYmIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgPiAwICkgeworICAgICAgICAqcF9ob3RfdGVhbXMgPSAoa21wX2hvdF90ZWFtX3B0cl90KilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2hvdF90ZWFtX3B0cl90KSAqIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwpOworICAgICAgICAoKnBfaG90X3RlYW1zKVswXS5ob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICAgICAgKCpwX2hvdF90ZWFtcylbMF0uaG90X3RlYW1fbnRoID0gMTsgLy8gaXQgaXMgZWl0aGVyIGFjdHVhbCBvciBub3QgbmVlZGVkICh3aGVuIGFjdGl2ZV9sZXZlbCA+IDApCisgICAgfQorI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbikpIHsKKyAgICAgICAgaW50IHRlYW1fc2l6ZSA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4pKAorICAgICAgICAgICAgb21wdF90YXNrX2lkLCBvbXB0X2ZyYW1lLCBvbXB0X3BhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbV9zaXplLCB1bndyYXBwZWRfdGFzaywgT01QVF9JTlZPS0VSKGNhbGxfY29udGV4dCkpOworICAgIH0KKyNlbmRpZgorCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayAmJgorICAgICAgICAgYXAgJiYgbWljcm90YXNrICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYgbGV2ZWwgPT0gdGVhbXNfbGV2ZWwgKSB7CisgICAgICAgIC8vIEFDOiBUaGlzIGlzIHN0YXJ0IG9mIHBhcmFsbGVsIHRoYXQgaXMgbmVzdGVkIGluc2lkZSB0ZWFtcyBjb25zdHJ1Y3QuCisgICAgICAgIC8vICAgICBUaGUgdGVhbSBpcyBhY3R1YWwgKGhvdCksIGFsbCB3b3JrZXJzIGFyZSByZWFkeSBhdCB0aGUgZm9yayBiYXJyaWVyLgorICAgICAgICAvLyAgICAgTm8gbG9jayBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdGVhbSBhIGJpdCwgdGhlbiBmcmVlIHdvcmtlcnMuCisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaWRlbnQgPSBsb2M7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYXJnYyAgPSBhcmdjOworICAgICAgICBhcmd2ID0gKHZvaWQqKilwYXJlbnRfdGVhbS0+dC50X2FyZ3Y7CisgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWxzLCBidXQgbm90IGluY3JlYXNlIHRoZSBzZXJpYWxpemF0aW9uICovCisgICAgICAgIGlmICggcGFyZW50X3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gc2VyaWFsaXplZCBwYXJhbGxlbAorICAgICAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZCA+IDEgKTsKKyAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZC0tOyAvLyBBQzogbmVlZCB0aGlzIGluIG9yZGVyIGVucXVpcnkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgY29ycmVjdGx5LCB3aWxsIHJlc3RvcmUgYXQgam9pbiB0aW1lCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgbHdfdGFza3RlYW07CisKKyAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkX3Rhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmKGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fbGluaygmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCk7CisKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgICAgICAgICAgLyogT01QVCBpbXBsaWNpdCB0YXNrIGJlZ2luICovCisgICAgICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQgPSBwYXJlbnRfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIC8qIE9NUFQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfVElNRV9CTE9DSyhPTVBfd29yayk7CisgICAgICAgICAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrLCBndGlkLCAwLCBhcmdjLCBwYXJlbnRfdGVhbS0+dC50X2FyZ3YKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGV4aXRfcnVudGltZV9wCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9UUkFDRQorICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpKAorICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKG1hc3Rlcl90aCk7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgY2xlYXIgdGhlIHRhc2sgaWQgb25seSBhZnRlciB1bmxpbmtpbmcgdGhlIHRhc2sKKyAgICAgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gb21wdF90YXNrX2lkX25vbmU7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQsIG9tcHRfdGFza19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NUFRfSU5WT0tFUihjYWxsX2NvbnRleHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X3BrZm4gID0gbWljcm90YXNrOworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBwYXJlbnRfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5taWNyb3Rhc2sgPSB1bndyYXBwZWRfdGFzazsKKyNlbmRpZgorICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2ludm9rZSA9IGludm9rZXI7CisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIqKSAmcm9vdC0+ci5yX2luX3BhcmFsbGVsICk7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsICsrOworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2xldmVsICsrOworCisgICAgICAgIC8qIENoYW5nZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgdGVhbSBpZiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgaWYgKCBtYXN0ZXJfc2V0X251bXRocmVhZHMgKSB7ICAgLy8gVGhlIHBhcmFsbGVsIGhhcyBudW1fdGhyZWFkcyBjbGF1c2UKKyAgICAgICAgICAgIGlmICggbWFzdGVyX3NldF9udW10aHJlYWRzIDwgbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplLm50aCApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogb25seSBjYW4gcmVkdWNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBkeW5hbWljYWxseSwgY2Fubm90IGluY3JlYXNlCisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9ucHJvYyA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBLZWVwIGV4dHJhIHRocmVhZHMgaG90IGluIHRoZSB0ZWFtIGZvciBwb3NzaWJsZSBuZXh0IHBhcmFsbGVscworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2MgPSAwOworICAgICAgICB9CisKKyNpZiBVU0VfREVCVUdHRVIKKyAgICBpZiAoIF9fa21wX2RlYnVnZ2luZyApIHsgICAgLy8gTGV0IGRlYnVnZ2VyIG92ZXJyaWRlIG51bWJlciBvZiB0aHJlYWRzLgorICAgICAgICBpbnQgbnRoID0gX19rbXBfb21wX251bV90aHJlYWRzKCBsb2MgKTsKKyAgICAgICAgaWYgKCBudGggPiAwICkgeyAgICAgICAgLy8gMCBtZWFucyBkZWJ1Z2dlciBkb2VzIG5vdCB3YW50IHRvIGNoYW5nZSBudW1iZXIgb2YgdGhyZWFkcy4KKyAgICAgICAgICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA9IG50aDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCisKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBpbnRlcm5hbCBmb3JrOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsIHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKSApOworICAgICAgICBfX2ttcF9pbnRlcm5hbF9mb3JrKCBsb2MsIGd0aWQsIHBhcmVudF90ZWFtICk7CisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBhZnRlciBpbnRlcm5hbCBmb3JrOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsIHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKSApOworCisgICAgICAgIC8qIEludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQgKi8KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBhcmVudF90ZWFtLT50LnRfaWQsIHBhcmVudF90ZWFtLT50LnRfcGtmbiApICk7CisKKyAgICAgICAgeworICAgICAgICAgICAgS01QX1RJTUVfQkxPQ0soT01QX3dvcmspOworICAgICAgICAgICAgaWYgKCEgcGFyZW50X3RlYW0tPnQudF9pbnZva2UoIGd0aWQgKSkgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAiY2Fubm90IGludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBkb25lIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICAgICAgZ3RpZCwgcGFyZW50X3RlYW0tPnQudF9pZCwgcGFyZW50X3RlYW0tPnQudF9wa2ZuICkgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0gLy8gUGFyYWxsZWwgY2xvc2VseSBuZXN0ZWQgaW4gdGVhbXMgY29uc3RydWN0CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID49IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgeworICAgICAgICBudGhyZWFkcyA9IDE7CisgICAgfSBlbHNlIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpbnQgZW50ZXJfdGVhbXMgPSAoKGFwPT1OVUxMICYmIGFjdGl2ZV9sZXZlbD09MCl8fChhcCAmJiB0ZWFtc19sZXZlbD4wICYmIHRlYW1zX2xldmVsPT1sZXZlbCkpOworI2VuZGlmCisgICAgICAgIG50aHJlYWRzID0gbWFzdGVyX3NldF9udW10aHJlYWRzID8KKyAgICAgICAgICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA6IGdldF9fbnByb2NfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKTsgLy8gVE9ETzogZ2V0IG5wcm9jIGRpcmVjdGx5IGZyb20gY3VycmVudCB0YXNrCisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB0YWtlIGZvcmtqb2luIGxvY2s/IChubyBuZWVkIGZvciBzZXJpYWxpemVkIHBhcmFsbGVsIG91dCBvZiB0ZWFtcyBjb25zdHJ1Y3QpLgorICAgICAgICAvLyBUaGlzIGNvZGUgbW92ZWQgaGVyZSBmcm9tIF9fa21wX3Jlc2VydmVfdGhyZWFkcygpIHRvIHNwZWVkdXAgbmVzdGVkIHNlcmlhbGl6ZWQgcGFyYWxsZWxzLgorICAgICAgICBpZiAobnRocmVhZHMgPiAxKSB7CisgICAgICAgICAgICBpZiAoICggIWdldF9fbmVzdGVkKG1hc3Rlcl90aCkgJiYgKHJvb3QtPnIucl9pbl9wYXJhbGxlbAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgJiYgIWVudGVyX3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICkgKSB8fCAoIF9fa21wX2xpYnJhcnkgPT0gbGlicmFyeV9zZXJpYWwgKSApIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWxpemluZyB0ZWFtOyByZXF1ZXN0ZWQgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbnRocmVhZHMgKSk7CisgICAgICAgICAgICAgICAgbnRocmVhZHMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggbnRocmVhZHMgPiAxICkgeworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGhvdyBtYW55IG5ldyB0aHJlYWRzIHdlIGNhbiB1c2UgKi8KKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICAgICAgICAgIG50aHJlYWRzID0gX19rbXBfcmVzZXJ2ZV90aHJlYWRzKHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkLCBudGhyZWFkcworI2lmIE9NUF80MF9FTkFCTEVECisvKiBBQzogSWYgd2UgZXhlY3V0ZSB0ZWFtcyBmcm9tIHBhcmFsbGVsIHJlZ2lvbiAob24gaG9zdCksIHRoZW4gdGVhbXMgc2hvdWxkIGJlIGNyZWF0ZWQKKyAgIGJ1dCBlYWNoIGNhbiBvbmx5IGhhdmUgMSB0aHJlYWQgaWYgbmVzdGluZyBpcyBkaXNhYmxlZC4gSWYgdGVhbXMgY2FsbGVkIGZyb20gc2VyaWFsIHJlZ2lvbiwKKyAgIHRoZW4gdGVhbXMgYW5kIHRoZWlyIHRocmVhZHMgc2hvdWxkIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcyBvZiB0aGUgbmVzdGluZyBzZXR0aW5nLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVudGVyX3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmICggbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAvLyBGcmVlIGxvY2sgZm9yIHNpbmdsZSB0aHJlYWQgZXhlY3V0aW9uIGhlcmU7CisgICAgICAgICAgICAgICAgLy8gZm9yIG11bHRpLXRocmVhZCBleGVjdXRpb24gaXQgd2lsbCBiZSBmcmVlZCBsYXRlcgorICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRlYW0gb2YgdGhyZWFkcyBjcmVhdGVkIGFuZCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggbnRocmVhZHMgPiAwICk7CisKKyAgICAvKiBJZiB3ZSB0ZW1wb3JhcmlseSBjaGFuZ2VkIHRoZSBzZXQgbnVtYmVyIG9mIHRocmVhZHMgdGhlbiByZXN0b3JlIGl0IG5vdyAqLworICAgIG1hc3Rlcl90aC0+dGgudGhfc2V0X25wcm9jID0gMDsKKworICAgIC8qIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgcmVnaW9uPyAqLworICAgIGlmICggbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgLyogam9zaCB0b2RvOiBoeXBvdGhldGljYWwgcXVlc3Rpb246IHdoYXQgZG8gd2UgZG8gZm9yIE9TIFgqPyAqLworI2lmIEtNUF9PU19MSU5VWCAmJiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIHZvaWQgKiAgIGFyZ3NbIGFyZ2MgXTsKKyNlbHNlCisgICAgICAgIHZvaWQgKiAqIGFyZ3MgPSAodm9pZCoqKSBLTVBfQUxMT0NBKCBhcmdjICogc2l6ZW9mKCB2b2lkICogKSApOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAmJiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWxpemluZyBwYXJhbGxlbCByZWdpb25cbiIsIGd0aWQgKSk7CisKKyAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKworICAgICAgICBpZiAoIGNhbGxfY29udGV4dCA9PSBmb3JrX2NvbnRleHRfaW50ZWwgKSB7CisgICAgICAgICAgICAvKiBUT0RPIHRoaXMgc3Vja3MsIHVzZSB0aGUgY29tcGlsZXIgaXRzZWxmIHRvIHBhc3MgYXJncyEgOikgKi8KKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9pZGVudCA9IGxvYzsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCAhYXAgKSB7CisgICAgICAgICAgICAgICAgLy8gcmV2ZXJ0IGNoYW5nZSBtYWRlIGluIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKCkKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgICAgICAgIHZvaWQgKipleGl0X3J1bnRpbWVfcDsKKworICAgICAgICAgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCBsd190YXNrdGVhbTsKKworICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQoJmx3X3Rhc2t0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBwZWRfdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisgICAgICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJihsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUpOworCisgICAgICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKCZsd190YXNrdGVhbSwgbWFzdGVyX3RoKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgLyogT01QVCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmZHVtbXk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX0JMT0NLKE9NUF93b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrLCBndGlkLCAwLCBhcmdjLCBwYXJlbnRfdGVhbS0+dC50X2FyZ3YKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICwgZXhpdF9ydW50aW1lX3AKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayhtYXN0ZXJfdGgpOworICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBjbGVhciB0aGUgdGFzayBpZCBvbmx5IGFmdGVyIHVubGlua2luZyB0aGUgdGFzaworICAgICAgICAgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gb21wdF90YXNrX2lkX25vbmU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBvbXB0X3Rhc2tfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QVF9JTlZPS0VSKGNhbGxfY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtaWNyb3Rhc2sgPT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgICAgIHRlYW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgLy90ZWFtLT50LnRfcGtmbiA9IG1pY3JvdGFzazsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIFRSVUUgKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYXJnYyA9IGFyZ2M7CisgICAgICAgICAgICAgICAgYXJndiA9ICh2b2lkKiopIHRlYW0tPnQudF9hcmd2OworICAgICAgICAgICAgICAgIGlmICggYXAgKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8vIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NgorIyBpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyMgZW5kaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbaV0gPSBwYXJlbnRfdGVhbS0+dC50X2FyZ3ZbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFDOiByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgICAgICAgIC8vICAgICBiZWNhdXNlIGluaXRpYWwgY29kZSBpbiB0ZWFtcyBzaG91bGQgaGF2ZSBsZXZlbD0wCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2xldmVsLS07CisgICAgICAgICAgICAgICAgLy8gQUM6IGNhbGwgc3BlY2lhbCBpbnZva2VyIGZvciBvdXRlciAicGFyYWxsZWwiIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX0JMT0NLKE9NUF93b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlcihndGlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICAgICAgYXJndiA9IGFyZ3M7CisgICAgICAgICAgICAgICAgZm9yKCBpPWFyZ2MtMTsgaSA+PSAwOyAtLWkgKQorLy8gVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2CisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgICAgICAgIHZvaWQgKipleGl0X3J1bnRpbWVfcDsKKworICAgICAgICAgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCBsd190YXNrdGVhbTsKKworICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQoJmx3X3Rhc2t0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBwZWRfdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisgICAgICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJihsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUpOworCisgICAgICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKCZsd190YXNrdGVhbSwgbWFzdGVyX3RoKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgLyogT01QVCBpbXBsaWNpdCB0YXNrIGJlZ2luICovCisgICAgICAgICAgICAgICAgICAgIG15X3Rhc2tfaWQgPSBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCA9IG9tcHRfcGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIC8qIE9NUFQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfVElNRV9CTE9DSyhPTVBfd29yayk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFzaywgZ3RpZCwgMCwgYXJnYywgYXJncworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgLCBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV91bmxpbmsobWFzdGVyX3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgY2xlYXIgdGhlIHRhc2sgaWQgb25seSBhZnRlciB1bmxpbmtpbmcgdGhlIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IG9tcHRfdGFza19pZF9ub25lOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUFRfSU5WT0tFUihjYWxsX2NvbnRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9nbnUgKSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IChvbXB0X2x3X3Rhc2t0ZWFtX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2Yob21wdF9sd190YXNrdGVhbV90KSk7CisgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdChsd3QsIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICB1bndyYXBwZWRfdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisKKyAgICAgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyhndGlkKTsKKyAgICAgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKGx3dCwgbWFzdGVyX3RoKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyB3ZSB3ZXJlIGNhbGxlZCBmcm9tIEdOVSBuYXRpdmUgY29kZQorICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWwgZXhpdFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCBjYWxsX2NvbnRleHQgPCBmb3JrX2NvbnRleHRfbGFzdCwgIl9fa21wX2ZvcmtfY2FsbDogdW5rbm93biBmb3JrX2NvbnRleHQgcGFyYW1ldGVyIiApOworICAgICAgICB9CisKKworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbCBleGl0XG4iLCBndGlkICkpOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIEdFSDogb25seSBtb2RpZnkgdGhlIGV4ZWN1dGluZyBmbGFnIGluIHRoZSBjYXNlIHdoZW4gbm90IHNlcmlhbGl6ZWQKKyAgICAvLyAgICAgIHNlcmlhbGl6ZWQgY2FzZSBpcyBoYW5kbGVkIGluIGttcGNfc2VyaWFsaXplZF9wYXJhbGxlbAorICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBwYXJlbnRfdGVhbV9hY2xldmVsPSVkLCBtYXN0ZXJfdGg9JXAsIGN1cnRhc2s9JXAsIGN1cnRhc2tfbWF4X2FjbGV2ZWw9JWRcbiIsCisgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCwgbWFzdGVyX3RoLCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICAvLyBUT0RPOiBHRUggLSBjYW5ub3QgZG8gdGhpcyBhc3NlcnRpb24gYmVjYXVzZSByb290IHRocmVhZCBub3Qgc2V0IHVwIGFzIGV4ZWN1dGluZworICAgIC8vIEtNUF9BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICAgIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPSAwOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayB8fCBsZXZlbCA+IHRlYW1zX2xldmVsICkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiopICZyb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgSUNWcy4KKyAgICBpbnQgbnRocmVhZHNfaWN2ID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2M7CisgICAgaWYgKChsZXZlbCsxIDwgX19rbXBfbmVzdGVkX250aC51c2VkKSAmJiAoX19rbXBfbmVzdGVkX250aC5udGhbbGV2ZWwrMV0gIT0gbnRocmVhZHNfaWN2KSkgeworICAgICAgICBudGhyZWFkc19pY3YgPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFtsZXZlbCsxXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG50aHJlYWRzX2ljdiA9IDA7ICAvLyBkb24ndCB1cGRhdGUKKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHByb2NfYmluZF9wb2xpY3kgZm9yIHRoZSBuZXcgdGVhbS4KKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gbWFzdGVyX3RoLT50aC50aF9zZXRfcHJvY19iaW5kOworICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmRfaWN2ID0gcHJvY19iaW5kX2RlZmF1bHQ7IC8vIHByb2NfYmluZF9kZWZhdWx0IG1lYW5zIGRvbid0IHVwZGF0ZQorICAgIGlmICggbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kID09IHByb2NfYmluZF9mYWxzZSApIHsKKyAgICAgICAgcHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgICAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSBzcGVjaWZpZWQ7IHVzZSBjdXJyZW50IHByb2MtYmluZC12YXIgZm9yIHRoaXMgcGFyYWxsZWwgcmVnaW9uCisgICAgICAgICAgICBwcm9jX2JpbmQgPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQ7CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZTogVGhlIHByb2NfYmluZCBwb2xpY3kgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IG9uIHBhcmFsbGVsIGNsYXVzZS4gVGhpcworICAgICAgICAgICBvdmVycmlkZXMgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24sIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgcHJvYy1iaW5kLXZhci4gKi8KKyAgICAgICAgLy8gRmlndXJlIHRoZSB2YWx1ZSBvZiBwcm9jLWJpbmQtdmFyIGZvciB0aGUgY2hpbGQgdGhyZWFkcy4KKyAgICAgICAgaWYgKChsZXZlbCsxIDwgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkKQorICAgICAgICAgICAgJiYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tsZXZlbCsxXSAhPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQpKSB7CisgICAgICAgICAgICBwcm9jX2JpbmRfaWN2ID0gX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2xldmVsKzFdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVzZXQgZm9yIG5leHQgcGFyYWxsZWwgcmVnaW9uCisgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfcHJvY19iaW5kID0gcHJvY19iaW5kX2RlZmF1bHQ7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGlmICgobnRocmVhZHNfaWN2ID4gMCkKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB8fCAocHJvY19iaW5kX2ljdiAhPSBwcm9jX2JpbmRfZGVmYXVsdCkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICApIHsKKyAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCBuZXdfaWN2czsKKyAgICAgICAgY29weV9pY3ZzKCZuZXdfaWN2cywgJm1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzKTsKKyAgICAgICAgbmV3X2ljdnMubmV4dCA9IE5VTEw7CisgICAgICAgIGlmIChudGhyZWFkc19pY3YgPiAwKSB7CisgICAgICAgICAgICBuZXdfaWN2cy5ucHJvYyA9IG50aHJlYWRzX2ljdjsKKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKHByb2NfYmluZF9pY3YgIT0gcHJvY19iaW5kX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIG5ld19pY3ZzLnByb2NfYmluZCA9IHByb2NfYmluZF9pY3Y7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfaWN2cywgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cywgYXJnYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSApOworICAgIH0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYWZ0ZXIgX19rbXBfYWxsb2NhdGVfdGVhbSAtIHRlYW0gPSAlcFxuIiwgdGVhbSApICk7CisKKyAgICAvKiBzZXR1cCB0aGUgbmV3IHRlYW0gKi8KKyAgICB0ZWFtLT50LnRfbWFzdGVyX3RpZCA9IG1hc3Rlcl90aWQ7CisgICAgdGVhbS0+dC50X21hc3Rlcl90aGlzX2NvbnMgPSBtYXN0ZXJfdGhpc19jb25zOworICAgIHRlYW0tPnQudF9pZGVudCAgICAgID0gbG9jOworICAgIHRlYW0tPnQudF9wYXJlbnQgICAgID0gcGFyZW50X3RlYW07CisgICAgVENXX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuLCBtaWNyb3Rhc2spOworI2lmIE9NUFRfU1VQUE9SVAorICAgIFRDV19TWU5DX1BUUih0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLm1pY3JvdGFzaywgdW53cmFwcGVkX3Rhc2spOworI2VuZGlmCisgICAgdGVhbS0+dC50X2ludm9rZSAgICAgPSBpbnZva2VyOyAgLyogVE9ETyBtb3ZlIHRoaXMgdG8gcm9vdCwgbWF5YmUgKi8KKyAgICAvLyBUT0RPOiBwYXJlbnRfdGVhbS0+dC50X2xldmVsID09IElOVF9NQVggPz8/CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayB8fCBsZXZlbCA+IHRlYW1zX2xldmVsICkgeworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIHRlYW0tPnQudF9sZXZlbCAgICAgICAgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsICsgMTsKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsICsgMTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFDOiBEbyBub3QgaW5jcmVhc2UgcGFyYWxsZWwgbGV2ZWwgYXQgc3RhcnQgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICB0ZWFtLT50LnRfbGV2ZWwgICAgICAgID0gcGFyZW50X3RlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsOworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHRlYW0tPnQudF9zY2hlZCAgICAgID0gZ2V0X19zY2hlZF8yKHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkKTsgLy8gc2V0IG1hc3RlcidzIHNjaGVkdWxlIGFzIG5ldyBydW4tdGltZSBzY2hlZHVsZQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisjZW5kaWYKKworICAgIC8vIFVwZGF0ZSB0aGUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgaW4gdGhlIHRlYW0gaWYgcmVxdWlyZWQuCisgICAgcHJvcGFnYXRlRlBDb250cm9sKHRlYW0pOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgLy8gU2V0IG1hc3RlcidzIHRhc2sgdGVhbSB0byB0ZWFtJ3MgdGFzayB0ZWFtLiBVbmxlc3MgdGhpcyBpcyBob3QgdGVhbSwgaXQgc2hvdWxkIGJlIE5VTEwuCisjaWYgMAorICAgICAgICAvLyBQYXRjaCBvdXQgYW4gYXNzZXJ0aW9uIHRoYXQgdHJpcHMgd2hpbGUgdGhlIHJ1bnRpbWUgc2VlbXMgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuCisgICAgICAgIC8vIEF2b2lkaW5nIHRoZSBwcmVjb25kaXRpb25zIHRoYXQgY2F1c2UgdGhlIGFzc2VydGlvbiB0byB0cmlwIGhhcyBiZWVuIHByb21pc2VkIGFzIGEgZm9ydGhjb21pbmcgcGF0Y2guCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXSk7CisjZW5kaWYKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9mb3JrX2NhbGw6IE1hc3RlciBUIyVkIHB1c2hpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcCwgbmV3IHRhc2tfdGVhbSAlcCAvIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLCB0ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0sIHRlYW0gKSApOworICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgIC8vIFRha2UgYSBtZW1vIG9mIG1hc3RlcidzIHRhc2tfc3RhdGUKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2spOworICAgICAgICAgICAgaWYgKG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3AgPj0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6KSB7IC8vIGluY3JlYXNlIHNpemUKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIG5ld19zaXplID0gMiptYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7CisgICAgICAgICAgICAgICAga21wX3VpbnQ4ICpvbGRfc3RhY2ssICpuZXdfc3RhY2s7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBpOworICAgICAgICAgICAgICAgIG5ld19zdGFjayA9IChrbXBfdWludDggKilfX2ttcF9hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X3N0YWNrW2ldID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaT1tYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7IGk8bmV3X3NpemU7ICsraSkgeyAvLyB6ZXJvLWluaXQgcmVzdCBvZiBzdGFjaworICAgICAgICAgICAgICAgICAgICBuZXdfc3RhY2tbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbGRfc3RhY2sgPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjazsKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayA9IG5ld19zdGFjazsKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3ogPSBuZXdfc2l6ZTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKG9sZF9zdGFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTdG9yZSBtYXN0ZXIncyB0YXNrX3N0YXRlIG9uIHN0YWNrCisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3ArKzsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgaWYgKHRlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9ob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtKSB7IC8vIFJlc3RvcmUgbWFzdGVyJ3MgbmVzdGVkIHN0YXRlIGlmIG5lc3RlZCBob3QgdGVhbQorICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3BdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSAwOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorI2lmICFLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSB8fCAodGVhbSA9PSByb290LT5yLnJfaG90X3RlYW0pKTsKKyNlbmRpZgorICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6JWQpLT4oJWQ6MCkgY3JlYXRlZCBhIHRlYW0gb2YgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBwYXJlbnRfdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWFzdGVyX3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbnByb2MgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSByb290LT5yLnJfaG90X3RlYW0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAoIHRlYW0tPnQudF9tYXN0ZXJfdGlkID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICggdGVhbS0+dC50X3BhcmVudCA9PSByb290LT5yLnJfcm9vdF90ZWFtIHx8IHRlYW0tPnQudF9wYXJlbnQtPnQudF9zZXJpYWxpemVkICkgKSk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBub3csIHNldHVwIHRoZSBhcmd1bWVudHMgKi8KKyAgICBhcmd2ID0gKHZvaWQqKil0ZWFtLT50LnRfYXJndjsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggYXAgKSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgZm9yICggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8vIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NgorI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGFyZ3ZbaV0gPSB0ZWFtLT50LnRfcGFyZW50LT50LnRfYXJndltpXTsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8qIG5vdyBhY3R1YWxseSBmb3JrIHRoZSB0aHJlYWRzICovCisgICAgdGVhbS0+dC50X21hc3Rlcl9hY3RpdmUgPSBtYXN0ZXJfYWN0aXZlOworICAgIGlmICghcm9vdC0+ci5yX2FjdGl2ZSkgLy8gT25seSBkbyBhc3NpZ25tZW50IGlmIGl0IHByZXZlbnRzIGNhY2hlIHBpbmctcG9uZworICAgICAgICByb290LT5yLnJfYWN0aXZlID0gVFJVRTsKKworICAgIF9fa21wX2ZvcmtfdGVhbV90aHJlYWRzKCByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKTsKKyAgICBfX2ttcF9zZXR1cF9pY3ZfY29weSggdGVhbSwgbnRocmVhZHMsICZtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cywgbG9jICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisjZW5kaWYKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSAvLyBvbmx5IHJlcG9ydCBmcmFtZXMgYXQgbGV2ZWwgMQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAmJiAhbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgLy8gbm90IGluIHRlYW1zIGNvbnN0cnVjdAorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggKCBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgICggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAxICkgKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfdWludDY0IHRtcF90aW1lID0gMDsKKyAgICAgICAgICAgIGlmICggX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgKQorICAgICAgICAgICAgICAgIHRtcF90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICAgICAgLy8gSW50ZXJuYWwgZm9yayAtIHJlcG9ydCBmcmFtZSBiZWdpbgorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9mcmFtZV90aW1lICA9IHRtcF90aW1lOworICAgICAgICAgICAgaWYgKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfcmVnaW9uX3RpbWUgPSB0bXBfdGltZTsKKyAgICAgICAgfSBlbHNlIC8vIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBzY2hlbWUgKGVpdGhlciAic3VibWl0IiBvciAiZm9ya2luZy9qb2luZWQiLCBub3QgYm90aCkKKyNlbmRpZiAvKiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICBpZiAoICggX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyAmJiAhX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKQorICAgICAgICB7IC8vIE1hcmsgc3RhcnQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLgorICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKGd0aWQsIHRlYW0tPnQudF9ucHJvYywgMCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLyogbm93IGdvIG9uIGFuZCBkbyB0aGUgd29yayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbSApOworICAgIEtNUF9NQigpOworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2ZvcmsgOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICB0ZWFtLT50LnRfc3RhY2tfaWQgPSBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpOyAvLyBjcmVhdGUgbmV3IHN0YWNrIHN0aXRjaGluZyBpZCBiZWZvcmUgZW50ZXJpbmcgZm9yayBiYXJyaWVyCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBhcCApICAgLy8gQUM6IHNraXAgX19rbXBfaW50ZXJuYWxfZm9yayBhdCB0ZWFtcyBjb25zdHJ1Y3QsIGxldCBvbmx5IG1hc3RlciB0aHJlYWRzIGV4ZWN1dGUKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZm9yayggbG9jLCBndGlkLCB0ZWFtICk7CisgICAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2ZvcmsgOiBhZnRlciA6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKyAgICB9CisKKyAgICBpZiAoY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9nbnUpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKiBJbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfcGtmbiApICk7CisgICAgfSAgLy8gRU5EIG9mIHRpbWVyIEtNUF9mb3JrX2NhbGwgYmxvY2sKKworICAgIHsKKyAgICAgICAgS01QX1RJTUVfQkxPQ0soT01QX3dvcmspOworICAgICAgICAvLyBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soVVNFUl9tYXN0ZXJfaW52b2tlKTsKKyAgICAgICAgaWYgKCEgdGVhbS0+dC50X2ludm9rZSggZ3RpZCApKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIiApOworICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6MCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfcGtmbiApICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJhbGxlbCBleGl0IFQjJWRcbiIsIGd0aWQgKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmIE9NUFRfU1VQUE9SVAorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUoCisgICAga21wX2luZm9fdCAqdGhyZWFkLAorICAgIGttcF90ZWFtX3QgKnRlYW0pCit7CisgICAgLy8gcmVzdG9yZSBzdGF0ZSBvdXRzaWRlIHRoZSByZWdpb24KKyAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSAoKHRlYW0tPnQudF9zZXJpYWxpemVkKSA/CisgICAgICAgIG9tcHRfc3RhdGVfd29ya19zZXJpYWwgOiBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2pvaW5fb21wdCgKKyAgICBrbXBfaW5mb190ICp0aHJlYWQsCisgICAga21wX3RlYW1fdCAqdGVhbSwKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgICAgZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0KQoreworICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgIHBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIE9NUFRfSU5WT0tFUihmb3JrX2NvbnRleHQpKTsKKyAgICB9CisKKyAgICBfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUodGhyZWFkLHRlYW0pOworfQorI2VuZGlmCisKK3ZvaWQKK19fa21wX2pvaW5fY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAsIGVudW0gZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgLCBpbnQgZXhpdF90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCispCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9qb2luX2NhbGwpOworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfYWN0aXZlOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2pvaW5fY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgcm9vdCAgICAgICAgICA9IG1hc3Rlcl90aC0+dGgudGhfcm9vdDsKKyAgICB0ZWFtICAgICAgICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgIHBhcmVudF90ZWFtICAgPSB0ZWFtLT50LnRfcGFyZW50OworCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICB9CisjZW5kaWYKKworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfam9pbl9jYWxsOiBUIyVkLCBvbGQgdGVhbSA9ICVwIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIHRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdICk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBpbiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgICAgIGludCB0bGV2ZWwgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICAgICAgaWYgKCBsZXZlbCA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgLy8gQUM6IHdlIGhhdmVuJ3QgaW5jcmVtZW50ZWQgaXQgZWFybGllciBhdCBzdGFydCBvZiB0ZWFtcyBjb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgLy8gICAgIHNvIGRvIGl0IGhlcmUgLSBhdCB0aGUgZW5kIG9mIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9sZXZlbCsrOworICAgICAgICAgICAgfSBlbHNlIGlmICggbGV2ZWwgPT0gdGxldmVsICsgMSApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogd2UgYXJlIGV4aXRpbmcgcGFyYWxsZWwgaW5zaWRlIHRlYW1zLCBuZWVkIHRvIGluY3JlbWVudCBzZXJpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgLy8gICAgIGluIG9yZGVyIHRvIHJlc3RvcmUgaXQgaW4gdGhlIG5leHQgY2FsbCB0byBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2VyaWFsaXplZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKCBsb2MsIGd0aWQgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUobWFzdGVyX3RoLCBwYXJlbnRfdGVhbSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXN0ZXJfYWN0aXZlID0gdGVhbS0+dC50X21hc3Rlcl9hY3RpdmU7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICghZXhpdF90ZWFtcykKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLy8gQUM6IE5vIGJhcnJpZXIgZm9yIGludGVybmFsIHRlYW1zIGF0IGV4aXQgZnJvbSB0ZWFtcyBjb25zdHJ1Y3QuCisgICAgICAgIC8vICAgICBCdXQgdGhlcmUgaXMgYmFycmllciBmb3IgZXh0ZXJuYWwgdGVhbSAobGVhZ3VlKS4KKyAgICAgICAgX19rbXBfaW50ZXJuYWxfam9pbiggbG9jLCBndGlkLCB0ZWFtICk7CisgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgZWxzZSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IDA7IC8vIEFDOiBubyB0YXNraW5nIGluIHRlYW1zIChvdXQgb2YgYW55IHBhcmFsbGVsKQorICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgS01QX01CKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQgPSB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCAoX19pdHRfY2FsbGVyKXRlYW0tPnQudF9zdGFja19pZCApOyAvLyBkZXN0cm95IHRoZSBzdGFjayBzdGl0Y2hpbmcgaWQgYWZ0ZXIgam9pbiBiYXJyaWVyCisgICAgfQorCisgICAgLy8gTWFyayBlbmQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLgorICAgIGlmICggdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICYmICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayAvKiBub3QgaW4gdGVhbXMgY29uc3RydWN0ICovCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgKSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgIC8vIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBzY2hlbWUgKGVpdGhlciAic3VibWl0IiBvciAiZm9ya2luZy9qb2luZWQiLCBub3QgYm90aCkKKyAgICAgICAgaWYgKCAoIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKQorICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGVhbS0+dC50X3JlZ2lvbl90aW1lLCBtYXN0ZXJfdGgtPnRoLnRoX2ZyYW1lX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBsb2MsIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYywgMSApOworICAgICAgICBlbHNlIGlmICggKCBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgISBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgKQorICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoIGd0aWQgKTsKKyAgICB9IC8vIGFjdGl2ZV9sZXZlbCA9PSAxCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICYmCisgICAgICAgICAhZXhpdF90ZWFtcyAmJgorICAgICAgICAgdGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICAgdGVhbS0+dC50X2xldmVsID09IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKyAxICkgeworICAgICAgICAvLyBBQzogV2UgbmVlZCB0byBsZWF2ZSB0aGUgdGVhbSBzdHJ1Y3R1cmUgaW50YWN0IGF0IHRoZSBlbmQKKyAgICAgICAgLy8gICAgIG9mIHBhcmFsbGVsIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0LCBzbyB0aGF0IGF0IHRoZSBuZXh0CisgICAgICAgIC8vICAgICBwYXJhbGxlbCBzYW1lIChob3QpIHRlYW0gd29ya3MsIG9ubHkgYWRqdXN0IG5lc3RpbmcgbGV2ZWxzCisKKyAgICAgICAgLyogRGVjcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgdGVhbS0+dC50X2xldmVsIC0tOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsIC0tOworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworCisgICAgICAgIC8qIFJlc3RvcmUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIHRlYW0gaWYgbmVlZGVkICovCisgICAgICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jIDwgbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplLm50aCApIHsKKyAgICAgICAgICAgIGludCBvbGRfbnVtID0gbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgaW50IG5ld19udW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRoOworICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9IG5ld19udW07CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG9sZF9udW07ICsraSApIHsKKyAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbmV3X251bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkanVzdCBzdGF0ZXMgb2Ygbm9uLXVzZWQgdGhyZWFkcyBvZiB0aGUgdGVhbQorICAgICAgICAgICAgZm9yICggaSA9IG9sZF9udW07IGkgPCBuZXdfbnVtOyArK2kgKSB7CisgICAgICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aHJlYWQncyBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bIGIgXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhclsgYiBdLmJfdGVhbV9hcnJpdmVkOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHRocmVhZCdzIHRhc2sgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBfX2ttcF9qb2luX29tcHQobWFzdGVyX3RoLCBwYXJlbnRfdGVhbSwgcGFyYWxsZWxfaWQsIGZvcmtfY29udGV4dCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8qIGRvIGNsZWFudXAgYW5kIHJlc3RvcmUgdGhlIHBhcmVudCB0ZWFtICovCisgICAgbWFzdGVyX3RoLT50aC50aF9pbmZvIC5kcy5kc190aWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gdGVhbS0+dC50X21hc3Rlcl90aGlzX2NvbnM7CisKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2Rpc3BhdGNoID0KKyAgICAgICAgICAgICAgICAmIHBhcmVudF90ZWFtLT50LnRfZGlzcGF0Y2hbIHRlYW0tPnQudF9tYXN0ZXJfdGlkIF07CisKKyAgICAvKiBqYzogVGhlIGZvbGxvd2luZyBsb2NrIGhhcyBpbnN0cnVjdGlvbnMgd2l0aCBSRUwgYW5kIEFDUSBzZW1hbnRpY3MsCisgICAgICAgc2VwYXJhdGluZyB0aGUgcGFyYWxsZWwgdXNlciBjb2RlIGNhbGxlZCBpbiB0aGlzIHBhcmFsbGVsIHJlZ2lvbgorICAgICAgIGZyb20gdGhlIHNlcmlhbCB1c2VyIGNvZGUgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrIHx8IHRlYW0tPnQudF9sZXZlbCA+IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICAvKiBEZWNyZW1lbnQgb3VyIG5lc3RlZCBkZXB0aCBsZXZlbCAqLworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290LT5yLnJfaW5fcGFyYWxsZWwgPj0gMCApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2pvaW5fY2FsbDE6IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgMCwgbWFzdGVyX3RoLCB0ZWFtICkgKTsKKyAgICBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCBtYXN0ZXJfdGggKTsKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLworICAgIC8vIFJlc3RvcmUgbWFzdGVyIHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgICAvLworICAgIG1hc3Rlcl90aC0+dGgudGhfZmlyc3RfcGxhY2UgPSB0ZWFtLT50LnRfZmlyc3RfcGxhY2U7CisgICAgbWFzdGVyX3RoLT50aC50aF9sYXN0X3BsYWNlID0gdGVhbS0+dC50X2xhc3RfcGxhY2U7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIHVwZGF0ZUhXRlBDb250cm9sICh0ZWFtKTsKKworICAgIGlmICggcm9vdC0+ci5yX2FjdGl2ZSAhPSBtYXN0ZXJfYWN0aXZlICkKKyAgICAgICAgcm9vdC0+ci5yX2FjdGl2ZSA9IG1hc3Rlcl9hY3RpdmU7CisKKyAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIHRlYW0gVVNFX05FU1RFRF9IT1RfQVJHKG1hc3Rlcl90aCkgKTsgLy8gdGhpcyB3aWxsIGZyZWUgd29ya2VyIHRocmVhZHMKKworICAgIC8qIHRoaXMgcmFjZSB3YXMgZnVuIHRvIGZpbmQuICBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyBpcyBpbiB0aGUgY3JpdGljYWwKKyAgICAgKiByZWdpb24gb3RoZXJ3aXNlIGFzc2VydGlvbnMgbWF5IGZhaWwgb2NjYXNpb25hbGx5IHNpbmNlIHRoZSBvbGQgdGVhbQorICAgICAqIG1heSBiZSByZWFsbG9jYXRlZCBhbmQgdGhlIGhpZXJhcmNoeSBhcHBlYXJzIGluY29uc2lzdGVudC4gIGl0IGlzCisgICAgICogYWN0dWFsbHkgc2FmZSB0byBydW4gYW5kIHdvbid0IGNhdXNlIGFueSBidWdzLCBidXQgd2lsbCBjYXVzZSB0aG9zZQorICAgICAqIGFzc2VydGlvbiBmYWlsdXJlcy4gIGl0J3Mgb25seSBvbmUgZGVyZWYmYXNzaWduIHNvIG1pZ2h0IGFzIHdlbGwgcHV0IHRoaXMKKyAgICAgKiBpbiB0aGUgY3JpdGljYWwgcmVnaW9uICovCisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtICAgICAgICA9ICAgcGFyZW50X3RlYW07CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jICA9ICAgcGFyZW50X3RlYW0tPnQudF9ucHJvYzsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWFzdGVyID0gICBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisKKyAgICAvKiByZXN0b3JlIHNlcmlhbGl6ZWQgdGVhbSwgaWYgbmVlZCBiZSAqLworICAgIGlmKCBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQgJiYKKyAgICAgICAgcGFyZW50X3RlYW0gIT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSAmJgorICAgICAgICBwYXJlbnRfdGVhbSAhPSByb290LT5yLnJfcm9vdF90ZWFtICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSApOworICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSA9IHBhcmVudF90ZWFtOworICAgIH0KKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIGlmIChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wID4gMCkgeyAvLyBSZXN0b3JlIHRhc2sgc3RhdGUgZnJvbSBtZW1vIHN0YWNrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrKTsKKyAgICAgICAgICAgIC8vIFJlbWVtYmVyIG1hc3RlcidzIHN0YXRlIGlmIHdlIHJlLXVzZSB0aGlzIG5lc3RlZCBob3QgdGVhbQorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcF0gPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgICAgICAgICAtLW1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3A7IC8vIHBvcAorICAgICAgICAgICAgLy8gTm93IHJlc3RvcmUgc3RhdGUgYXQgdGhpcyBsZXZlbAorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcF07CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29weSB0aGUgdGFzayB0ZWFtIGZyb20gdGhlIHBhcmVudCB0ZWFtIHRvIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID0gcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9qb2luX2NhbGw6IE1hc3RlciBUIyVkIHJlc3RvcmluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtLCBwYXJlbnRfdGVhbSApICk7CisgICAgfQorCisgICAgIC8vIFRPRE86IEdFSCAtIGNhbm5vdCBkbyB0aGlzIGFzc2VydGlvbiBiZWNhdXNlIHJvb3QgdGhyZWFkIG5vdCBzZXQgdXAgYXMgZXhlY3V0aW5nCisgICAgIC8vIEtNUF9BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIF9fa21wX2pvaW5fb21wdChtYXN0ZXJfdGgsIHBhcmVudF90ZWFtLCBwYXJhbGxlbF9pZCwgZm9ya19jb250ZXh0KTsKKyAgICB9CisjZW5kaWYKKworICAgIEtNUF9NQigpOworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9qb2luX2NhbGw6IGV4aXQgVCMlZFxuIiwgZ3RpZCApKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgcHVzaCBhbiBpbnRlcm5hbCBjb250cm9sIHJlY29yZCBvbnRvIHRoZQorICAgc2VyaWFsIHRlYW0gc3RhY2suICBJZiBzbywgZG8gaXQuICAqLwordm9pZAorX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyAoIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworCisgICAgaWYgKCB0aHJlYWQtPnRoLnRoX3RlYW0gIT0gdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCA+IDEpIHsKKyAgICAgICAgaW50IHB1c2ggPSAwOworCisgICAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBwdXNoID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggdGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AtPnNlcmlhbF9uZXN0aW5nX2xldmVsICE9CisgICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICAgICAgcHVzaCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB1c2gpIHsgIC8qIHB1c2ggYSByZWNvcmQgb24gdGhlIHNlcmlhbCB0ZWFtJ3Mgc3RhY2sgKi8KKyAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBjb250cm9sID0gKGttcF9pbnRlcm5hbF9jb250cm9sX3QgKikgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9pbnRlcm5hbF9jb250cm9sX3QpKTsKKworICAgICAgICAgICAgY29weV9pY3ZzKCBjb250cm9sLCAmIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzICk7CisKKyAgICAgICAgICAgIGNvbnRyb2wtPnNlcmlhbF9uZXN0aW5nX2xldmVsID0gdGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZDsKKworICAgICAgICAgICAgY29udHJvbC0+bmV4dCA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBjb250cm9sOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDaGFuZ2VzIHNldF9ucHJvYyAqLwordm9pZAorX19rbXBfc2V0X251bV90aHJlYWRzKCBpbnQgbmV3X250aCwgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3NldF9udW1fdGhyZWFkczogbmV3IF9fa21wX250aCA9ICVkXG4iLCBuZXdfbnRoICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAobmV3X250aCA8IDEpCisgICAgICAgIG5ld19udGggPSAxOworICAgIGVsc2UgaWYgKG5ld19udGggPiBfX2ttcF9tYXhfbnRoKQorICAgICAgICBuZXdfbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIEtNUF9DT1VOVF9WQUxVRShPTVBfc2V0X251bXRocmVhZHMsIG5ld19udGgpOworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fbnByb2MoIHRocmVhZCwgbmV3X250aCApOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsIHdpbGwgY2F1c2UgdGhlIGhvdCB0ZWFtIHNpemUgdG8gYmUKKyAgICAvLyByZWR1Y2VkIChpbiB0aGUgYWJzZW5jZSBvZiBhIG51bV90aHJlYWRzIGNsYXVzZSksIHRoZW4gcmVkdWNlIGl0IG5vdywKKyAgICAvLyByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisgICAgLy8KKyAgICByb290ID0gdGhyZWFkLT50aC50aF9yb290OworICAgIGlmICggX19rbXBfaW5pdF9wYXJhbGxlbCAmJiAoICEgcm9vdC0+ci5yX2FjdGl2ZSApCisgICAgICAmJiAoIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jID4gbmV3X250aCApCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICYmIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgJiYgIV9fa21wX2hvdF90ZWFtc19tb2RlCisjZW5kaWYKKyAgICApIHsKKyAgICAgICAga21wX3RlYW1fdCAqaG90X3RlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisgICAgICAgIGludCBmOworCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBleHRyYSB0aHJlYWRzIHdlIGRvbid0IG5lZWQgYW55IG1vcmUuCisgICAgICAgIGZvciAoIGYgPSBuZXdfbnRoOyAgZiA8IGhvdF90ZWFtLT50LnRfbnByb2M7IGYrKyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBkZWNyZWFzaW5nIHRlYW0gc2l6ZSwgdGhyZWFkcyBubyBsb25nZXIgaW4gdGhlIHRlYW0gc2hvdWxkIHVucmVmIHRhc2sgdGVhbS4KKyAgICAgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdICk7CisgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gPSAgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBob3RfdGVhbS0+dC50X25wcm9jID0gbmV3X250aDsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICBpZiggdGhyZWFkLT50aC50aF9ob3RfdGVhbXMgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBob3RfdGVhbSA9PSB0aHJlYWQtPnRoLnRoX2hvdF90ZWFtc1swXS5ob3RfdGVhbSApOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9ob3RfdGVhbXNbMF0uaG90X3RlYW1fbnRoID0gbmV3X250aDsKKyAgICAgICAgfQorI2VuZGlmCisKKworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdF9ucHJvYyBmaWVsZCBpbiB0aGUgdGhyZWFkcyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUuCisgICAgICAgIC8vCisgICAgICAgIGZvciggZj0wIDsgZiA8IG5ld19udGg7IGYrKyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMICk7CisgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPSBuZXdfbnRoOworICAgICAgICB9CisgICAgICAgIC8vIFNwZWNpYWwgZmxhZyBpbiBjYXNlIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsCisgICAgICAgIGhvdF90ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gLTE7CisgICAgfQorfQorCisvKiBDaGFuZ2VzIG1heF9hY3RpdmVfbGV2ZWxzICovCit2b2lkCitfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkLCBpbnQgbWF4X2FjdGl2ZV9sZXZlbHMgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzOiBuZXcgbWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsIGd0aWQsIG1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICBpZiggbWF4X2FjdGl2ZV9sZXZlbHMgPCAwICkgeworICAgICAgICBLTVBfV0FSTklORyggQWN0aXZlTGV2ZWxzTmVnYXRpdmUsIG1heF9hY3RpdmVfbGV2ZWxzICk7CisgICAgICAgIC8vIFdlIGlnbm9yZSB0aGlzIGNhbGwgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAvLyBUaGUgY3VycmVudCBzZXR0aW5nIHdvbid0IGJlIGNoYW5nZWQuIFRoZSBsYXN0IHZhbGlkIHNldHRpbmcgd2lsbCBiZSB1c2VkLgorICAgICAgICAvLyBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgKGlmIHdhcm5pbmdzIGFyZSBhbGxvd2VkIGFzIGNvbnRyb2xsZWQgYnkgdGhlIEtNUF9XQVJOSU5HUyBlbnYgdmFyKS4KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IHRoZSBjYWxsIGlzIGlnbm9yZWQ6IG5ldyBtYXhfYWN0aXZlX2xldmVscyBmb3IgdGhyZWFkICVkID0gKCVkKVxuIiwgZ3RpZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBtYXhfYWN0aXZlX2xldmVscyA8PSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgKSB7CisgICAgICAgIC8vIGl0J3MgT0ssIHRoZSBtYXhfYWN0aXZlX2xldmVscyBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlOiBbIDA7IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCBdCisgICAgICAgIC8vIFdlIGFsbG93IGEgemVybyB2YWx1ZS4gKGltcGxlbWVudGF0aW9uIGRlZmluZWQgYmVoYXZpb3IpCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFjdGl2ZUxldmVsc0V4Y2VlZExpbWl0LCBtYXhfYWN0aXZlX2xldmVscywgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUICApOworICAgICAgICBtYXhfYWN0aXZlX2xldmVscyA9IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVDsKKyAgICAgICAgLy8gQ3VycmVudCB1cHBlciBsaW1pdCBpcyBNQVhfSU5ULiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IGV4Y2VlZHMgdGhlIHVwcGVyIGxpbWl0LCB3ZSBjb3JyZWN0IHRoZSBpbnB1dCB0byBiZSB0aGUgdXBwZXIgbGltaXQuIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJlaGF2aW9yKQorICAgICAgICAvLyBBY3R1YWxseSwgdGhlIGZsb3cgc2hvdWxkIG5ldmVyIGdldCBoZXJlIHVudGlsIHdlIHVzZSBNQVhfSU5UIGxpbWl0LgorICAgIH0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVsczogYWZ0ZXIgdmFsaWRhdGlvbjogbmV3IG1heF9hY3RpdmVfbGV2ZWxzIGZvciB0aHJlYWQgJWQgPSAoJWQpXG4iLCBndGlkLCBtYXhfYWN0aXZlX2xldmVscyApICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fbWF4X2FjdGl2ZV9sZXZlbHMoIHRocmVhZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKTsKKworfQorCisvKiBHZXRzIG1heF9hY3RpdmVfbGV2ZWxzICovCitpbnQKK19fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aHJlYWQgJWRcbiIsIGd0aWQgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVsczogdGhyZWFkICVkLCBjdXJ0YXNrPSVwLCBjdXJ0YXNrX21heGFjbGV2ZWw9JWRcbiIsCisgICAgICAgIGd0aWQsIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLCB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgcmV0dXJuIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzOworfQorCisvKiBDaGFuZ2VzIGRlZl9zY2hlZF92YXIgSUNWIHZhbHVlcyAocnVuLXRpbWUgc2NoZWR1bGUga2luZCBhbmQgY2h1bmspICovCit2b2lkCitfX2ttcF9zZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgY2h1bmsgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKy8vICAgIGttcF90ZWFtX3QgKnRlYW07CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfc2V0X3NjaGVkdWxlOiBuZXcgc2NoZWR1bGUgZm9yIHRocmVhZCAlZCA9ICglZCwgJWQpXG4iLCBndGlkLCAoaW50KWtpbmQsIGNodW5rICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUga2luZCBwYXJhbWV0ZXIgaXMgdmFsaWQsIGNvcnJlY3QgaWYgbmVlZGVkLgorICAgIC8vIFZhbGlkIHBhcmFtZXRlcnMgc2hvdWxkIGZpdCBpbiBvbmUgb2YgdHdvIGludGVydmFscyAtIHN0YW5kYXJkIG9yIGV4dGVuZGVkOgorICAgIC8vICAgICAgIDxsb3dlcj4sIDx2YWxpZD4sIDx1cHBlcl9zdGQ+LCA8bG93ZXJfZXh0PiwgPHZhbGlkPiwgPHVwcGVyPgorICAgIC8vIDIwMDgtMDEtMjU6IDAsICAxIC0gNCwgICAgICAgNSwgICAgICAgICAxMDAsICAgICAxMDEgLSAxMDIsIDEwMworICAgIGlmICgga2luZCA8PSBrbXBfc2NoZWRfbG93ZXIgfHwga2luZCA+PSBrbXBfc2NoZWRfdXBwZXIgfHwKKyAgICAgICAoIGtpbmQgPD0ga21wX3NjaGVkX2xvd2VyX2V4dCAmJiBraW5kID49IGttcF9zY2hlZF91cHBlcl9zdGQgKSApCisgICAgeworICAgICAgICAvLyBUT0RPOiBIaW50IG5lZWRzIGF0dGVudGlvbiBpbiBjYXNlIHdlIGNoYW5nZSB0aGUgZGVmYXVsdCBzY2hlZHVsZS4KKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICBLTVBfTVNHKCBTY2hlZHVsZUtpbmRPdXRPZlJhbmdlLCBraW5kICksCisgICAgICAgICAgICBLTVBfSE5UKCBEZWZhdWx0U2NoZWR1bGVLaW5kVXNlZCwgInN0YXRpYywgbm8gY2h1bmsiICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgICAgICBraW5kID0ga21wX3NjaGVkX2RlZmF1bHQ7CisgICAgICAgIGNodW5rID0gMDsgICAgICAgICAvLyBpZ25vcmUgY2h1bmsgdmFsdWUgaW4gY2FzZSBvZiBiYWQga2luZAorICAgIH0KKworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgaWYgKCBraW5kIDwga21wX3NjaGVkX3VwcGVyX3N0ZCApIHsKKyAgICAgICAgaWYgKCBraW5kID09IGttcF9zY2hlZF9zdGF0aWMgJiYgY2h1bmsgPCBLTVBfREVGQVVMVF9DSFVOSyApIHsKKyAgICAgICAgICAgIC8vIGRpZmZlciBzdGF0aWMgY2h1bmtlZCB2cy4gdW5jaHVua2VkOgorICAgICAgICAgICAgLy8gY2h1bmsgc2hvdWxkIGJlIGludmFsaWQgdG8gaW5kaWNhdGUgdW5jaHVua2VkIHNjaGVkdWxlICh3aGljaCBpcyB0aGUgZGVmYXVsdCkKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9IGttcF9zY2hfc3RhdGljOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc2NoX21hcFsga2luZCAtIGttcF9zY2hlZF9sb3dlciAtIDEgXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXTsKKyAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0KKyAgICAgICAgICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXTsKKyAgICB9CisgICAgaWYgKCBraW5kID09IGttcF9zY2hlZF9hdXRvICkgeworICAgICAgICAvLyBpZ25vcmUgcGFyYW1ldGVyIGNodW5rIGZvciBzY2hlZHVsZSBhdXRvCisgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLmNodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQuY2h1bmsgPSBjaHVuazsKKyAgICB9Cit9CisKKy8qIEdldHMgZGVmX3NjaGVkX3ZhciBJQ1YgdmFsdWVzICovCit2b2lkCitfX2ttcF9nZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCAqIGtpbmQsIGludCAqIGNodW5rICkKK3sKKyAgICBrbXBfaW5mb190ICAgICAqdGhyZWFkOworICAgIGVudW0gc2NoZWRfdHlwZSB0aF90eXBlOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2dldF9zY2hlZHVsZTogdGhyZWFkICVkXG4iLCBndGlkICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICAvL3RoX3R5cGUgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXRfc2NoZWRbIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXS5yX3NjaGVkX3R5cGU7CisgICAgdGhfdHlwZSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZTsKKworICAgIHN3aXRjaCAoIHRoX3R5cGUgKSB7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWM7CisgICAgICAgICpjaHVuayA9IDA7ICAgLy8gY2h1bmsgd2FzIG5vdCBzZXQsIHRyeSB0byBzaG93IHRoaXMgZmFjdCB2aWEgemVybyB2YWx1ZQorICAgICAgICByZXR1cm47CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX2R5bmFtaWM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfY2h1bmtlZDoKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9ndWlkZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9hdXRvOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9hdXRvOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3RyYXBlem9pZGFsOworICAgICAgICBicmVhazsKKy8qCisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfc3RhdGljX3N0ZWFsOworICAgICAgICBicmVhazsKKyovCisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duU2NoZWR1bGluZ1R5cGUsIHRoX3R5cGUgKTsKKyAgICB9CisKKyAgICAvLypjaHVuayA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NldF9zY2hlZFsgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdLmNodW5rOworICAgICpjaHVuayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLmNodW5rOworfQorCitpbnQKK19fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgZ3RpZCwgaW50IGxldmVsICkgeworCisgICAgaW50IGlpLCBkZDsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKnRocjsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bTogdGhyZWFkICVkICVkXG4iLCBndGlkLCBsZXZlbCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgICBpZiggbGV2ZWwgPT0gMCApIHJldHVybiAwOworICAgIGlmKCBsZXZlbCA8IDAgKSByZXR1cm4gLTE7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgaWYoIGxldmVsID4gaWkgKSByZXR1cm4gLTE7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgLy8gQUM6IHdlIGFyZSBpbiB0ZWFtcyByZWdpb24gd2hlcmUgbXVsdGlwbGUgbmVzdGVkIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgaWYoIGxldmVsIDw9IHRsZXZlbCApIHsgLy8gb3RoZXJ3aXNlIHVzdWFsIGFsZ29yaXRobSB3b3JrcyAod2lsbCBub3QgdG91Y2ggdGhlIHRlYW1zKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICAvLyBBQzogQXMgd2UgbmVlZCB0byBwYXNzIGJ5IHRoZSB0ZWFtcyBsZWFndWUsIHdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IGluY3JlYXNlIGlpCisgICAgICAgICAgICBpZiAoIGlpID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICBpaSArPSAyOyAvLyB0aHJlZSB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWkgKys7ICAgLy8gdHdvIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggaWkgPT0gbGV2ZWwgKSByZXR1cm4gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworCisgICAgZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICBsZXZlbCsrOworICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICB7CisgICAgICAgIGZvciggZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBpZiggKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApICYmICggIWRkICkgKSB7CisgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBkZCA9IHRlYW0tPnQudF9zZXJpYWxpemVkOworICAgICAgICAgICAgaWktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIGRkID4gMSApID8gKCAwICkgOiAoIHRlYW0tPnQudF9tYXN0ZXJfdGlkICk7Cit9CisKK2ludAorX19rbXBfZ2V0X3RlYW1fc2l6ZSggaW50IGd0aWQsIGludCBsZXZlbCApIHsKKworICAgIGludCBpaSwgZGQ7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aHI7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfZ2V0X3RlYW1fc2l6ZTogdGhyZWFkICVkICVkXG4iLCBndGlkLCBsZXZlbCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgICBpZiggbGV2ZWwgPT0gMCApIHJldHVybiAxOworICAgIGlmKCBsZXZlbCA8IDAgKSByZXR1cm4gLTE7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgaWYoIGxldmVsID4gaWkgKSByZXR1cm4gLTE7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgLy8gQUM6IHdlIGFyZSBpbiB0ZWFtcyByZWdpb24gd2hlcmUgbXVsdGlwbGUgbmVzdGVkIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgaWYoIGxldmVsIDw9IHRsZXZlbCApIHsgLy8gb3RoZXJ3aXNlIHVzdWFsIGFsZ29yaXRobSB3b3JrcyAod2lsbCBub3QgdG91Y2ggdGhlIHRlYW1zKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICAvLyBBQzogQXMgd2UgbmVlZCB0byBwYXNzIGJ5IHRoZSB0ZWFtcyBsZWFndWUsIHdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IGluY3JlYXNlIGlpCisgICAgICAgICAgICBpZiAoIGlpID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICBpaSArPSAyOyAvLyB0aHJlZSB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWkgKys7ICAgLy8gdHdvIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgeworICAgICAgICBmb3IoIGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgaWYoIHRlYW0tPnQudF9zZXJpYWxpemVkICYmICggIWRkICkgKSB7CisgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBpaS0tOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRlYW0tPnQudF9ucHJvYzsKK30KKwora21wX3Jfc2NoZWRfdAorX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCgpIHsKKy8vIFRoaXMgcm91dGluZSBjcmVhdGVkIGJlY2F1c2UgcGFpcnMgKF9fa21wX3NjaGVkLCBfX2ttcF9jaHVuaykgYW5kIChfX2ttcF9zdGF0aWMsIF9fa21wX2d1aWRlZCkKKy8vIG1heSBiZSBjaGFuZ2VkIGJ5IGttcF9zZXRfZGVmYXVsdHMgaW5kZXBlbmRlbnRseS4gU28gb25lIGNhbiBnZXQgdGhlIHVwZGF0ZWQgc2NoZWR1bGUgaGVyZS4KKworICAgIGttcF9yX3NjaGVkX3Qgcl9zY2hlZDsKKworICAgIC8vIGNyZWF0ZSBzY2hlZHVsZSBmcm9tIDQgZ2xvYmFsczogX19rbXBfc2NoZWQsIF9fa21wX2NodW5rLCBfX2ttcF9zdGF0aWMsIF9fa21wX2d1aWRlZAorICAgIC8vIF9fa21wX3NjaGVkIHNob3VsZCBrZWVwIG9yaWdpbmFsIHZhbHVlLCBzbyB0aGF0IHVzZXIgY2FuIHNldCBLTVBfU0NIRURVTEUgbXVsdGlwbGUgdGltZXMsCisgICAgLy8gYW5kIHRodXMgaGF2ZSBkaWZmZXJlbnQgcnVuLXRpbWUgc2NoZWR1bGVzIGluIGRpZmZlcmVudCByb290cyAoZXZlbiBpbiBPTVAgMi41KQorICAgIGlmICggX19rbXBfc2NoZWQgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgIHJfc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc3RhdGljOyAvLyByZXBsYWNlIFNUQVRJQyB3aXRoIG1vcmUgZGV0YWlsZWQgc2NoZWR1bGUgKGJhbGFuY2VkIG9yIGdyZWVkeSkKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9zY2hlZCA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICkgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX2d1aWRlZDsgLy8gcmVwbGFjZSBHVUlERUQgd2l0aCBtb3JlIGRldGFpbGVkIHNjaGVkdWxlIChpdGVyYXRpdmUgb3IgYW5hbHl0aWNhbCkKKyAgICB9IGVsc2UgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX3NjaGVkOyAgLy8gKFNUQVRJQ19DSFVOS0VEKSwgb3IgKERZTkFNSUNfQ0hVTktFRCksIG9yIG90aGVyCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9jaHVuayA8IEtNUF9ERUZBVUxUX0NIVU5LICkgeyAvLyBfX2ttcF9jaHVuayBtYXkgYmUgd3JvbmcgaGVyZSAoaWYgaXQgd2FzIG5vdCBldmVyIHNldCkKKyAgICAgICAgcl9zY2hlZC5jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJfc2NoZWQuY2h1bmsgPSBfX2ttcF9jaHVuazsKKyAgICB9CisKKyAgICByZXR1cm4gcl9zY2hlZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogQWxsb2NhdGUgKHJlYWxsb2MgPT0gRkFMU0UpICogb3IgcmVhbGxvY2F0ZSAocmVhbGxvYyA9PSBUUlVFKQorICogYXQgbGVhc3QgYXJnYyBudW1iZXIgb2YgKnRfYXJndiBlbnRyaWVzIGZvciB0aGUgcmVxdWVzdGVkIHRlYW0uCisgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgcmVhbGxvYyApCit7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgaWYoICFyZWFsbG9jIHx8IGFyZ2MgPiB0ZWFtLT50LnRfbWF4X2FyZ2MgKSB7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBuZWVkZWQgZW50cmllcz0lZCwgY3VycmVudCBlbnRyaWVzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgYXJnYywgKCByZWFsbG9jICkgPyB0ZWFtLT50LnRfbWF4X2FyZ2MgOiAwICkpOworICAgICAgICAvKiBpZiBwcmV2aW91c2x5IGFsbG9jYXRlZCBoZWFwIHNwYWNlIGZvciBhcmdzLCBmcmVlIHRoZW0gKi8KKyAgICAgICAgaWYgKCByZWFsbG9jICYmIHRlYW0tPnQudF9hcmd2ICE9ICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF0gKQorICAgICAgICAgICAgX19rbXBfZnJlZSggKHZvaWQgKikgdGVhbS0+dC50X2FyZ3YgKTsKKworICAgICAgICBpZiAoIGFyZ2MgPD0gS01QX0lOTElORV9BUkdWX0VOVFJJRVMgKSB7CisgICAgICAgICAgICAvKiB1c2UgdW51c2VkIHNwYWNlIGluIHRoZSBjYWNoZSBsaW5lIGZvciBhcmd1bWVudHMgKi8KKyAgICAgICAgICAgIHRlYW0tPnQudF9tYXhfYXJnYyA9IEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBpbmxpbmUgYWxsb2NhdGUgJWQgYXJndiBlbnRyaWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9tYXhfYXJnYyApKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF9hcmd2ID0gJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXTsKKyAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbS01QX0lOTElORV9BUkdWX0VOVFJJRVNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHZvaWQgKikgKiBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWFtXyVkLnRfaW5saW5lX2FyZ3YiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgaW4gdGhlIGhlYXAgKi8KKyAgICAgICAgICAgIHRlYW0tPnQudF9tYXhfYXJnYyA9ICggYXJnYyA8PSAoS01QX01JTl9NQUxMT0NfQVJHVl9FTlRSSUVTID4+IDEgKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA6IDIgKiBhcmdjOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBkeW5hbWljIGFsbG9jYXRlICVkIGFyZ3YgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MgKSk7CisgICAgICAgICAgICB0ZWFtLT50LnRfYXJndiAgICAgPSAodm9pZCoqKSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplb2Yodm9pZCopICogdGVhbS0+dC50X21heF9hcmdjICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2FyZ3ZbMF0sICZ0ZWFtLT50LnRfYXJndlt0ZWFtLT50LnRfbWF4X2FyZ2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSAqIHRlYW0tPnQudF9tYXhfYXJnYywgInRlYW1fJWQudF9hcmd2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyhrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbWF4X250aCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbnVtX2Rpc3BfYnVmZiA9IG1heF9udGggPiAxID8gS01QX01BWF9ESVNQX0JVRiA6IDI7CisjaWYgS01QX1VTRV9QT09MRURfQUxMT0MKKyAgICAvLyBBQzogVE9ETzogZml4IGJ1ZyBoZXJlOiBzaXplIG9mIHRfZGlzcF9idWZmZXIgc2hvdWxkIG5vdCBiZSBtdWx0aXBsaWVkIGJ5IG1heF9udGghCisgICAgY2hhciAqcHRyID0gX19rbXBfYWxsb2NhdGUobWF4X250aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBzaXplb2Yoa21wX2luZm9fdCopICsgc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpKm51bV9kaXNwX2J1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKGttcF9kaXNwX3QpICsgc2l6ZW9mKGludCkqNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vKyBzaXplb2YoaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKGttcF9yX3NjaGVkX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICkgKTsKKworICAgIHRlYW0tPnQudF90aHJlYWRzICAgICAgICAgID0gKGttcF9pbmZvX3QqKikgcHRyOyBwdHIgKz0gc2l6ZW9mKGttcF9pbmZvX3QqKSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyICAgICAgPSAoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCopIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmY7CisgICAgdGVhbS0+dC50X2Rpc3BhdGNoICAgICAgICAgPSAoa21wX2Rpc3BfdCopIHB0cjsgcHRyICs9IHNpemVvZihrbXBfZGlzcF90KSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X3NldF9ucHJvYyAgICAgICAgPSAoaW50KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGludCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9zZXRfZHluYW1pYyAgICAgID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtLT50LnRfc2V0X25lc3RlZCAgICAgICA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X3NldF9ibG9ja3RpbWUgICAgPSAoaW50KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGludCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtLT50LnRfc2V0X2J0X3NldCAgICAgICA9IChpbnQqKSBwdHI7CisgICAgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICAvL3RlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgPSAoaW50KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGludCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9zZXRfc2NoZWQgICAgICAgID0gKGttcF9yX3NjaGVkX3QqKSBwdHI7CisgICAgcHRyICs9IHNpemVvZihrbXBfcl9zY2hlZF90KSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QqKSBwdHI7CisgICAgcHRyICs9IHNpemVvZihrbXBfdGFza2RhdGFfdCkgKiBtYXhfbnRoOworI2Vsc2UKKworICAgIHRlYW0tPnQudF90aHJlYWRzID0gKGttcF9pbmZvX3QqKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfaW5mb190KikgKiBtYXhfbnRoICk7CisgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyID0gKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QqKQorICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpICogbnVtX2Rpc3BfYnVmZiApOworICAgIHRlYW0tPnQudF9kaXNwYXRjaCA9IChrbXBfZGlzcF90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfZGlzcF90KSAqIG1heF9udGggKTsKKyAgICAvL3RlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworICAgIC8vdGVhbS0+dC50X3NldF9zY2hlZCA9IChrbXBfcl9zY2hlZF90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfcl9zY2hlZF90KSAqIG1heF9udGggKTsKKyAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICogbWF4X250aCApOworI2VuZGlmCisgICAgdGVhbS0+dC50X21heF9ucHJvYyA9IG1heF9udGg7CisKKyAgICAvKiBzZXR1cCBkaXNwYXRjaCBidWZmZXJzICovCisgICAgZm9yKGkgPSAwIDsgaSA8IG51bV9kaXNwX2J1ZmY7ICsraSkKKyAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2ldLmJ1ZmZlcl9pbmRleCA9IGk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0pIHsKKyAgICAvKiBOb3RlOiB0aGlzIGRvZXMgbm90IGZyZWUgdGhlIHRocmVhZHMgaW4gdF90aHJlYWRzIChfX2ttcF9mcmVlX3RocmVhZHMpICovCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCB0ZWFtLT50LnRfbWF4X25wcm9jOyArKyBpICkgeworICAgICAgICBpZiAoIHRlYW0tPnQudF9kaXNwYXRjaFsgaSBdLnRoX2Rpc3BfYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCB0ZWFtLT50LnRfZGlzcGF0Y2hbIGkgXS50aF9kaXNwX2J1ZmZlciApOworICAgICAgICAgICAgdGVhbS0+dC50X2Rpc3BhdGNoWyBpIF0udGhfZGlzcF9idWZmZXIgPSBOVUxMOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3RocmVhZHMpOworICAgICNpZiAhS01QX1VTRV9QT09MRURfQUxMT0MKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzKTsKKyAgICAgICAgLy9fX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfc2NoZWQpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhKTsKKyAgICAjZW5kaWYKKyAgICB0ZWFtLT50LnRfdGhyZWFkcyAgICAgPSBOVUxMOworICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlciA9IE5VTEw7CisgICAgdGVhbS0+dC50X2Rpc3BhdGNoICAgID0gTlVMTDsKKyAgICAvL3RlYW0tPnQudF9zZXRfc2NoZWQgICA9IDA7CisgICAgLy90ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzID0gMDsKKyAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWFsbG9jYXRlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0sIGludCBtYXhfbnRoKSB7CisgICAga21wX2luZm9fdCAqKm9sZFRocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworICAgICNpZiAhS01QX1VTRV9QT09MRURfQUxMT0MKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzKTsKKyAgICAgICAgLy9fX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfc2NoZWQpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhKTsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyh0ZWFtLCBtYXhfbnRoKTsKKworICAgIEtNUF9NRU1DUFkodGVhbS0+dC50X3RocmVhZHMsIG9sZFRocmVhZHMsIHRlYW0tPnQudF9ucHJvYyAqIHNpemVvZiAoa21wX2luZm9fdCopKTsKKworICAgIF9fa21wX2ZyZWUob2xkVGhyZWFkcyk7Cit9CisKK3N0YXRpYyBrbXBfaW50ZXJuYWxfY29udHJvbF90CitfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoIHZvaWQgKSB7CisKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPiAwICk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ19pY3ZzID0geworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnQgc2VyaWFsX25lc3RpbmdfbGV2ZWw7IC8vY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aF90ZWFtX3NlcmlhbGl6ZWQgZmllbGQKKyAgICAgIChrbXBfaW50OClfX2ttcF9kZmx0X25lc3RlZCwgICAgICAgICAgICAvL2ludCBuZXN0ZWQ7ICAgICAgICAgICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gKHBlciB0aHJlYWQpCisgICAgICAoa21wX2ludDgpX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpCisgICAgICAoa21wX2ludDgpX19rbXBfZW52X2Jsb2NrdGltZSwgICAgICAgICAgLy9pbnQgYnRfc2V0OyAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3Igd2hldGhlciBibG9ja3RpbWUgaXMgZXhwbGljaXRseSBzZXQKKyAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lLCAgICAgICAgIC8vaW50IGJsb2NrdGltZTsgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZQorICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzLCAgICAgICAgICAgLy9pbnQgYnRfaW50ZXJ2YWxzOyAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscworICAgICAgX19rbXBfZGZsdF90ZWFtX250aCwgICAgICAgICAgLy9pbnQgbnByb2M7ICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgIyBvZiB0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYSBtYXggdWIgb24gdmFsdWUgaWYgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSBub3QgY2FsbGVkIHlldCkKKyAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMsIC8vaW50IG1heF9hY3RpdmVfbGV2ZWxzOyAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgICByX3NjaGVkLCAgICAgICAgICAgICAgICAgICAgICAvL2ttcF9yX3NjaGVkX3Qgc2NoZWQ7ICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBydW50aW1lIHNjaGVkdWxlIHtzY2hlZCxjaHVua30gcGFpcgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RydWN0IGttcF9pbnRlcm5hbF9jb250cm9sICpuZXh0OworICAgIH07CisKKyAgICByZXR1cm4gZ19pY3ZzOworfQorCitzdGF0aWMga21wX2ludGVybmFsX2NvbnRyb2xfdAorX19rbXBfZ2V0X3hfZ2xvYmFsX2ljdnMoIGNvbnN0IGttcF90ZWFtX3QgKnRlYW0gKSB7CisKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IGd4X2ljdnM7CisgICAgZ3hfaWN2cy5zZXJpYWxfbmVzdGluZ19sZXZlbCA9IDA7IC8vIHByb2JhYmx5ID10ZWFtLT50LnRfc2VyaWFsIGxpa2UgaW4gc2F2ZV9pbnRlcl9jb250cm9scworICAgIGNvcHlfaWN2cyggJiBneF9pY3ZzLCAmIHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMgKTsKKyAgICBneF9pY3ZzLm5leHQgPSBOVUxMOworCisgICAgcmV0dXJuIGd4X2ljdnM7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0aWFsaXplX3Jvb3QoIGttcF9yb290X3QgKnJvb3QgKQoreworICAgIGludCAgICAgICAgICAgZjsKKyAgICBrbXBfdGVhbV90ICAgKnJvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICAgKmhvdF90ZWFtOworICAgIGludCAgICAgICAgICAgaG90X3RlYW1fbWF4X250aDsKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X2dsb2JhbF9pY3ZzKCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCApOworICAgIEtNUF9BU1NFUlQoICEgcm9vdC0+ci5yX2JlZ2luICk7CisKKyAgICAvKiBzZXR1cCB0aGUgcm9vdCBzdGF0ZSBzdHJ1Y3R1cmUgKi8KKyAgICBfX2ttcF9pbml0X2xvY2soICZyb290LT5yLnJfYmVnaW5fbG9jayApOworICAgIHJvb3QtPnIucl9iZWdpbiAgICAgICAgPSBGQUxTRTsKKyAgICByb290LT5yLnJfYWN0aXZlICAgICAgID0gRkFMU0U7CisgICAgcm9vdC0+ci5yX2luX3BhcmFsbGVsICA9IDA7CisgICAgcm9vdC0+ci5yX2Jsb2NrdGltZSAgICA9IF9fa21wX2RmbHRfYmxvY2t0aW1lOworICAgIHJvb3QtPnIucl9uZXN0ZWQgICAgICAgPSBfX2ttcF9kZmx0X25lc3RlZDsKKworICAgIC8qIHNldHVwIHRoZSByb290IHRlYW0gZm9yIHRoaXMgdGFzayAqLworICAgIC8qIGFsbG9jYXRlIHRoZSByb290IHRlYW0gc3RydWN0dXJlICovCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGJlZm9yZSByb290X3RlYW1cbiIgKSApOworCisgICAgcm9vdF90ZWFtID0KKyAgICAgICAgX19rbXBfYWxsb2NhdGVfdGVhbSgKKyAgICAgICAgICAgIHJvb3QsCisgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld19ucHJvYworICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhfbnByb2MKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIDAsIC8vIHJvb3QgcGFyYWxsZWwgaWQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisjZW5kaWYKKyAgICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZ2MKKyAgICAgICAgICAgIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzdGVyIHRocmVhZCBpcyB1bmtub3duCisgICAgICAgICk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgLy8gTm9uLU5VTEwgdmFsdWUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIG1ha2UgdGhlIGRlYnVnZ2VyIGRpc3BsYXkgdGhlIHJvb3QgdGVhbS4KKyAgICBUQ1dfU1lOQ19QVFIocm9vdF90ZWFtLT50LnRfcGtmbiwgKG1pY3JvdGFza190KSggfiAwICkpOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgcm9vdF90ZWFtID0gJXBcbiIsIHJvb3RfdGVhbSApICk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtID0gcm9vdF90ZWFtOworICAgIHJvb3RfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wID0gTlVMTDsKKworICAgIC8qIGluaXRpYWxpemUgcm9vdCB0ZWFtICovCisgICAgcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IE5VTEw7CisgICAgcm9vdF90ZWFtLT50LnRfbnByb2MgICAgICA9IDE7CisgICAgcm9vdF90ZWFtLT50LnRfc2VyaWFsaXplZCA9IDE7CisgICAgLy8gVE9ETz8/Pzogcm9vdF90ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICAgIHJvb3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIHJvb3RfdGVhbS0+dC50X3NjaGVkLmNodW5rICAgICAgICA9IHJfc2NoZWQuY2h1bms7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2luaXRpYWxpemVfcm9vdDogaW5pdCByb290IHRlYW0gJWQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHJvb3RfdGVhbS0+dC50X2lkLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworCisgICAgLyogc2V0dXAgdGhlICBob3QgdGVhbSBmb3IgdGhpcyB0YXNrICovCisgICAgLyogYWxsb2NhdGUgdGhlIGhvdCB0ZWFtIHN0cnVjdHVyZSAqLworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBiZWZvcmUgaG90X3RlYW1cbiIgKSApOworCisgICAgaG90X3RlYW0gPQorICAgICAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtKAorICAgICAgICAgICAgcm9vdCwKKyAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3X25wcm9jCisgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICogMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heF9ucHJvYworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSwKKyNlbmRpZgorICAgICAgICAgICAgJnJfaWN2cywKKyAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJnYworICAgICAgICAgICAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXN0ZXIgdGhyZWFkIGlzIHVua25vd24KKyAgICAgICAgKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgaG90X3RlYW0gPSAlcFxuIiwgaG90X3RlYW0gKSApOworCisgICAgcm9vdC0+ci5yX2hvdF90ZWFtID0gaG90X3RlYW07CisgICAgcm9vdF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgICAgLyogZmlyc3QtdGltZSBpbml0aWFsaXphdGlvbiAqLworICAgIGhvdF90ZWFtLT50LnRfcGFyZW50ID0gcm9vdF90ZWFtOworCisgICAgLyogaW5pdGlhbGl6ZSBob3QgdGVhbSAqLworICAgIGhvdF90ZWFtX21heF9udGggPSBob3RfdGVhbS0+dC50X21heF9ucHJvYzsKKyAgICBmb3IgKCBmID0gMDsgZiA8IGhvdF90ZWFtX21heF9udGg7ICsrIGYgKSB7CisgICAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gTlVMTDsKKyAgICB9OyAvLyBmb3IKKyAgICBob3RfdGVhbS0+dC50X25wcm9jID0gMTsKKyAgICAvLyBUT0RPPz8/OiBob3RfdGVhbS0+dC50X21heF9hY3RpdmVfbGV2ZWxzID0gX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVsczsKKyAgICBob3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIGhvdF90ZWFtLT50LnRfc2NoZWQuY2h1bmsgICAgICAgID0gcl9zY2hlZC5jaHVuazsKKyAgICBob3RfdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDA7Cit9CisKKyNpZmRlZiBLTVBfREVCVUcKKworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGVhbV9saXN0X2l0ZW0geworICAgIGttcF90ZWFtX3AgY29uc3QgKiAgICAgICAgICAgZW50cnk7CisgICAgc3RydWN0IGttcF90ZWFtX2xpc3RfaXRlbSAqICBuZXh0OworfSBrbXBfdGVhbV9saXN0X2l0ZW1fdDsKK3R5cGVkZWYga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBrbXBfdGVhbV9saXN0X3Q7CisKKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCAgICAvLyBBZGQgdGVhbSB0byBsaXN0IG9mIHRlYW1zLgorICAgIGttcF90ZWFtX2xpc3RfdCAgICAgbGlzdCwgICAgICAgIC8vIExpc3Qgb2YgdGVhbXMuCisgICAga21wX3RlYW1fcCBjb25zdCAqICB0ZWFtICAgICAgICAgLy8gVGVhbSB0byBhZGQuCispIHsKKworICAgIC8vIExpc3QgbXVzdCB0ZXJtaW5hdGUgd2l0aCBpdGVtIHdoZXJlIGJvdGggZW50cnkgYW5kIG5leHQgYXJlIE5VTEwuCisgICAgLy8gVGVhbSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvbmx5IG9uY2UuCisgICAgLy8gTGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRlYW0gaWQuCisgICAgLy8gVGVhbSBpZCBpcyAqbm90KiBhIGtleS4KKworICAgIGttcF90ZWFtX2xpc3RfdCBsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggbGlzdCAhPSBOVUxMICk7CisgICAgaWYgKCB0ZWFtID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHRlYW0tPnQudF9wYXJlbnQgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGVhbS0+dC50X25leHRfcG9vbCApOworCisgICAgLy8gU2VhcmNoIGxpc3QgZm9yIHRoZSB0ZWFtLgorICAgIGwgPSBsaXN0OworICAgIHdoaWxlICggbC0+bmV4dCAhPSBOVUxMICYmIGwtPmVudHJ5ICE9IHRlYW0gKSB7CisgICAgICAgIGwgPSBsLT5uZXh0OworICAgIH07IC8vIHdoaWxlCisgICAgaWYgKCBsLT5uZXh0ICE9IE5VTEwgKSB7CisgICAgICAgIHJldHVybjsgIC8vIFRlYW0gaGFzIGJlZW4gYWRkZWQgYmVmb3JlLCBleGl0LgorICAgIH07IC8vIGlmCisKKyAgICAvLyBUZWFtIGlzIG5vdCBmb3VuZC4gU2VhcmNoIGxpc3QgYWdhaW4gZm9yIGluc2VydGlvbiBwb2ludC4KKyAgICBsID0gbGlzdDsKKyAgICB3aGlsZSAoIGwtPm5leHQgIT0gTlVMTCAmJiBsLT5lbnRyeS0+dC50X2lkIDw9IHRlYW0tPnQudF9pZCApIHsKKyAgICAgICAgbCA9IGwtPm5leHQ7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIEluc2VydCB0ZWFtLgorICAgIHsKKyAgICAgICAga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBpdGVtID0KKyAgICAgICAgICAgIChrbXBfdGVhbV9saXN0X2l0ZW1fdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggIGttcF90ZWFtX2xpc3RfaXRlbV90ICkgKTsKKyAgICAgICAgKiBpdGVtID0gKiBsOworICAgICAgICBsLT5lbnRyeSA9IHRlYW07CisgICAgICAgIGwtPm5leHQgID0gaXRlbTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKAorICAgIGNoYXIgY29uc3QgKiAgICAgICB0aXRsZSwKKyAgICBrbXBfdGVhbV9wIGNvbnN0ICogdGVhbQorCispIHsKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIHRpdGxlICk7CisgICAgaWYgKCB0ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIiUyeCAlcFxuIiwgdGVhbS0+dC50X2lkLCB0ZWFtICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiIC0gKG5pbClcbiIgKTsKKyAgICB9OyAvLyBpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCgKKyAgICBjaGFyIGNvbnN0ICogICAgICAgdGl0bGUsCisgICAga21wX2luZm9fcCBjb25zdCAqIHRocmVhZAorCispIHsKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIHRpdGxlICk7CisgICAgaWYgKCB0aHJlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJTJkICVwXG4iLCB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgdGhyZWFkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiIC0gKG5pbClcbiIgKTsKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitfX2ttcF9wcmludF9zdHJ1Y3R1cmUoCisgICAgdm9pZAorKSB7CisKKyAgICBrbXBfdGVhbV9saXN0X3QgbGlzdDsKKworICAgIC8vIEluaXRpYWxpemUgbGlzdCBvZiB0ZWFtcy4KKyAgICBsaXN0ID0gKGttcF90ZWFtX2xpc3RfaXRlbV90ICopS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBrbXBfdGVhbV9saXN0X2l0ZW1fdCApICk7CisgICAgbGlzdC0+ZW50cnkgPSBOVUxMOworICAgIGxpc3QtPm5leHQgID0gTlVMTDsKKworICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5HbG9iYWwgVGhyZWFkIFRhYmxlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICIlMmQiLCBndGlkICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3RocmVhZHMgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICIgJXAiLCBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIF9fa21wX3Jvb3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICIgJXAiLCBfX2ttcF9yb290WyBndGlkIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9CisKKyAgICAvLyBQcmludCBvdXQgX19rbXBfdGhyZWFkcyBhcnJheS4KKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGhyZWFkc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgaWYgKCBfX2ttcF90aHJlYWRzICE9IE5VTEwgKSB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190IGNvbnN0ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICAgICAgaWYgKCB0aHJlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJHVElEICUyZCAlcDpcbiIsIGd0aWQsIHRocmVhZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgT3VyIFJvb3Q6ICAgICAgICAlcFxuIiwgdGhyZWFkLT50aC50aF9yb290ICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBPdXIgVGVhbTogICAgICIsICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIFNlcmlhbCBUZWFtOiAgIiwgICAgICAgIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFRocmVhZHM6ICAgICAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfdGVhbV9ucHJvYyApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIgICAgTWFzdGVyOiAgICAgICAiLCAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtX21hc3RlciApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgU2VyaWFsaXplZD86ICAlMmRcbiIsICAgdGhyZWFkLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNldCBOUHJvYzogICAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNldCBQcm9jIEJpbmQ6ICUyZFxuIiwgIHRocmVhZC0+dGgudGhfc2V0X3Byb2NfYmluZCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiAgICBOZXh0IGluIHBvb2w6ICIsICAgICAgICB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCB0aHJlYWQtPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICJUaHJlYWRzIGFycmF5IGlzIG5vdCBhbGxvY2F0ZWQuXG4iICk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIFByaW50IG91dCBfX2ttcF9yb290IGFycmF5LgorICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5VYmVyc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgaWYgKCBfX2ttcF9yb290ICE9IE5VTEwgKSB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBrbXBfcm9vdF90IGNvbnN0ICogcm9vdCA9IF9fa21wX3Jvb3RbIGd0aWQgXTsKKyAgICAgICAgICAgIGlmICggcm9vdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIkdUSUQgJTJkICVwOlxuIiwgZ3RpZCwgcm9vdCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICIgICAgUm9vdCBUZWFtOiAgICAiLCAgICAgIHJvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIEhvdCBUZWFtOiAgICAgIiwgICAgICByb290LT5yLnJfaG90X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAiICAgIFViZXIgVGhyZWFkOiAgIiwgICAgICByb290LT5yLnJfdWJlcl90aHJlYWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIEFjdGl2ZT86ICAgICAgJTJkXG4iLCByb290LT5yLnJfYWN0aXZlICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBOZXN0ZWQ/OiAgICAgICUyZFxuIiwgcm9vdC0+ci5yX25lc3RlZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgSW4gUGFyYWxsZWw6ICAlMmRcbiIsIHJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHJvb3QtPnIucl9ob3RfdGVhbSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICJVYmVycyBhcnJheSBpcyBub3QgYWxsb2NhdGVkLlxuIiApOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGVhbXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIHdoaWxlICggbGlzdC0+bmV4dCAhPSBOVUxMICkgeworICAgICAgICBrbXBfdGVhbV9wIGNvbnN0ICogdGVhbSA9IGxpc3QtPmVudHJ5OworICAgICAgICBpbnQgaTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiVGVhbSAlMnggJXA6XG4iLCB0ZWFtLT50LnRfaWQsIHRlYW0gKTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICIgICAgUGFyZW50IFRlYW06ICAgICAgIiwgICAgICB0ZWFtLT50LnRfcGFyZW50ICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIE1hc3RlciBUSUQ6ICAgICAgICUyZFxuIiwgdGVhbS0+dC50X21hc3Rlcl90aWQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTWF4IHRocmVhZHM6ICAgICAgJTJkXG4iLCB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIExldmVscyBvZiBzZXJpYWw6ICUyZFxuIiwgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTnVtYmVyIHRocmVhZHM6ICAgJTJkXG4iLCB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGkgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAiICAgIFRocmVhZCAlMmQ6ICAgICAgIiwgaSApOworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiIsIHRlYW0tPnQudF90aHJlYWRzWyBpIF0gKTsKKyAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICIgICAgTmV4dCBpbiBwb29sOiAgICAgIiwgICAgICB0ZWFtLT50LnRfbmV4dF9wb29sICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUHJpbnQgb3V0IF9fa21wX3RocmVhZF9wb29sIGFuZCBfX2ttcF90ZWFtX3Bvb2wuCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblBvb2xzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAgICJUaHJlYWQgcG9vbDogICAgICAgICAgIiwgKGttcF9pbmZvX3QgKilfX2ttcF90aHJlYWRfcG9vbCApOworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICAgIlRlYW0gcG9vbDogICAgICAgICAgICAiLCAoa21wX3RlYW1fdCAqKV9fa21wX3RlYW1fcG9vbCApOworICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworCisgICAgLy8gRnJlZSB0ZWFtIGxpc3QuCisgICAgd2hpbGUgKCBsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgIGttcF90ZWFtX2xpc3RfaXRlbV90ICogaXRlbSA9IGxpc3Q7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggaXRlbSApOworICAgIH07IC8vIHdoaWxlCisKK30KKworI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdHVmZiBmb3IgcGVyLXRocmVhZCBmYXN0IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisvLyAgVGFibGUgb2YgcHJpbWVzCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBfX2ttcF9wcmltZXNbXSA9IHsKKyAgMHg5ZTM3NzliMSwgMHhmZmU2Y2M1OSwgMHgyMTA5ZjZkZCwgMHg0Mzk3N2FiNSwKKyAgMHhiYTU3MDNmNSwgMHhiNDk1YTg3NywgMHhlMTYyNjc0MSwgMHg3OTY5NWU2YiwKKyAgMHhiYzk4YzA5ZiwgMHhkNWJlZTJiMywgMHgyODc0ODhmOSwgMHgzYWYxODIzMSwKKyAgMHg5Njc3Y2Q0ZCwgMHhiZTNhNjkyOSwgMHhhZGM2YTg3NywgMHhkY2YwNjc0YiwKKyAgMHhiZTRkNmZlOSwgMHg1ZjE1ZTIwMSwgMHg5OWFmYzNmZCwgMHhmM2YxNjgwMSwKKyAgMHhlMjIyY2ZmZiwgMHgyNGJhNWZkYiwgMHgwNjIwNDUyZCwgMHg3OWYxNDllMywKKyAgMHhjOGI5M2Y0OSwgMHg5NzI3MDJjZCwgMHhiMDdkZDgyNywgMHg2Yzk3ZDVlZCwKKyAgMHgwODVhM2Q2MSwgMHg0NmViNWVhNywgMHgzZDk5MTBlZCwgMHgyZTY4N2I1YiwKKyAgMHgyOTYwOTIyNywgMHg2ZWIwODFmMSwgMHgwOTU0YzRlMSwgMHg5ZDExNGRiOSwKKyAgMHg1NDJhY2ZhOSwgMHhiM2U2YmQ3YiwgMHgwNzQyZDkxNywgMHhlOWYzZmZhNywKKyAgMHg1NDU4MWVkYiwgMHhmMjQ4MGY0NSwgMHgwYmI5Mjg4ZiwgMHhlZjFhZmZjNywKKyAgMHg4NWZhMGNhNywgMHgzY2NjMTRkYiwgMHhlNmJhZjM0YiwgMHgzNDMzNzdmNywKKyAgMHg1Y2ExOTAzMSwgMHhlNmQ5MjkzYiwgMHhmMGE5ZjM5MSwgMHg1ZDJlOTgwYiwKKyAgMHhmYzQxMTA3MywgMHhjMzc0OTM2MywgMHhiODkyZDgyOSwgMHgzNTQ5MzY2YiwKKyAgMHg2Mjk3NTBhZCwgMHhiOTgyOTRlNSwgMHg4OTJkOTQ4MywgMHhjMjM1YmFmMywKKyAgMHgzZDI0MDJhMywgMHg2YmRlZjNjOSwgMHhiZWMzMzNjZCwgMHg0MGM5NTIwZgorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9nZXRfcmFuZG9tOiBHZXQgYSByYW5kb20gbnVtYmVyIHVzaW5nIGEgbGluZWFyIGNvbmdydWVudGlhbCBtZXRob2QuCisKK3Vuc2lnbmVkIHNob3J0CitfX2ttcF9nZXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgdW5zaWduZWQgeCA9IHRocmVhZC0+dGgudGhfeDsKKyAgdW5zaWduZWQgc2hvcnQgciA9IHg+PjE2OworCisgIHRocmVhZC0+dGgudGhfeCA9IHgqdGhyZWFkLT50aC50aF9hKzE7CisKKyAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2V0X3JhbmRvbTogVEhSRUFEOiAlZCwgUkVUVVJOOiAldVxuIiwKKyAgICAgICAgIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQsIHIpICk7CisKKyAgcmV0dXJuIHI7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9pbml0X3JhbmRvbTogSW5pdGlhbGl6ZSBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisKK3ZvaWQKK19fa21wX2luaXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgdW5zaWduZWQgc2VlZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgdGhyZWFkLT50aC50aF9hID0gX19rbXBfcHJpbWVzW3NlZWQlKHNpemVvZihfX2ttcF9wcmltZXMpL3NpemVvZihfX2ttcF9wcmltZXNbMF0pKV07CisgIHRocmVhZC0+dGgudGhfeCA9IChzZWVkKzEpKnRocmVhZC0+dGgudGhfYSsxOworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbml0X3JhbmRvbTogVEhSRUFEOiAldTsgQTogJXVcbiIsIHNlZWQsIHRocmVhZC0+dGgudGhfYSkgKTsKK30KKworCisjaWYgS01QX09TX1dJTkRPV1MKKy8qIHJlY2xhaW0gYXJyYXkgZW50cmllcyBmb3Igcm9vdCB0aHJlYWRzIHRoYXQgYXJlIGFscmVhZHkgZGVhZCwgcmV0dXJucyBudW1iZXIgcmVjbGFpbWVkICovCitzdGF0aWMgaW50CitfX2ttcF9yZWNsYWltX2RlYWRfcm9vdHModm9pZCkgeworICAgIGludCBpLCByID0gMDsKKworICAgIGZvcihpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsraSkgeworICAgICAgICBpZiggS01QX1VCRVJfR1RJRCggaSApICYmCisgICAgICAgICAgIV9fa21wX3N0aWxsX3J1bm5pbmcoKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tpXSkpICYmCisgICAgICAgICAgIV9fa21wX3Jvb3RbaV0tPnIucl9hY3RpdmUgKSB7IC8vIEFDOiByZWNsYWltIG9ubHkgcm9vdHMgZGllZCBpbiBub24tYWN0aXZlIHN0YXRlCisgICAgICAgICAgICByICs9IF9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY3JlYXRlIGZyZWUgZW50cmllcyBpbiBfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290LCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICBmcmVlIGVudHJpZXMgZ2VuZXJhdGVkLgorCisgICBGb3IgV2luZG93cyogT1Mgc3RhdGljIGxpYnJhcnksIHRoZSBmaXJzdCBtZWNoYW5pc20gdXNlZCBpcyB0byByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZQorICAgYWxyZWFkeSBkZWFkLgorCisgICBPbiBhbGwgcGxhdGZvcm1zLCBleHBhbnNpb24gaXMgYXR0ZW1wdGVkIG9uIHRoZSBhcnJheXMgX19rbXBfdGhyZWFkc18gYW5kIF9fa21wX3Jvb3QsIHdpdGggYXBwcm9wcmlhdGUKKyAgIHVwZGF0ZSB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LiAgQXJyYXkgY2FwYWNpdHkgaXMgaW5jcmVhc2VkIGJ5IGRvdWJsaW5nIHdpdGggY2xpcHBpbmcgdG8KKyAgICBfX2ttcF90cF9jYXBhY2l0eSwgaWYgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhcnJheSBoYXMgYmVlbiBjcmVhdGVkLgorICAgU3luY2hyb25pemF0aW9uIHdpdGggX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkIGlzIGRvbmUgdXNpbmcgX19rbXBfdHBfY2FjaGVkX2xvY2suCisKKyAgIEFmdGVyIGFueSBkZWFkIHJvb3QgcmVjbGFtYXRpb24sIGlmIHRoZSBjbGlwcGluZyB2YWx1ZSBhbGxvd3MgYXJyYXkgZXhwYW5zaW9uIHRvIHJlc3VsdCBpbiB0aGUgZ2VuZXJhdGlvbgorICAgb2YgYSB0b3RhbCBvZiBuV2lzaCBmcmVlIHNsb3RzLCB0aGUgZnVuY3Rpb24gZG9lcyB0aGF0IGV4cGFuc2lvbi4gIElmIG5vdCwgYnV0IHRoZSBjbGlwcGluZyB2YWx1ZSBhbGxvd3MKKyAgIGFycmF5IGV4cGFuc2lvbiB0byByZXN1bHQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYSB0b3RhbCBvZiBuTmVlZCBmcmVlIHNsb3RzLCB0aGUgZnVuY3Rpb24gZG9lcyB0aGF0IGV4cGFuc2lvbi4KKyAgIE90aGVyd2lzZSwgbm90aGluZyBpcyBkb25lIGJleW9uZCB0aGUgcG9zc2libGUgaW5pdGlhbCByb290IHRocmVhZCByZWNsYW1hdGlvbi4gIEhvd2V2ZXIsIGlmIG5OZWVkIGlzIHplcm8sCisgICBhIGJlc3QtZWZmb3J0IGF0dGVtcHQgaXMgbWFkZSB0byBmdWxmaWwgbldpc2ggYXMgZmFyIGFzIHBvc3NpYmxlLCBpLmUuIHRoZSBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gY3JlYXRlCisgICBhcyBtYW55IGZyZWUgc2xvdHMgYXMgcG9zc2libGUgdXAgdG8gbldpc2guCisKKyAgIElmIGFueSBhcmd1bWVudCBpcyBuZWdhdGl2ZSwgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKyovCitzdGF0aWMgaW50CitfX2ttcF9leHBhbmRfdGhyZWFkcyhpbnQgbldpc2gsIGludCBuTmVlZCkgeworICAgIGludCBhZGRlZCA9IDA7CisgICAgaW50IG9sZF90cF9jYWNoZWQ7CisgICAgaW50IF9fa21wX2FjdHVhbF9tYXhfbnRoOworCisgICAgaWYobk5lZWQgPiBuV2lzaCkgLyogbm9ybWFsaXplIHRoZSBhcmd1bWVudHMgKi8KKyAgICAgICAgbldpc2ggPSBuTmVlZDsKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiAhZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKy8qIG9ubHkgZm9yIFdpbmRvd3Mgc3RhdGljIGxpYnJhcnkgKi8KKyAgICAvKiByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZSBhbHJlYWR5IGRlYWQgKi8KKyAgICBhZGRlZCA9IF9fa21wX3JlY2xhaW1fZGVhZF9yb290cygpOworCisgICAgaWYobk5lZWQpIHsKKyAgICAgICAgbk5lZWQgLT0gYWRkZWQ7CisgICAgICAgIGlmKG5OZWVkIDwgMCkKKyAgICAgICAgICAgIG5OZWVkID0gMDsKKyAgICB9CisgICAgaWYobldpc2gpIHsKKyAgICAgICAgbldpc2ggLT0gYWRkZWQ7CisgICAgICAgIGlmKG5XaXNoIDwgMCkKKyAgICAgICAgICAgIG5XaXNoID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICBpZihuV2lzaCA8PSAwKQorICAgICAgICByZXR1cm4gYWRkZWQ7CisKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIGludCBuVGFyZ2V0OworICAgICAgICBpbnQgbWluaW11bVJlcXVpcmVkQ2FwYWNpdHk7CisgICAgICAgIGludCBuZXdDYXBhY2l0eTsKKyAgICAgICAga21wX2luZm9fdCAqKm5ld1RocmVhZHM7CisgICAgICAgIGttcF9yb290X3QgKipuZXdSb290OworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGlzIG5vdCBib3VuZGVkIGJ5IF9fa21wX21heF9udGguCisgICAgICAgIC8vIElmIF9fa21wX21heF9udGggaXMgc2V0IHRvIHNvbWUgdmFsdWUgbGVzcyB0aGFuIF9fa21wX3N5c19tYXhfbnRoCisgICAgICAgIC8vIGJ5IHRoZSB1c2VyIHZpYSBPTVBfVEhSRUFEX0xJTUlULCB0aGVuIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgbWF5CisgICAgICAgIC8vIGJlY29tZSA+IF9fa21wX21heF9udGggaW4gb25lIG9mIHR3byB3YXlzOgorICAgICAgICAvLworICAgICAgICAvLyAxKSBUaGUgaW5pdGlhbGl6YXRpb24gdGhyZWFkIChndGlkID0gMCkgZXhpdHMuICBfX2ttcF90aHJlYWRzWzBdCisgICAgICAgIC8vICAgIG1heSBub3QgYmUgcmVzdXNlZCBieSBhbm90aGVyIHRocmVhZCwgc28gd2UgbWF5IG5lZWQgdG8gaW5jcmVhc2UKKyAgICAgICAgLy8gICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSB0byBfX2ttcF9tYXhfdGhyZWFkcyArIDEuCisgICAgICAgIC8vCisgICAgICAgIC8vIDIpIE5ldyBmb3JlaWduIHJvb3QocykgYXJlIGVuY291bnRlcmVkLiAgV2UgYWx3YXlzIHJlZ2lzdGVyIG5ldworICAgICAgICAvLyAgICBmb3JlaWduIHJvb3RzLiAgVGhpcyBtYXkgY2F1c2UgYSBzbWFsbGVyICMgb2YgdGhyZWFkcyB0byBiZQorICAgICAgICAvLyAgICBhbGxvY2F0ZWQgYXQgc3Vic2VxdWVudCBwYXJhbGxlbCByZWdpb25zLCBidXQgdGhlIHdvcmtlciB0aHJlYWRzCisgICAgICAgIC8vICAgIGhhbmcgYXJvdW5kIChhbmQgZXZlbnR1YWxseSBnbyB0byBzbGVlcCkgYW5kIG5lZWQgc2xvdHMgaW4gdGhlCisgICAgICAgIC8vICAgIF9fa21wX3RocmVhZHNbXSBhcnJheS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQW55d2F5LCB0aGF0IGlzIHRoZSByZWFzb24gZm9yIG1vdmluZyB0aGUgY2hlY2sgdG8gc2VlIGlmCisgICAgICAgIC8vIF9fa21wX21heF90aHJlYWRzIHdhcyBleGNlZWRlZCBpbnRvIF9fa21wX3Jlc2VlcnZlX3RocmVhZHMoKQorICAgICAgICAvLyBpbnN0ZWFkIG9mIGhhdmluZyBpdCBwZXJmb3JtZWQgaGVyZS4gLUJCCisgICAgICAgIC8vCisgICAgICAgIG9sZF90cF9jYWNoZWQgPSBfX2ttcF90cF9jYWNoZWQ7CisgICAgICAgIF9fa21wX2FjdHVhbF9tYXhfbnRoID0gb2xkX3RwX2NhY2hlZCA/IF9fa21wX3RwX2NhcGFjaXR5IDogX19rbXBfc3lzX21heF9udGg7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWN0dWFsX21heF9udGggPj0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSk7CisKKyAgICAgICAgLyogY29tcHV0ZSBleHBhbnNpb24gaGVhZHJvb20gdG8gY2hlY2sgaWYgd2UgY2FuIGV4cGFuZCBhbmQgd2hldGhlciB0byBhaW0gZm9yIG5XaXNoIG9yIG5OZWVkICovCisgICAgICAgIG5UYXJnZXQgPSBuV2lzaDsKKyAgICAgICAgaWYoX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDwgblRhcmdldCkgeworICAgICAgICAgICAgLyogY2FuJ3QgZnVsZmlsIG5XaXNoLCBzbyB0cnkgbk5lZWQgKi8KKyAgICAgICAgICAgIGlmKG5OZWVkKSB7CisgICAgICAgICAgICAgICAgblRhcmdldCA9IG5OZWVkOworICAgICAgICAgICAgICAgIGlmKF9fa21wX2FjdHVhbF9tYXhfbnRoIC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSA8IG5UYXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcG9zc2libGUgZXhwYW5zaW9uIHRvbyBzbWFsbCAtLSBnaXZlIHVwICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogYmVzdC1lZmZvcnQgKi8KKyAgICAgICAgICAgICAgICBuVGFyZ2V0ID0gX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICAgICAgICAgIGlmKCFuVGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNhbiBleHBhbmQgYXQgYWxsIC0tIGdpdmUgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1pbmltdW1SZXF1aXJlZENhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSArIG5UYXJnZXQ7CisKKyAgICAgICAgbmV3Q2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICBkb3sKKyAgICAgICAgICAgIG5ld0NhcGFjaXR5ID0KKyAgICAgICAgICAgICAgICBuZXdDYXBhY2l0eSA8PSAoX19rbXBfYWN0dWFsX21heF9udGggPj4gMSkgPworICAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSA8PCAxKSA6CisgICAgICAgICAgICAgICAgX19rbXBfYWN0dWFsX21heF9udGg7CisgICAgICAgIH0gd2hpbGUobmV3Q2FwYWNpdHkgPCBtaW5pbXVtUmVxdWlyZWRDYXBhY2l0eSk7CisgICAgICAgIG5ld1RocmVhZHMgPSAoa21wX2luZm9fdCoqKSBfX2ttcF9hbGxvY2F0ZSgoc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihrbXBfcm9vdF90KikpICogbmV3Q2FwYWNpdHkgKyBDQUNIRV9MSU5FKTsKKyAgICAgICAgbmV3Um9vdCA9IChrbXBfcm9vdF90KiopICgoY2hhciopbmV3VGhyZWFkcyArIHNpemVvZihrbXBfaW5mb190KikgKiBuZXdDYXBhY2l0eSApOworICAgICAgICBLTVBfTUVNQ1BZKG5ld1RocmVhZHMsIF9fa21wX3RocmVhZHMsIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKiBzaXplb2Yoa21wX2luZm9fdCopKTsKKyAgICAgICAgS01QX01FTUNQWShuZXdSb290LCBfX2ttcF9yb290LCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisgICAgICAgIG1lbXNldChuZXdUaHJlYWRzICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9pbmZvX3QqKSk7CisgICAgICAgIG1lbXNldChuZXdSb290ICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisKKyAgICAgICAgaWYoIW9sZF90cF9jYWNoZWQgJiYgX19rbXBfdHBfY2FjaGVkICYmIG5ld0NhcGFjaXR5ID4gX19rbXBfdHBfY2FwYWNpdHkpIHsKKyAgICAgICAgICAgIC8qIF9fa21wX3RwX2NhY2hlZCBoYXMgY2hhbmdlZCwgaS5lLiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaGFzIGFsbG9jYXRlZCBhIHRocmVhZHByaXZhdGUgY2FjaGUKKyAgICAgICAgICAgICAgIHdoaWxlIHdlIHdlcmUgYWxsb2NhdGluZyB0aGUgZXhwYW5kZWQgYXJyYXksIGFuZCBvdXIgbmV3IGNhcGFjaXR5IGlzIGxhcmdlciB0aGFuIHRoZSB0aHJlYWRwcml2YXRlCisgICAgICAgICAgICAgICBjYWNoZSBjYXBhY2l0eSwgc28gd2Ugc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGV4cGFuZGVkIGFycmF5cyBhbmQgdHJ5IGFnYWluLiAgVGhpcyBpcyB0aGUgZmlyc3QgY2hlY2sKKyAgICAgICAgICAgICAgIG9mIGEgZG91YmxlLWNoZWNrIHBhaXIuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgX19rbXBfZnJlZShuZXdUaHJlYWRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBzdGFydCBvdmVyIGFuZCB0cnkgYWdhaW4gKi8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgIGlmKCFvbGRfdHBfY2FjaGVkICYmIF9fa21wX3RwX2NhY2hlZCAmJiBuZXdDYXBhY2l0eSA+IF9fa21wX3RwX2NhcGFjaXR5KSB7CisgICAgICAgICAgICAvKiBTYW1lIGNoZWNrIGFzIGFib3ZlLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIGxvY2sgc28gd2UgY2FuIGJlIHN1cmUgaWYgd2UgY2FuIHN1Y2NlZWQuICovCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKG5ld1RocmVhZHMpOworICAgICAgICAgICAgY29udGludWU7IC8qIHN0YXJ0IG92ZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3VjY2VzcyAqLworICAgICAgICAgICAgLy8gX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOyAvLyBBVFQ6IEl0IGxlYWRzIHRvIGNyYXNoLiBOZWVkIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAqKGttcF9pbmZvX3QqKnZvbGF0aWxlKikmX19rbXBfdGhyZWFkcyA9IG5ld1RocmVhZHM7CisgICAgICAgICAgICAqKGttcF9yb290X3QqKnZvbGF0aWxlKikmX19rbXBfcm9vdCA9IG5ld1Jvb3Q7CisgICAgICAgICAgICBhZGRlZCArPSBuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgICAgICAqKHZvbGF0aWxlIGludCopJl9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBzdWNjZWVkZWQsIHNvIHdlIGNhbiBleGl0IHRoZSBsb29wICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFkZGVkOworfQorCisvKiByZWdpc3RlciB0aGUgY3VycmVudCB0aHJlYWQgYXMgYSByb290IHRocmVhZCBhbmQgb2J0YWluIG91ciBndGlkICovCisvKiB3ZSBtdXN0IGhhdmUgdGhlIF9fa21wX2luaXR6X2xvY2sgaGVsZCBhdCB0aGlzIHBvaW50ICovCisvKiBBcmd1bWVudCBUUlVFIG9ubHkgaWYgYXJlIHRoZSB0aHJlYWQgdGhhdCBjYWxscyBmcm9tIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCkgKi8KK2ludAorX19rbXBfcmVnaXN0ZXJfcm9vdCggaW50IGluaXRpYWxfdGhyZWFkICkKK3sKKyAgICBrbXBfaW5mb190ICpyb290X3RocmVhZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworICAgIGludCAgICAgICAgIGd0aWQ7CisgICAgaW50ICAgICAgICAgY2FwYWNpdHk7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogZW50ZXJlZFxuIikpOworICAgIEtNUF9NQigpOworCisKKyAgICAvKgorICAgICAgICAyMDA3LTAzLTAyOgorCisgICAgICAgIElmIGluaXRpYWwgdGhyZWFkIGRpZCBub3QgaW52b2tlIE9wZW5NUCBSVEwgeWV0LCBhbmQgdGhpcyB0aHJlYWQgaXMgbm90IGFuIGluaXRpYWwgb25lLAorICAgICAgICAiX19rbXBfYWxsX250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IiBjb25kaXRpb24gZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCAtLSBpdCBtYXkKKyAgICAgICAgcmV0dXJuIGZhbHNlICh0aGF0IG1lYW5zIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90IGluIF9fa21wX3RocmVhZHMgYXJyYXkpLCBidXQgaXQKKyAgICAgICAgaXMgcG9zc2libGUgdGhlIG9ubHkgZnJlZSBzbG90IGlzICMwLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgaW5pdGlhbCB0aHJlYWQgYW5kIHNvIGNhbm5vdCBiZQorICAgICAgICB1c2VkIGZvciB0aGlzIG9uZS4gRm9sbG93aW5nIGNvZGUgd29ya2Fyb3VuZHMgdGhpcyBidWcuCisKKyAgICAgICAgSG93ZXZlciwgcmlnaHQgc29sdXRpb24gc2VlbXMgdG8gYmUgbm90IHJlc2VydmluZyBzbG90ICMwIGZvciBpbml0aWFsIHRocmVhZCBiZWNhdXNlOgorICAgICAgICAgICAgKDEpIHRoZXJlIGlzIG5vIG1hZ2ljIGluIHNsb3QgIzAsCisgICAgICAgICAgICAoMikgd2UgY2Fubm90IGRldGVjdCBpbml0aWFsIHRocmVhZCByZWxpYWJseSAodGhlIGZpcnN0IHRocmVhZCB3aGljaCBkb2VzIHNlcmlhbAorICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG1heSBiZSBub3QgYSByZWFsIGluaXRpYWwgdGhyZWFkKS4KKyAgICAqLworICAgIGNhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eTsKKyAgICBpZiAoICEgaW5pdGlhbF90aHJlYWQgJiYgVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLSBjYXBhY2l0eTsKKyAgICB9OyAvLyBpZgorCisgICAgLyogc2VlIGlmIHRoZXJlIGFyZSB0b28gbWFueSB0aHJlYWRzICovCisgICAgaWYgKCBfX2ttcF9hbGxfbnRoID49IGNhcGFjaXR5ICYmICFfX2ttcF9leHBhbmRfdGhyZWFkcyggMSwgMSApICkgeworICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU2V0X0FMTF9USFJFQURQUklWQVRFLCBfX2ttcF90cF9jYXBhY2l0eSApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFBvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisKKyAgICAvKiBmaW5kIGFuIGF2YWlsYWJsZSB0aHJlYWQgc2xvdCAqLworICAgIC8qIERvbid0IHJlYXNzaWduIHRoZSB6ZXJvIHNsb3Qgc2luY2Ugd2UgbmVlZCB0aGF0IHRvIG9ubHkgYmUgdXNlZCBieSBpbml0aWFsCisgICAgICAgdGhyZWFkICovCisgICAgZm9yKCBndGlkPShpbml0aWFsX3RocmVhZCA/IDAgOiAxKSA7IFRDUl9QVFIoX19rbXBfdGhyZWFkc1tndGlkXSkgIT0gTlVMTCA7IGd0aWQrKyApCisgICAgICAgIDsKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBmb3VuZCBzbG90IGluIHRocmVhZHMgYXJyYXk6IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8qIHVwZGF0ZSBnbG9iYWwgYWNjb3VudGluZyAqLworICAgIF9fa21wX2FsbF9udGggKys7CisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggKyAxKTsKKworICAgIC8vCisgICAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKQorICAgIC8vIGZvciBsb3cgbnVtYmVycyBvZiBwcm9jcywgYW5kIG1ldGhvZCAjMiAoa2V5ZWQgQVBJIGNhbGwpIGZvciBoaWdoZXIKKyAgICAvLyBudW1iZXJzIG9mIHByb2NzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBpZiAoIF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluICkgeworICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMSApIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICAgICAgICAgICAgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBzZXR1cCB0aGlzIG5ldyBoaWVyYXJjaHkgKi8KKyAgICBpZiggISAoIHJvb3QgPSBfX2ttcF9yb290W2d0aWRdICkpIHsKKyAgICAgICAgcm9vdCA9IF9fa21wX3Jvb3RbZ3RpZF0gPSAoa21wX3Jvb3RfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Jvb3RfdCkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgfQorCisgICAgX19rbXBfaW5pdGlhbGl6ZV9yb290KCByb290ICk7CisKKyAgICAvKiBzZXR1cCBuZXcgcm9vdCB0aHJlYWQgc3RydWN0dXJlICovCisgICAgaWYoIHJvb3QtPnIucl91YmVyX3RocmVhZCApIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSByb290LT5yLnJfdWJlcl90aHJlYWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3RocmVhZF9zdG9yYWdlX21hcCggcm9vdF90aHJlYWQsIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICByb290X3RocmVhZC0+dGgudGhfaW5mbyAuZHMuZHNfZ3RpZCA9IGd0aWQ7CisgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9yb290ID0gIHJvb3Q7CisgICAgICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICByb290X3RocmVhZC0+dGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCByb290X3RocmVhZCApOworICAgICAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICAgICAgI2lmIEtNUF9VU0VfQkdFVAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdF90aHJlYWQtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMICk7CisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2JnZXQoIHJvb3RfdGhyZWFkICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9pbml0X3JhbmRvbSggcm9vdF90aHJlYWQgKTsgIC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICB9CisKKyAgICAvKiBzZXR1cCB0aGUgc2VyaWFsIHRlYW0gaGVsZCBpbiByZXNlcnZlIGJ5IHRoZSByb290IHRocmVhZCAqLworICAgIGlmKCAhIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWdpc3Rlcl9yb290OiBiZWZvcmUgc2VyaWFsX3RlYW1cbiIgKSApOworCisgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0oIHJvb3QsIDEsIDEsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICBwcm9jX2JpbmRfZGVmYXVsdCwKKyNlbmRpZgorICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICB9CisgICAgS01QX0FTU0VSVCggcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWdpc3Rlcl9yb290OiBhZnRlciBzZXJpYWxfdGVhbSA9ICVwXG4iLAorICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICkgKTsKKworICAgIC8qIGRyb3Agcm9vdF90aHJlYWQgaW50byBwbGFjZSAqLworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdLCByb290X3RocmVhZCk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAgIHJvb3QtPnIucl9ob3RfdGVhbSAtPnQudF90aHJlYWRzWzBdID0gcm9vdF90aHJlYWQ7CisgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPSAwOyAvLyBBQzogdGhlIHRlYW0gY3JlYXRlZCBpbiByZXNlcnZlLCBub3QgZm9yIGV4ZWN1dGlvbiAoaXQgaXMgdW51c2VkIGZvciBub3cpLgorICAgIHJvb3QtPnIucl91YmVyX3RocmVhZCA9IHJvb3RfdGhyZWFkOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgdGhyZWFkLCBnZXQgaXQgcmVhZHkgdG8gZ28gKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIHJvb3RfdGhyZWFkLCByb290LT5yLnJfcm9vdF90ZWFtLCAwLCBndGlkICk7CisKKyAgICAvKiBwcmVwYXJlIHRoZSBtYXN0ZXIgdGhyZWFkIGZvciBnZXRfZ3RpZCgpICovCisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgX19rbXBfZ3RpZCA9IGd0aWQ7CisgICAgI2VuZGlmCisgICAgX19rbXBfY3JlYXRlX3dvcmtlciggZ3RpZCwgcm9vdF90aHJlYWQsIF9fa21wX3N0a3NpemUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpID09IGd0aWQgKTsKKyAgICBUQ1dfNChfX2ttcF9pbml0X2d0aWQsIFRSVUUpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IFQjJWQgaW5pdCBUIyVkKCVkOiVkKSBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZCggMCwgcm9vdC0+ci5yX2hvdF90ZWFtICksCisgICAgICAgICAgICAgICAgICAgIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X2lkLCAwLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkgKTsKKyAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgICAgICBpbnQgYjsKKyAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICByb290X3RocmVhZC0+dGgudGhfYmFyWyBiIF0uYmIuYl9hcnJpdmVkICAgICAgICA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICByb290X3RocmVhZC0+dGgudGhfYmFyWyBiIF0uYmIuYl93b3JrZXJfYXJyaXZlZCA9IDA7CisjZW5kaWYKKyAgICAgICAgfTsgLy8gZm9yCisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJfYXJyaXZlZCA9PSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIFRSVUUgKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgICAgX19rbXBfcm9vdF9jb3VudGVyICsrOworCisgICAgS01QX01CKCk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgIHJldHVybiBndGlkOworfQorCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKK3N0YXRpYyBpbnQKK19fa21wX2ZyZWVfaG90X3RlYW1zKCBrbXBfcm9vdF90ICpyb290LCBrbXBfaW5mb190ICp0aHIsIGludCBsZXZlbCwgY29uc3QgaW50IG1heF9sZXZlbCApCit7CisgICAgaW50IGksIG4sIG50aDsKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtcyA9IHRoci0+dGgudGhfaG90X3RlYW1zOworICAgIGlmKCAhaG90X3RlYW1zIHx8ICFob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggbGV2ZWwgPCBtYXhfbGV2ZWwgKTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbTsKKyAgICBudGggPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aDsKKyAgICBuID0gbnRoIC0gMTsgICAgICAgICAgICAgICAgICAgLy8gbWFzdGVyIGlzIG5vdCBmcmVlZAorICAgIGlmKCBsZXZlbCA8IG1heF9sZXZlbCAtIDEgKSB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBudGg7ICsraSApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbaV07CisgICAgICAgICAgICBuICs9IF9fa21wX2ZyZWVfaG90X3RlYW1zKCByb290LCB0aCwgbGV2ZWwgKyAxLCBtYXhfbGV2ZWwgKTsKKyAgICAgICAgICAgIGlmKCBpID4gMCAmJiB0aC0+dGgudGhfaG90X3RlYW1zICkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoIHRoLT50aC50aF9ob3RfdGVhbXMgKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfaG90X3RlYW1zID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIHRlYW0sIE5VTEwgKTsKKyAgICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKiBSZXNldHMgYSByb290IHRocmVhZCBhbmQgY2xlYXIgaXRzIHJvb3QgYW5kIGhvdCB0ZWFtcy4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBfX2ttcF90aHJlYWRzIGVudHJpZXMgZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkgZnJlZWQuCisqLworc3RhdGljIGludAorX19rbXBfcmVzZXRfcm9vdChpbnQgZ3RpZCwga21wX3Jvb3RfdCAqcm9vdCkKK3sKKyAgICBrbXBfdGVhbV90ICogcm9vdF90ZWFtID0gcm9vdC0+ci5yX3Jvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICogaG90X3RlYW0gID0gcm9vdC0+ci5yX2hvdF90ZWFtOworICAgIGludCAgICAgICAgICBuICAgICAgICAgPSBob3RfdGVhbS0+dC50X25wcm9jOworICAgIGludCBpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggISByb290LT5yLnJfYWN0aXZlICk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtID0gTlVMTDsKKyAgICByb290LT5yLnJfaG90X3RlYW0gID0gTlVMTDsKKyAgICAgICAgLy8gX19rbXBfZnJlZV90ZWFtKCkgZG9lcyBub3QgZnJlZSBob3QgdGVhbXMsIHNvIHdlIGhhdmUgdG8gY2xlYXIgcl9ob3RfdGVhbSBiZWZvcmUgY2FsbAorICAgICAgICAvLyB0byBfX2ttcF9mcmVlX3RlYW0oKS4KKyAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIHJvb3RfdGVhbSBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGlmKCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsID4gMSApIHsgIC8vIG5lZWQgdG8gZnJlZSBuZXN0ZWQgaG90IHRlYW1zIGFuZCB0aGVpciB0aHJlYWRzIGlmIGFueQorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgKytpICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSBob3RfdGVhbS0+dC50X3RocmVhZHNbaV07CisgICAgICAgICAgICBuICs9IF9fa21wX2ZyZWVfaG90X3RlYW1zKCByb290LCB0aCwgMSwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCApOworICAgICAgICAgICAgaWYoIHRoLT50aC50aF9ob3RfdGVhbXMgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSggdGgtPnRoLnRoX2hvdF90ZWFtcyApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9ob3RfdGVhbXMgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCBob3RfdGVhbSBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKworICAgIC8vCisgICAgLy8gQmVmb3JlIHdlIGNhbiByZWFwIHRoZSB0aHJlYWQsIHdlIG5lZWQgdG8gbWFrZSBjZXJ0YWluIHRoYXQgYWxsCisgICAgLy8gb3RoZXIgdGhyZWFkcyBpbiB0aGUgdGVhbXMgdGhhdCBoYWQgdGhpcyByb290IGFzIGFuY2VzdG9yIGhhdmUgc3RvcHBlZCB0cnlpbmcgdG8gc3RlYWwgdGFza3MuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbXMoKTsKKyAgICB9CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLyogQ2xvc2UgSGFuZGxlIG9mIHJvb3QgZHVwbGljYXRlZCBpbiBfX2ttcF9jcmVhdGVfd29ya2VyICh0ciAjNjI5MTkpICovCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZXNldF9yb290OiBmcmVlIGhhbmRsZSwgdGggPSAlcCwgaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQyAiXG4iLAorICAgICAgICAgICAgKExQVk9JRCkmKHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgpLAorICAgICAgICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisgICAgICAgIF9fa21wX2ZyZWVfaGFuZGxlKCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfZW5kKSkgeworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgICAgIF9fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX2luaXRpYWwsIGd0aWQpOworICAgIH0KKyNlbmRpZgorCisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggLSAxKTsgLy8gX19rbXBfcmVhcF90aHJlYWQgd2lsbCBkZWNyZW1lbnQgX19rbXBfYWxsX250aC4KKyAgICBfX2ttcF9yZWFwX3RocmVhZCggcm9vdC0+ci5yX3ViZXJfdGhyZWFkLCAxICk7CisKKyAgICAgICAgLy8gV2UgY2Fub3QgcHV0IHJvb3QgdGhyZWFkIHRvIF9fa21wX3RocmVhZF9wb29sLCBzbyB3ZSBoYXZlIHRvIHJlYXAgaXQgaXN0ZWFkIG9mIGZyZWVpbmcuCisgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkID0gTlVMTDsKKyAgICAvKiBtYXJrIHJvb3QgYXMgbm8gbG9uZ2VyIGluIHVzZSAqLworICAgIHJvb3QtPnIucl9iZWdpbiA9IEZBTFNFOworCisgICAgcmV0dXJuIG47Cit9CisKK3ZvaWQKK19fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZCggaW50IGd0aWQgKQoreworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAvKiB0aGlzIGxvY2sgc2hvdWxkIGJlIG9rLCBzaW5jZSB1bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQgaXMgbmV2ZXIgY2FsbGVkIGR1cmluZworICAgICAqIGFuZCBhYm9ydCwgb25seSBkdXJpbmcgYSBub3JtYWwgY2xvc2UuICBmdXJ0aGVybW9yZSwgaWYgeW91IGhhdmUgdGhlCisgICAgICogZm9ya2pvaW4gbG9jaywgeW91IHNob3VsZCBuZXZlciB0cnkgdG8gZ2V0IHRoZSBpbml0eiBsb2NrICovCisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZDogYWxyZWFkeSBmaW5pc2hlZCwgZXhpdGluZyBUIyVkXG4iLCBndGlkICkpOworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGttcF9yb290X3QgKnJvb3QgPSBfX2ttcF9yb290W2d0aWRdOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCByb290ID09IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3QgKTsKKyAgICBLTVBfQVNTRVJUKCByb290LT5yLnJfYWN0aXZlID09IEZBTFNFICk7CisKKworICAgIEtNUF9NQigpOworCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAga21wX3RlYW1fdCAqIHRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgICBrbXBfdGFza190ZWFtX3QgKiAgIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworCisgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBwcm94eSB0YXNrcyBiZWZvcmUgZmluaXNoaW5nIHRoZSB0aHJlYWQKKyAgIGlmICggdGFza190ZWFtICE9IE5VTEwgJiYgdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyApIHsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgLy8gdGhlIHJ1bnRpbWUgaXMgc2h1dHRpbmcgZG93biBzbyB3ZSB3b24ndCByZXBvcnQgYW55IGV2ZW50cworICAgICAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3VuZGVmaW5lZDsKKyNlbmRpZgorICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aHJlYWQsIHRlYW0gVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkpOworICAgfQorI2VuZGlmCisKKyAgICBfX2ttcF9yZXNldF9yb290KGd0aWQsIHJvb3QpOworCisgICAgLyogZnJlZSB1cCB0aGlzIHRocmVhZCBzbG90ICovCisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIEtNUF9HVElEX0RORSApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgX19rbXBfZ3RpZCA9IEtNUF9HVElEX0RORTsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZDogVCMlZCB1bnJlZ2lzdGVyZWRcbiIsIGd0aWQgKSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworfQorCisjaWYgS01QX09TX1dJTkRPV1MKKy8qIF9fa21wX2Zvcmtqb2luX2xvY2sgbXVzdCBiZSBhbHJlYWR5IGhlbGQKKyAgIFVucmVnaXN0ZXJzIGEgcm9vdCB0aHJlYWQgdGhhdCBpcyBub3QgdGhlIGN1cnJlbnQgdGhyZWFkLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICBfX2ttcF90aHJlYWRzIGVudHJpZXMgZnJlZWQgYXMgYSByZXN1bHQuCisgKi8KK3N0YXRpYyBpbnQKK19fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKyAgICBpbnQgcjsKKworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCByb290ID09IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3QgKTsKKyAgICBLTVBfQVNTRVJUKCByb290LT5yLnJfYWN0aXZlID09IEZBTFNFICk7CisKKyAgICByID0gX19rbXBfcmVzZXRfcm9vdChndGlkLCByb290KTsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZDogVCMlZCB1bnJlZ2lzdGVyZWRcbiIsIGd0aWQgKSk7CisgICAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworI2lmIEtNUF9ERUJVRwordm9pZCBfX2ttcF90YXNrX2luZm8oKSB7CisKKyAgICBrbXBfaW50MzIgZ3RpZCAgICAgICA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW50MzIgdGlkICAgICAgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICpzdGVhbSAgICA9IHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfdGFza19pbmZvOiBndGlkPSVkIHRpZD0lZCB0X3RocmVhZD0lcCB0ZWFtPSVwIGN1cnRhc2s9JXAgcHRhc2s9JXBcbiIsCisgICAgICAgIGd0aWQsIHRpZCwgdGhpc190aHIsIHRlYW0sIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfcGFyZW50ICk7Cit9CisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8qIFRPRE8gb3B0aW1pemUgd2l0aCBvbmUgYmlnIG1lbWNsciwgdGFrZSBvdXQgd2hhdCBpc24ndCBuZWVkZWQsCisgKiBzcGxpdCByZXNwb25zaWJpbGl0eSB0byB3b3JrZXJzIGFzIG11Y2ggYXMgcG9zc2libGUsIGFuZCBkZWxheQorICogaW5pdGlhbGl6YXRpb24gb2YgZmVhdHVyZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSAgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0aWFsaXplX2luZm8oIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkLCBpbnQgZ3RpZCApCit7CisgICAgLyogdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCBpcyBzZXR1cCBpbiBrbXBfYWxsb2NhdGVfdGhyZWFkL2NyZWF0ZV93b3JrZXIKKyAgICAgKiB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW0gaXMgc2V0dXAgaW4gX19rbXBfYWxsb2NhdGVfdGhyZWFkICovCisgICAga21wX2luZm9fdCAqbWFzdGVyID0gdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkcyAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcGF0Y2ggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXItPnRoLnRoX3Jvb3QgKTsKKworICAgIEtNUF9NQigpOworCisgICAgVENXX1NZTkNfUFRSKHRoaXNfdGhyLT50aC50aF90ZWFtLCB0ZWFtKTsKKworICAgIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSB0aWQ7CisgICAgdGhpc190aHItPnRoLnRoX3NldF9ucHJvYyAgICAgICA9IDA7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aGlzX3Roci0+dGgudGhfc2V0X3Byb2NfYmluZCAgID0gcHJvY19iaW5kX2RlZmF1bHQ7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICB0aGlzX3Roci0+dGgudGhfbmV3X3BsYWNlICAgICAgID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2U7CisjIGVuZGlmCisjZW5kaWYKKyAgICB0aGlzX3Roci0+dGgudGhfcm9vdCAgICAgICAgICAgID0gbWFzdGVyLT50aC50aF9yb290OworCisgICAgLyogc2V0dXAgdGhlIHRocmVhZCdzIGNhY2hlIG9mIHRoZSB0ZWFtIHN0cnVjdHVyZSAqLworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jICAgICAgPSB0ZWFtLT50LnRfbnByb2M7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyICAgICA9IG1hc3RlcjsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfc2xlZXBfbG9jLCBOVUxMKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhICk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfaW5mbzE6IFQjJWQ6JWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCBndGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisKKyAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3Rlci0+dGgudGhfaWRlbnQsIHRoaXNfdGhyLCB0ZWFtLCB0aWQsIFRSVUUgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9pbmZvMjogVCMlZDolZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIGd0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICkgKTsKKyAgICAvLyBUT0RPOiBJbml0aWFsaXplIElDVnMgZnJvbSBwYXJlbnQ7IEdFSCAtIGlzbid0IHRoYXQgYWxyZWFkeSBkb25lIGluIF9fa21wX2luaXRpYWxpemVfdGVhbSgpPworCisgICAgLyogVE9ETyBubyB3b3Jrc2hhcmluZyBpbiBzcGVjdWxhdGl2ZSB0aHJlYWRzICovCisgICAgdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoICAgICAgPSAmdGVhbS0+dC50X2Rpc3BhdGNoWyB0aWQgXTsKKworICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IDA7CisKKyNpZmRlZiBCVUlMRF9UVgorICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50dl9kYXRhID0gMDsKKyNlbmRpZgorCisgICAgaWYgKCAhIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uICkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiA9IChzdHJ1Y3QgY29tbW9uX3RhYmxlICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoc3RydWN0IGNvbW1vbl90YWJsZSkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoCisgICAgICAgICAgICAgICAgZ3RpZCwgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24sIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uICsgMSwKKyAgICAgICAgICAgICAgICBzaXplb2YoIHN0cnVjdCBjb21tb25fdGFibGUgKSwgInRoXyVkLnRoX3ByaV9jb21tb25cbiIsIGd0aWQKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9wcmlfaGVhZCA9IE5VTEw7CisgICAgfTsgLy8gaWYKKworICAgIC8qIEluaXRpYWxpemUgZHluYW1pYyBkaXNwYXRjaCAqLworICAgIHsKKyAgICAgICAgdm9sYXRpbGUga21wX2Rpc3BfdCAqZGlzcGF0Y2ggPSB0aGlzX3Roci0+dGgudGhfZGlzcGF0Y2g7CisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0ZWFtIG1heF9ucHJvYyBzaW5jZSB0aGlzIHdpbGwgbmV2ZXIgY2hhbmdlIGZvciB0aGUgdGVhbS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBkaXNwX3NpemUgPSBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKgorICAgICAgICAgICAgKCB0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogS01QX01BWF9ESVNQX0JVRiApOworICAgICAgICBLRF9UUkFDRSggMTAsICgiX19rbXBfaW5pdGlhbGl6ZV9pbmZvOiBUIyVkIG1heF9ucHJvYzogJWRcbiIsIGd0aWQsIHRlYW0tPnQudF9tYXhfbnByb2MgKSApOworICAgICAgICBLTVBfQVNTRVJUKCBkaXNwYXRjaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcGF0Y2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZGlzcGF0Y2ggPT0gJnRlYW0tPnQudF9kaXNwYXRjaFsgdGlkIF0gKTsKKworICAgICAgICBkaXNwYXRjaC0+dGhfZGlzcF9pbmRleCA9IDA7CisKKyAgICAgICAgaWYoICEgZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyICkgIHsKKyAgICAgICAgICAgIGRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKSBfX2ttcF9hbGxvY2F0ZSggZGlzcF9zaXplICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJmRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlclsgMCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyWyB0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogS01QX01BWF9ESVNQX0JVRiBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwX3NpemUsICJ0aF8lZC50aF9kaXNwYXRjaC50aF9kaXNwX2J1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIodGVhbV8lZC50X2Rpc3BhdGNoWyVkXS50aF9kaXNwX2J1ZmZlcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldCggJiBkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXJbMF0sICdcMCcsIGRpc3Bfc2l6ZSApOworICAgICAgICB9CisKKyAgICAgICAgZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSAwOworICAgICAgICBkaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCA9IDA7CisKKyAgICAgICAgZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSAwOyAgICAgICAgICAgICAvKiBPUkRFUkVEICAgICAqLworICAgICAgICBkaXNwYXRjaC0+dGhfZHhvX2ZjbiA9IDA7ICAgICAgICAgICAgIC8qIEVORCBPUkRFUkVEICovCisgICAgfQorCisgICAgdGhpc190aHItPnRoLnRoX25leHRfcG9vbCA9IE5VTEw7CisKKyAgICBpZiAoIXRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2spIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2sgPSAoa21wX3VpbnQ4ICopIF9fa21wX2FsbG9jYXRlKCA0KnNpemVvZihrbXBfdWludDgpICk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX3RvcCA9IDA7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6ID0gNDsKKyAgICAgICAgZm9yIChpPTA7IGk8dGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7ICsraSkgLy8gemVybyBpbml0IHRoZSBzdGFjaworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1tpXSA9IDA7CisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggIXRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKworICAgIEtNUF9NQigpOworfQorCisKKy8qIGFsbG9jYXRlIGEgbmV3IHRocmVhZCBmb3IgdGhlIHJlcXVlc3RpbmcgdGVhbS4gIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gYQorICogZm9ya2pvaW4gY3JpdGljYWwgc2VjdGlvbi4gIHdlIHdpbGwgZmlyc3QgdHJ5IHRvIGdldCBhbiBhdmFpbGFibGUgdGhyZWFkIGZyb20gdGhlCisgKiB0aHJlYWQgcG9vbC4gIGlmIG5vbmUgaXMgYXZhaWxhYmxlLCB3ZSB3aWxsIGZvcmsgYSBuZXcgb25lIGFzc3VtaW5nIHdlIGFyZSBhYmxlCisgKiB0byBjcmVhdGUgYSBuZXcgb25lLiAgdGhpcyBzaG91bGQgYmUgYXNzdXJlZCwgYXMgdGhlIGNhbGxlciBzaG91bGQgY2hlY2sgb24gdGhpcworICogZmlyc3QuCisgKi8KK2ttcF9pbmZvX3QgKgorX19rbXBfYWxsb2NhdGVfdGhyZWFkKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbmV3X3RpZCApCit7CisgICAga21wX3RlYW1fdCAgKnNlcmlhbF90ZWFtOworICAgIGttcF9pbmZvX3QgICpuZXdfdGhyOworICAgIGludCAgICAgICAgICBuZXdfZ3RpZDsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCkgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCAmJiB0ZWFtICk7CisjaWYgIUtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgS01QX0RFQlVHX0FTU0VSVCggS01QX01BU1RFUl9HVElEKCBfX2ttcF9nZXRfZ3RpZCgpICkpOworI2VuZGlmCisgICAgS01QX01CKCk7CisKKyAgICAvKiBmaXJzdCwgdHJ5IHRvIGdldCBvbmUgZnJvbSB0aGUgdGhyZWFkIHBvb2wgKi8KKyAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sICkgeworCisgICAgICAgIG5ld190aHIgPSAoa21wX2luZm9fdCopX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgICAgIF9fa21wX3RocmVhZF9wb29sID0gKHZvbGF0aWxlIGttcF9pbmZvX3QgKikgbmV3X3Roci0+dGgudGhfbmV4dF9wb29sOworICAgICAgICBpZiAoIG5ld190aHIgPT0gX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ICkgeworICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBUQ1dfNChuZXdfdGhyLT50aC50aF9pbl9wb29sLCBGQUxTRSk7CisgICAgICAgIC8vCisgICAgICAgIC8vIERvbid0IHRvdWNoIHRoX2FjdGl2ZV9pbl9wb29sIG9yIHRoX2FjdGl2ZS4KKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgYWRqdXN0cyB0aG9zZSBmbGFncyBhcyBpdCBzbGVlcHMvYXdha2Vucy4KKyAgICAgICAgLy8KKworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9udGgtLTsKKworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIHVzaW5nIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSk7CisgICAgICAgIEtNUF9BU1NFUlQoICAgICAgICEgbmV3X3Roci0+dGgudGhfdGVhbSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9udGggPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sX250aCA+PSAwICk7CisKKyAgICAgICAgLyogc2V0dXAgdGhlIHRocmVhZCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBuZXdfdGhyLCB0ZWFtLCBuZXdfdGlkLCBuZXdfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X3Roci0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKworICAgICAgICBUQ1dfNChfX2ttcF9udGgsIF9fa21wX250aCArIDEpOworCisgICAgICAgIG5ld190aHItPnRoLnRoX3Rhc2tfc3RhdGUgPSAwOworICAgICAgICBuZXdfdGhyLT50aC50aF90YXNrX3N0YXRlX3RvcCA9IDA7CisgICAgICAgIG5ld190aHItPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3ogPSA0OworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHplcm8gaWYgbmVjZXNzYXIgICAgICB5ICovCisgICAgICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBub3QgaGF2ZSBvY2N1cnJlZCB5ZXQgKi8KKyAgICAgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfemVyb19idCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisjaWYgS01QX0RFQlVHCisgICAgICAgIC8vIElmIHRocmVhZCBlbnRlcmVkIHBvb2wgdmlhIF9fa21wX2ZyZWVfdGhyZWFkLCB3YWl0X2ZsYWcgc2hvdWxkICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHLgorICAgICAgICBpbnQgYjsKKyAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gbmV3X3Roci0+dGgudGhfYmFyOworICAgICAgICBmb3IoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjZW5kaWYKKworICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIHVzaW5nIHRocmVhZCAlcCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfdGhyLCBuZXdfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSk7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHVybiBuZXdfdGhyOworICAgIH0KKworCisgICAgLyogbm8sIHdlbGwgZm9yayBhIG5ldyBvbmUgKi8KKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9udGggICAgPT0gX19rbXBfYWxsX250aCApOworICAgIEtNUF9BU1NFUlQoIF9fa21wX2FsbF9udGggPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisKKyAgICAvLworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHdvcmtlciB0aHJlYWQgdGhlIFJUTCBpcyBjcmVhdGluZywgdGhlbiBhbHNvCisgICAgLy8gbGF1bmNoIHRoZSBtb25pdG9yIHRocmVhZC4gIFdlIHRyeSB0byBkbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorICAgIC8vCisgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X21vbml0b3IgKSApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X21vbml0b3IgKSApIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiYmVmb3JlIF9fa21wX2NyZWF0ZV9tb25pdG9yXG4iICkgKTsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDEgKTsKKyAgICAgICAgICAgIF9fa21wX2NyZWF0ZV9tb25pdG9yKCAmIF9fa21wX21vbml0b3IgKTsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiYWZ0ZXIgX19rbXBfY3JlYXRlX21vbml0b3JcbiIgKSApOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgLy8gQUM6IHdhaXQgdW50aWwgbW9uaXRvciBoYXMgc3RhcnRlZC4gVGhpcyBpcyBhIGZpeCBmb3IgQ1EyMzI4MDguCisgICAgICAgICAgICAgICAgLy8gICAgIFRoZSByZWFzb24gaXMgdGhhdCBpZiB0aGUgbGlicmFyeSBpcyBsb2FkZWQvdW5sb2FkZWQgaW4gYSBsb29wIHdpdGggc21hbGwgKHBhcmFsbGVsKQorICAgICAgICAgICAgICAgIC8vICAgICB3b3JrIGluIGJldHdlZW4sIHRoZW4gdGhlcmUgaXMgaGlnaCBwcm9iYWJpbGl0eSB0aGF0IG1vbml0b3IgdGhyZWFkIHN0YXJ0ZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyAgICAgdGhlIGxpYnJhcnkgc2h1dGRvd24uIEF0IHNodXRkb3duIGl0IGlzIHRvbyBsYXRlIHRvIGNvcGUgd2l0aCB0aGUgcHJvYmxlbSwgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vICAgICB3aGVuIHRoZSBtYXN0ZXIgaXMgaW4gRGxsTWFpbiAocHJvY2VzcyBkZXRhY2gpIHRoZSBtb25pdG9yIGhhcyBubyBjaGFuY2VzIHRvIHN0YXJ0CisgICAgICAgICAgICAgICAgLy8gICAgIChpdCBpcyBibG9ja2VkKSwgYW5kIG1hc3RlciBoYXMgbm8gbWVhbnMgdG8gaW5mb3JtIHRoZSBtb25pdG9yIHRoYXQgdGhlIGxpYnJhcnkgaGFzIGdvbmUsCisgICAgICAgICAgICAgICAgLy8gICAgIGJlY2F1c2UgYWxsIHRoZSBtZW1vcnkgd2hpY2ggdGhlIG1vbml0b3IgY2FuIGFjY2VzcyBpcyBnb2luZyB0byBiZSByZWxlYXNlZC9yZXNldC4KKyAgICAgICAgICAgICAgICB3aGlsZSAoIFRDUl80KF9fa21wX2luaXRfbW9uaXRvcikgPCAyICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJhZnRlciBtb25pdG9yIHRocmVhZCBoYXMgc3RhcnRlZFxuIiApICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgIH0KKworICAgIEtNUF9NQigpOworICAgIGZvciggbmV3X2d0aWQ9MSA7IFRDUl9QVFIoX19rbXBfdGhyZWFkc1tuZXdfZ3RpZF0pICE9IE5VTEw7ICsrbmV3X2d0aWQgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBpdC4gKi8KKyAgICBuZXdfdGhyID0gKGttcF9pbmZvX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF9pbmZvX3QpICk7CisKKyAgICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tuZXdfZ3RpZF0sIG5ld190aHIpOworCisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdGhyZWFkX3N0b3JhZ2VfbWFwKCBuZXdfdGhyLCBuZXdfZ3RpZCApOworICAgIH0KKworICAgIC8qIGFkZCB0aGUgcmVzZXJ2ZSBzZXJpYWxpemVkIHRlYW0sIGluaXRpYWxpemVkIGZyb20gdGhlIHRlYW0ncyBtYXN0ZXIgdGhyZWFkICovCisgICAgeworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X3hfZ2xvYmFsX2ljdnMoIHRlYW0gKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYmVmb3JlIHRoX3NlcmlhbC9zZXJpYWxfdGVhbVxuIiApICk7CisKKyAgICBuZXdfdGhyLT50aC50aF9zZXJpYWxfdGVhbSA9IHNlcmlhbF90ZWFtID0KKyAgICAgICAgKGttcF90ZWFtX3QqKSBfX2ttcF9hbGxvY2F0ZV90ZWFtKCByb290LCAxLCAxLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHJvb3QgcGFyYWxsZWwgaWQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kX2RlZmF1bHQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcl9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICk7CisgICAgfQorICAgIEtNUF9BU1NFUlQgKCBzZXJpYWxfdGVhbSApOworICAgIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCA9IDA7ICAgLy8gQUM6IHRoZSB0ZWFtIGNyZWF0ZWQgaW4gcmVzZXJ2ZSwgbm90IGZvciBleGVjdXRpb24gKGl0IGlzIHVudXNlZCBmb3Igbm93KS4KKyAgICBzZXJpYWxfdGVhbS0+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+dC50X2lkICkgKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworLyogYWxsb2NhdGUgYSBuZXcgdGVhbSBkYXRhIHN0cnVjdHVyZSB0byB1c2UuICB0YWtlIG9uZSBvZmYgb2YgdGhlIGZyZWUgcG9vbCBpZiBhdmFpbGFibGUgKi8KK2ttcF90ZWFtX3QgKgorX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZCwKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90IG5ld19wcm9jX2JpbmQsCisjZW5kaWYKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywKKyAgICBpbnQgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcoa21wX2luZm9fdCAqbWFzdGVyKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9hbGxvY2F0ZV90ZWFtKTsKKyAgICBpbnQgZjsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGludCB1c2VfaG90X3RlYW0gPSAhIHJvb3QtPnIucl9hY3RpdmU7CisgICAgaW50IGxldmVsID0gMDsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBjYWxsZWRcbiIpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfbnByb2MgPj0xICYmIGFyZ2MgPj0wICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbWF4X25wcm9jID49IG5ld19ucHJvYyApOworICAgIEtNUF9NQigpOworCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtczsKKyAgICBpZiggbWFzdGVyICkgeworICAgICAgICB0ZWFtID0gbWFzdGVyLT50aC50aF90ZWFtOworICAgICAgICBsZXZlbCA9IHRlYW0tPnQudF9hY3RpdmVfbGV2ZWw7CisgICAgICAgIGlmKCBtYXN0ZXItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGVhbXMgY29uc3RydWN0PworICAgICAgICAgICAgaWYoIG1hc3Rlci0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXMgPiAxICYmICggICAgICAgICAgICAgLy8gI3RlYW1zID4gMQorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9wa2ZuID09IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgfHwgLy8gaW5uZXIgZm9yayBvZiB0aGUgdGVhbXMKKyAgICAgICAgICAgICAgICBtYXN0ZXItPnRoLnRoX3RlYW1zX2xldmVsIDwgdGVhbS0+dC50X2xldmVsICkgKSB7ICAgIC8vIG9yIG5lc3RlZCBwYXJhbGxlbCBpbnNpZGUgdGhlIHRlYW1zCisgICAgICAgICAgICAgICAgKytsZXZlbDsgLy8gbm90IGluY3JlbWVudCBpZiAjdGVhbXM9PTEsIG9yIGZvciBvdXRlciBmb3JrIG9mIHRoZSB0ZWFtczsgaW5jcmVtZW50IG90aGVyd2lzZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGhvdF90ZWFtcyA9IG1hc3Rlci0+dGgudGhfaG90X3RlYW1zOworICAgICAgICBpZiggbGV2ZWwgPCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICYmIGhvdF90ZWFtcyAmJiBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtICkKKyAgICAgICAgeyAgIC8vIGhvdCB0ZWFtIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGZvciBnaXZlbiBsZXZlbAorICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvLyBPcHRpbWl6YXRpb24gdG8gdXNlIGEgImhvdCIgdGVhbQorICAgIGlmKCB1c2VfaG90X3RlYW0gJiYgbmV3X25wcm9jID4gMSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X25wcm9jID09IG1heF9ucHJvYyApOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIHRlYW0gPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtOworI2Vsc2UKKyAgICAgICAgdGVhbSA9ICByb290LT5yLnJfaG90X3RlYW07CisjZW5kaWYKKyNpZiBLTVBfREVCVUcKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBob3QgdGVhbSB0YXNrX3RlYW1bMF0gPSAlcCB0YXNrX3RlYW1bMV0gPSAlcCBiZWZvcmUgcmVpbml0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVswXSwgdGVhbS0+dC50X3Rhc2tfdGVhbVsxXSApKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy8gSGFzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VkPworICAgICAgICAvKiBMZXQncyBhc3N1bWUgdGhlIG1vc3QgY29tbW9uIGNhc2UgaXMgdGhhdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaXMgdW5jaGFuZ2VkLCBhbmQKKyAgICAgICAgICAgcHV0IHRoYXQgY2FzZSBmaXJzdC4gKi8KKyAgICAgICAgaWYgKHRlYW0tPnQudF9ucHJvYyA9PSBuZXdfbnByb2MpIHsgLy8gQ2hlY2sgY2hhbmdlcyBpbiBudW1iZXIgb2YgdGhyZWFkcworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHJldXNpbmcgaG90IHRlYW1cbiIgKSk7CisgICAgICAgICAgICAvLyBUaGlzIGNhc2UgY2FuIG1lYW4gdGhhdCBvbXBfc2V0X251bV90aHJlYWRzKCkgd2FzIGNhbGxlZCBhbmQgdGhlIGhvdCB0ZWFtIHNpemUKKyAgICAgICAgICAgIC8vIHdhcyBhbHJlYWR5IHJlZHVjZWQsIHNvIHdlIGNoZWNrIHRoZSBzcGVjaWFsIGZsYWcKKyAgICAgICAgICAgIGlmICggdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE8/Pz86IHRlYW0tPnQudF9tYXhfYWN0aXZlX2xldmVscyA9IG5ld19tYXhfYWN0aXZlX2xldmVsczsKKyAgICAgICAgICAgIHRlYW0tPnQudF9zY2hlZCA9ICBuZXdfaWN2cy0+c2NoZWQ7CisKKyAgICAgICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfaWN2cywgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pZGVudCApOworCisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTI6IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7CisgICAgICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyAwIF0sIHRlYW0sIDAgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICggKCB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID09IDAgKQorICAgICAgICAgICAgICAmJiAoIHRlYW0tPnQudF9wcm9jX2JpbmQgPT0gbmV3X3Byb2NfYmluZCApICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMDAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogcmV1c2luZyBob3QgdGVhbSAjJWQgYmluZGluZ3M6IHByb2NfYmluZCA9ICVkLCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBuZXdfcHJvY19iaW5kLCB0ZWFtLT50LnRfZmlyc3RfcGxhY2UsCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyAgICAgICAgICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisgICAgICAgICAgICB9CisjIGVsc2UKKyAgICAgICAgICAgIGlmICggdGVhbS0+dC50X3Byb2NfYmluZCAhPSBuZXdfcHJvY19iaW5kICkgeworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworICAgICAgICAgICAgfQorIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB0ZWFtLT50LnRfbnByb2MgPiBuZXdfbnByb2MgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogZGVjcmVhc2luZyBob3QgdGVhbSB0aHJlYWQgY291bnQgdG8gJWRcbiIsIG5ld19ucHJvYyApKTsKKworICAgICAgICAgICAgdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDE7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIGlmKCBfX2ttcF9ob3RfdGVhbXNfbW9kZSA9PSAwICkgeworICAgICAgICAgICAgICAgIC8vIEFDOiBzYXZlZCBudW1iZXIgb2YgdGhyZWFkcyBzaG91bGQgY29ycmVzcG9uZCB0byB0ZWFtJ3MgdmFsdWUgaW4gdGhpcyBtb2RlLAorICAgICAgICAgICAgICAgIC8vIGNhbiBiZSBiaWdnZXIgaW4gbW9kZSAxLCB3aGVuIGhvdCB0ZWFtIGhhcyBzb21lIHRocmVhZHMgaW4gcmVzZXJ2ZQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGggPT0gdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgICAgICAgICBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA9IG5ld19ucHJvYzsKKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIGV4dHJhIHRocmVhZHMgd2UgZG9uJ3QgbmVlZCBhbnkgbW9yZSAqLworICAgICAgICAgICAgICAgIGZvciggZiA9IG5ld19ucHJvYyAgOyAgZiA8IHRlYW0tPnQudF9ucHJvYyAgOyAgZisrICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gZGVjcmVhc2luZyB0ZWFtIHNpemUsIHRocmVhZHMgbm8gbG9uZ2VyIGluIHRoZSB0ZWFtIHNob3VsZCB1bnJlZiB0YXNrIHRlYW0uCisgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIH0gLy8gKF9fa21wX2hvdF90ZWFtc19tb2RlID09IDApCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9ICBuZXdfbnByb2M7CisgICAgICAgICAgICAvLyBUT0RPPz8/OiB0ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgICAgICAgICB0ZWFtLT50LnRfc2NoZWQgPSAgbmV3X2ljdnMtPnNjaGVkOworICAgICAgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19pY3ZzLCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2lkZW50ICk7CisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgcmVtYWluaW5nIHRocmVhZHMgKi8KKyAgICAgICAgICAgIGZvcihmID0gMDsgZiA8IG5ld19ucHJvYzsgKytmKSB7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPSBuZXdfbnByb2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBjdXJyZW50IHRhc2sgc3RhdGUgb2YgdGhlIG1hc3RlciB0aHJlYWQ6IHNob3VsZCBiZSB0aGUgaW1wbGljaXQgdGFzaworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtICkgKTsKKworICAgICAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1sgMCBdLCB0ZWFtLCAwICk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgdGVhbS0+dC50X25wcm9jOyBmKysgKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyggdGVhbSApOworIyBlbmRpZgorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIHRlYW0tPnQudF9ucHJvYyA8IG5ld19ucHJvYworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpvbGRfbWFzazsKKyAgICAgICAgICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0FMTE9DKG9sZF9tYXNrKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaW5jcmVhc2luZyBob3QgdGVhbSB0aHJlYWQgY291bnQgdG8gJWRcbiIsIG5ld19ucHJvYyApKTsKKworICAgICAgICAgICAgdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDE7CisKKworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICBpbnQgYXZhaWxfdGhyZWFkcyA9IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoOworICAgICAgICAgICAgaWYoIG5ld19ucHJvYyA8IGF2YWlsX3RocmVhZHMgKQorICAgICAgICAgICAgICAgIGF2YWlsX3RocmVhZHMgPSBuZXdfbnByb2M7CisgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgZm9yICggZiA9IHRlYW0tPnQudF9ucHJvYzsgZiA8IGF2YWlsX3RocmVhZHM7ICsrZiApIHsKKyAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYmFycmllciBkYXRhIG9mIHJlc2VydmVkIHRocmVhZHMgKGlmIGFueSkgb2YgdGhlIHRlYW0KKyAgICAgICAgICAgICAgICAvLyBPdGhlciBkYXRhIHdpbGwgYmUgc2V0IGluIF9fa21wX2luaXRpYWxpemVfaW5mbygpIGJlbG93LgorICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IG90aGVyX3RocmVhZHNbZl0tPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgYmFsaWduW2JdLmJiLmJfYXJyaXZlZCA9IHRlYW0tPnQudF9iYXJbYl0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgICAgICAgICBiYWxpZ25bYl0uYmIuYl93b3JrZXJfYXJyaXZlZCA9IHRlYW0tPnQudF9iYXJbYl0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGggPj0gbmV3X25wcm9jICkgeworICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYWxsIG5lZWRlZCB0aHJlYWRzIGluIHJlc2VydmUsIG5vIG5lZWQgdG8gYWxsb2NhdGUgYW55CisgICAgICAgICAgICAgICAgLy8gdGhpcyBvbmx5IHBvc3NpYmxlIGluIG1vZGUgMSwgY2Fubm90IGhhdmUgcmVzZXJ2ZWQgdGhyZWFkcyBpbiBtb2RlIDAKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2hvdF90ZWFtc19tb2RlID09IDEpOworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9IG5ld19ucHJvYzsgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGdldCByZXNlcnZlZCB0aHJlYWRzIGludm9sdmVkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHdlIG1heSBoYXZlIHNvbWUgdGhyZWFkcyBpbiByZXNlcnZlLCBidXQgbm90IGVub3VnaAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoOyAvLyBnZXQgcmVzZXJ2ZWQgdGhyZWFkcyBpbnZvbHZlZCBpZiBhbnkKKyAgICAgICAgICAgICAgICBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA9IG5ld19ucHJvYzsgICAgICAgLy8gYWRqdXN0IGhvdCB0ZWFtIG1heCBzaXplCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIGlmKHRlYW0tPnQudF9tYXhfbnByb2MgPCBuZXdfbnByb2MpIHsKKyAgICAgICAgICAgICAgICAvKiByZWFsbG9jYXRlIGxhcmdlciBhcnJheXMgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9yZWFsbG9jYXRlX3RlYW1fYXJyYXlzKHRlYW0sIG5ld19ucHJvYyk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19pY3ZzLCBOVUxMICk7CisgICAgICAgICAgICB9CisKKyNpZiBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgLyogVGVtcG9yYXJpbHkgc2V0IGZ1bGwgbWFzayBmb3IgbWFzdGVyIHRocmVhZCBiZWZvcmUKKyAgICAgICAgICAgICAgIGNyZWF0aW9uIG9mIHdvcmtlcnMuIFRoZSByZWFzb24gaXMgdGhhdCB3b3JrZXJzIGluaGVyaXQKKyAgICAgICAgICAgICAgIHRoZSBhZmZpbml0eSBmcm9tIG1hc3Rlciwgc28gaWYgYSBsb3Qgb2Ygd29ya2VycyBhcmUKKyAgICAgICAgICAgICAgIGNyZWF0ZWQgb24gdGhlIHNpbmdsZSBjb3JlIHF1aWNrbHksIHRoZXkgZG9uJ3QgZ2V0CisgICAgICAgICAgICAgICBhIGNoYW5jZSB0byBzZXQgdGhlaXIgb3duIGFmZmluaXR5IGZvciBhIGxvbmcgdGltZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBfX2ttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfZnVsbF90bXAoIG9sZF9tYXNrICk7CisjZW5kaWYKKworICAgICAgICAgICAgLyogYWxsb2NhdGUgbmV3IHRocmVhZHMgZm9yIHRoZSBob3QgdGVhbSAqLworICAgICAgICAgICAgZm9yKCBmID0gdGVhbS0+dC50X25wcm9jICA7ICBmIDwgbmV3X25wcm9jICA7ICBmKysgKSB7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqIG5ld193b3JrZXIgPSBfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIHJvb3QsIHRlYW0sIGYgKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfd29ya2VyICk7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIGYgXSA9IG5ld193b3JrZXI7CisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdGVhbSAlZCBpbml0IFQjJWQgYXJyaXZlZDogam9pbj0lbGx1LCBwbGFpbj0lbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIF9fa21wX2d0aWRfZnJvbV90aWQoIGYsIHRlYW0gKSwgdGVhbS0+dC50X2lkLCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2Jhcltic19wbGFpbl9iYXJyaWVyXS5iX2Fycml2ZWQgKSApOworCisgICAgICAgICAgICAgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YSBmb3IgbmV3IHRocmVhZHMuCisgICAgICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSBuZXdfd29ya2VyLT50aC50aF9iYXI7CisgICAgICAgICAgICAgICAgICAgIGZvciggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhclsgYiBdLmJfdGVhbV9hcnJpdmVkOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgaW5pdGlhbCBtYXN0ZXIgdGhyZWFkJ3MgYWZmaW5pdHkgbWFzayAqLworICAgICAgICAgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIG9sZF9tYXNrLCBUUlVFICk7CisgICAgICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZF9tYXNrKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICB9IC8vIGVuZCBvZiBjaGVjayBvZiB0X25wcm9jIHZzLiBuZXdfbnByb2MgdnMuIGhvdF90ZWFtX250aAorI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICAvKiBtYWtlIHN1cmUgZXZlcnlvbmUgaXMgc3luY3Jvbml6ZWQgKi8KKyAgICAgICAgICAgIGludCBvbGRfbnByb2MgPSB0ZWFtLT50LnRfbnByb2M7IC8vIHNhdmUgb2xkIHZhbHVlIGFuZCB1c2UgdG8gdXBkYXRlIG9ubHkgbmV3IHRocmVhZHMgYmVsb3cKKyAgICAgICAgICAgIF9fa21wX2luaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X25wcm9jLCBuZXdfaWN2cywgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pZGVudCApOworCisgICAgICAgICAgICAvKiByZWluaXRpYWxpemUgdGhlIHRocmVhZHMgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X25wcm9jID09IG5ld19ucHJvYyk7CisgICAgICAgICAgICBmb3IgKGY9MDsgIGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrZikKKyAgICAgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIHRlYW0tPnQudF90aHJlYWRzWyBmIF0sIHRlYW0sIGYsIF9fa21wX2d0aWRfZnJvbV90aWQoIGYsIHRlYW0gKSApOworICAgICAgICAgICAgaWYgKGxldmVsKSB7IC8vIHNldCB0aF90YXNrX3N0YXRlIGZvciBuZXcgdGhyZWFkcyBpbiBuZXN0ZWQgaG90IHRlYW0KKyAgICAgICAgICAgICAgICAvLyBfX2ttcF9pbml0aWFsaXplX2luZm8oKSBubyBsb25nZXIgemVyb2VzIHRoX3Rhc2tfc3RhdGUsIHNvIHdlIHNob3VsZCBvbmx5IG5lZWQgdG8gc2V0IHRoZQorICAgICAgICAgICAgICAgIC8vIHRoX3Rhc2tfc3RhdGUgZm9yIHRoZSBuZXcgdGhyZWFkcy4gdGhfdGFza19zdGF0ZSBmb3IgbWFzdGVyIHRocmVhZCB3aWxsIG5vdCBiZSBhY2N1cmF0ZSB1bnRpbAorICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRoaXMgaW4gX19rbXBfZm9ya19jYWxsKCksIHNvIHdlIGxvb2sgdG8gdGhlIG1hc3RlcidzIG1lbW9fc3RhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0IHZhbHVlLgorICAgICAgICAgICAgICAgIGZvciAoZj1vbGRfbnByb2M7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrZikKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3Rhc2tfc3RhdGUgPSB0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW2xldmVsXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeyAvLyBzZXQgdGhfdGFza19zdGF0ZSBmb3IgbmV3IHRocmVhZHMgaW4gbm9uLW5lc3RlZCBob3QgdGVhbQorICAgICAgICAgICAgICAgIGludCBvbGRfc3RhdGUgPSB0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfdGFza19zdGF0ZTsgLy8gY29weSBtYXN0ZXIncyBzdGF0ZQorICAgICAgICAgICAgICAgIGZvciAoZj1vbGRfbnByb2M7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrZikKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3Rhc2tfc3RhdGUgPSBvbGRfc3RhdGU7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgdGVhbS0+dC50X25wcm9jOyArKyBmICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICYmCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90ZWFtX25wcm9jID09IHRlYW0tPnQudF9ucHJvYyApOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIHRlYW0gKTsKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgICB9IC8vIENoZWNrIGNoYW5nZXMgaW4gbnVtYmVyIG9mIHRocmVhZHMKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGttcF9pbmZvX3QgKm1hc3RlciA9IHRlYW0tPnQudF90aHJlYWRzWzBdOworICAgICAgICBpZiggbWFzdGVyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgICAgICBmb3IoIGYgPSAxOyBmIDwgbmV3X25wcm9jOyArK2YgKSB7CisgICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRlYW1zIGNvbnN0cnVjdCBzcGVjaWZpYyBpbmZvIHRvIHdvcmtlcnMKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aHIgPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IG1hc3Rlci0+dGgudGhfdGVhbXNfbWljcm90YXNrOworICAgICAgICAgICAgICAgIHRoci0+dGgudGhfdGVhbXNfbGV2ZWwgICAgID0gbWFzdGVyLT50aC50aF90ZWFtc19sZXZlbDsKKyAgICAgICAgICAgICAgICB0aHItPnRoLnRoX3RlYW1zX3NpemUgICAgICA9IG1hc3Rlci0+dGgudGhfdGVhbXNfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgaWYoIGxldmVsICkgeworICAgICAgICAgICAgLy8gU3luYyBiYXJyaWVyIHN0YXRlIGZvciBuZXN0ZWQgaG90IHRlYW1zLCBub3QgbmVlZGVkIGZvciBvdXRlcm1vc3QgaG90IHRlYW0uCisgICAgICAgICAgICBmb3IoIGYgPSAxOyBmIDwgbmV3X25wcm9jOyArK2YgKSB7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhyID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gdGhyLT50aC50aF9iYXI7CisgICAgICAgICAgICAgICAgZm9yKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgYmFsaWduWyBiIF0uYmIuYl9hcnJpdmVkICAgICAgICA9IHRlYW0tPnQudF9iYXJbIGIgXS5iX2Fycml2ZWQ7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfd29ya2VyX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworCisgICAgICAgIC8qIHJlYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBhcmdjLCB0ZWFtLCBUUlVFICk7CisgICAgICAgIHRlYW0tPnQudF9hcmdjICAgICA9IGFyZ2M7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBob3QgdGVhbSByZS11c2VzIHRoZSBwcmV2aW91cyB0YXNrIHRlYW0sCisgICAgICAgIC8vIGlmIHVudG91Y2hlZCBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbGVhc2UtPmdhdGhlciBwaGFzZS4KKyAgICAgICAgLy8KKworICAgICAgICBLRl9UUkFDRSggMTAsICggIiBob3RfdGVhbSA9ICVwXG4iLCB0ZWFtICkgKTsKKworI2lmIEtNUF9ERUJVRworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGhvdCB0ZWFtIHRhc2tfdGVhbVswXSA9ICVwIHRhc2tfdGVhbVsxXSA9ICVwIGFmdGVyIHJlaW5pdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bMF0sIHRlYW0tPnQudF90YXNrX3RlYW1bMV0gKSk7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIF9fb21wdF90ZWFtX2Fzc2lnbl9pZCh0ZWFtLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyNlbmRpZgorCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIHJldHVybiB0ZWFtOworICAgIH0KKworICAgIC8qIG5leHQsIGxldCdzIHRyeSB0byB0YWtlIG9uZSBmcm9tIHRoZSB0ZWFtIHBvb2wgKi8KKyAgICBLTVBfTUIoKTsKKyAgICBmb3IoIHRlYW0gPSAoa21wX3RlYW1fdCopIF9fa21wX3RlYW1fcG9vbCA7ICh0ZWFtKSA7ICkKKyAgICB7CisgICAgICAgIC8qIFRPRE86IGNvbnNpZGVyIHJlc2l6aW5nIHVuZGVyc2l6ZWQgdGVhbXMgaW5zdGVhZCBvZiByZWFwaW5nIHRoZW0sIG5vdyB0aGF0IHdlIGhhdmUgYSByZXNpemluZyBtZWNoYW5pc20gKi8KKyAgICAgICAgaWYgKCB0ZWFtLT50LnRfbWF4X25wcm9jID49IG1heF9ucHJvYyApIHsKKyAgICAgICAgICAgIC8qIHRha2UgdGhpcyB0ZWFtIGZyb20gdGhlIHRlYW0gcG9vbCAqLworICAgICAgICAgICAgX19rbXBfdGVhbV9wb29sID0gdGVhbS0+dC50X25leHRfcG9vbDsKKworICAgICAgICAgICAgLyogc2V0dXAgdGhlIHRlYW0gZm9yIGZyZXNoIHVzZSAqLworICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfbnByb2MsIG5ld19pY3ZzLCBOVUxMICk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGVhbTogc2V0dGluZyB0YXNrX3RlYW1bMF0gJXAgYW5kIHRhc2tfdGVhbVsxXSAlcCB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtWzBdLCAmdGVhbS0+dC50X3Rhc2tfdGVhbVsxXSkgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bMF0gPSBOVUxMOworICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVsxXSA9IE5VTEw7CisKKyAgICAgICAgICAgIC8qIHJlYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgIF9fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggYXJnYywgdGVhbSwgVFJVRSApOworICAgICAgICAgICAgdGVhbS0+dC50X2FyZ2MgICAgID0gYXJnYzsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHRlYW0gJWQgaW5pdCBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSk7CisgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGIgXS5iX2Fycml2ZWQgICAgICAgID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYiBdLmJfbWFzdGVyX2Fycml2ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQgICA9IDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisjZW5kaWYKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHVzaW5nIHRlYW0gZnJvbSBwb29sICVkLlxuIiwgdGVhbS0+dC50X2lkICkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBfX29tcHRfdGVhbV9hc3NpZ25faWQodGVhbSwgb21wdF9wYXJhbGxlbF9pZCk7CisjZW5kaWYKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0ZWFtOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVhcCB0ZWFtIGlmIGl0IGlzIHRvbyBzbWFsbCwgdGhlbiBsb29wIGJhY2sgYW5kIGNoZWNrIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAvKiBub3Qgc3VyZSBpZiB0aGlzIGlzIHdpc2UsIGJ1dCwgd2lsbCBiZSByZWRvbmUgZHVyaW5nIHRoZSBob3QtdGVhbXMgcmV3cml0ZS4gKi8KKyAgICAgICAgLyogVE9ETzogVXNlIHRlY2huaXF1ZSB0byBmaW5kIHRoZSByaWdodCBzaXplIGhvdC10ZWFtLCBkb24ndCByZWFwIHRoZW0gKi8KKyAgICAgICAgdGVhbSA9ICBfX2ttcF9yZWFwX3RlYW0oIHRlYW0gKTsKKyAgICAgICAgX19rbXBfdGVhbV9wb29sID0gdGVhbTsKKyAgICB9CisKKyAgICAvKiBub3RoaW5nIGF2YWlsYWJsZSBpbiB0aGUgcG9vbCwgbm8gbWF0dGVyLCBtYWtlIGEgbmV3IHRlYW0hICovCisgICAgS01QX01CKCk7CisgICAgdGVhbSA9IChrbXBfdGVhbV90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZigga21wX3RlYW1fdCApICk7CisKKyAgICAvKiBhbmQgc2V0IGl0IHVwICovCisgICAgdGVhbS0+dC50X21heF9ucHJvYyAgID0gbWF4X25wcm9jOworICAgIC8qIE5PVEUgd2VsbCwgZm9yIHNvbWUgcmVhc29uIGFsbG9jYXRpbmcgb25lIGJpZyBidWZmZXIgYW5kIGRpdmlkaW5nIGl0CisgICAgICogdXAgc2VlbXMgdG8gcmVhbGx5IGh1cnQgcGVyZm9ybWFuY2UgYSBsb3Qgb24gdGhlIFA0LCBzbywgbGV0J3Mgbm90IHVzZQorICAgICAqIHRoaXMuLi4gKi8KKyAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyggdGVhbSwgbWF4X25wcm9jICk7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3RlYW06IG1ha2luZyBhIG5ldyB0ZWFtXG4iICkgKTsKKyAgICBfX2ttcF9pbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19ucHJvYywgbmV3X2ljdnMsIE5VTEwgKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGVhbTogc2V0dGluZyB0YXNrX3RlYW1bMF0gJXAgYW5kIHRhc2tfdGVhbVsxXSAlcCB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X3Rhc2tfdGVhbVswXSwgJnRlYW0tPnQudF90YXNrX3RlYW1bMV0gKSApOworICAgIHRlYW0tPnQudF90YXNrX3RlYW1bMF0gPSBOVUxMOyAgICAvLyB0byBiZSByZW1vdmVkLCBhcyBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgbWVtb3J5LCBubyBuZWVkIHRvIGR1cGxpY2F0ZQorICAgIHRlYW0tPnQudF90YXNrX3RlYW1bMV0gPSBOVUxMOyAgICAvLyB0byBiZSByZW1vdmVkLCBhcyBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgbWVtb3J5LCBubyBuZWVkIHRvIGR1cGxpY2F0ZQorCisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdGVhbV9zdG9yYWdlX21hcCggInRlYW0iLCB0ZWFtLCB0ZWFtLT50LnRfaWQsIG5ld19ucHJvYyApOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgKi8KKyAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIEZBTFNFICk7CisgICAgdGVhbS0+dC50X2FyZ2MgICAgICAgID0gYXJnYzsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiB0ZWFtICVkIGluaXQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSApKTsKKyAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgICAgICBpbnQgYjsKKyAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkICAgICAgICA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl9tYXN0ZXJfYXJyaXZlZCA9IDA7CisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQgICA9IDA7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fb21wdF90ZWFtX2Fzc2lnbl9pZCh0ZWFtLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyAgICB0ZWFtLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm8gPSBOVUxMOworI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBkb25lIGNyZWF0aW5nIGEgbmV3IHRlYW0gJWQuXG4iLCB0ZWFtLT50LnRfaWQgKSk7CisKKyAgICByZXR1cm4gdGVhbTsKK30KKworLyogVE9ETyBpbXBsZW1lbnQgaG90LXRlYW1zIGF0IGFsbCBsZXZlbHMgKi8KKy8qIFRPRE8gaW1wbGVtZW50IGxhenkgdGhyZWFkIHJlbGVhc2Ugb24gZGVtYW5kIChkaXNiYW5kIHJlcXVlc3QpICovCisKKy8qIGZyZWUgdGhlIHRlYW0uICByZXR1cm4gaXQgdG8gdGhlIHRlYW0gcG9vbC4gIHJlbGVhc2UgYWxsIHRoZSB0aHJlYWRzCisgKiBhc3NvY2lhdGVkIHdpdGggaXQgKi8KK3ZvaWQKK19fa21wX2ZyZWVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwga21wX3RlYW1fdCAqdGVhbSAgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKm1hc3RlcikgKQoreworICAgIGludCBmOworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mcmVlX3RlYW06IFQjJWQgZnJlZWluZyB0ZWFtICVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLCB0ZWFtLT50LnRfaWQgKSk7CisKKyAgICAvKiB2ZXJpZnkgc3RhdGUgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA8PSB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgKTsKKworICAgIGludCB1c2VfaG90X3RlYW0gPSB0ZWFtID09IHJvb3QtPnIucl9ob3RfdGVhbTsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGludCBsZXZlbDsKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtczsKKyAgICBpZiggbWFzdGVyICkgeworICAgICAgICBsZXZlbCA9IHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgLSAxOworICAgICAgICBpZiggbWFzdGVyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRlYW1zIGNvbnN0cnVjdD8KKyAgICAgICAgICAgIGlmKCBtYXN0ZXItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSApIHsKKyAgICAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl9tYXN0ZXJzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICAgICAgICAgIG1hc3Rlci0+dGgudGhfdGVhbXNfbGV2ZWwgPT0gdGVhbS0+dC50X2xldmVsICkgeworICAgICAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl93b3JrZXJzIGJlZm9yZSB0aGUgcGFyYWxsZWwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAvLyB0ZWFtLT50LnRfbGV2ZWwgd2lsbCBiZSBpbmNyZWFzZWQgaW5zaWRlIHBhcmFsbGVsCisgICAgICAgIH0KKyAgICAgICAgaG90X3RlYW1zID0gbWFzdGVyLT50aC50aF9ob3RfdGVhbXM7CisgICAgICAgIGlmKCBsZXZlbCA8IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtID09IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gKTsKKyAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworICAgIC8qIHRlYW0gaXMgZG9uZSB3b3JraW5nICovCisgICAgVENXX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuLCBOVUxMKTsgLy8gSW1wb3J0YW50IGZvciBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorICAgIHRlYW0tPnQudF9jb3B5aW5fY291bnRlciA9IDA7IC8vIGluaXQgY291bnRlciBmb3IgcG9zc2libGUgcmV1c2UKKyAgICAvLyBEbyBub3QgcmVzZXQgcG9pbnRlciB0byBwYXJlbnQgdGVhbSB0byBOVUxMIGZvciBob3QgdGVhbXMuCisKKyAgICAvKiBpZiB3ZSBhcmUgbm9uLWhvdCB0ZWFtLCByZWxlYXNlIG91ciB0aHJlYWRzICovCisgICAgaWYoICEgdXNlX2hvdF90ZWFtICkgeworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgLy8gRGVsZXRlIHRhc2sgdGVhbXMKKyAgICAgICAgICAgIGludCB0dF9pZHg7CisgICAgICAgICAgICBmb3IgKHR0X2lkeD0wOyB0dF9pZHg8MjsgKyt0dF9pZHgpIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW1bdHRfaWR4XTsKKyAgICAgICAgICAgICAgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGY9MDsgZjx0ZWFtLT50LnRfbnByb2M7ICsrZikgeyAvLyBIYXZlIGFsbCB0aHJlYWRzIHVucmVmIHRhc2sgdGVhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZnJlZV90ZWFtOiBUIyVkIGRlYWN0aXZhdGluZyB0YXNrX3RlYW0gJXAgb24gdGVhbSAlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSwgdGFza190ZWFtLCB0ZWFtLT50LnRfaWQgKSApOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza190ZWFtKCBtYXN0ZXIsIHRhc2tfdGVhbSApOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bdHRfaWR4XSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzZXQgcG9pbnRlciB0byBwYXJlbnQgdGVhbSBvbmx5IGZvciBub24taG90IHRlYW1zLgorICAgICAgICB0ZWFtLT50LnRfcGFyZW50ID0gTlVMTDsKKworCisgICAgICAgIC8qIGZyZWUgdGhlIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIGZvciAoIGYgPSAxOyBmIDwgdGVhbS0+dC50X25wcm9jOyArKyBmICkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgX19rbXBfZnJlZV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gPSBOVUxMOworICAgICAgICB9CisKKworICAgICAgICAvKiBwdXQgdGhlIHRlYW0gYmFjayBpbiB0aGUgdGVhbSBwb29sICovCisgICAgICAgIC8qIFRPRE8gbGltaXQgc2l6ZSBvZiB0ZWFtIHBvb2wsIGNhbGwgcmVhcF90ZWFtIGlmIHBvb2wgdG9vIGxhcmdlICovCisgICAgICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgID0gKGttcF90ZWFtX3QqKSBfX2ttcF90ZWFtX3Bvb2w7CisgICAgICAgIF9fa21wX3RlYW1fcG9vbCAgICAgICAgPSAodm9sYXRpbGUga21wX3RlYW1fdCopIHRlYW07CisgICAgfQorCisgICAgS01QX01CKCk7Cit9CisKKworLyogcmVhcCB0aGUgdGVhbS4gIGRlc3Ryb3kgaXQsIHJlY2xhaW0gYWxsIGl0cyByZXNvdXJjZXMgYW5kIGZyZWUgaXRzIG1lbW9yeSAqLwora21wX3RlYW1fdCAqCitfX2ttcF9yZWFwX3RlYW0oIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF90ZWFtX3QgKm5leHRfcG9vbCA9IHRlYW0tPnQudF9uZXh0X3Bvb2w7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BhdGNoICAgICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BfYnVmZmVyICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgICAgICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2FyZ3YgICAgICAgICk7CisKKyAgICAvKiBUT0RPIGNsZWFuIHRoZSB0aHJlYWRzIHRoYXQgYXJlIGEgcGFydCBvZiB0aGlzPyAqLworCisgICAgLyogZnJlZSBzdHVmZiAqLworCisgICAgX19rbXBfZnJlZV90ZWFtX2FycmF5cyggdGVhbSApOworICAgIGlmICggdGVhbS0+dC50X2FyZ3YgIT0gJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXSApCisgICAgICAgIF9fa21wX2ZyZWUoICh2b2lkKikgdGVhbS0+dC50X2FyZ3YgKTsKKyAgICBfX2ttcF9mcmVlKCB0ZWFtICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gbmV4dF9wb29sOworfQorCisvLworLy8gRnJlZSB0aGUgdGhyZWFkLiAgRG9uJ3QgcmVhcCBpdCwganVzdCBwbGFjZSBpdCBvbiB0aGUgcG9vbCBvZiBhdmFpbGFibGUKKy8vIHRocmVhZHMuCisvLworLy8gQ2hhbmdlcyBmb3IgUXVhZCBpc3N1ZSA1Mjc4NDU6IFdlIG5lZWQgYSBwcmVkaWN0YWJsZSBPTVAgdGlkIDwtPiBndGlkCisvLyBiaW5kaW5nIGZvciB0aGUgYWZmaW5pdHkgbWVjaGFuaXNtIHRvIGJlIHVzZWZ1bC4KKy8vCisvLyBOb3csIHdlIGFsd2F5cyBrZWVwIHRoZSBmcmVlIGxpc3QgKF9fa21wX3RocmVhZF9wb29sKSBzb3J0ZWQgYnkgZ3RpZC4KKy8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gYXZvaWQgYSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgcHJvYmxlbSBieSBhbHdheXMKKy8vIHNjYW5uaW5nIHRocm91Z2ggdGhlIGxpc3QgdG8gZmluZCB0aGUgY29ycmVjdCBwb2ludCBhdCB3aGljaCB0byBpbnNlcnQKKy8vIHRoZSB0aHJlYWQgKHBvdGVudGlhbCBOKioyIGJlaGF2aW9yKS4gIFRvIGRvIHRoaXMgd2Uga2VlcCB0cmFjayBvZiB0aGUKKy8vIGxhc3QgcGxhY2UgYSB0aHJlYWQgc3RydWN0IHdhcyBpbnNlcnRlZCAoX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0KS4KKy8vIFdpdGggc2luZ2xlLWxldmVsIHBhcmFsbGVsaXNtLCB0aHJlYWRzIHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSB0YWlsCisvLyBvZiB0aGUgbGlzdCwga2VwdCB0cmFjayBvZiBieSBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQuICBXaXRoIG5lc3RlZAorLy8gcGFyYWxsZWxpc20sIGFsbCBiZXRzIGFyZSBvZmYgYW5kIHdlIG1heSBuZWVkIHRvIHNjYW4gdGhyb3VnaCB0aGUgZW50aXJlCisvLyBmcmVlIGxpc3QuCisvLworLy8gVGhpcyBjaGFuZ2UgYWxzbyBoYXMgYSBwb3RlbnRpYWxseSBsYXJnZSBwZXJmb3JtYW5jZSBiZW5lZml0LCBmb3Igc29tZQorLy8gYXBwbGljYXRpb25zLiAgUHJldmlvdXNseSwgYXMgdGhyZWFkcyB3ZXJlIGZyZWVkIGZyb20gdGhlIGhvdCB0ZWFtLCB0aGV5CisvLyB3b3VsZCBiZSBwbGFjZWQgYmFjayBvbiB0aGUgZnJlZSBsaXN0IGluIGludmVyc2Ugb3JkZXIuICBJZiB0aGUgaG90IHRlYW0KKy8vIGdyZXcgYmFjayB0byBpdCdzIG9yaWdpbmFsIHNpemUsIHRoZW4gdGhlIGZyZWVkIHRocmVhZCB3b3VsZCBiZSBwbGFjZWQKKy8vIGJhY2sgb24gdGhlIGhvdCB0ZWFtIGluIHJldmVyc2Ugb3JkZXIuICBUaGlzIGNvdWxkIGNhdXNlIGJhZCBjYWNoZQorLy8gbG9jYWxpdHkgcHJvYmxlbXMgb24gcHJvZ3JhbXMgd2hlcmUgdGhlIHNpemUgb2YgdGhlIGhvdCB0ZWFtIHJlZ3VsYXJseQorLy8gZ3JldyBhbmQgc2hydW5rLgorLy8KKy8vIE5vdywgZm9yIHNpbmdsZS1sZXZlbCBwYXJhbGxlbGlzbSwgdGhlIE9NUCB0aWQgaXMgYWx3YXkgPT0gZ3RpZC4KKy8vCit2b2lkCitfX2ttcF9mcmVlX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aCApCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX2luZm9fdCAqKnNjYW47CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZnJlZV90aHJlYWQ6IFQjJWQgcHV0dGluZyBUIyVkIGJhY2sgb24gZnJlZSBwb29sLlxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCB0aGlzX3RoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RoICk7CisKKyAgICAvLyBXaGVuIG1vdmluZyB0aHJlYWQgdG8gcG9vbCwgc3dpdGNoIHRocmVhZCB0byB3YWl0IG9uIG93biBiX2dvIGZsYWcsIGFuZCB1bmluaXRpYWxpemVkIChOVUxMIHRlYW0pLgorICAgIGludCBiOworICAgIGttcF9iYWxpZ25fdCAqYmFsaWduID0gdGhpc190aC0+dGgudGhfYmFyOworICAgIGZvciAoYj0wOyBiPGJzX2xhc3RfYmFycmllcjsgKytiKSB7CisgICAgICAgIGlmIChiYWxpZ25bYl0uYmIud2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKQorICAgICAgICAgICAgYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRzsKKyAgICAgICAgYmFsaWduW2JdLmJiLnRlYW0gPSBOVUxMOworICAgIH0KKyAgICB0aGlzX3RoLT50aC50aF90YXNrX3N0YXRlID0gMDsKKworCisgICAgLyogcHV0IHRocmVhZCBiYWNrIG9uIHRoZSBmcmVlIHBvb2wgKi8KKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX3RlYW0sIE5VTEwpOworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfcm9vdCwgTlVMTCk7CisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF9kaXNwYXRjaCwgTlVMTCk7ICAgICAgICAgICAgICAgLyogTk9UIE5FRURFRCAqLworCisgICAgLy8KKyAgICAvLyBJZiB0aGUgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0IGlzIGFscmVhZHkgcGFzdCB0aGUgbmV3IGluc2VydAorICAgIC8vIHBvaW50LCB0aGVuIHdlIG5lZWQgdG8gcmUtc2NhbiB0aGUgZW50aXJlIGxpc3QuCisgICAgLy8KKyAgICBndGlkID0gdGhpc190aC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ICE9IE5VTEwgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sICE9IE5VTEwgKTsKKyAgICAgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA+IGd0aWQgKSB7CisgICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gU2NhbiBkb3duIHRoZSBsaXN0IHRvIGZpbmQgdGhlIHBsYWNlIHRvIGluc2VydCB0aGUgdGhyZWFkLgorICAgIC8vIHNjYW4gaXMgdGhlIGFkZHJlc3Mgb2YgYSBsaW5rIGluIHRoZSBsaXN0LCBwb3NzaWJseSB0aGUgYWRkcmVzcyBvZgorICAgIC8vIF9fa21wX3RocmVhZF9wb29sIGl0c2VsZi4KKyAgICAvLworICAgIC8vIEluIHRoZSBhYnNlbmNlIG9mIG5lc3RlZCBwYXJhbGxpc20sIHRoZSBmb3IgbG9vcCB3aWxsIGhhdmUgMCBpdGVyYXRpb25zLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgIT0gTlVMTCApIHsKKyAgICAgICAgc2NhbiA9ICYoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC0+dGgudGhfbmV4dF9wb29sICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzY2FuID0gKGttcF9pbmZvX3QgKiopJl9fa21wX3RocmVhZF9wb29sOworICAgIH0KKyAgICBmb3IgKDsgKCAqc2NhbiAhPSBOVUxMICkgJiYgKCAoKnNjYW4pLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPCBndGlkICk7CisgICAgICBzY2FuID0gJiggKCpzY2FuKS0+dGgudGhfbmV4dF9wb29sICkgKTsKKworICAgIC8vCisgICAgLy8gSW5zZXJ0IHRoZSBuZXcgZWxlbWVudCBvbiB0aGUgbGlzdCwgYW5kIHNldCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQKKyAgICAvLyB0byBpdHMgYWRkcmVzcy4KKyAgICAvLworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfbmV4dF9wb29sLCAqc2Nhbik7CisgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gKnNjYW4gPSB0aGlzX3RoOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggdGhpc190aC0+dGgudGhfbmV4dF9wb29sID09IE5VTEwgKQorICAgICAgfHwgKCB0aGlzX3RoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQKKyAgICAgIDwgdGhpc190aC0+dGgudGhfbmV4dF9wb29sLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworICAgIFRDV180KHRoaXNfdGgtPnRoLnRoX2luX3Bvb2wsIFRSVUUpOworICAgIF9fa21wX3RocmVhZF9wb29sX250aCsrOworCisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggLSAxKTsKKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHVzZXIgc2V0dGluZyBvciBkZWZhdWx0IGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBuZXZlciBoYXZlIG9jY3VycmVkICAgICAgICAgICAgICAgICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2F2YWlsX3Byb2MgPiAwICk7CisgICAgICAgIGlmICggX19rbXBfbnRoIDw9IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIEtNUF9NQigpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICoKK19fa21wX2xhdW5jaF90aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgZ3RpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisvKiAgICB2b2lkICAgICAgICAgICAgICAgICAqc3RhY2tfZGF0YTsqLworICAgIGttcF90ZWFtX3QgKigqdm9sYXRpbGUgcHRlYW0pOworCisgICAgS01QX01CKCk7CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQgc3RhcnRcbiIsIGd0aWQgKSApOworCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2NvbnMgPSBfX2ttcF9hbGxvY2F0ZV9jb25zX3N0YWNrKCBndGlkICk7ICAvLyBBVFQ6IE1lbW9yeSBsZWFrPworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uaWRsZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9iZWdpbikpIHsKKyAgICAgICAgICAgIF9fb21wdF90aHJlYWRfYmVnaW4ob21wdF90aHJlYWRfd29ya2VyLCBndGlkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgdGhyZWFkcyB3YWl0IGZvciB3b3JrICovCisgICAgd2hpbGUoICEgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdICk7CisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8qIHdhaXQgZm9yIHdvcmsgdG8gZG8gKi8KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQgd2FpdGluZyBmb3Igd29ya1xuIiwgZ3RpZCApKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfaWRsZTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLyogTm8gdGlkIHlldCBzaW5jZSBub3QgcGFydCBvZiBhIHRlYW0gKi8KKyAgICAgICAgX19rbXBfZm9ya19iYXJyaWVyKCBndGlkLCBLTVBfR1RJRF9ETkUgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHB0ZWFtID0gKGttcF90ZWFtX3QgKigqKSkoJiB0aGlzX3Roci0+dGgudGhfdGVhbSk7CisKKyAgICAgICAgLyogaGF2ZSB3ZSBiZWVuIGFsbG9jYXRlZD8gKi8KKyAgICAgICAgaWYgKCBUQ1JfU1lOQ19QVFIoKnB0ZWFtKSAmJiAhVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgICAgIC8qIHdlIHdlcmUganVzdCB3b2tlbiB1cCwgc28gcnVuIG91ciBuZXcgdGFzayAqLworICAgICAgICAgICAgaWYgKCBUQ1JfU1lOQ19QVFIoKCpwdGVhbSktPnQudF9wa2ZuKSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkKCVkOiVkKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCAoKnB0ZWFtKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCAoKnB0ZWFtKS0+dC50X3BrZm4pKTsKKworICAgICAgICAgICAgICAgIHVwZGF0ZUhXRlBDb250cm9sICgqcHRlYW0pOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBPTVBUIHRhc2sgaWQgZm9yIGltcGxpY2l0IHRhc2suCisgICAgICAgICAgICAgICAgICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICAgICAgICAgICAgICAoKnB0ZWFtKS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0KKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X3Rhc2tfaWRfbmV3KHRpZCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBLTVBfU1RPUF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIoVVNFUl9sYXVuY2hfdGhyZWFkX2xvb3ApOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKFVTRVJfd29ya2VyX2ludm9rZSk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gKCpwdGVhbSktPnQudF9pbnZva2UoIGd0aWQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX1NUQVJUX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihVU0VSX2xhdW5jaF90aHJlYWRfbG9vcCk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbm8gZnJhbWUgc2V0IHdoaWxlIG91dHNpZGUgdGFzayAqLworICAgICAgICAgICAgICAgICAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpwdGVhbSktPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCglZDolZCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICgqcHRlYW0pLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksICgqcHRlYW0pLT50LnRfcGtmbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogam9pbiBiYXJyaWVyIGFmdGVyIHBhcmFsbGVsIHJlZ2lvbiAqLworICAgICAgICAgICAgX19rbXBfam9pbl9iYXJyaWVyKCBndGlkICk7CisgICAgICAgIH0KKyAgICB9CisgICAgVENSX1NZTkNfUFRSKChpbnRwdHJfdClfX2ttcF9nbG9iYWwuZy5nX2RvbmUpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCkpIHsKKyAgICAgICAgX19vbXB0X3RocmVhZF9lbmQob21wdF90aHJlYWRfd29ya2VyLCBndGlkKTsKKyAgICB9CisjZW5kaWYKKworICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgIC8qIHJ1biB0aGUgZGVzdHJ1Y3RvcnMgZm9yIHRoZSB0aHJlYWRwcml2YXRlIGRhdGEgZm9yIHRoaXMgdGhyZWFkICovCisgICAgX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZCggZ3RpZCApOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQgZG9uZVxuIiwgZ3RpZCApICk7CisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIHRoaXNfdGhyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdCggdm9pZCAqc3BlY2lmaWNfZ3RpZCApCit7CisgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAgODEwICkgLy8gY29udmVyc2lvbiBmcm9tICJ2b2lkICoiIHRvICJpbnQiIG1heSBsb3NlIHNpZ25pZmljYW50IGJpdHMKKyAgICAjZW5kaWYKKyAgICAvLyBNYWtlIHN1cmUgbm8gc2lnbmlmaWNhbnQgYml0cyBhcmUgbG9zdAorICAgIGludCBndGlkID0gKGttcF9pbnRwdHJfdClzcGVjaWZpY19ndGlkIC0gMTsKKyAgICAjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisgICAgI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMzAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3Q6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICAvKiBOT1RFOiB0aGUgZ3RpZCBpcyBzdG9yZWQgYXMgZ2l0ZCsxIGluIHRoZSB0aHJlYWQtbG9jYWwtc3RvcmFnZQorICAgICAqIHRoaXMgaXMgYmVjYXVzZSAwIGlzIHJlc2VydmVkIGZvciB0aGUgbm90aGluZy1zdG9yZWQgY2FzZSAqLworCisgICAgLyogam9zaDogT25lIHJlYXNvbiBmb3Igc2V0dGluZyB0aGUgZ3RpZCBzcGVjaWZpYyBkYXRhIGV2ZW4gd2hlbiBpdCBpcyBiZWluZworICAgICAgIGRlc3Ryb3llZCBieSBwdGhyZWFkIGlzIHRvIGFsbG93IGd0aWQgbG9va3VwIHRocm91Z2ggdGhyZWFkIHNwZWNpZmljIGRhdGEKKyAgICAgICAoX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMpLiAgU29tZSBvZiB0aGUgY29kZSwgZXNwZWNpYWxseSBzdGF0IGNvZGUsCisgICAgICAgdGhhdCBnZXRzIGV4ZWN1dGVkIGluIHRoZSBjYWxsIHRvIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQsIGFjdHVhbGx5CisgICAgICAgZ2V0cyB0aGUgZ3RpZCB0aHJvdWdoIHRoZSB0aHJlYWQgc3BlY2lmaWMgZGF0YS4gIFNldHRpbmcgaXQgaGVyZSBzZWVtcworICAgICAgIHJhdGhlciBpbmVsZWdhbnQgYW5kIHBlcmhhcHMgd3JvbmcsIGJ1dCBhbGxvd3MgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZAorICAgICAgIHRvIHJ1biBzbW9vdGhseS4KKyAgICAgICB0b2RvOiBnZXQgcmlkIG9mIHRoaXMgYWZ0ZXIgd2UgcmVtb3ZlIHRoZSBkZXBlbmRlbmNlIG9uCisgICAgICAgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMKKyAgICAqLworICAgIGlmKGd0aWQgPj0gMCAmJiBLTVBfVUJFUl9HVElEKGd0aWQpKQorICAgICAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggZ3RpZCApOworICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICBfX2ttcF9ndGlkID0gZ3RpZDsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKCBndGlkICk7Cit9CisKKyNpZiBLTVBfT1NfVU5JWCAmJiBLTVBfRFlOQU1JQ19MSUIKKworLy8gMjAwOS0wOS0wOCAobGV2KTogSXQgbG9va3MgdGhlIGRlc3RydWN0b3IgZG9lcyBub3Qgd29yay4gSW4gc2ltcGxlIHRlc3QgY2FzZXMgZGVzdHJ1Y3RvcnMgd29yaworLy8gcGVyZmVjdGx5LCBidXQgaW4gcmVhbCBsaWJvbXAuc28gSSBoYXZlIG5vIGV2aWRlbmNlIGl0IGlzIGV2ZXIgY2FsbGVkLiBIb3dldmVyLCAtZmluaSBsaW5rZXIKKy8vIG9wdGlvbiBpbiBtYWtlZmlsZS5tayB3b3JrcyBmaW5lLgorCitfX2F0dHJpYnV0ZV9fKCggZGVzdHJ1Y3RvciApKQordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX2R0b3IoIHZvaWQgKQoreworICAgIF9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQoKTsKK30KKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkoIHZvaWQgKQoreworICAgIF9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQoKTsKK30KKworI2VuZGlmCisKKy8qIFtXaW5kb3dzXSBqb3NoOiB3aGVuIHRoZSBhdGV4aXQgaGFuZGxlciBpcyBjYWxsZWQsIHRoZXJlIG1heSBzdGlsbCBiZSBtb3JlIHRoYW4gb25lIHRocmVhZCBhbGl2ZSAqLwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCggdm9pZCApCit7CisgICAgS0FfVFJBQ0UoIDMwLCAoICJfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0XG4iICkgKTsKKyAgICAvKiBbV2luZG93c10KKyAgICAgICBqb3NoOiBpZGVhbGx5LCB3ZSB3YW50IHRvIGNvbXBsZXRlbHkgc2h1dGRvd24gdGhlIGxpYnJhcnkgaW4gdGhpcyBhdGV4aXQgaGFuZGxlciwgYnV0CisgICAgICAgc3RhdCBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aHJlYWQgc3BlY2lmaWMgZGF0YSBmb3IgZ3RpZCBmYWlscyBiZWNhdXNlIHRoYXQgZGF0YSBiZWNvbWVzCisgICAgICAgdW5hdmFpbGFibGUgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIHNodXRkb3duLCBzbyB3ZSBjYWxsIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQKKyAgICAgICBpbnN0ZWFkLiAgV2Ugc2hvdWxkIGV2ZW50dWFsbHkgcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IG9uIF9fa21wX2dldF9zcGVjaWZpY19ndGlkIGluIHRoZQorICAgICAgIHN0YXQgY29kZSBhbmQgdXNlIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5IHRvIGNsZWFubHkgc2h1dGRvd24gdGhlIGxpYnJhcnkuCisKKy8vIFRPRE86IENhbiBzb21lIG9mIHRoaXMgY29tbWVudCBhYm91dCBHVlMgYmUgcmVtb3ZlZD8KKyAgICAgICBJIHN1c3BlY3QgdGhhdCB0aGUgb2ZmZW5kaW5nIHN0YXQgY29kZSBpcyBleGVjdXRlZCB3aGVuIHRoZSBjYWxsaW5nIHRocmVhZCB0cmllcyB0bworICAgICAgIGNsZWFuIHVwIGEgZGVhZCByb290IHRocmVhZCdzIGRhdGEgc3RydWN0dXJlcywgcmVzdWx0aW5nIGluIEdWUyBjb2RlIHRyeWluZyB0byBjbG9zZQorICAgICAgIHRoZSBHVlMgc3RydWN0dXJlcyBmb3IgdGhhdCB0aHJlYWQsIGJ1dCBzaW5jZSB0aGUgc3RhdCBjb2RlIHVzZXMKKyAgICAgICBfX2ttcF9nZXRfc3BlY2lmaWNfZ3RpZCB0byBnZXQgdGhlIGd0aWQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBjYWxsaW5nIHRocmVhZCBpcworICAgICAgIGNsZWFuaW5nIHVwIGl0c2VsZiBpbnN0ZWFkIG9mIGFub3RoZXIgdGhyZWFkLCBpdCBnZXRzIGNvbmZ1c2VkLiAgVGhpcyBoYXBwZW5zIGJlY2F1c2UKKyAgICAgICBhbGxvd2luZyBhIHRocmVhZCB0byB1bnJlZ2lzdGVyIGFuZCBjbGVhbnVwIGFub3RoZXIgdGhyZWFkIGlzIGEgcmVjZW50IG1vZGlmaWNhdGlvbiBmb3IKKyAgICAgICBhZGRyZXNzaW5nIGFuIGlzc3VlIHdpdGggTWF4b24gQ2luZW1hNEQuICBCYXNlZCBvbiB0aGUgY3VycmVudCBkZXNpZ24gKDIwMDUwNzIyKSwgYQorICAgICAgIHRocmVhZCBtYXkgZW5kIHVwIHRyeWluZyB0byB1bnJlZ2lzdGVyIGFub3RoZXIgdGhyZWFkIG9ubHkgaWYgdGhyZWFkIGRlYXRoIGRvZXMgbm90CisgICAgICAgdHJpZ2dlciB0aGUgY2FsbGluZyBvZiBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkLiAgRm9yIExpbnV4KiBPUywgdGhlcmUgaXMgdGhlIHRocmVhZAorICAgICAgIHNwZWNpZmljIGRhdGEgZGVzdHJ1Y3RvciBmdW5jdGlvbiB0byBkZXRlY3QgdGhyZWFkIGRlYXRoLiAgRm9yIFdpbmRvd3MgZHluYW1pYywgdGhlcmUKKyAgICAgICBpcyBEbGxNYWluKFRIUkVBRF9ERVRBQ0gpLiAgRm9yIFdpbmRvd3Mgc3RhdGljLCB0aGVyZSBpcyBub3RoaW5nLiAgVGh1cywgdGhlCisgICAgICAgd29ya2Fyb3VuZCBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIFdpbmRvd3Mgc3RhdGljIHN0YXQgbGlicmFyeS4KKyAgICAqLworICAgIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCAtMSApOworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBfX2ttcF9jbG9zZV9jb25zb2xlKCk7CisgICAgI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWFwX3RocmVhZCgKKyAgICBrbXBfaW5mb190ICogdGhyZWFkLAorICAgIGludCBpc19yb290CispIHsKKworICAgIC8vIEl0IGlzIGFzc3VtZWQgX19rbXBfZm9ya2pvaW5fbG9jayBpcyBhY3F1aXJlZC4KKworICAgIGludCBndGlkOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkICE9IE5VTEwgKTsKKworICAgIGd0aWQgPSB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKworICAgIGlmICggISBpc19yb290ICkgeworCisgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICAvKiBBc3N1bWUgdGhlIHRocmVhZHMgYXJlIGF0IHRoZSBmb3JrIGJhcnJpZXIgaGVyZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3JlYXBfdGhyZWFkOiByZWxlYXNpbmcgVCMlZCBmcm9tIGZvcmsgYmFycmllciBmb3IgcmVhcFxuIiwgZ3RpZCApICk7CisgICAgICAgICAgICAvKiBOZWVkIHJlbGVhc2UgZmVuY2UgaGVyZSB0byBwcmV2ZW50IHNlZyBmYXVsdHMgZm9yIHRyZWUgZm9ya2pvaW4gYmFycmllciAoR0VIKSAqLworICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyZWFkLT50aC50aF9iYXJbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXS5iYi5iX2dvLCB0aHJlYWQpOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV82NCgmZmxhZyk7CisgICAgICAgIH07IC8vIGlmCisKKworICAgICAgICAvLyBUZXJtaW5hdGUgT1MgdGhyZWFkLgorICAgICAgICBfX2ttcF9yZWFwX3dvcmtlciggdGhyZWFkICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHRocmVhZCB3YXMga2lsbGVkIGFzeW5jaHJvbm91c2x5LiAgSWYgaXQgd2FzIGFjdGl2ZWx5CisgICAgICAgIC8vIHNwaW5uaW5nIGluIHRoZSBpbiB0aGUgdGhyZWFkIHBvb2wsIGRlY3JlbWVudCB0aGUgZ2xvYmFsIGNvdW50LgorICAgICAgICAvLworICAgICAgICAvLyBUaGVyZSBpcyBhIHNtYWxsIHRpbWluZyBob2xlIGhlcmUgLSBpZiB0aGUgd29ya2VyIHRocmVhZCB3YXMKKyAgICAgICAgLy8ganVzdCB3YWtpbmcgdXAgYWZ0ZXIgc2xlZXBpbmcgaW4gdGhlIHBvb2wsIGhhZCByZXNldCBpdCdzCisgICAgICAgIC8vIHRoX2FjdGl2ZV9pbl9wb29sIGZsYWcgYnV0IG5vdCBkZWNyZW1lbnRlZCB0aGUgZ2xvYmFsIGNvdW50ZXIKKyAgICAgICAgLy8gX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCB5ZXQsIHRoZW4gdGhlIGdsb2JhbCBjb3VudGVyCisgICAgICAgIC8vIG1pZ2h0IG5vdCBnZXQgdXBkYXRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ3VycmVudGx5LCB0aGlzIGNhbiBvbmx5IGhhcHBlbiBhcyB0aGUgbGlicmFyeSBpcyB1bmxvYWRlZCwKKyAgICAgICAgLy8gc28gdGhlcmUgYXJlIG5vIGhhcm1mdWwgc2lkZSBlZmZlY3RzLgorICAgICAgICAvLworICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWNyZW1lbnQgIyBvZiBbd29ya2VyXSB0aHJlYWRzIGluIHRoZSBwb29sLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbF9udGggPiAwICk7CisgICAgICAgIC0tX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworICAgIH07IC8vIGlmCisKKyAgICAvLyBGcmVlIHRoZSBmYXN0IG1lbW9yeSBmb3IgdGFza2luZworICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZnJlZV9mYXN0X21lbW9yeSggdGhyZWFkICk7CisgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworCisgICAgX19rbXBfc3VzcGVuZF91bmluaXRpYWxpemVfdGhyZWFkKCB0aHJlYWQgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHNbIGd0aWQgXSA9PSB0aHJlYWQgKTsKKyAgICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSwgTlVMTCk7CisKKyAgICAtLSBfX2ttcF9hbGxfbnRoOworICAgIC8vIF9fa21wX250aCB3YXMgZGVjcmVtZW50ZWQgd2hlbiB0aHJlYWQgaXMgYWRkZWQgdG8gdGhlIHBvb2wuCisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB1c2VyIHNldHRpbmcgb3IgZGVmYXVsdCBpZiBuZWNlc3NhcnkgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbmV2ZXIgaGF2ZSBvY2N1cnJlZCAgICAgICAgICAgICAgICAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApOworICAgICAgICBpZiAoIF9fa21wX250aCA8PSBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBmcmVlIHRoZSBtZW1vcnkgYmVpbmcgdXNlZCAqLworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9jb25zICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV9jb25zX3N0YWNrKCB0aHJlYWQtPnRoLnRoX2NvbnMgKTsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfY29ucyA9IE5VTEw7CisgICAgICAgIH07IC8vIGlmCisgICAgfQorCisgICAgaWYgKCB0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfZnJlZSggdGhyZWFkLT50aC50aF9wcmlfY29tbW9uICk7CisgICAgICAgIHRocmVhZC0+dGgudGhfcHJpX2NvbW1vbiA9IE5VTEw7CisgICAgfTsgLy8gaWYKKworICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2spOworICAgICAgICB0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayA9IE5VTEw7CisgICAgfQorCisgICAgI2lmIEtNUF9VU0VfQkdFVAorICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9maW5hbGl6ZV9iZ2V0KCB0aHJlYWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpZiAoIHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMICkgeworICAgICAgICBLTVBfQ1BVX0ZSRUUoIHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayApOworICAgICAgICB0aHJlYWQtPnRoLnRoX2FmZmluX21hc2sgPSBOVUxMOworICAgIH07IC8vIGlmCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgICAgX19rbXBfcmVhcF90ZWFtKCB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSA9IE5VTEw7CisgICAgX19rbXBfZnJlZSggdGhyZWFkICk7CisKKyAgICBLTVBfTUIoKTsKKworfSAvLyBfX2ttcF9yZWFwX3RocmVhZAorCitzdGF0aWMgdm9pZAorX19rbXBfaW50ZXJuYWxfZW5kKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBGaXJzdCwgdW5yZWdpc3RlciB0aGUgbGlicmFyeSAqLworICAgIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeSgpOworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8qIEluIFdpbiBzdGF0aWMgbGlicmFyeSwgd2UgY2FuJ3QgdGVsbCB3aGVuIGEgcm9vdCBhY3R1YWxseSBkaWVzLCBzbyB3ZQorICAgICAgICAgICByZWNsYWltIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGFueSByb290IHRocmVhZHMgdGhhdCBoYXZlIGRpZWQgYnV0IG5vdAorICAgICAgICAgICB1bnJlZ2lzdGVyZWQgdGhlbXNlbHZlcywgaW4gb3JkZXIgdG8gc2h1dCBkb3duIGNsZWFubHkuCisgICAgICAgICAgIEluIFdpbiBkeW5hbWljIGxpYnJhcnkgd2UgYWxzbyBjYW4ndCB0ZWxsIHdoZW4gYSB0aHJlYWQgZGllcy4KKyAgICAgICAgKi8KKyAgICAgICAgX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKCk7IC8vIEFDOiBtb3ZlZCBoZXJlIHRvIGFsd2F5cyBjbGVhbiByZXNvdXJjZXMgb2YgZGVhZCByb290cworICAgICNlbmRpZgorCisgICAgZm9yKCBpPTAgOyBpPF9fa21wX3RocmVhZHNfY2FwYWNpdHkgOyBpKysgKQorICAgICAgICBpZiggX19rbXBfcm9vdFtpXSApCisgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtpXS0+ci5yX2FjdGl2ZSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworCisgICAgaWYgKCBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApIHsKKyAgICAgICAgLy8gMjAwOS0wOS0wOCAobGV2KTogT3RoZXIgYWxpdmUgcm9vdHMgZm91bmQuIFdoeSBkbyB3ZSBraWxsIHRoZSBtb25pdG9yPz8KKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTmVlZCB0byBjaGVjayB0aGF0IG1vbml0b3Igd2FzIGluaXRpYWxpemVkIGJlZm9yZSByZWFwaW5nIGl0LgorICAgICAgICAvLyBJZiB3ZSBhcmUgY2FsbGVkIGZvcm0gX19rbXBfYXRmb3JrX2NoaWxkICh3aGljaCBzZXRzCisgICAgICAgIC8vIF9fa21wX2luaXRfcGFyYWxsZWwgPSAwKSwgdGhlbiBfX2ttcF9tb25pdG9yIHdpbGwgYXBwZWFyIHRvCisgICAgICAgIC8vIGNvbnRhaW4gdmFsaWQgZGF0YSwgYnV0IGl0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLAorICAgICAgICAvLyBub3QgdGhlIGNoaWxkLgorICAgICAgICAvLworICAgICAgICAvLyBOZXcgYmVoYXZpb3IgKDIwMTAwOCk6IGluc3RlYWQgb2Yga2V5aW5nIG9mZiBvZiB0aGUgZmxhZworICAgICAgICAvLyBfX2ttcF9pbml0X3BhcmFsbGVsLCB0aGUgbW9uaXRvciB0aHJlYWQgY3JlYXRpb24gaXMga2V5ZWQgb2ZmCisgICAgICAgIC8vIG9mIHRoZSBuZXcgZmxhZyBfX2ttcF9pbml0X21vbml0b3IuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIGlmICggVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yKCAmIF9fa21wX21vbml0b3IgKTsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kOiBtb25pdG9yIHJlYXBlZFxuIiApICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVE9ETyBtb3ZlIHRoaXMgdG8gY2xlYW51cCBjb2RlICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHByb3Blcmx5IGVuZGVkICovCisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtpXSApIHsKKy8vICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAhIEtNUF9VQkVSX0dUSUQoIGkgKSApOyAgICAgICAgIC8vIEFDOiB0aGVyZSBjYW4gYmUgdWJlciB0aHJlYWRzIGFsaXZlIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggISBfX2ttcF9yb290W2ldLT5yLnJfYWN0aXZlICk7ICAvLyBUT0RPOiBjYW4gdGhleSBiZSBhY3RpdmU/CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAvLyBSZWFwIHRoZSB3b3JrZXIgdGhyZWFkcy4KKyAgICAgICAgLy8gVGhpcyBpcyB2YWxpZCBmb3Igbm93LCBidXQgYmUgY2FyZWZ1bCBpZiB0aHJlYWRzIGFyZSByZWFwZWQgc29vbmVyLgorICAgICAgICB3aGlsZSAoIF9fa21wX3RocmVhZF9wb29sICE9IE5VTEwgKSB7ICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHRocmVhZCBpbiB0aGUgcG9vbC4KKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB0aHJlYWQgZnJvbSB0aGUgcG9vbC4KKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSAoa21wX2luZm9fdCAqKSBfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sID0gdGhyZWFkLT50aC50aF9uZXh0X3Bvb2w7CisgICAgICAgICAgICAvLyBSZWFwIGl0LgorICAgICAgICAgICAgdGhyZWFkLT50aC50aF9uZXh0X3Bvb2wgPSBOVUxMOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICBfX2ttcF9yZWFwX3RocmVhZCggdGhyZWFkLCAwICk7CisgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisKKyAgICAgICAgLy8gUmVhcCB0ZWFtcy4KKyAgICAgICAgd2hpbGUgKCBfX2ttcF90ZWFtX3Bvb2wgIT0gTlVMTCApIHsgICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHRlYW1zIGluIHRoZSBwb29sLgorICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHRlYW0gZnJvbSB0aGUgcG9vbC4KKyAgICAgICAgICAgIGttcF90ZWFtX3QgKiB0ZWFtID0gKGttcF90ZWFtX3QgKikgX19rbXBfdGVhbV9wb29sOworICAgICAgICAgICAgX19rbXBfdGVhbV9wb29sID0gdGVhbS0+dC50X25leHRfcG9vbDsKKyAgICAgICAgICAgIC8vIFJlYXAgaXQuCisgICAgICAgICAgICB0ZWFtLT50LnRfbmV4dF9wb29sID0gTlVMTDsKKyAgICAgICAgICAgIF9fa21wX3JlYXBfdGVhbSggdGVhbSApOworICAgICAgICB9OyAvLyB3aGlsZQorCisgICAgICAgIF9fa21wX3JlYXBfdGFza190ZWFtcyggKTsKKworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGkgKSB7CisgICAgICAgICAgICAvLyBUQkQ6IEFkZCBzb21lIGNoZWNraW5nLi4uCisgICAgICAgICAgICAvLyBTb21ldGhpbmcgbGlrZSBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRbIGkgXSA9PSBOVUxMICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBNYWtlIHN1cmUgYWxsIHRocmVhZHByaXZhdGUgZGVzdHJ1Y3RvcnMgZ2V0IHJ1biBieSBqb2luaW5nIHdpdGggYWxsIHdvcmtlcgorICAgICAgICAgICB0aHJlYWRzIGJlZm9yZSByZXNldHRpbmcgdGhpcyBmbGFnICovCisgICAgICAgIFRDV19TWU5DXzQoX19rbXBfaW5pdF9jb21tb24sIEZBTFNFKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kOiBhbGwgd29ya2VycyByZWFwZWRcbiIgKSApOworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAvLworICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogT25lIG9mIHRoZSBwb3NzaWJsZSBmaXhlcyBmb3IgQ1ExMzg0MzQgLyBDUTE0MDEyNgorICAgICAgICAvLworICAgICAgICAvLyBGSVhNRTogcHVzaCBib3RoIGNvZGUgZnJhZ21lbnRzIGRvd24gYW5kIENTRSB0aGVtPworICAgICAgICAvLyBwdXNoIHRoZW0gaW50byBfX2ttcF9jbGVhbnVwKCkgPworICAgICAgICAvLworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBpZiAoIFRDUl80KCBfX2ttcF9pbml0X21vbml0b3IgKSApIHsKKyAgICAgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvciggJiBfX2ttcF9tb25pdG9yICk7CisgICAgICAgICAgICBUQ1dfNCggX19rbXBfaW5pdF9tb25pdG9yLCAwICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZDogbW9uaXRvciByZWFwZWRcbiIgKSApOworCisgICAgfSAvKiBlbHNlICFfX2ttcF9nbG9iYWwudF9hY3RpdmUgKi8KKyAgICBUQ1dfNChfX2ttcF9pbml0X2d0aWQsIEZBTFNFKTsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworCisgICAgX19rbXBfY2xlYW51cCgpOworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfZmluaSgpOworI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCBpbnQgZ3RpZF9yZXEgKQoreworICAgIC8qIGlmIHdlIGhhdmUgYWxyZWFkeSBjbGVhbmVkIHVwLCBkb24ndCB0cnkgYWdhaW4sIGl0IHdvdWxkbid0IGJlIHByZXR0eSAqLworICAgIC8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSBfX2ttcF9pbnRlcm5hbF9lbmQoKSBpcyB0aGUKKyAgICAgKiBvbmx5IHBsYWNlIHRvIGNsZWFyIF9fa21wX3NlcmlhbF9pbml0ICovCisgICAgLyogd2UnbGwgY2hlY2sgdGhpcyBsYXRlciB0b28sIGFmdGVyIHdlIGdldCB0aGUgbG9jayAqLworICAgIC8vIDIwMDktMDktMDY6IFdlIGRvIG5vdCBzZXQgZ19hYm9ydCB3aXRob3V0IHNldHRpbmcgZ19kb25lLiBUaGlzIGNoZWNrIGxvb2tzIHJlZHVuZGFhbnQsCisgICAgLy8gYmVjYXVzZSB0aGUgbmV4dCBjaGVjayB3aWxsIHdvcmsgaW4gYW55IGNhc2UuCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMSwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGFscmVhZHkgZmluaXNoZWRcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogZmluZCBvdXQgd2hvIHdlIGFyZSBhbmQgd2hhdCB3ZSBzaG91bGQgZG8gKi8KKyAgICB7CisgICAgICAgIGludCBndGlkID0gKGd0aWRfcmVxPj0wKSA/IGd0aWRfcmVxIDogX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBlbnRlciBUIyVkICAoJWQpXG4iLCBndGlkLCBndGlkX3JlcSApKTsKKyAgICAgICAgaWYoIGd0aWQgPT0gS01QX0dUSURfU0hVVERPV04gKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6ICFfX2ttcF9pbml0X3J1bnRpbWUsIHN5c3RlbSBhbHJlYWR5IHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIGd0aWQgPT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogbW9uaXRvciB0aHJlYWQsIGd0aWQgbm90IHJlZ2lzdGVyZWQsIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX0RORSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogZ3RpZCBub3QgcmVnaXN0ZXJlZCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICAvKiB3ZSBkb24ndCBrbm93IHdobyB3ZSBhcmUsIGJ1dCB3ZSBtYXkgc3RpbGwgc2h1dGRvd24gdGhlIGxpYnJhcnkgKi8KKyAgICAgICAgfSBlbHNlIGlmKCBLTVBfVUJFUl9HVElEKCBndGlkICkpIHsKKyAgICAgICAgICAgIC8qIHVucmVnaXN0ZXIgb3Vyc2VsdmVzIGFzIGFuIHViZXIgdGhyZWFkLiAgZ3RpZCBpcyBubyBsb25nZXIgdmFsaWQgKi8KKyAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2d0aWRdLT5yLnJfYWN0aXZlICkgeworICAgICAgICAgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSAtMTsKKyAgICAgICAgICAgICAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiByb290IHN0aWxsIGFjdGl2ZSwgYWJvcnQgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogdW5yZWdpc3RlcmluZyBzaWJsaW5nIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkKCBndGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiB3b3JrZXIgdGhyZWFkcyBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uIHRocm91Z2ggdGhlIGF0ZXhpdCBoYW5kbGVyLCBpZiB0aGV5IGNhbGwgZXhpdCgpICovCisgICAgICAgICAgICAvKiBGb3Igbm93LCBza2lwIHRoZSB1c3VhbCBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgYW5kIGp1c3QgZHVtcCB0aGUgZGVidWcgYnVmZmVyLgorICAgICAgICAgICAgICAgVE9ETzogZG8gYSB0aG9yb3VnaCBzaHV0ZG93biBpbnN0ZWFkCisgICAgICAgICAgICAqLworICAgICAgICAgICAgI2lmZGVmIERVTVBfREVCVUdfT05fRVhJVAorICAgICAgICAgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzeW5jaHJvbml6ZSB0aGUgdGVybWluYXRpb24gcHJvY2VzcyAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICAvKiBoYXZlIHdlIGFscmVhZHkgZmluaXNoZWQgKi8KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRoaXMgbG9jayB0byBlbmZvcmNlIG11dGV4IGJldHdlZW4gdGhpcyByZWFkaW5nIG9mCisgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSBhbmQgdGhlIHdyaXRpbmcgYnkgX19rbXBfcmVnaXN0ZXJfcm9vdC4KKyAgICAgICBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gdXNlIGEgY291bnRlciBvZiByb290cyB0aGF0IGlzCisgICAgICAgYXRvbWljYWxseSB1cGRhdGVkIGJ5IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZywKKyAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSBhbmQgX19rbXBfaW50ZXJuYWxfZW5kXyouCisgICAgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgLyogbm93IHdlIGNhbiBzYWZlbHkgY29uZHVjdCB0aGUgYWN0dWFsIHRlcm1pbmF0aW9uICovCisgICAgX19rbXBfaW50ZXJuYWxfZW5kKCk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGV4aXRcbiIgKSApOworCisgICAgI2lmZGVmIERVTVBfREVCVUdfT05fRVhJVAorICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApCisgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworICAgICNlbmRpZgorCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX2ZpbmlfYWxsb2NhdG9yKCk7CisKK30gLy8gX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkKKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggaW50IGd0aWRfcmVxICkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIGlmIHdlIGhhdmUgYWxyZWFkeSBjbGVhbmVkIHVwLCBkb24ndCB0cnkgYWdhaW4sIGl0IHdvdWxkbid0IGJlIHByZXR0eSAqLworICAgIC8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSBfX2ttcF9pbnRlcm5hbF9lbmQoKSBpcyB0aGUKKyAgICAgKiBvbmx5IHBsYWNlIHRvIGNsZWFyIF9fa21wX3NlcmlhbF9pbml0ICovCisgICAgLyogd2UnbGwgY2hlY2sgdGhpcyBsYXRlciB0b28sIGFmdGVyIHdlIGdldCB0aGUgbG9jayAqLworICAgIC8vIDIwMDktMDktMDY6IFdlIGRvIG5vdCBzZXQgZ19hYm9ydCB3aXRob3V0IHNldHRpbmcgZ19kb25lLiBUaGlzIGNoZWNrIGxvb2tzIHJlZHVuZGFudCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXh0IGNoZWNrIHdpbGwgd29yayBpbiBhbnkgY2FzZS4KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDExLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGFib3J0LCBleGl0aW5nXG4iICkpOworICAgICAgICAvKiBUT0RPIGFib3J0PyAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGFscmVhZHkgZmluaXNoZWRcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIGZpbmQgb3V0IHdobyB3ZSBhcmUgYW5kIHdoYXQgd2Ugc2hvdWxkIGRvICovCisgICAgeworICAgICAgICBpbnQgZ3RpZCA9IChndGlkX3JlcT49MCkgPyBndGlkX3JlcSA6IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBlbnRlciBUIyVkICAoJWQpXG4iLCBndGlkLCBndGlkX3JlcSApKTsKKyAgICAgICAgaWYoIGd0aWQgPT0gS01QX0dUSURfU0hVVERPV04gKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogIV9fa21wX2luaXRfcnVudGltZSwgc3lzdGVtIGFscmVhZHkgc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IG1vbml0b3IgdGhyZWFkLCBndGlkIG5vdCByZWdpc3RlcmVkLCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9ETkUgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZ3RpZCBub3QgcmVnaXN0ZXJlZCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAvKiB3ZSBkb24ndCBrbm93IHdobyB3ZSBhcmUgKi8KKyAgICAgICAgfSBlbHNlIGlmKCBLTVBfVUJFUl9HVElEKCBndGlkICkpIHsKKyAgICAgICAgLyogdW5yZWdpc3RlciBvdXJzZWx2ZXMgYXMgYW4gdWJlciB0aHJlYWQuICBndGlkIGlzIG5vIGxvbmdlciB2YWxpZCAqLworICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0tPnIucl9hY3RpdmUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IC0xOworICAgICAgICAgICAgICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogcm9vdCBzdGlsbCBhY3RpdmUsIGFib3J0IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogdW5yZWdpc3RlcmluZyBzaWJsaW5nIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkKCBndGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBqdXN0IGEgd29ya2VyIHRocmVhZCwgbGV0J3MgbGVhdmUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB3b3JrZXIgdGhyZWFkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICAgICAgICAgIGlmICggZ3RpZCA+PSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB3b3JrZXIgdGhyZWFkIGRvbmUsIGV4aXRpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAjaWYgZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyAgICAvLyBBQzogbGV0cyBub3Qgc2h1dGRvd24gdGhlIExpbnV4KiBPUyBkeW5hbWljIGxpYnJhcnkgYXQgdGhlIGV4aXQgb2YgdWJlciB0aHJlYWQsCisgICAgLy8gICAgIGJlY2F1c2Ugd2Ugd2lsbCBiZXR0ZXIgc2h1dGRvd24gbGF0ZXIgaW4gdGhlIGxpYnJhcnkgZGVzdHJ1Y3Rvci4KKyAgICAvLyAgICAgVGhlIHJlYXNvbiBvZiB0aGlzIGNoYW5nZSBpcyBwZXJmb3JtYW5jZSBwcm9ibGVtIHdoZW4gbm9uLW9wZW5tcCB0aHJlYWQKKyAgICAvLyAgICAgaW4gYSBsb29wIGZvcmtzIGFuZCBqb2lucyBtYW55IG9wZW5tcCB0aHJlYWRzLiBXZSBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lCisgICAgLy8gICAgIGtlZXBpbmcgd29ya2VyIHRocmVhZHMgYWxpdmUgdW50aWwgdGhlIHByb2dyYW0gc2h1dGRvd24uCisgICAgLy8gT006IFJlbW92ZWQgTGludXgqIE9TIHJlc3RyaWN0aW9uIHRvIGZpeCB0aGUgY3Jhc2ggb24gT1MgWCogKERQRDIwMDIzOTk2NikgYW5kCisgICAgLy8gICAgIFdpbmRvd3MoRFBEMjAwMjg3NDQzKSB0aGF0IG9jY3VycyB3aGVuIHVzaW5nIGNyaXRpY2FsIHNlY3Rpb25zIGZyb20gZm9yZWlnbiB0aHJlYWRzLgorICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZXhpdGluZyBUIyVkXG4iLCBndGlkX3JlcSkgKTsKKyAgICAgICAgcmV0dXJuOworICAgICNlbmRpZgorICAgIC8qIHN5bmNocm9uaXplIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIC8qIGhhdmUgd2UgYWxyZWFkeSBmaW5pc2hlZCAqLworICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogV2UgbmVlZCB0aGlzIGxvY2sgdG8gZW5mb3JjZSBtdXRleCBiZXR3ZWVuIHRoaXMgcmVhZGluZyBvZgorICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgYW5kIHRoZSB3cml0aW5nIGJ5IF9fa21wX3JlZ2lzdGVyX3Jvb3QuCisgICAgICAgQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHVzZSBhIGNvdW50ZXIgb2Ygcm9vdHMgdGhhdCBpcworICAgICAgIGF0b21pY2FsbHkgdXBkYXRlZCBieSBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcsCisgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgYW5kIF9fa21wX2ludGVybmFsX2VuZF8qLgorICAgICovCisKKyAgICAvKiBzaG91bGQgd2UgZmluaXNoIHRoZSBydW4tdGltZT8gIGFyZSBhbGwgc2libGluZ3MgZG9uZT8gKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBpICkgeworICAgICAgICBpZiAoIEtNUF9VQkVSX0dUSUQoIGkgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiByZW1haW5pbmcgc2libGluZyB0YXNrOiBndGlkPT0lZFxuIiwgaSApKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9OworICAgIH0KKworICAgIC8qIG5vdyB3ZSBjYW4gc2FmZWx5IGNvbmR1Y3QgdGhlIGFjdHVhbCB0ZXJtaW5hdGlvbiAqLworCisgICAgX19rbXBfaW50ZXJuYWxfZW5kKCk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZXhpdCBUIyVkXG4iLCBndGlkX3JlcSApICk7CisKKyAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgI2VuZGlmCit9IC8vIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlicmFyeSByZWdpc3RyYXRpb24gc3R1ZmYuCisKK3N0YXRpYyBsb25nICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAwOworICAgIC8vIFJhbmRvbSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24uCitzdGF0aWMgY2hhciAqIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgID0gTlVMTDsKKyAgICAvLyBWYWx1ZSB0byBiZSBzYXZlZCBpbiBlbnYgdmFyIF9fS01QX1JFR0lTVEVSRURfTElCXzxwaWQ+LgorCisKK3N0YXRpYyBpbmxpbmUKK2NoYXIgKgorX19rbXBfcmVnX3N0YXR1c19uYW1lKCkgeworICAgIC8qCisgICAgICAgIE9uIFJIRUwgM3U1IGlmIGxpbmtlZCBzdGF0aWNhbGx5LCBnZXRwaWQoKSByZXR1cm5zIGRpZmZlcmVudCB2YWx1ZXMgaW4gZWFjaCB0aHJlYWQuCisgICAgICAgIElmIHJlZ2lzdHJhdGlvbiBhbmQgdW5yZWdpc3RyYXRpb24gZ28gaW4gZGlmZmVyZW50IHRocmVhZHMgKG9tcF9taXNjX290aGVyX3Jvb3RfZXhpdC5jcHAgdGVzdCBjYXNlKSwKKyAgICAgICAgdGhlIG5hbWUgb2YgcmVnaXN0ZXJlZF9saWJfZW52IGVudiB2YXIgY2FuIG5vdCBiZSBmb3VuZCwgYmVjYXVzZSB0aGUgbmFtZSB3aWxsIGNvbnRhaW4gZGlmZmVyZW50IHBpZC4KKyAgICAqLworICAgIHJldHVybiBfX2ttcF9zdHJfZm9ybWF0KCAiX19LTVBfUkVHSVNURVJFRF9MSUJfJWQiLCAoaW50KSBnZXRwaWQoKSApOworfSAvLyBfX2ttcF9yZWdfc3RhdHVzX2dldAorCisKK3ZvaWQKK19fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cCgKKyAgICB2b2lkCispIHsKKworICAgIGNoYXIgKiBuYW1lICAgPSBfX2ttcF9yZWdfc3RhdHVzX25hbWUoKTsgIC8vIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgIGludCAgICBkb25lICAgPSAwOworICAgIHVuaW9uIHsKKyAgICAgICAgZG91YmxlIGR0aW1lOworICAgICAgICBsb25nICAgbHRpbWU7CisgICAgfSB0aW1lOworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCk7CisgICAgI2VuZGlmCisgICAgX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggJiB0aW1lLmR0aW1lICk7CisgICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAweENBRkUwMDAwTCB8ICggdGltZS5sdGltZSAmIDB4MDAwMEZGRkZMICk7CisgICAgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciA9CisgICAgICAgIF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiJXAtJWx4LSVzIiwKKyAgICAgICAgICAgICYgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcsCisgICAgICAgICAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZywKKyAgICAgICAgICAgIEtNUF9MSUJSQVJZX0ZJTEUKKyAgICAgICAgKTsKKworICAgIEtBX1RSQUNFKCA1MCwgKCAiX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwOiAlcz1cIiVzXCJcbiIsIG5hbWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKSApOworCisgICAgd2hpbGUgKCAhIGRvbmUgKSB7CisKKyAgICAgICAgY2hhciAqIHZhbHVlICA9IE5VTEw7IC8vIEFjdHVhbCB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyAgICAgICAgLy8gU2V0IGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgZG8gbm90IG92ZXJ3cml0ZSBpZiBpdCBpcyBleGlzdC4KKyAgICAgICAgX19rbXBfZW52X3NldCggbmFtZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciwgMCApOworICAgICAgICAvLyBDaGVjayB0aGUgdmFyaWFibGUgaXMgd3JpdHRlbi4KKyAgICAgICAgdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCBuYW1lICk7CisgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCAmJiBzdHJjbXAoIHZhbHVlLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICkgPT0gMCApIHsKKworICAgICAgICAgICAgZG9uZSA9IDE7ICAgIC8vIE9rLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgc3VjY2Vzc2Z1bGx5LCBleGl0IHRoZSBsb29wLgorCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIE9vcHMuIFdyaXRlIGZhaWxlZC4gQW5vdGhlciBjb3B5IG9mIE9wZW5NUCBSVEwgaXMgaW4gbWVtb3J5LgorICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBpdCBhbGl2ZSBvciBkZWFkLgorICAgICAgICAgICAgaW50ICAgIG5laWdoYm9yID0gMDsgLy8gMCAtLSB1bmtub3duIHN0YXR1cywgMSAtLSBhbGl2ZSwgMiAtLSBkZWFkLgorICAgICAgICAgICAgY2hhciAqIHRhaWwgICAgICAgICAgPSB2YWx1ZTsKKyAgICAgICAgICAgIGNoYXIgKiBmbGFnX2FkZHJfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgKiBmbGFnX3ZhbF9zdHIgID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBmaWxlX25hbWUgICAgID0gTlVMTDsKKyAgICAgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJy0nLCAmIGZsYWdfYWRkcl9zdHIsICYgdGFpbCApOworICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnLScsICYgZmxhZ192YWxfc3RyLCAgJiB0YWlsICk7CisgICAgICAgICAgICBmaWxlX25hbWUgPSB0YWlsOworICAgICAgICAgICAgaWYgKCB0YWlsICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgbG9uZyAqIGZsYWdfYWRkciA9IDA7CisgICAgICAgICAgICAgICAgbG9uZyAgIGZsYWdfdmFsICA9IDA7CisgICAgICAgICAgICAgICAgS01QX1NTQ0FORiggZmxhZ19hZGRyX3N0ciwgIiVwIiwgICYgZmxhZ19hZGRyICk7CisgICAgICAgICAgICAgICAgS01QX1NTQ0FORiggZmxhZ192YWxfc3RyLCAgIiVseCIsICYgZmxhZ192YWwgICk7CisgICAgICAgICAgICAgICAgaWYgKCBmbGFnX2FkZHIgIT0gMCAmJiBmbGFnX3ZhbCAhPSAwICYmIHN0cmNtcCggZmlsZV9uYW1lLCAiIiApICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBjaGVjayB3aGV0aGVyIGVudmlyb25tZW50LWVuY29kZWQgYWRkcmVzcyBpcyBtYXBwZWQgaW50byBhZGRyIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgZGVyZWZlcmVuY2UgaXQgdG8gc2VlIGlmIGl0IHN0aWxsIGhhcyB0aGUgcmlnaHQgdmFsdWUuCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggZmxhZ19hZGRyICkgJiYgKiBmbGFnX2FkZHIgPT0gZmxhZ192YWwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZWlnaGJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHRoZW4gd2Uga25vdyB0aGUgb3RoZXIgY29weSBvZiB0aGUgbGlicmFyeSBpcyBubyBsb25nZXIgcnVubmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHN3aXRjaCAoIG5laWdoYm9yICkgeworICAgICAgICAgICAgICAgIGNhc2UgMCA6ICAgICAgLy8gQ2Fubm90IHBhcnNlIGVudmlyb25tZW50IHZhcmlhYmxlIC0tIG5laWdoYm9yIHN0YXR1cyB1bmtub3duLgorICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgaXQgaXMgdGhlIGluY29tcGF0aWJsZSBmb3JtYXQgb2YgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgb3RoZXIgbGlicmFyeSBpcyBhbGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV0FSTiggLi4uICk7IC8vIFRPRE86IElzc3VlIGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lID0gInVua25vd24gbGlicmFyeSI7CisgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVudGlvbiEgRmFsbGluZyB0byB0aGUgbmV4dCBjYXNlLiBUaGF0J3MgaW50ZW50aW9uYWwuCisgICAgICAgICAgICAgICAgY2FzZSAxIDogeyAgICAvLyBOZWlnaGJvciBpcyBhbGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaXQgaXMgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICAgICAgY2hhciAqIGR1cGxpY2F0ZV9vayA9IF9fa21wX2Vudl9nZXQoICJLTVBfRFVQTElDQVRFX0xJQl9PSyIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhIF9fa21wX3N0cl9tYXRjaF90cnVlKCBkdXBsaWNhdGVfb2sgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoYXQncyBub3QgYWxsb3dlZC4gSXNzdWUgZmF0YWwgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIER1cGxpY2F0ZUxpYnJhcnksIEtNUF9MSUJSQVJZX0ZJTEUsIGZpbGVfbmFtZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIER1cGxpY2F0ZUxpYnJhcnkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGR1cGxpY2F0ZV9vayApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayA9IDE7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAxOyAgICAvLyBFeGl0IHRoZSBsb29wLgorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDogeyAgICAvLyBOZWlnaGJvciBpcyBkZWFkLgorICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgdmFyaWFibGUgYW5kIHRyeSB0byByZWdpc3RlciBsaWJyYXJ5IGFnYWluLgorICAgICAgICAgICAgICAgICAgICBfX2ttcF9lbnZfdW5zZXQoIG5hbWUgKTsKKyAgICAgICAgICAgICAgICB9ICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH07IC8vIHN3aXRjaAorCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB2YWx1ZSApOworCisgICAgfTsgLy8gd2hpbGUKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgbmFtZSApOworCit9IC8vIGZ1bmMgX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwCisKKwordm9pZAorX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5KCB2b2lkICkgeworCisgICAgY2hhciAqIG5hbWUgID0gX19rbXBfcmVnX3N0YXR1c19uYW1lKCk7CisgICAgY2hhciAqIHZhbHVlID0gX19rbXBfZW52X2dldCggbmFtZSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgIT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgICE9IE5VTEwgKTsKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgJiYgc3RyY21wKCB2YWx1ZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApID09IDAgKSB7CisgICAgICAgIC8vIE9rLCB0aGlzIGlzIG91ciB2YXJpYWJsZS4gRGVsZXRlIGl0LgorICAgICAgICBfX2ttcF9lbnZfdW5zZXQoIG5hbWUgKTsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggdmFsdWUgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggbmFtZSApOworCisgICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAwOworICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgID0gTlVMTDsKKworfSAvLyBfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkKKworCisvLyBFbmQgb2YgTGlicmFyeSByZWdpc3RyYXRpb24gc3R1ZmYuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKworc3RhdGljIHZvaWQgX19rbXBfY2hlY2tfbWljX3R5cGUoKQoreworICAgIGttcF9jcHVpZF90IGNwdWlkX3N0YXRlID0gezB9OworICAgIGttcF9jcHVpZF90ICogY3NfcCA9ICZjcHVpZF9zdGF0ZTsKKyAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgY3NfcCk7CisgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBtaWMxIGF0IHRoZSBtb21lbnQKKyAgICBpZiggKGNzX3AtPmVheCAmIDB4ZmYwKSA9PSAweEIxMCApIHsKKyAgICAgICAgX19rbXBfbWljX3R5cGUgPSBtaWMyOworICAgIH0gZWxzZSBpZiggKGNzX3AtPmVheCAmIDB4ZjBmZjApID09IDB4NTA2NzAgKSB7CisgICAgICAgIF9fa21wX21pY190eXBlID0gbWljMzsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9taWNfdHlwZSA9IG5vbl9taWM7CisgICAgfQorfQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IGksIGd0aWQ7CisgICAgaW50IHNpemU7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemU6IGVudGVyXG4iICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX2ludDMyICkgPT0gNCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX3VpbnQzMiApID09IDQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF9pbnQ2NCApID09IDggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF91aW50NjQgKSA9PSA4ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfaW50cHRyX3QgKSA9PSBzaXplb2YoIHZvaWQgKiApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3ByZV9pbml0KCk7CisjZW5kaWYKKworICAgIF9fa21wX3ZhbGlkYXRlX2xvY2tzKCk7CisKKyAgICAvKiBJbml0aWFsaXplIGludGVybmFsIG1lbW9yeSBhbGxvY2F0b3IgKi8KKyAgICBfX2ttcF9pbml0X2FsbG9jYXRvcigpOworCisgICAgLyogUmVnaXN0ZXIgdGhlIGxpYnJhcnkgc3RhcnR1cCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICBhbmQgY2hlY2sgdG8gc2VlIHdoZXRoZXIgYW5vdGhlciBjb3B5IG9mIHRoZSBsaWJyYXJ5IGlzIGFscmVhZHkKKyAgICAgICByZWdpc3RlcmVkLiAqLworCisgICAgX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKCApOworCisgICAgLyogVE9ETyByZWluaXRpYWxpemF0aW9uIG9mIGxpYnJhcnkgKi8KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemU6IHJlaW5pdGlhbGl6YXRpb24gb2YgbGlicmFyeVxuIiApICk7CisgICAgfQorCisgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IDA7CisgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIEZBTFNFKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGxvY2tzICovCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIF9fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgICBfX2ttcF9pbml0X3Rhc19sb2NrKCAmIF9fa21wX3N0YXRzX2xvY2sgKTsKKyNlbmRpZgorICAgIF9fa21wX2luaXRfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jayAgICAgKTsKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggJiBfX2ttcF9kaXNwYXRjaF9sb2NrICk7CisgICAgX19rbXBfaW5pdF9sb2NrKCAmIF9fa21wX2RlYnVnX2xvY2sgICAgICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2sgICAgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfNGkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180ciAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOHIgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184YyAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzEwciApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTZyICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYyApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF9mb3Jram9pbl9sb2NrICApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfZXhpdF9sb2NrICAgICAgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayAgICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF90cF9jYWNoZWRfbG9jayApOworCisgICAgLyogY29uZHVjdCBpbml0aWFsaXphdGlvbiBhbmQgaW5pdGlhbCBzZXR1cCBvZiBjb25maWd1cmF0aW9uICovCisKKyAgICBfX2ttcF9ydW50aW1lX2luaXRpYWxpemUoKTsKKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgIF9fa21wX2NoZWNrX21pY190eXBlKCk7CisjZW5kaWYKKworICAgIC8vIFNvbWUgZ2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIG1vdmVkIGhlcmUgZnJvbSBrbXBfZW52X2luaXRpYWxpemUoKQorI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9kaWFnID0gMDsKKyNlbmRpZgorICAgIF9fa21wX2Fib3J0X2RlbGF5ID0gMDsKKworICAgIC8vIEZyb20gX19rbXBfaW5pdF9kZmx0X3RlYW1fbnRoKCkKKyAgICAvKiBhc3N1bWUgdGhlIGVudGlyZSBtYWNoaW5lIHdpbGwgYmUgdXNlZCAqLworICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF94cHJvYzsKKyAgICBpZiggX19rbXBfZGZsdF90ZWFtX250aF91YiA8IEtNUF9NSU5fTlRIICkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gS01QX01JTl9OVEg7CisgICAgfQorICAgIGlmKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID4gX19rbXBfc3lzX21heF9udGggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF9zeXNfbWF4X250aDsKKyAgICB9CisgICAgX19rbXBfbWF4X250aCA9IF9fa21wX3N5c19tYXhfbnRoOworCisgICAgLy8gVGhyZWUgdmFycyBiZWxvdyBtb3ZlZCBoZXJlIGZyb20gX19rbXBfZW52X2luaXRpYWxpemUoKSAiS01QX0JMT0NLVElNRSIgcGFydAorICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX0RFRkFVTFRfQkxPQ0tUSU1FOworICAgIF9fa21wX21vbml0b3Jfd2FrZXVwcyA9IEtNUF9XQUtFVVBTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgX19rbXBfYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRSggX19rbXBfZGZsdF9ibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOworICAgIC8vIEZyb20gIktNUF9MSUJSQVJZIiBwYXJ0IG9mIF9fa21wX2Vudl9pbml0aWFsaXplKCkKKyAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgIC8vIEZyb20gS01QX1NDSEVEVUxFIGluaXRpYWxpemF0aW9uCisgICAgX19rbXBfc3RhdGljID0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ7CisgICAgLy8gQUM6IGRvIG5vdCB1c2UgYW5hbHl0aWNhbCBoZXJlLCBiZWNhdXNlIGl0IGlzIG5vbi1tb25vdG9ub3VzCisgICAgLy9fX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAvL19fa21wX2F1dG8gPSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ7IC8vIEFDOiBpdCBpcyB0aGUgZGVmYXVsdCwgbm8gbmVlZCB0byByZXBlYXRlIGFzc2lnbm1lbnQKKyAgICAvLyBCYXJyaWVyIGluaXRpYWxpemF0aW9uLiBNb3ZlZCBoZXJlIGZyb20gX19rbXBfZW52X2luaXRpYWxpemUoKSBCYXJyaWVyIGJyYW5jaCBiaXQgY29udHJvbCBhbmQgYmFycmllciBtZXRob2QKKyAgICAvLyBjb250cm9sIHBhcnRzCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYiAoKGludCkxKQorICAgICAgICAjZGVmaW5lIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX2JiICgoaW50KTEpCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9wYXQgYnBfaHlwZXJfYmFyCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0IGJwX2h5cGVyX2JhcgorICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIGZvciAoIGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBpIF0gPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0OworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuIFsgaSBdID0gX19rbXBfYmFycmllcl9nYXRoZXJfcGF0X2RmbHQ7CisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBpIF0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQ7CisgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICBpZiggaSA9PSBic19yZWR1Y3Rpb25fYmFycmllciApIHsgLy8gdGVzdGVkIGFuZCBjb25maXJtZWQgb24gQUxUSVggb25seSAoIGxpbl82NCApOiBoeXBlciwxCisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfYmI7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX2JiOworICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGkgXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfcGF0OworICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX3BhdDsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICB9CisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9wYXQKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfcGF0CisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9iYgorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYgorICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgIGlmIChfX2ttcF9taWNfdHlwZSA9PSBtaWMyKSB7IC8vIEtOQworICAgICAgICAvLyBBQzogcGxhbmU9MywyLCBmb3Jram9pbj0yLDEgYXJlIG9wdGltYWwgZm9yIDI0MCB0aHJlYWRzIG9uIEtOQworICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGJzX3BsYWluX2JhcnJpZXIgXSA9IDM7ICAvLyBwbGFpbiBnYXRoZXIKKyAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPSAxOyAgLy8gZm9ya2pvaW4gcmVsZWFzZQorICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuIFsgYnNfZm9ya2pvaW5fYmFycmllciBdID0gYnBfaGllcmFyY2hpY2FsX2JhcjsKKyAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGJzX2Zvcmtqb2luX2JhcnJpZXIgXSA9IGJwX2hpZXJhcmNoaWNhbF9iYXI7CisgICAgfQorI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgaWYgKF9fa21wX21pY190eXBlID09IG1pYzIpIHsgLy8gS05DCisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBic19yZWR1Y3Rpb25fYmFycmllciBdID0gYnBfaGllcmFyY2hpY2FsX2JhcjsKKyAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGJzX3JlZHVjdGlvbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgICAvLyBGcm9tIEtNUF9DSEVDS1MgaW5pdGlhbGl6YXRpb24KKyNpZmRlZiBLTVBfREVCVUcKKyAgICBfX2ttcF9lbnZfY2hlY2tzID0gVFJVRTsgICAvKiBkZXZlbG9wbWVudCB2ZXJzaW9ucyBoYXZlIHRoZSBleHRyYSBjaGVja3MgKi8KKyNlbHNlCisgICAgX19rbXBfZW52X2NoZWNrcyA9IEZBTFNFOyAgLyogcG9ydCB2ZXJzaW9ucyBkbyBub3QgaGF2ZSB0aGUgZXh0cmEgY2hlY2tzICovCisjZW5kaWYKKworICAgIC8vIEZyb20gIktNUF9GT1JFSUdOX1RIUkVBRFNfVEhSRUFEUFJJVkFURSIgaW5pdGlhbGl6YXRpb24KKyAgICBfX2ttcF9mb3JlaWduX3RwID0gVFJVRTsKKworICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyA9IEZBTFNFOworICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19kZWZhdWx0OworCisgICAgX19rbXBfZW52X2luaXRpYWxpemUoIE5VTEwgKTsKKworICAgIC8vIFByaW50IGFsbCBtZXNzYWdlcyBpbiBtZXNzYWdlIGNhdGFsb2cgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBjaGFyIGNvbnN0ICogdmFsID0gX19rbXBfZW52X2dldCggIktNUF9EVU1QX0NBVEFMT0ciICk7CisgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoX3RydWUoIHZhbCApICkgeworICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisgICAgICAgICAgICBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZyggJiBidWZmZXIgKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9lbnZfZnJlZSggJiB2YWwgKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICAvLyBNb3ZlZCBoZXJlIGZyb20gX19rbXBfZW52X2luaXRpYWxpemUoKSAiS01QX0FMTF9USFJFQURQUklWQVRFIiBwYXJ0CisgICAgX19rbXBfdHBfY2FwYWNpdHkgPSBfX2ttcF9kZWZhdWx0X3RwX2NhcGFjaXR5KF9fa21wX2RmbHRfdGVhbV9udGhfdWIsIF9fa21wX21heF9udGgsIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQpOworCisgICAgLy8gSWYgdGhlIGxpYnJhcnkgaXMgc2h1dCBkb3duIHByb3Blcmx5LCBib3RoIHBvb2xzIG11c3QgYmUgTlVMTC4gSnVzdCBpbiBjYXNlLCBzZXQgdGhlbQorICAgIC8vIHRvIE5VTEwgLS0gc29tZSBtZW1vcnkgbWF5IGxlYWssIGJ1dCBzdWJzZXF1ZW50IGNvZGUgd2lsbCB3b3JrIGV2ZW4gaWYgcG9vbHMgYXJlIG5vdCBmcmVlZC4KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbCA9PSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID09IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90ZWFtX3Bvb2wgICA9PSBOVUxMICk7CisgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSBOVUxMOworICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisgICAgX19rbXBfdGVhbV9wb29sICAgPSBOVUxMOworCisgICAgLyogQWxsb2NhdGUgYWxsIG9mIHRoZSB2YXJpYWJsZSBzaXplZCByZWNvcmRzICovCisgICAgLyogTk9URTogX19rbXBfdGhyZWFkc19jYXBhY2l0eSBlbnRyaWVzIGFyZSBhbGxvY2F0ZWQsIGJ1dCB0aGUgYXJyYXlzIGFyZSBleHBhbmRhYmxlICovCisgICAgLyogU2luY2UgYWxsb2NhdGlvbiBpcyBjYWNoZS1hbGlnbmVkLCBqdXN0IGFkZCBleHRyYSBwYWRkaW5nIGF0IHRoZSBlbmQgKi8KKyAgICBzaXplID0gKHNpemVvZihrbXBfaW5mb190KikgKyBzaXplb2Yoa21wX3Jvb3RfdCopKSpfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICsgQ0FDSEVfTElORTsKKyAgICBfX2ttcF90aHJlYWRzID0gKGttcF9pbmZvX3QqKikgX19rbXBfYWxsb2NhdGUoIHNpemUgKTsKKyAgICBfX2ttcF9yb290ICAgID0gKGttcF9yb290X3QqKikgKChjaGFyKilfX2ttcF90aHJlYWRzICsgc2l6ZW9mKGttcF9pbmZvX3QqKSAqIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8qIGluaXQgdGhyZWFkIGNvdW50cyAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FsbF9udGggPT0gMCApOyAvLyBBc3NlcnRzIGZhaWwgaWYgdGhlIGxpYnJhcnkgaXMgcmVpbml0aWFsaXppbmcgYW5kCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfbnRoID09IDAgKTsgICAgIC8vIHNvbWV0aGluZyB3YXMgd3JvbmcgaW4gdGVybWluYXRpb24uCisgICAgX19rbXBfYWxsX250aCA9IDA7CisgICAgX19rbXBfbnRoICAgICA9IDA7CisKKyAgICAvKiBzZXR1cCB0aGUgdWJlciBtYXN0ZXIgdGhyZWFkIGFuZCBoaWVyYXJjaHkgKi8KKyAgICBndGlkID0gX19rbXBfcmVnaXN0ZXJfcm9vdCggVFJVRSApOworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSAgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkgKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfSU5JVElBTF9HVElEKCBndGlkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgX19rbXBfY29tbW9uX2luaXRpYWxpemUoKTsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICAvKiBpbnZva2UgdGhlIGNoaWxkIGZvcmsgaGFuZGxlciAqLworICAgICAgICBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsoKTsKKyAgICAjZW5kaWYKKworICAgICNpZiAhIGRlZmluZWQgS01QX0RZTkFNSUNfTElCCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEludm9rZSB0aGUgZXhpdCBoYW5kbGVyIHdoZW4gdGhlIHByb2dyYW0gZmluaXNoZXMsIG9ubHkgZm9yIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgICAgICAgICAgRm9yIGR5bmFtaWMgbGlicmFyeSwgd2UgYWxyZWFkeSBoYXZlIF9maW5pIGFuZCBEbGxNYWluLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgcmMgPSBhdGV4aXQoIF9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQgKTsKKyAgICAgICAgICAgIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgS01QX01TRyggRnVuY3Rpb25FcnJvciwgImF0ZXhpdCgpIiApLCBLTVBfRVJSKCByYyApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorICAgICNlbmRpZgorCisgICAgI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgICAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgICAgIC8qIE5PVEU6IG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgdXNlciBpbnN0YWxscworICAgICAgICAgICAgICogICAgICAgICAgdGhlaXIgb3duIHNpZ25hbCBoYW5kbGVycyBzbyB0aGF0IHRoZSB1c2VyIGhhbmRsZXJzCisgICAgICAgICAgICAgKiAgICAgICAgICBhcmUgY2FsbGVkIGZpcnN0LiAgdGhpcyB3YXkgdGhleSBjYW4gcmV0dXJuIGZhbHNlLAorICAgICAgICAgICAgICogICAgICAgICAgbm90IGNhbGwgb3VyIGhhbmRsZXIsIGF2b2lkIHRlcm1pbmF0aW5nIHRoZSBsaWJyYXJ5LAorICAgICAgICAgICAgICogICAgICAgICAgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiB3aGVyZSB0aGV5IGxlZnQgb2ZmLiAqLworICAgICAgICAgICAgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBGQUxTRSApOworICAgICAgICAjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIFRSVUUgKTsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgI2VuZGlmCisKKyAgICAvKiB3ZSBoYXZlIGZpbmlzaGVkIHRoZSBzZXJpYWwgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBfX2ttcF9pbml0X2NvdW50ZXIgKys7CisKKyAgICBfX2ttcF9pbml0X3NlcmlhbCA9IFRSVUU7CisKKyAgICBpZiAoX19rbXBfc2V0dGluZ3MpIHsKKyAgICAgICAgX19rbXBfZW52X3ByaW50KCk7CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoX19rbXBfZGlzcGxheV9lbnYgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSkgeworICAgICAgICBfX2ttcF9lbnZfcHJpbnRfMigpOworICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF9wb3N0X2luaXQoKTsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemU6IGV4aXRcbiIgKSApOworfQorCit2b2lkCitfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIGlmICggX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBpLCBqOworICAgIGludCBwcmV2X2RmbHRfdGVhbV9udGg7CisKKyAgICBpZiggIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogZW50ZXJcbiIgKSApOworCisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIF9fa21wX2RmbHRfdGVhbV9udGggc28gdGhhdAorICAgIC8vIHdlIGNhbiBhdm9pZCBzb21lIHJlaW5pdGlhbGl6YXRpb24gaWYgaXQgaGFzbid0IGNoYW5nZWQuCisgICAgLy8KKyAgICBwcmV2X2RmbHRfdGVhbV9udGggPSBfX2ttcF9kZmx0X3RlYW1fbnRoOworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIC8vCisgICAgLy8gX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSgpIHdpbGwgdHJ5IHRvIHNldCBfX2ttcF9uY29yZXMgdG8gdGhlCisgICAgLy8gbnVtYmVyIG9mIGNvcmVzIG9uIHRoZSBtYWNoaW5lLgorICAgIC8vCisgICAgX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSgpOworCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCB0aGUgX19rbXBfdGhyZWFkcyBhcnJheSBhbmQgc2V0IHRoZSBhZmZpbml0eSBtYXNrCisgICAgLy8gZm9yIGVhY2ggcm9vdCB0aHJlYWQgdGhhdCBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBSVEwuCisgICAgLy8KKyAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKyApIHsKKyAgICAgICAgaWYgKCBUQ1JfUFRSKCBfX2ttcF90aHJlYWRzWyBpIF0gKSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayggaSwgVFJVRSApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIEtNUF9BU1NFUlQoIF9fa21wX3hwcm9jID4gMCApOworICAgIGlmICggX19rbXBfYXZhaWxfcHJvYyA9PSAwICkgeworICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gX19rbXBfeHByb2M7CisgICAgfQorCisgICAgLy8gSWYgdGhlcmUgd2VyZSBlbXB0eSBwbGFjZXMgaW4gbnVtX3RocmVhZHMgbGlzdCAoT01QX05VTV9USFJFQURTPSwsMiwzKSwgY29ycmVjdCB0aGVtIG5vdworICAgIGogPSAwOworICAgIHdoaWxlICggKCBqIDwgX19rbXBfbmVzdGVkX250aC51c2VkICkgJiYgISBfX2ttcF9uZXN0ZWRfbnRoLm50aFsgaiBdICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aFsgaiBdID0gX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF9hdmFpbF9wcm9jOworICAgICAgICBqKys7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoID09IDAgKSB7CisjaWZkZWYgS01QX0RGTFRfTlRIX0NPUkVTCisgICAgICAgIC8vCisgICAgICAgIC8vIERlZmF1bHQgI3RocmVhZHMgPSAjY29yZXMKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX25jb3JlczsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBzZXR0aW5nIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9uY29yZXMgKCVkKVxuIiwKKyAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoICkgKTsKKyNlbHNlCisgICAgICAgIC8vCisgICAgICAgIC8vIERlZmF1bHQgI3RocmVhZHMgPSAjYXZhaWxhYmxlIE9TIHByb2NzCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9hdmFpbF9wcm9jOworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IHNldHRpbmcgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX2F2YWlsX3Byb2MoJWQpXG4iLAorICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggKSApOworI2VuZGlmIC8qIEtNUF9ERkxUX05USF9DT1JFUyAqLworICAgIH0KKworICAgIGlmICggX19rbXBfZGZsdF90ZWFtX250aCA8IEtNUF9NSU5fTlRIICkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gS01QX01JTl9OVEg7CisgICAgfQorICAgIGlmKCBfX2ttcF9kZmx0X3RlYW1fbnRoID4gX19rbXBfc3lzX21heF9udGggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9zeXNfbWF4X250aDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRoZXJlJ3Mgbm8gaGFybSBpbiBjb250aW51aW5nIGlmIHRoZSBmb2xsb3dpbmcgY2hlY2sgZmFpbHMsCisgICAgLy8gYnV0IGl0IGluZGljYXRlcyBhbiBlcnJvciBpbiB0aGUgcHJldmlvdXMgbG9naWMuCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9kZmx0X3RlYW1fbnRoIDw9IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKworICAgIGlmICggX19rbXBfZGZsdF90ZWFtX250aCAhPSBwcmV2X2RmbHRfdGVhbV9udGggKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBfX2ttcF90aHJlYWRzIGFycmF5IGFuZCBzZXQgdGhlIG51bSB0aHJlYWRzIGljdgorICAgICAgICAvLyBmb3IgZWFjaCByb290IHRocmVhZCB0aGF0IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggdGhlIFJUTAorICAgICAgICAvLyAod2hpY2ggaGFzIG5vdCBhbHJlYWR5IGV4cGxpY2l0bHkgc2V0IGl0cyBudGhyZWFkcy12YXIgd2l0aCBhCisgICAgICAgIC8vIGNhbGwgdG8gb21wX3NldF9udW1fdGhyZWFkcygpKS4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBpKysgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBpIF07CisgICAgICAgICAgICBpZiAoIHRocmVhZCA9PSBOVUxMICkgY29udGludWU7CisgICAgICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jICE9IDAgKSBjb250aW51ZTsKKworICAgICAgICAgICAgc2V0X19ucHJvYyggX19rbXBfdGhyZWFkc1sgaSBdLCBfX2ttcF9kZmx0X3RlYW1fbnRoICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBmaW5hbCB2YWx1ZSBmb3IgX19rbXBfZGZsdF90ZWFtX250aCA9ICVkXG4iLAorICAgICAgX19rbXBfZGZsdF90ZWFtX250aCkgKTsKKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSB0byB6ZXJvIGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIG5vdyB0aGF0IF9fa21wX2F2YWlsX3Byb2MgaXMgc2V0ICAgICAgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYXZhaWxfcHJvYyA+IDAgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPiBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIHdlIGhhdmUgZmluaXNoZWQgbWlkZGxlIGluaXRpYWxpemF0aW9uICovCisgICAgVENXX1NZTkNfNChfX2ttcF9pbml0X21pZGRsZSwgVFJVRSk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemU6IGV4aXRcbiIgKSApOworfQorCit2b2lkCitfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIGlmICggX19rbXBfaW5pdF9taWRkbGUgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworfQorCit2b2lkCitfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAvLyB0aGlzIG1pZ2h0IGJlIGEgbmV3IHJvb3QKKworICAgIC8qIHN5bmNocm9uaXplIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uIChmb3Igc2libGluZykgKi8KKyAgICBpZiggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSByZXR1cm47CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICBpZiggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7IF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7IHJldHVybjsgfQorCisgICAgLyogVE9ETyByZWluaXRpYWxpemF0aW9uIGFmdGVyIHdlIGhhdmUgYWxyZWFkeSBzaHV0IGRvd24gKi8KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3BhcmFsbGVsX2luaXRpYWxpemU6IGF0dGVtcHQgdG8gaW5pdCB3aGlsZSBzaHV0dGluZyBkb3duXG4iICkgKTsKKyAgICAgICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOworICAgIH0KKworICAgIC8qIGpjOiBUaGUgbG9jayBfX2ttcF9pbml0el9sb2NrIGlzIGFscmVhZHkgaGVsZCwgc28gY2FsbGluZyBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZQorICAgICAgICAgICB3b3VsZCBjYXVzZSBhIGRlYWRsb2NrLiAgU28gd2UgY2FsbCBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSBkaXJlY3RseS4KKyAgICAqLworICAgIGlmKCAhX19rbXBfaW5pdF9taWRkbGUgKSB7CisgICAgICAgIF9fa21wX2RvX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgfQorCisgICAgLyogYmVnaW4gaW5pdGlhbGl6YXRpb24gKi8KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogZW50ZXJcbiIgKSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSApOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgRlAgY29udHJvbCByZWdzLgorICAgIC8vIFdvcmtlciB0aHJlYWRzIHdpbGwgc2V0IHRoZWlycyB0byB0aGVzZSB2YWx1ZXMgYXQgdGhyZWFkIHN0YXJ0dXAuCisgICAgLy8KKyAgICBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9zdG9yZV9teGNzciggJl9fa21wX2luaXRfbXhjc3IgKTsKKyAgICBfX2ttcF9pbml0X214Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiBLTVBfT1NfVU5JWAorIyBpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAvKiAgbXVzdCBiZSBhZnRlciBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSAgKi8KKyAgICBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIFRSVUUgKTsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCk7CisKKyMgIGlmIGRlZmluZWQoVVNFX0xPQURfQkFMQU5DRSkKKyAgICBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfZGVmYXVsdCApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX2xvYWRfYmFsYW5jZTsKKyAgICB9CisjZWxzZQorICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBfX2ttcF92ZXJzaW9uICkgeworICAgICAgICBfX2ttcF9wcmludF92ZXJzaW9uXzIoKTsKKyAgICB9CisKKyAgICAvKiB3ZSBoYXZlIGZpbmlzaGVkIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uICovCisgICAgVENXX1NZTkNfNChfX2ttcF9pbml0X3BhcmFsbGVsLCBUUlVFKTsKKworICAgIEtNUF9NQigpOworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplOiBleGl0XG4iICkgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsCisgIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF9kaXNwX3QgKmRpc3BhdGNoOworCisgICAgS01QX01CKCk7CisKKyAgICAvKiBub25lIG9mIHRoZSB0aHJlYWRzIGhhdmUgZW5jb3VudGVyZWQgYW55IGNvbnN0cnVjdHMsIHlldC4gKi8KKyAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QgPSAwOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goICZ0aGlzX3Roci0+dGgudGhfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYmIuYl9hcnJpdmVkICk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgIGRpc3BhdGNoID0gKGttcF9kaXNwX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZGlzcGF0Y2ggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcGF0Y2ggKTsKKyAgICAvL0tNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9PSAmdGVhbS0+dC50X2Rpc3BhdGNoWyB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQgXSApOworCisgICAgZGlzcGF0Y2gtPnRoX2Rpc3BfaW5kZXggPSAwOyAgICAvKiByZXNldCB0aGUgZGlzcGF0Y2ggYnVmZmVyIGNvdW50ZXIgKi8KKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKCBndGlkLCB0ZWFtLT50LnRfaWRlbnQgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCit2b2lkCitfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsCisgIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3BfcGFyYWxsZWwoIGd0aWQsIHRlYW0tPnQudF9pZGVudCApOworfQorCitpbnQKK19fa21wX2ludm9rZV90YXNrX2Z1bmMoIGludCBndGlkICkKK3sKKyAgICBpbnQgICAgICAgICAgcmM7CisgICAgaW50ICAgICAgICAgIHRpZCAgICAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF9pbmZvX3QgICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICAqdGVhbSAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKworICAgIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBndGlkLCB0aWQsIHRoaXNfdGhyLCB0ZWFtICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIF9fa21wX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGluZm9ybSBpdHRub3RpZnkgYWJvdXQgZW50ZXJpbmcgdXNlcidzIGNvZGUKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfSU5WT0tJTkcoKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgdm9pZCAqZHVtbXk7CisgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBleGl0X3J1bnRpbWVfcCA9ICYodGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS4KKyAgICAgICAgICAgIG9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmZHVtbXk7CisgICAgfQorCisjaWYgT01QVF9UUkFDRQorICAgIG15X3Rhc2tfaWQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgbXlfcGFyYWxsZWxfaWQgPSB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgICAgeworICAgICAgICBLTVBfVElNRV9CTE9DSyhPTVBfd29yayk7CisgICAgICAgIHJjID0gX19rbXBfaW52b2tlX21pY3JvdGFzayggKG1pY3JvdGFza190KSBUQ1JfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRpZCwgKGludCkgdGVhbS0+dC50X2FyZ2MsICh2b2lkICoqKSB0ZWFtLT50LnRfYXJndgorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZXhpdF9ydW50aW1lX3AKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpKAorICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgaW1wbGljaXQgdGFzayBpcyBub3QgZGVhZCB5ZXQsIHNvIHdlIGNhbid0IGNsZWFyIGl0cyB0YXNrIGlkIGhlcmUKKyAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSAwOworICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGluZm9ybSBpdHRub3RpZnkgYWJvdXQgbGVhdmluZyB1c2VyJ3MgY29kZQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSApOworCisgICAgcmV0dXJuIHJjOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQKK19fa21wX3RlYW1zX21hc3RlciggaW50IGd0aWQgKQoreworICAgIC8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgYWxsIG1hc3RlciB0aHJlYWRzIGluIHRlYW1zIGNvbnN0cnVjdAorICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlkZW50X3QgICAgICpsb2MgPSAgdGVhbS0+dC50X2lkZW50OworICAgIHRoci0+dGgudGhfc2V0X25wcm9jID0gdGhyLT50aC50aF90ZWFtc19zaXplLm50aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoci0+dGgudGhfc2V0X25wcm9jICk7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3RlYW1zX21hc3RlcjogVCMlZCwgVGlkICVkLCBtaWNyb3Rhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApLCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApICk7CisgICAgLy8gTGF1bmNoIGxlYWd1ZSBvZiB0ZWFtcyBub3csIGJ1dCBub3QgbGV0IHdvcmtlcnMgZXhlY3V0ZQorICAgIC8vICh0aGV5IGhhbmcgb24gZm9yayBiYXJyaWVyIHVudGlsIG5leHQgcGFyYWxsZWwpCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19GT1JLSU5HKCk7CisjZW5kaWYKKyAgICBfX2ttcF9mb3JrX2NhbGwoIGxvYywgZ3RpZCwgZm9ya19jb250ZXh0X2ludGVsLAorICAgICAgICAgICAgdGVhbS0+dC50X2FyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAodm9pZCAqKXRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrLCAgICAgIC8vICJ1bndyYXBwZWQiIHRhc2sKKyNlbmRpZgorICAgICAgICAgICAgKG1pY3JvdGFza190KXRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrLCAvLyAid3JhcHBlZCIgdGFzaworICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChsYXVuY2hfdCkgX19rbXBfaW52b2tlX3Rhc2tfZnVuYywKKyAgICAgICAgICAgIE5VTEwgKTsKKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgIFNTQ19NQVJLX0pPSU5JTkcoKTsKKyNlbmRpZgorICAgIAorICAgIC8vIEFDOiBsYXN0IHBhcmFtZXRlciAiMSIgZWxpbWluYXRlcyBqb2luIGJhcnJpZXIgd2hpY2ggd29uJ3Qgd29yayBiZWNhdXNlCisgICAgLy8gd29ya2VyIHRocmVhZHMgYXJlIGluIGEgZm9yayBiYXJyaWVyIHdhaXRpbmcgZm9yIG1vcmUgcGFyYWxsZWwgcmVnaW9ucworICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICwgZm9ya19jb250ZXh0X2ludGVsCisjZW5kaWYKKyAgICAgICAgLCAxICk7IAorfQorCitpbnQKK19fa21wX2ludm9rZV90ZWFtc19tYXN0ZXIoIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAgKnRlYW0gICAgID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgI2lmIEtNUF9ERUJVRworICAgIGlmICggIV9fa21wX3RocmVhZHNbZ3RpZF0tPiB0aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCApCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICh2b2lkKilfX2ttcF90aHJlYWRzW2d0aWRdLT4gdGgudGhfdGVhbS0+dC50X3BrZm4gPT0gKHZvaWQqKV9fa21wX3RlYW1zX21hc3RlciApOworICAgICNlbmRpZgorICAgIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBndGlkLCAwLCB0aGlzX3RociwgdGVhbSApOworICAgIF9fa21wX3RlYW1zX21hc3RlciggZ3RpZCApOworICAgIF9fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soIGd0aWQsIDAsIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworLyogdGhpcyBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbgorICogZW5jb3VudGVyZWQgYnkgdGhpcyB0ZWFtICovCisvKiBzaW5jZSB0aGlzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgZm9ya2pvaW4gY3JpdGljYWwgc2VjdGlvbiBpdAorICogc2hvdWxkIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aXRoIGFzc3ltbWV0cmljYWwgbmVzdGVkIHBhcmFsbGVsaXNtICovCisKK3ZvaWQKK19fa21wX3B1c2hfbnVtX3RocmVhZHMoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwgaW50IG51bV90aHJlYWRzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgaWYoIG51bV90aHJlYWRzID4gMCApCisgICAgICAgIHRoci0+dGgudGhfc2V0X25wcm9jID0gbnVtX3RocmVhZHM7Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvKiB0aGlzIHNldHMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgdGVhbXMgZm9yIHRoZSB0ZWFtcyByZWdpb24gYW5kL29yCisgKiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiBlbmNvdW50ZXJlZCAgKi8KK3ZvaWQKK19fa21wX3B1c2hfbnVtX3RlYW1zKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGludCBudW1fdGVhbXMsIGludCBudW1fdGhyZWFkcyApCit7CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bV90ZWFtcyA+PSAwKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bV90aHJlYWRzID49IDApOworCisgICAgaWYoIG51bV90ZWFtcyA9PSAwICkKKyAgICAgICAgbnVtX3RlYW1zID0gMTsgICAgLy8gZGVmYXVsdCBudW1iZXIgb2YgdGVhbXMgaXMgMS4KKyAgICBpZiggbnVtX3RlYW1zID4gX19rbXBfbWF4X250aCApIHsgLy8gaWYgdG9vIG1hbnkgdGVhbXMgcmVxdWVzdGVkPworICAgICAgICBpZiAoICFfX2ttcF9yZXNlcnZlX3dhcm4gKSB7CisgICAgICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm4gPSAxOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRGb3JtVGhyVGVhbSwgbnVtX3RlYW1zLCBfX2ttcF9tYXhfbnRoICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggVW5zZXRfQUxMX1RIUkVBRFMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBudW1fdGVhbXMgPSBfX2ttcF9tYXhfbnRoOworICAgIH0KKyAgICAvLyBTZXQgbnVtYmVyIG9mIHRlYW1zIChudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgb3V0ZXIgInBhcmFsbGVsIiBvZiB0aGUgdGVhbXMpCisgICAgdGhyLT50aC50aF9zZXRfbnByb2MgPSB0aHItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID0gbnVtX3RlYW1zOworCisgICAgLy8gUmVtZW1iZXIgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZvciBpbm5lciBwYXJhbGxlbCByZWdpb25zCisgICAgaWYoIG51bV90aHJlYWRzID09IDAgKSB7CisgICAgICAgIGlmKCAhVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7ICAvLyBnZXQgX19rbXBfYXZhaWxfcHJvYyBjYWxjdWxhdGVkCisgICAgICAgIG51bV90aHJlYWRzID0gX19rbXBfYXZhaWxfcHJvYyAvIG51bV90ZWFtczsKKyAgICAgICAgaWYoIG51bV90ZWFtcyAqIG51bV90aHJlYWRzID4gX19rbXBfbWF4X250aCApIHsKKyAgICAgICAgICAgIC8vIGFkanVzdCBudW1fdGhyZWFkcyB3L28gd2FybmluZyBhcyBpdCBpcyBub3QgdXNlciBzZXR0aW5nCisgICAgICAgICAgICBudW1fdGhyZWFkcyA9IF9fa21wX21heF9udGggLyBudW1fdGVhbXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiggbnVtX3RlYW1zICogbnVtX3RocmVhZHMgPiBfX2ttcF9tYXhfbnRoICkgeworICAgICAgICAgICAgaW50IG5ld190aHJlYWRzID0gX19rbXBfbWF4X250aCAvIG51bV90ZWFtczsKKyAgICAgICAgICAgIGlmICggIV9fa21wX3Jlc2VydmVfd2FybiApIHsgLy8gdXNlciBhc2tlZCBmb3IgdG9vIG1hbnkgdGhyZWFkcworICAgICAgICAgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDE7ICAvLyB0aGF0IGNvbmZsaWN0cyB3aXRoIE9NUF9USFJFQURfTElNSVQKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIG51bV90aHJlYWRzLCBuZXdfdGhyZWFkcyApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBVbnNldF9BTExfVEhSRUFEUyApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1fdGhyZWFkcyA9IG5ld190aHJlYWRzOworICAgICAgICB9CisgICAgfQorICAgIHRoci0+dGgudGhfdGVhbXNfc2l6ZS5udGggPSBudW1fdGhyZWFkczsKK30KKworCisvLworLy8gU2V0IHRoZSBwcm9jX2JpbmQgdmFyIHRvIHVzZSBpbiB0aGUgZm9sbG93aW5nIHBhcmFsbGVsIHJlZ2lvbi4KKy8vCit2b2lkCitfX2ttcF9wdXNoX3Byb2NfYmluZCggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIHRoci0+dGgudGhfc2V0X3Byb2NfYmluZCA9IHByb2NfYmluZDsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKy8qIExhdW5jaCB0aGUgd29ya2VyIHRocmVhZHMgaW50byB0aGUgbWljcm90YXNrLiAqLworCit2b2lkCitfX2ttcF9pbnRlcm5hbF9mb3JrKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBmOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICA9PSAgdGVhbSApOworICAgIEtNUF9BU1NFUlQoICAgICAgIEtNUF9NQVNURVJfR1RJRChndGlkKSApOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgdGVhbS0+dC50X2NvbnN0cnVjdCA9IDA7ICAgICAgICAgIC8qIG5vIHNpbmdsZSBkaXJlY3RpdmVzIHNlZW4geWV0ICovCisgICAgdGVhbS0+dC50X29yZGVyZWQuZHQudF92YWx1ZSA9IDA7IC8qIHRocmVhZCAwIGVudGVycyB0aGUgb3JkZXJlZCBzZWN0aW9uIGZpcnN0ICovCisKKyAgICAvKiBSZXNldCB0aGUgaWRlbnRpZmllcnMgb24gdGhlIGRpc3BhdGNoIGJ1ZmZlciAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwX2J1ZmZlciApOworICAgIGlmICggdGVhbS0+dC50X21heF9ucHJvYyA+IDEgKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgIEtNUF9NQVhfRElTUF9CVUY7ICsraSkKKyAgICAgICAgICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlclsgaSBdLmJ1ZmZlcl9pbmRleCA9IGk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyWyAwIF0uYnVmZmVyX2luZGV4ID0gMDsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLTVBfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAgPT0gIHRlYW0gKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGZvciggZj0wIDsgZjx0ZWFtLT50LnRfbnByb2MgOyBmKysgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90ZWFtX25wcm9jID09IHRlYW0tPnQudF9ucHJvYyApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIC8qIHJlbGVhc2UgdGhlIHdvcmtlciB0aHJlYWRzIHNvIHRoZXkgbWF5IGJlZ2luIHdvcmtpbmcgKi8KKyAgICBfX2ttcF9mb3JrX2JhcnJpZXIoIGd0aWQsIDAgKTsKK30KKworCit2b2lkCitfX2ttcF9pbnRlcm5hbF9qb2luKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAgPT0gIHRlYW0gKTsKKyAgICBLTVBfQVNTRVJUKCAgICAgICBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgKTsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIEpvaW4gYmFycmllciBhZnRlciBmb3JrICovCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpZiAoX19rbXBfdGhyZWFkc1tndGlkXSAmJiBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jICE9IHRlYW0tPnQudF9ucHJvYyApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJHVElEOiAlZCwgX19rbXBfdGhyZWFkc1slZF09JXBcbiIsZ3RpZCwgZ3RpZCwgX19rbXBfdGhyZWFkc1tndGlkXSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiX19rbXBfdGhyZWFkc1slZF0tPnRoLnRoX3RlYW1fbnByb2M9JWQsIFRFQU06ICVwLCB0ZWFtLT50LnRfbnByb2M9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jLCB0ZWFtLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmUoKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1tndGlkXSAmJgorICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIF9fa21wX2pvaW5fYmFycmllciggZ3RpZCApOyAgLyogd2FpdCBmb3IgZXZlcnlvbmUgKi8KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICA9PSAgdGVhbSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisKKy8vCisvLyBSZXR1cm4gdGhlIHdvcmtlciB0aHJlYWRzIGFjdGl2ZWx5IHNwaW5uaW5nIGluIHRoZSBob3QgdGVhbSwgaWYgd2UKKy8vIGFyZSBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsIG9mIHBhcmFsbGVsaXNtLiAgT3RoZXJ3aXNlLCByZXR1cm4gMC4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hY3RpdmVfaG90X3RlYW1fbnByb2MoIGttcF9yb290X3QgKnJvb3QgKQoreworICAgIGludCBpOworICAgIGludCByZXR2YWw7CisgICAga21wX3RlYW1fdCAqaG90X3RlYW07CisKKyAgICBpZiAoIHJvb3QtPnIucl9hY3RpdmUgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICByZXR1cm4gaG90X3RlYW0tPnQudF9ucHJvYyAtIDE7ICAvLyBEb24ndCBjb3VudCBtYXN0ZXIgdGhyZWFkCisgICAgfQorCisgICAgLy8KKyAgICAvLyBTa2lwIHRoZSBtYXN0ZXIgdGhyZWFkIC0gaXQgaXMgYWNjb3VudGVkIGZvciBlbHNld2hlcmUuCisgICAgLy8KKyAgICByZXR2YWwgPSAwOworICAgIGZvciAoIGkgPSAxOyBpIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgaSsrICkgeworICAgICAgICBpZiAoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tpXS0+dGgudGhfYWN0aXZlICkgeworICAgICAgICAgICAgcmV0dmFsKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLy8KKy8vIFBlcmZvcm0gYW4gYXV0b21hdGljIGFkanVzdG1lbnQgdG8gdGhlIG51bWJlciBvZgorLy8gdGhyZWFkcyB1c2VkIGJ5IHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2MoIGttcF9yb290X3QgKnJvb3QsIGludCBzZXRfbnByb2MgKQoreworICAgIGludCByZXR2YWw7CisgICAgaW50IHBvb2xfYWN0aXZlOworICAgIGludCBob3RfdGVhbV9hY3RpdmU7CisgICAgaW50IHRlYW1fY3Vycl9hY3RpdmU7CisgICAgaW50IHN5c3RlbV9hY3RpdmU7CisKKyAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBjYWxsZWQgcm9vdDolcCBzZXRfbnByb2M6JWRcbiIsCisgICAgICAgICAgICAgICAgcm9vdCwgc2V0X25wcm9jICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdC0+ci5yX3Jvb3RfdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljID09IFRSVUUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXRfbnByb2MgPiAxICk7CisKKyAgICBpZiAoIHNldF9ucHJvYyA9PSAxKSB7CisgICAgICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHNlcmlhbCBleGVjdXRpb24uXG4iICkgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaHJlYWRzIHRoYXQgYXJlIGFjdGl2ZSBpbiB0aGUgdGhyZWFkIHBvb2wsIGFjdGl2ZSBpbiB0aGUgaG90IHRlYW0KKyAgICAvLyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHJvb3QgKGlmIHdlIGFyZSBhdCB0aGUgb3V0ZXIgcGFyIGxldmVsKSwgYW5kCisgICAgLy8gdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkICh0byBiZWNvbWUgdGhlIG1hc3RlcikgYXJlIGF2YWlsYWJsZQorICAgIC8vIHRvIGFkZCB0byB0aGUgbmV3IHRlYW0sIGJ1dCBhcmUgY3VycmVudGx5IGNvbnRyaWJ1dGluZyB0byB0aGUgc3lzdGVtCisgICAgLy8gbG9hZCwgYW5kIG11c3QgYmUgYWNjb3VudGVkIGZvci4KKyAgICAvLworICAgIHBvb2xfYWN0aXZlID0gVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCk7CisgICAgaG90X3RlYW1fYWN0aXZlID0gX19rbXBfYWN0aXZlX2hvdF90ZWFtX25wcm9jKCByb290ICk7CisgICAgdGVhbV9jdXJyX2FjdGl2ZSA9IHBvb2xfYWN0aXZlICsgaG90X3RlYW1fYWN0aXZlICsgMTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdGhlIHN5c3RlbSBsb2FkLgorICAgIC8vCisgICAgc3lzdGVtX2FjdGl2ZSA9IF9fa21wX2dldF9sb2FkX2JhbGFuY2UoIF9fa21wX2F2YWlsX3Byb2MgKyB0ZWFtX2N1cnJfYWN0aXZlICk7CisgICAgS0JfVFJBQ0UoIDMwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogc3lzdGVtIGFjdGl2ZSA9ICVkIHBvb2wgYWN0aXZlID0gJWQgaG90IHRlYW0gYWN0aXZlID0gJWRcbiIsCisgICAgICBzeXN0ZW1fYWN0aXZlLCBwb29sX2FjdGl2ZSwgaG90X3RlYW1fYWN0aXZlICkgKTsKKworICAgIGlmICggc3lzdGVtX2FjdGl2ZSA8IDAgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIHRoZSBuZWNlc3NhcnkgaW5mbyBmcm9tIC9wcm9jLAorICAgICAgICAvLyBzbyB1c2UgdGhlIHRocmVhZCBsaW1pdCBhbGdvcml0aG0gaW5zdGVhZC4gIE9uY2Ugd2Ugc2V0CisgICAgICAgIC8vIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQsCisgICAgICAgIC8vIHdlIHNob3VsZG4ndCB3aW5kIHVwIGdldHRpbmcgYmFjayBoZXJlLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0OworICAgICAgICBLTVBfV0FSTklORyggQ2FudExvYWRCYWxVc2luZywgIktNUF9EWU5BTUlDX01PREU9dGhyZWFkIGxpbWl0IiApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE1ha2UgdGhpcyBjYWxsIGJlaGF2ZSBsaWtlIHRoZSB0aHJlYWQgbGltaXQgYWxnb3JpdGhtLgorICAgICAgICAvLworICAgICAgICByZXR2YWwgPSBfX2ttcF9hdmFpbF9wcm9jIC0gX19rbXBfbnRoICsgKHJvb3QtPnIucl9hY3RpdmUgPyAxCisgICAgICAgICAgOiByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIGlmICggcmV0dmFsID4gc2V0X25wcm9jICkgeworICAgICAgICAgICAgcmV0dmFsID0gc2V0X25wcm9jOworICAgICAgICB9CisgICAgICAgIGlmICggcmV0dmFsIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgICAgICByZXR2YWwgPSBLTVBfTUlOX05USDsKKyAgICAgICAgfQorCisgICAgICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHRocmVhZCBsaW1pdCBleGl0LiByZXR2YWw6JWRcbiIsIHJldHZhbCApICk7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBkZWxheSBpbiB0aGUgbG9hZCBiYWxhbmNlIGFsZ29yaXRobSBpbiBkZXRlY3RpbmcKKyAgICAvLyBuZXcgcnVubmluZyBwcm9jcy4gIFRoZSByZWFsIHN5c3RlbSBsb2FkIGF0IHRoaXMgaW5zdGFudCBzaG91bGQgYmUKKyAgICAvLyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgI2FjdGl2ZSBvbXAgdGhyZWFkIHRoYXQgYXJlIGF2YWlsYWJsZSB0bworICAgIC8vIGFkZCB0byB0aGUgdGVhbS4KKyAgICAvLworICAgIGlmICggc3lzdGVtX2FjdGl2ZSA8IHRlYW1fY3Vycl9hY3RpdmUgKSB7CisgICAgICAgIHN5c3RlbV9hY3RpdmUgPSB0ZWFtX2N1cnJfYWN0aXZlOworICAgIH0KKyAgICByZXR2YWwgPSBfX2ttcF9hdmFpbF9wcm9jIC0gc3lzdGVtX2FjdGl2ZSArIHRlYW1fY3Vycl9hY3RpdmU7CisgICAgaWYgKCByZXR2YWwgPiBzZXRfbnByb2MgKSB7CisgICAgICAgIHJldHZhbCA9IHNldF9ucHJvYzsKKyAgICB9CisgICAgaWYgKCByZXR2YWwgPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgcmV0dmFsID0gS01QX01JTl9OVEg7CisgICAgfQorCisgICAgS0JfVFJBQ0UoIDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogZXhpdC4gcmV0dmFsOiVkXG4iLCByZXR2YWwgKSApOworICAgIHJldHVybiByZXR2YWw7Cit9IC8vIF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygpCisKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE5PVEU6IHRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIF9fa21wX2luaXRfbG9jayBoZWxkICovCit2b2lkCitfX2ttcF9jbGVhbnVwKCB2b2lkICkKK3sKKyAgICBpbnQgZjsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jbGVhbnVwOiBlbnRlclxuIiApICk7CisKKyAgICBpZiAoVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHsKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAgICAgX19rbXBfcmVtb3ZlX3NpZ25hbHMoKTsKKyNlbmRpZgorICAgICAgICBUQ1dfNChfX2ttcF9pbml0X3BhcmFsbGVsLCBGQUxTRSk7CisgICAgfQorCisgICAgaWYgKFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKCk7CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworICAgICAgICBfX2ttcF9jbGVhbnVwX2hpZXJhcmNoeSgpOworICAgICAgICBUQ1dfNChfX2ttcF9pbml0X21pZGRsZSwgRkFMU0UpOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jbGVhbnVwOiBnbyBzZXJpYWwgY2xlYW51cFxuIiApICk7CisKKyAgICBpZiAoX19rbXBfaW5pdF9zZXJpYWwpIHsKKyAgICAgICAgX19rbXBfcnVudGltZV9kZXN0cm95KCk7CisgICAgICAgIF9fa21wX2luaXRfc2VyaWFsID0gRkFMU0U7CisgICAgfQorCisgICAgZm9yICggZiA9IDA7IGYgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBmKysgKSB7CisgICAgICAgIGlmICggX19rbXBfcm9vdFsgZiBdICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBfX2ttcF9yb290WyBmIF0gKTsKKyAgICAgICAgICAgIF9fa21wX3Jvb3RbIGYgXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOworICAgIC8vIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3Qgd2VyZSBhbGxvY2F0ZWQgYXQgb25jZSwgYXMgc2luZ2xlIGJsb2NrLCBzbyB0aGVyZSBpcyBubyBuZWVkIGluCisgICAgLy8gZnJlZWluZyBfX2ttcF9yb290LgorICAgIF9fa21wX3RocmVhZHMgPSBOVUxMOworICAgIF9fa21wX3Jvb3QgICAgPSBOVUxMOworICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSAwOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBfX2ttcF9jbGVhbnVwX2luZGlyZWN0X3VzZXJfbG9ja3MoKTsKKyNlbHNlCisgICAgX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCk7CisjZW5kaWYKKworICAgICNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBfX2ttcF9jcHVpbmZvX2ZpbGUgKTsKKyAgICAgICAgX19rbXBfY3B1aW5mb19maWxlID0gTlVMTDsKKyAgICAjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgICAjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgICAgIF9fa21wX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzKCk7CisgICAjZW5kaWYKKyAgICNlbmRpZgorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBfX2ttcF9uZXN0ZWRfbnRoLm50aCApOworICAgIF9fa21wX25lc3RlZF9udGgubnRoID0gTlVMTDsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLnNpemUgPSAwOworICAgIF9fa21wX25lc3RlZF9udGgudXNlZCA9IDA7CisKKyAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7CisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIF9fa21wX2FjY3VtdWxhdGVfc3RhdHNfYXRfZXhpdCgpOworICAgIF9fa21wX3N0YXRzX2xpc3QuZGVhbGxvY2F0ZSgpOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY2xlYW51cDogZXhpdFxuIiApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludAorX19rbXBfaWdub3JlX21wcGJlZyggdm9pZCApCit7CisgICAgY2hhciAqZW52OworCisgICAgaWYgKChlbnYgPSBnZXRlbnYoICJLTVBfSUdOT1JFX01QUEJFRyIgKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoX19rbXBfc3RyX21hdGNoX2ZhbHNlKCBlbnYgKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgLy8gQnkgZGVmYXVsdCBfX2ttcGNfYmVnaW4oKSBpcyBuby1vcC4KKyAgICByZXR1cm4gVFJVRTsKK30KKworaW50CitfX2ttcF9pZ25vcmVfbXBwZW5kKCB2b2lkICkKK3sKKyAgICBjaGFyICplbnY7CisKKyAgICBpZiAoKGVudiA9IGdldGVudiggIktNUF9JR05PUkVfTVBQRU5EIiApKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGVudiApKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAvLyBCeSBkZWZhdWx0IF9fa21wY19lbmQoKSBpcyBuby1vcC4KKyAgICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorX19rbXBfaW50ZXJuYWxfYmVnaW4oIHZvaWQgKQoreworICAgIGludCBndGlkOworICAgIGttcF9yb290X3QgKnJvb3Q7CisKKyAgICAvKiB0aGlzIGlzIGEgdmVyeSBpbXBvcnRhbnQgc3RlcCBhcyBpdCB3aWxsIHJlZ2lzdGVyIG5ldyBzaWJsaW5nIHRocmVhZHMKKyAgICAgKiBhbmQgYXNzaWduIHRoZXNlIG5ldyB1YmVyIHRocmVhZHMgYSBuZXcgZ3RpZCAqLworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgcm9vdCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcm9vdDsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkpOworCisgICAgaWYoIHJvb3QtPnIucl9iZWdpbiApIHJldHVybjsKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICZyb290LT5yLnJfYmVnaW5fbG9jaywgZ3RpZCApOworICAgIGlmKCByb290LT5yLnJfYmVnaW4gKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiByb290LT5yLnJfYmVnaW5fbG9jaywgZ3RpZCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcm9vdC0+ci5yX2JlZ2luID0gVFJVRTsKKworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiByb290LT5yLnJfYmVnaW5fbG9jaywgZ3RpZCApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3VzZXJfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZykKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIC8qIGZpcnN0LCBtYWtlIHN1cmUgd2UgYXJlIGluaXRpYWxpemVkIHNvIHdlIGNhbiBnZXQgb3VyIGd0aWQgKi8KKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgcm9vdCA9IHRocmVhZC0+dGgudGhfcm9vdDsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF91c2VyX3NldF9saWJyYXJ5OiBlbnRlciBUIyVkLCBhcmc6ICVkLCAlZFxuIiwgZ3RpZCwgYXJnLCBsaWJyYXJ5X3NlcmlhbCApKTsKKyAgICBpZiAocm9vdC0+ci5yX2luX3BhcmFsbGVsKSB7IC8qIE11c3QgYmUgY2FsbGVkIGluIHNlcmlhbCBzZWN0aW9uIG9mIHRvcC1sZXZlbCB0aHJlYWQgKi8KKyAgICAgICAgS01QX1dBUk5JTkcoIFNldExpYnJhcnlJbmNvcnJlY3RDYWxsICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCBhcmcgKSB7CisgICAgY2FzZSBsaWJyYXJ5X3NlcmlhbCA6CisgICAgICAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgc2V0X19ucHJvYyggdGhyZWFkLCAxICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDoKKyAgICAgICAgdGhyZWFkLT50aC50aF9zZXRfbnByb2MgPSAwOworICAgICAgICBzZXRfX25wcm9jKCB0aHJlYWQsIF9fa21wX2RmbHRfdGVhbV9udGggPyBfX2ttcF9kZmx0X3RlYW1fbnRoIDogX19rbXBfZGZsdF90ZWFtX250aF91YiApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6CisgICAgICAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgc2V0X19ucHJvYyggdGhyZWFkLCBfX2ttcF9kZmx0X3RlYW1fbnRoID8gX19rbXBfZGZsdF90ZWFtX250aCA6IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duTGlicmFyeVR5cGUsIGFyZyApOworICAgIH0KKworICAgIF9fa21wX2F1eF9zZXRfbGlicmFyeSAoIGFyZyApOworfQorCit2b2lkCitfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSggc2l6ZV90IGFyZyApCit7CisgICAgaWYgKCEgX19rbXBfaW5pdF9zZXJpYWwpCisgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisKKyNpZiBLTVBfT1NfREFSV0lOCisgICAgaWYgKGFyZyAmICgweDEwMDAgLSAxKSkgeworICAgICAgICBhcmcgJj0gfigweDEwMDAgLSAxKTsKKyAgICAgICAgaWYoYXJnICsgMHgxMDAwKSAvKiBjaGVjayBmb3Igb3ZlcmZsb3cgaWYgd2Ugcm91bmQgdXAgKi8KKyAgICAgICAgICAgIGFyZyArPSAweDEwMDA7CisgICAgfQorI2VuZGlmCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIC8qIG9ubHkgY2hhbmdlIHRoZSBkZWZhdWx0IHN0YWNrc2l6ZSBiZWZvcmUgdGhlIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbiAqLworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKSB7CisgICAgICAgIHNpemVfdCB2YWx1ZSA9IGFyZzsgICAgICAgLyogYXJndW1lbnQgaXMgaW4gYnl0ZXMgKi8KKworICAgICAgICBpZiAodmFsdWUgPCBfX2ttcF9zeXNfbWluX3N0a3NpemUgKQorICAgICAgICAgICAgdmFsdWUgPSBfX2ttcF9zeXNfbWluX3N0a3NpemUgOworICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IEtNUF9NQVhfU1RLU0laRSkKKyAgICAgICAgICAgIHZhbHVlID0gS01QX01BWF9TVEtTSVpFOworCisgICAgICAgIF9fa21wX3N0a3NpemUgPSB2YWx1ZTsKKworICAgICAgICBfX2ttcF9lbnZfc3Rrc2l6ZSA9IFRSVUU7ICAgIC8qIHdhcyBLTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworfQorCisvKiBzZXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgcnVudGltZSBsaWJyYXJ5ICovCisvKiBUT0RPIHRoaXMgY2FuIGNhdXNlIHNvbWUgb2RkIGJlaGF2aW91ciB3aXRoIHNpYmxpbmcgcGFyYWxsZWxpc20uLi4gKi8KK3ZvaWQKK19fa21wX2F1eF9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKQoreworICAgIF9fa21wX2xpYnJhcnkgPSBhcmc7CisKKyAgICBzd2l0Y2ggKCBfX2ttcF9saWJyYXJ5ICkgeworICAgIGNhc2UgbGlicmFyeV9zZXJpYWwgOgorICAgICAgICB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBMaWJyYXJ5SXNTZXJpYWwgKTsKKyAgICAgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggVFJVRSApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDoKKyAgICAgICAgKHZvaWQpIF9fa21wX2NoYW5nZV9saWJyYXJ5KCBUUlVFICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgbGlicmFyeV90aHJvdWdocHV0IDoKKyAgICAgICAgKHZvaWQpIF9fa21wX2NoYW5nZV9saWJyYXJ5KCBGQUxTRSApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfRkFUQUwoIFVua25vd25MaWJyYXJ5VHlwZSwgYXJnICk7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSAoaW50IGFyZywga21wX2luZm9fdCAqdGhyZWFkLCBpbnQgdGlkKQoreworICAgIGludCBibG9ja3RpbWUgPSBhcmc7ICAgICAgICAvKiBhcmd1bWVudCBpcyBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBpbnQgYnRfaW50ZXJ2YWxzOworICAgIGludCBidF9zZXQ7CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIC8qIE5vcm1hbGl6ZSBhbmQgc2V0IGJsb2NrdGltZSBmb3IgdGhlIHRlYW1zICovCisgICAgaWYgKGJsb2NrdGltZSA8IEtNUF9NSU5fQkxPQ0tUSU1FKQorICAgICAgICBibG9ja3RpbWUgPSBLTVBfTUlOX0JMT0NLVElNRTsKKyAgICBlbHNlIGlmIChibG9ja3RpbWUgPiBLTVBfTUFYX0JMT0NLVElNRSkKKyAgICAgICAgYmxvY2t0aW1lID0gS01QX01BWF9CTE9DS1RJTUU7CisKKyAgICBzZXRfX2Jsb2NrdGltZV90ZWFtKCB0aHJlYWQtPnRoLnRoX3RlYW0sIHRpZCwgYmxvY2t0aW1lICk7CisgICAgc2V0X19ibG9ja3RpbWVfdGVhbSggdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSwgMCwgYmxvY2t0aW1lICk7CisKKyAgICAvKiBDYWxjdWxhdGUgYW5kIHNldCBibG9ja3RpbWUgaW50ZXJ2YWxzIGZvciB0aGUgdGVhbXMgKi8KKyAgICBidF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKGJsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzKTsKKworICAgIHNldF9fYnRfaW50ZXJ2YWxzX3RlYW0oIHRocmVhZC0+dGgudGhfdGVhbSwgdGlkLCBidF9pbnRlcnZhbHMgKTsKKyAgICBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLCAwLCBidF9pbnRlcnZhbHMgKTsKKworICAgIC8qIFNldCB3aGV0aGVyIGJsb2NrdGltZSBoYXMgYmVlbiBzZXQgdG8gIlRSVUUiICovCisgICAgYnRfc2V0ID0gVFJVRTsKKworICAgIHNldF9fYnRfc2V0X3RlYW0oIHRocmVhZC0+dGgudGhfdGVhbSwgdGlkLCBidF9zZXQgKTsKKyAgICBzZXRfX2J0X3NldF90ZWFtKCB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLCAwLCBidF9zZXQgKTsKKyAgICBLRl9UUkFDRSgxMCwgKCAia21wX3NldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWQsIGJ0X2ludGVydmFscz0lZCwgbW9uaXRvcl91cGRhdGVzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aWQsIHRocmVhZC0+dGgudGhfdGVhbSksCisgICAgICAgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9pZCwgdGlkLCBibG9ja3RpbWUsIGJ0X2ludGVydmFscywgX19rbXBfbW9uaXRvcl93YWtldXBzICkgKTsKK30KKwordm9pZAorX19rbXBfYXV4X3NldF9kZWZhdWx0cygKKyAgICBjaGFyIGNvbnN0ICogc3RyLAorICAgIGludCAgICAgICAgICBsZW4KKykgeworICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9OworICAgIF9fa21wX2Vudl9pbml0aWFsaXplKCBzdHIgKTsKKworICAgIGlmIChfX2ttcF9zZXR0aW5ncworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHx8IF9fa21wX2Rpc3BsYXlfZW52IHx8IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorICAgICAgICApIHsKKyAgICAgICAgX19rbXBfZW52X3ByaW50KCk7CisgICAgfQorfSAvLyBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogaW50ZXJuYWwgZmFzdCByZWR1Y3Rpb24gcm91dGluZXMKKyAqLworCitQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UCitfX2ttcF9kZXRlcm1pbmVfcmVkdWN0aW9uX21ldGhvZCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKQoreworCisgICAgLy8gRGVmYXVsdCByZWR1Y3Rpb24gbWV0aG9kOiBjcml0aWNhbCBjb25zdHJ1Y3QgKCBsY2sgIT0gTlVMTCwgbGlrZSBpbiBjdXJyZW50IFBBUk9QVCApCisgICAgLy8gSWYgKCByZWR1Y2VfZGF0YSE9TlVMTCAmJiByZWR1Y2VfZnVuYyE9TlVMTCApOiB0aGUgdHJlZS1yZWR1Y3Rpb24gbWV0aG9kIGNhbiBiZSBzZWxlY3RlZCBieSBSVEwKKyAgICAvLyBJZiBsb2MtPmZsYWdzIGNvbnRhaW5zIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFLCB0aGUgYXRvbWljIHJlZHVjZSBtZXRob2QgY2FuIGJlIHNlbGVjdGVkIGJ5IFJUTAorICAgIC8vIEZpbmFsbHksIGl0J3MgdXAgdG8gT3Blbk1QIFJUTCB0byBtYWtlIGEgZGVjaXNpb24gb24gd2hpY2ggbWV0aG9kIHRvIHNlbGVjdCBhbW9uZyBnZW5lcmF0ZWQgYnkgUEFST1BULgorCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCByZXR2YWw7CisKKyAgICBpbnQgdGVhbV9zaXplOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggbG9jICk7ICAgIC8vIGl0IHdvdWxkIGJlIG5pY2UgdG8gdGVzdCAoIGxvYyAhPSAwICkKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgKTsgICAgLy8gaXQgd291bGQgYmUgbmljZSB0byB0ZXN0ICggbGNrICE9IDAgKQorCisgICAgI2RlZmluZSBGQVNUX1JFRFVDVElPTl9BVE9NSUNfTUVUSE9EX0dFTkVSQVRFRCAoICggbG9jLT5mbGFncyAmICggS01QX0lERU5UX0FUT01JQ19SRURVQ0UgKSApID09ICggS01QX0lERU5UX0FUT01JQ19SRURVQ0UgKSApCisgICAgI2RlZmluZSBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQgICAoICggcmVkdWNlX2RhdGEgKSAmJiAoIHJlZHVjZV9mdW5jICkgKQorCisgICAgcmV0dmFsID0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrOworCisgICAgdGVhbV9zaXplID0gX19rbXBfZ2V0X3RlYW1fbnVtX3RocmVhZHMoIGdsb2JhbF90aWQgKTsgLy8gYW5vdGhlciBjaG9pY2Ugb2YgZ2V0dGluZyBhIHRlYW0gc2l6ZSAoIHdpdGggMSBkeW5hbWljIGRlZmVyZW5jZSApIGlzIHNsb3dlcgorCisgICAgaWYoIHRlYW1fc2l6ZSA9PSAxICkgeworCisgICAgICAgIHJldHZhbCA9IGVtcHR5X3JlZHVjZV9ibG9jazsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgaW50IGF0b21pY19hdmFpbGFibGUgPSBGQVNUX1JFRFVDVElPTl9BVE9NSUNfTUVUSE9EX0dFTkVSQVRFRDsKKyAgICAgICAgaW50IHRyZWVfYXZhaWxhYmxlICAgPSBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQ7CisKKyAgICAgICAgI2lmIEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9QUEM2NCB8fCBLTVBfQVJDSF9BQVJDSDY0CisKKyAgICAgICAgICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCB8fCBLTVBfT1NfV0lORE9XUyB8fCBLTVBfT1NfREFSV0lOCisKKwkgICAgaW50IHRlYW1zaXplX2N1dG9mZiA9IDQ7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICAgICAgICAgICAgICBpZiggX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYyApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbXNpemVfY3V0b2ZmID0gODsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiggdHJlZV9hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0ZWFtX3NpemUgPD0gdGVhbXNpemVfY3V0b2ZmICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhdG9taWNfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUyIKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCB8fCBLTVBfT1NfV0lORE9XUyB8fCBLTVBfT1NfREFSV0lOCisKKyAgICAgICAgI2VsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSAorCisgICAgICAgICAgICAjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTCisKKyAgICAgICAgICAgICAgICAvLyBiYXNpYyB0dW5pbmcKKworICAgICAgICAgICAgICAgIGlmKCBhdG9taWNfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICBpZiggbnVtX3ZhcnMgPD0gMiApIHsgLy8gJiYgKCB0ZWFtX3NpemUgPD0gOCApIGR1ZSB0byBmYWxzZS1zaGFyaW5nID8/PworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gb3RoZXJ3aXNlOiB1c2UgY3JpdGljYWwgc2VjdGlvbgorCisgICAgICAgICAgICAjZWxpZiBLTVBfT1NfREFSV0lOCisKKyAgICAgICAgICAgICAgICBpZiggYXRvbWljX2F2YWlsYWJsZSAmJiAoIG51bV92YXJzIDw9IDMgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCB0cmVlX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICggcmVkdWNlX3NpemUgPiAoIDkgKiBzaXplb2YoIGttcF9yZWFsNjQgKSApICkgJiYgKCByZWR1Y2Vfc2l6ZSA8ICggMjAwMCAqIHNpemVvZigga21wX3JlYWw2NCApICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUExBSU5fQkFSUklFUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gb3RoZXJ3aXNlOiB1c2UgY3JpdGljYWwgc2VjdGlvbgorCisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUyIKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIgorICAgICAgICAjZW5kaWYKKworICAgIH0KKworICAgIC8vIEtNUF9GT1JDRV9SRURVQ1RJT04KKworICAgIC8vIElmIHRoZSB0ZWFtIGlzIHNlcmlhbGl6ZWQgKHRlYW1fc2l6ZSA9PSAxKSwgaWdub3JlIHRoZSBmb3JjZWQgcmVkdWN0aW9uCisgICAgLy8gbWV0aG9kIGFuZCBzdGF5IHdpdGggdGhlIHVuc3luY2hyb25pemVkIG1ldGhvZCAoZW1wdHlfcmVkdWNlX2Jsb2NrKQorICAgIGlmKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICE9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQgJiYgdGVhbV9zaXplICE9IDEpIHsKKworICAgICAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIGZvcmNlZF9yZXR2YWw7CisKKyAgICAgICAgaW50IGF0b21pY19hdmFpbGFibGUsIHRyZWVfYXZhaWxhYmxlOworCisgICAgICAgIHN3aXRjaCggKCBmb3JjZWRfcmV0dmFsID0gX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCApICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBjcml0aWNhbF9yZWR1Y2VfYmxvY2s6CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggbGNrICk7ICAgICAgICAgICAgICAvLyBsY2sgc2hvdWxkIGJlICE9IDAKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBhdG9taWNfcmVkdWNlX2Jsb2NrOgorICAgICAgICAgICAgICAgIGF0b21pY19hdmFpbGFibGUgPSBGQVNUX1JFRFVDVElPTl9BVE9NSUNfTUVUSE9EX0dFTkVSQVRFRDsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCBhdG9taWNfYXZhaWxhYmxlICk7IC8vIGF0b21pY19hdmFpbGFibGUgc2hvdWxkIGJlICE9IDAKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSB0cmVlX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICB0cmVlX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRDsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCB0cmVlX2F2YWlsYWJsZSApOyAgIC8vIHRyZWVfYXZhaWxhYmxlIHNob3VsZCBiZSAhPSAwCisgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgZm9yY2VkX3JldHZhbCA9IFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUkVEVUNUSU9OX0JBUlJJRVI7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCApOyAvLyAidW5zdXBwb3J0ZWQgbWV0aG9kIHNwZWNpZmllZCIKKyAgICAgICAgfQorCisgICAgICAgIHJldHZhbCA9IGZvcmNlZF9yZXR2YWw7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICggInJlZHVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQ9JTA4eFxuIiwgcmV0dmFsICkgKTsKKworICAgICN1bmRlZiBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQKKyAgICAjdW5kZWYgRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQKKworICAgIHJldHVybiAoIHJldHZhbCApOworfQorCisvLyB0aGlzIGZ1bmN0aW9uIGlzIGZvciB0ZXN0aW5nIHNldC9nZXQvZGV0ZXJtaW5lIHJlZHVjZSBtZXRob2QKK2ttcF9pbnQzMgorX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QoIHZvaWQgKSB7CisgICAgcmV0dXJuICggKCBfX2ttcF9lbnRyeV90aHJlYWQoKS0+dGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSA+PiA4ICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3NhZmVfY19hcGkuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zYWZlX2NfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkZjY0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zYWZlX2NfYXBpLmgKQEAgLTAsMCArMSw2MiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NBRkVfQ19BUElfSAorI2RlZmluZSBLTVBfU0FGRV9DX0FQSV9ICisKKy8vCisvLyBSZXBsYWNlbWVudCBmb3IgYmFubmVkIEMgQVBJCisvLworCisvLyBOb3QgZXZlcnkgdW5zYWZlIGNhbGwgbGlzdGVkIGhlcmUgaXMgaGFuZGxlZCBub3csIGJ1dCBrZWVwaW5nIGV2ZXJ5dGhpbmcKKy8vIGluIG9uZSBwbGFjZSBzaG91bGQgYmUgaGFuZHkgZm9yIGZ1dHVyZSBtYWludGVuYW5jZS4KKyNpZiBLTVBfT1NfV0lORE9XUworCisjIGRlZmluZSBSU0laRV9NQVhfU1RSICggNFVMIDw8IDEwICkgLy8gNEtCCisKKy8vIF9tYWxsb2NhIHdhcyBzdWdnZXN0ZWQsIGJ1dCBpdCBpcyBub3QgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBfYWxsb2NhCisjIGRlZmluZSBLTVBfQUxMT0NBICAgICAgICAgICAgICAgICAgX2FsbG9jYQorCisjIGRlZmluZSBLTVBfTUVNQ1BZX1MgICAgICAgICAgICAgICAgbWVtY3B5X3MKKyMgZGVmaW5lIEtNUF9TTlBSSU5URiAgICAgICAgICAgICAgICBzcHJpbnRmX3MKKyMgZGVmaW5lIEtNUF9TU0NBTkYgICAgICAgICAgICAgICAgICBzc2NhbmZfcworIyBkZWZpbmUgS01QX1NUUkNQWV9TICAgICAgICAgICAgICAgIHN0cmNweV9zCisjIGRlZmluZSBLTVBfU1RSTkNQWV9TICAgICAgICAgICAgICAgc3RybmNweV9zCisKKy8vIFVzZSB0aGlzIG9ubHkgd2hlbiBidWZmZXIgc2l6ZSBpcyB1bmtub3duCisjIGRlZmluZSBLTVBfTUVNQ1BZKGRzdCwgc3JjLCBjbnQpICAgbWVtY3B5X3MoZHN0LCBjbnQsIHNyYywgY250KQorCisjIGRlZmluZSBLTVBfU1RSTEVOKHN0cikgICAgICAgICAgICAgc3Rybmxlbl9zKHN0ciwgUlNJWkVfTUFYX1NUUikKKworLy8gVXNlIHRoaXMgb25seSB3aGVuIGJ1ZmZlciBzaXplIGlzIHVua25vd24KKyMgZGVmaW5lIEtNUF9TVFJOQ1BZKGRzdCwgc3JjLCBjbnQpICBzdHJuY3B5X3MoZHN0LCBjbnQsIHNyYywgY250KQorCisvLyBfVFJVTkNBVEUgaW5zdXJlcyBidWZmZXIgc2l6ZSA+IG1heCBzdHJpbmcgdG8gcHJpbnQuCisjIGRlZmluZSBLTVBfVlNOUFJJTlRGKGRzdCwgY250LCBmbXQsIGFyZykgIHZzbnByaW50Zl9zKGRzdCwgY250LCBfVFJVTkNBVEUsIGZtdCwgYXJnKQorCisjZWxzZSAvLyBLTVBfT1NfV0lORE9XUworCisvLyBGb3Igbm93LCB0aGVzZSBtYWNyb3MgdXNlIHRoZSBleGlzdGluZyBBUEkuCisKKyMgZGVmaW5lIEtNUF9BTExPQ0EgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhCisjIGRlZmluZSBLTVBfTUVNQ1BZX1MoZHN0LCBic3osIHNyYywgY250KSAgIG1lbWNweShkc3QsIHNyYywgY250KQorIyBkZWZpbmUgS01QX1NOUFJJTlRGICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZgorIyBkZWZpbmUgS01QX1NTQ0FORiAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYKKyMgZGVmaW5lIEtNUF9TVFJDUFlfUyhkc3QsIGJzeiwgc3JjKSAgICAgICAgc3RyY3B5KGRzdCwgc3JjKSAKKyMgZGVmaW5lIEtNUF9TVFJOQ1BZX1MoZHN0LCBic3osIHNyYywgY250KSAgc3RybmNweShkc3QsIHNyYywgY250KQorIyBkZWZpbmUgS01QX1ZTTlBSSU5URiAgICAgICAgICAgICAgICAgICAgICB2c25wcmludGYKKyMgZGVmaW5lIEtNUF9TVFJOQ1BZICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweQorIyBkZWZpbmUgS01QX1NUUkxFTiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4KKyMgZGVmaW5lIEtNUF9NRU1DUFkgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5CisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisjZW5kaWYgLy8gS01QX1NBRkVfQ19BUElfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3N2NhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBrbXBfc2NoZWQuYyAtLSBzdGF0aWMgc2NoZWR1bGluZyAtLSBpdGVyYXRpb24gaW5pdGlhbGl6YXRpb24KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAqIFN0YXRpYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uLgorICoKKyAqIE5PVEU6IHRlYW0tPnQudF9ucHJvYyBpcyBhIGNvbnN0YW50IGluc2lkZSBvZiBhbnkgZGlzcGF0Y2ggbG9vcCwgaG93ZXZlcgorICogICAgICAgaXQgbWF5IGNoYW5nZSB2YWx1ZXMgYmV0d2VlbiBwYXJhbGxlbCByZWdpb25zLiAgX19rbXBfbWF4X250aAorICogICAgICAgaXMgdGhlIGxhcmdlc3QgdmFsdWUgX19rbXBfbnRoIG1heSB0YWtlLCAxIGlzIHRoZSBzbWFsbGVzdC4KKyAqCisgKi8KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvLyB0ZW1wbGF0ZSBmb3IgdHlwZSBsaW1pdHMKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0cnVjdCBpX21heG1pbiB7CisgICAgc3RhdGljIGNvbnN0IFQgbXg7CisgICAgc3RhdGljIGNvbnN0IFQgbW47Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCBpbnQgPiB7CisgICAgc3RhdGljIGNvbnN0IGludCBteCA9IDB4N2ZmZmZmZmY7CisgICAgc3RhdGljIGNvbnN0IGludCBtbiA9IDB4ODAwMDAwMDA7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCB1bnNpZ25lZCBpbnQgPiB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBteCA9IDB4ZmZmZmZmZmY7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtbiA9IDB4MDAwMDAwMDA7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCBsb25nIGxvbmcgPiB7CisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBteCA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbW4gPSAweDgwMDAwMDAwMDAwMDAwMDBMTDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IHVuc2lnbmVkIGxvbmcgbG9uZyA+IHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG14ID0gMHhmZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBtbiA9IDB4MDAwMDAwMDAwMDAwMDAwMExMOworfTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9ERUJVRworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0ZW1wbGF0ZSBmb3IgZGVidWcgcHJpbnRzIHNwZWNpZmljYXRpb24gKCBkLCB1LCBsbGQsIGxsdSApCisgICAgY2hhciBjb25zdCAqIHRyYWl0c190PCBpbnQgPjo6c3BlYyA9ICJkIjsKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IHVuc2lnbmVkIGludCA+OjpzcGVjID0gInUiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgbG9uZyBsb25nID46OnNwZWMgPSAibGxkIjsKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IHVuc2lnbmVkIGxvbmcgbG9uZyA+OjpzcGVjID0gImxsdSI7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZgorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZm9yX3N0YXRpY19pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdHlwZSwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbG93ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAqcHN0cmlkZSwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgY2h1bmsKKykgeworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX3N0YXRpYyk7CisgICAgS01QX1RJTUVfQkxPQ0sgKEZPUl9zdGF0aWNfc2NoZWR1bGluZyk7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgLyogIHRoaXMgYWxsIGhhcyB0byBiZSBjaGFuZ2VkIGJhY2sgdG8gVElEIGFuZCBzdWNoLi4gKi8KKyAgICByZWdpc3RlciBrbXBfaW50MzIgICBndGlkID0gZ2xvYmFsX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICB0aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgbnRoOworICAgIHJlZ2lzdGVyIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgb21wdF90ZWFtX2luZm9fdCAqdGVhbV9pbmZvID0gTlVMTDsgCisgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gTlVMTDsgCisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIE9ubHkgZnVsbHkgaW5pdGlhbGl6ZSB2YXJpYWJsZXMgbmVlZGVkIGJ5IE9NUFQgaWYgT01QVCBpcyBlbmFibGVkLgorICAgICAgICB0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICB0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhc3RpdGVyICYmIHBsb3dlciAmJiBwdXBwZXIgJiYgcHN0cmlkZSApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0IGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyUlZCBzY2hlZD0lJWQgbGl0ZXI9JSVkIGl0ZXI9KCUlJXMsIiBcCisgICAgICAgICAgICAiICUlJXMsICUlJXMpIGluY3I9JSUlcyBjaHVuaz0lJSVzIHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGdsb2JhbF90aWQsIHNjaGVkdHlwZSwgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlLCBpbmNyLCBjaHVuayApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgaWYgKCBpbmNyID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIC8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHplcm8tdHJpcCBsb29wcyAqLworICAgIGlmICggaW5jciA+IDAgPyAoKnB1cHBlciA8ICpwbG93ZXIpIDogKCpwbG93ZXIgPCAqcHVwcGVyKSApIHsKKyAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSBGQUxTRTsKKyAgICAgICAgLyogbGVhdmUgcHVwcGVyIGFuZCBwbG93ZXIgc2V0IHRvIGVudGlyZSBpdGVyYXRpb24gc3BhY2UgKi8KKyAgICAgICAgKnBzdHJpZGUgPSBpbmNyOyAgIC8qIHZhbHVlIHNob3VsZCBuZXZlciBiZSB1c2VkICovCisJLy8gICAgICAgICpwbG93ZXIgPSAqcHVwcGVyIC0gaW5jcjsgICAvLyBsZXQgY29tcGlsZXIgYnlwYXNzIHRoZSBpbGxlZ2FsIGxvb3AgKGxpa2UgZm9yKGk9MTtpPDEwO2ktLSkpICBUSElTIExJTkUgQ0FVU0VEIHNoYXBlMkYvaF90ZXN0c18xLmYgVE8gSEFWRSBBIEZBSUxVUkUgT04gQSBaRVJPLVRSSVAgTE9PUCAobG93ZXI9MSxcCisJICB1cHBlcj0wLHN0cmlkZT0xKSAtIEpQSCBKdW5lIDIzLCAyMDA5LgorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDooWkVSTyBUUklQKSBsaXRlcj0lJWQgbG93ZXI9JSUlcyB1cHBlcj0lJSVzIHN0cmlkZSA9ICUlJXMgc2lnbmVkPzwlcz4sIGxvYyA9ICUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlLCBsb2MtPnBzb3VyY2UgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgS01QX0NPVU5UX1ZBTFVFIChGT1Jfc3RhdGljX2l0ZXJhdGlvbnMsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBzY2hlZHR5cGUgPiBrbXBfb3JkX3VwcGVyICkgeworICAgICAgICAvLyB3ZSBhcmUgaW4gRElTVFJJQlVURSBjb25zdHJ1Y3QKKyAgICAgICAgc2NoZWR0eXBlICs9IGttcF9zY2hfc3RhdGljIC0ga21wX2Rpc3RyaWJ1dGVfc3RhdGljOyAgICAgIC8vIEFDOiBjb252ZXJ0IHRvIHVzdWFsIHNjaGVkdWxlIHR5cGUKKyAgICAgICAgdGlkICA9IHRoLT50aC50aF90ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtLT50LnRfcGFyZW50OworICAgIH0gZWxzZQorICAgICNlbmRpZgorICAgIHsKKyAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKyAgICAgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgIH0KKworICAgIC8qIGRldGVybWluZSBpZiAiZm9yIiBsb29wIGlzIGFuIGFjdGl2ZSB3b3Jrc2hhcmluZyBjb25zdHJ1Y3QgKi8KKyAgICBpZiAoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIC8qIHNlcmlhbGl6ZWQgcGFyYWxsZWwsIGVhY2ggdGhyZWFkIGV4ZWN1dGVzIHdob2xlIGl0ZXJhdGlvbiBzcGFjZSAqLworICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9IFRSVUU7CisgICAgICAgIC8qIGxlYXZlIHB1cHBlciBhbmQgcGxvd2VyIHNldCB0byBlbnRpcmUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgICpwc3RyaWRlID0gKGluY3IgPiAwKSA/ICgqcHVwcGVyIC0gKnBsb3dlciArIDEpIDogKC0oKnBsb3dlciAtICpwdXBwZXIgKyAxKSk7CisKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IChzZXJpYWwpIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkLAorICAgICAgICAgICAgICAgIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbnRoID0gdGVhbS0+dC50X25wcm9jOworICAgIGlmICggbnRoID09IDEgKSB7CisgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAqcGxhc3RpdGVyID0gVFJVRTsKKyAgICAgICAgKnBzdHJpZGUgPSAoaW5jciA+IDApID8gKCpwdXBwZXIgLSAqcGxvd2VyICsgMSkgOiAoLSgqcGxvd2VyIC0gKnB1cHBlciArIDEpKTsKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IChzZXJpYWwpIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkLAorICAgICAgICAgICAgICAgIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRyaXAgY291bnQgKi8KKyAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwdXBwZXIgLSAqcGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYgKGluY3IgPT0gLTEpIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIGluY3IgPiAxICkgeyAgLy8gdGhlIGNoZWNrIGlzIG5lZWRlZCBmb3IgdW5zaWduZWQgZGl2aXNpb24gd2hlbiBpbmNyIDwgMAorICAgICAgICAgICAgdHJpcF9jb3VudCA9ICgqcHVwcGVyIC0gKnBsb3dlcikgLyBpbmNyICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAoKnBsb3dlciAtICpwdXBwZXIpIC8gKCAtaW5jciApICsgMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAvKiB0cmlwY291bnQgb3ZlcmZsb3c/ICovCisgICAgICAgIGlmICggdHJpcF9jb3VudCA9PSAwICYmICpwdXBwZXIgIT0gKnBsb3dlciApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0l0ZXJhdGlvblJhbmdlVG9vTGFyZ2UsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0NPVU5UX1ZBTFVFIChGT1Jfc3RhdGljX2l0ZXJhdGlvbnMsIHRyaXBfY291bnQpOworCisgICAgLyogY29tcHV0ZSByZW1haW5pbmcgcGFyYW1ldGVycyAqLworICAgIHN3aXRjaCAoIHNjaGVkdHlwZSApIHsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHRyaXBfY291bnQgPCBudGggKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZAorICAgICAgICAgICAgICAgICk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICAgICBpZiAoIHRpZCA8IHRyaXBfY291bnQgKSB7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyID0gKnBsb3dlciArIHRpZCAqIGluY3I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgKyBpbmNyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKCB0aWQgPT0gdHJpcF9jb3VudCAtIDEgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIHNtYWxsX2NodW5rID0gdHJpcF9jb3VudCAvIG50aDsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50aDsKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKCB0aWQgKiBzbWFsbF9jaHVuayArICggdGlkIDwgZXh0cmFzID8gdGlkIDogZXh0cmFzICkgKTsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBzbWFsbF9jaHVuayAqIGluY3IgLSAoIHRpZCA8IGV4dHJhcyA/IDAgOiBpbmNyICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKCB0aWQgPT0gbnRoIC0gMSApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgYmlnX2NodW5rX2luY19jb3VudCA9ICggdHJpcF9jb3VudC9udGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggdHJpcF9jb3VudCAlIG50aCApID8gMSA6IDApICkgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBUIG9sZF91cHBlciA9ICpwdXBwZXI7CisKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorCisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gdGlkICogYmlnX2NodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBiaWdfY2h1bmtfaW5jX2NvdW50IC0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om14OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSBvbGRfdXBwZXIgJiYgKnB1cHBlciA+IG9sZF91cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICpwdXBwZXIgPiBvbGRfdXBwZXIgKSAqcHVwcGVyID0gb2xkX3VwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPiAqcGxvd2VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bW47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyID49IG9sZF91cHBlciAmJiAqcHVwcGVyIDwgb2xkX3VwcGVyIC0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKnB1cHBlciA8IG9sZF91cHBlciApICpwdXBwZXIgPSBvbGRfdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgU1Qgc3BhbjsKKyAgICAgICAgICAgIGlmICggY2h1bmsgPCAxICkgeworICAgICAgICAgICAgICAgIGNodW5rID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwYW4gPSBjaHVuayAqIGluY3I7CisgICAgICAgICAgICAqcHN0cmlkZSA9IHNwYW4gKiBudGg7CisgICAgICAgICAgICAqcGxvd2VyID0gKnBsb3dlciArIChzcGFuICogdGlkKTsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgc3BhbiAtIGluY3I7CisgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAodGlkID09ICgodHJpcF9jb3VudCAtIDEpLyggVVQgKWNodW5rKSAlIG50aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogdW5rbm93biBzY2hlZHVsaW5nIHR5cGUiICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAvLyBSZXBvcnQgbG9vcCBtZXRhZGF0YQorICAgIGlmICggS01QX01BU1RFUl9USUQodGlkKSAmJiBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgJiYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrID09IE5VTEwgJiYKKyNlbmRpZgorICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDEgKQorICAgIHsKKyAgICAgICAga21wX3VpbnQ2NCBjdXJfY2h1bmsgPSBjaHVuazsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIGNodW5rIGluIGNhc2UgaXQgd2FzIG5vdCBzcGVjaWZpZWQ7IGl0IGlzIHNwZWNpZmllZCBmb3Iga21wX3NjaF9zdGF0aWNfY2h1bmtlZAorICAgICAgICBpZiAoIHNjaGVkdHlwZSA9PSBrbXBfc2NoX3N0YXRpYyApIHsKKyAgICAgICAgICAgIGN1cl9jaHVuayA9IHRyaXBfY291bnQgLyBudGggKyAoICggdHJpcF9jb3VudCAlIG50aCApID8gMSA6IDApOworICAgICAgICB9CisgICAgICAgIC8vIDAgLSAic3RhdGljIiBzY2hlZHVsZQorICAgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfbG9vcChsb2MsIDAsIHRyaXBfY291bnQsIGN1cl9jaHVuayk7CisgICAgfQorI2VuZGlmCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBsaXRlcj0lJWQgbG93ZXI9JSUlcyB1cHBlcj0lJSVzIHN0cmlkZSA9ICUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJWQgcmV0dXJuXG4iLCBnbG9iYWxfdGlkICkgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKAorICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkLCB0ZWFtX2luZm8tPm1pY3JvdGFzayk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm47Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXN0X2Zvcl9zdGF0aWNfaW5pdCgKKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbG93ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAqcHN0cmlkZSwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgY2h1bmsKKykgeworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRElTVFJJQlVURSk7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIHRpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICBudGg7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgdGVhbV9pZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICBudGVhbXM7CisgICAgcmVnaXN0ZXIgVVQgICAgICAgICAgdHJpcF9jb3VudDsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKiB0aDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYXN0aXRlciAmJiBwbG93ZXIgJiYgcHVwcGVyICYmIHB1cHBlckRpc3QgJiYgcHN0cmlkZSApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQgY2FsbGVkICglZClcbiIsIGd0aWQpKTsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdDogVCMlJWQgc2NoZWRMb29wPSUlZCBsaXRlcj0lJWQgIlwKKyAgICAgICAgICAgICJpdGVyPSglJSVzLCAlJSVzLCAlJSVzKSBjaHVuaz0lJSVzIHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ3RpZCwgc2NoZWR1bGUsICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICpwbG93ZXIsICpwdXBwZXIsIGluY3IsIGNodW5rICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGd0aWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIGlmKCBpbmNyID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgICAgIGlmKCBpbmNyID4gMCA/ICgqcHVwcGVyIDwgKnBsb3dlcikgOiAoKnBsb3dlciA8ICpwdXBwZXIpICkgeworICAgICAgICAgICAgLy8gVGhlIGxvb3AgaXMgaWxsZWdhbC4KKyAgICAgICAgICAgIC8vIFNvbWUgemVyby10cmlwIGxvb3BzIG1haW50YWluZWQgYnkgY29tcGlsZXIsIGUuZy46CisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDsrK2kpIC8vIGxvd2VyID49IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPjEwOy0taSkgLy8gbG93ZXIgPD0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7KytpKSAvLyBpbmNyID4gMCAgICAgICAtIGNvbXBpbGUtdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPDA7LS1pKSAvLyBpbmNyIDwgMCAgICAgICAtIGNvbXBpbGUtdGltZSBjaGVjaworICAgICAgICAgICAgLy8gQ29tcGlsZXIgZG9lcyBub3QgY2hlY2sgdGhlIGZvbGxvd2luZyBpbGxlZ2FsIGxvb3BzOgorICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k8MTA7aSs9aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k+MDtpLT1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNySWxsZWdhbCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIG50aCA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgIHRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2spOyAgIC8vIHdlIGFyZSBpbiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgbnRlYW1zID0gdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zOworICAgICNlbmRpZgorICAgIHRlYW1faWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50ZWFtcyA9PSB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2MpOworCisgICAgLy8gY29tcHV0ZSBnbG9iYWwgdHJpcCBjb3VudAorICAgIGlmKCBpbmNyID09IDEgKSB7CisgICAgICAgIHRyaXBfY291bnQgPSAqcHVwcGVyIC0gKnBsb3dlciArIDE7CisgICAgfSBlbHNlIGlmKGluY3IgPT0gLTEpIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmlwX2NvdW50ID0gKFNUKSgqcHVwcGVyIC0gKnBsb3dlcikgLyBpbmNyICsgMTsgLy8gY2FzdCB0byBzaWduZWQgdG8gY292ZXIgaW5jcjwwIGNhc2UKKyAgICB9CisKKyAgICAqcHN0cmlkZSA9ICpwdXBwZXIgLSAqcGxvd2VyOyAgLy8ganVzdCBpbiBjYXNlIChjYW4gYmUgdW51c2VkKQorICAgIGlmKCB0cmlwX2NvdW50IDw9IG50ZWFtcyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkCisgICAgICAgICk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgLy8gb25seSBtYXN0ZXJzIG9mIHNvbWUgdGVhbXMgZ2V0IHNpbmdsZSBpdGVyYXRpb24sIG90aGVyIHRocmVhZHMgZ2V0IG5vdGhpbmcKKyAgICAgICAgaWYoIHRlYW1faWQgPCB0cmlwX2NvdW50ICYmIHRpZCA9PSAwICkgeworICAgICAgICAgICAgKnB1cHBlciA9ICpwdXBwZXJEaXN0ID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0ZWFtX2lkICogaW5jcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gKnB1cHBlcjsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gY29tcGlsZXIgc2hvdWxkIHNraXAgbG9vcCBib2R5CisgICAgICAgIH0KKyAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSAwICYmIHRlYW1faWQgPT0gdHJpcF9jb3VudCAtIDEgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBHZXQgdGhlIHRlYW0ncyBjaHVuayBmaXJzdCAoZWFjaCB0ZWFtIGdldHMgYXQgbW9zdCBvbmUgY2h1bmspCisgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICByZWdpc3RlciBVVCBjaHVua0QgPSB0cmlwX2NvdW50IC8gbnRlYW1zOworICAgICAgICAgICAgcmVnaXN0ZXIgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50ZWFtczsKKyAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICggdGVhbV9pZCAqIGNodW5rRCArICggdGVhbV9pZCA8IGV4dHJhcyA/IHRlYW1faWQgOiBleHRyYXMgKSApOworICAgICAgICAgICAgKnB1cHBlckRpc3QgPSAqcGxvd2VyICsgY2h1bmtEICogaW5jciAtICggdGVhbV9pZCA8IGV4dHJhcyA/IDAgOiBpbmNyICk7CisgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRlYW1faWQgPT0gbnRlYW1zIC0gMSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVnaXN0ZXIgVCBjaHVua19pbmNfY291bnQgPQorICAgICAgICAgICAgICAgICggdHJpcF9jb3VudCAvIG50ZWFtcyArICggKCB0cmlwX2NvdW50ICUgbnRlYW1zICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICByZWdpc3RlciBUIHVwcGVyID0gKnB1cHBlcjsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKTsKKyAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAqcGxvd2VyICs9IHRlYW1faWQgKiBjaHVua19pbmNfY291bnQ7CisgICAgICAgICAgICAqcHVwcGVyRGlzdCA9ICpwbG93ZXIgKyBjaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICAgICAgLy8gQ2hlY2svY29ycmVjdCBib3VuZHMgaWYgbmVlZGVkCisgICAgICAgICAgICBpZiggaW5jciA+IDAgKSB7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0IDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPD0gdXBwZXIgJiYgKnB1cHBlckRpc3QgPiB1cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0ID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgIGlmKCAqcGxvd2VyID4gKnB1cHBlckRpc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcHVwcGVyRGlzdDsgIC8vIG5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgdGVhbQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyRGlzdCA+ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyID49IHVwcGVyICYmICpwdXBwZXJEaXN0IDwgdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyRGlzdCA8IHVwcGVyICkKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlckRpc3QgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICBpZiggKnBsb3dlciA8ICpwdXBwZXJEaXN0ICkgeworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnB1cHBlckRpc3Q7ICAvLyBubyBpdGVyYXRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHRlYW0KKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEdldCB0aGUgcGFyYWxsZWwgbG9vcCBjaHVuayBub3cgKGZvciB0aHJlYWQpCisgICAgICAgIC8vIGNvbXB1dGUgdHJpcCBjb3VudCBmb3IgdGVhbSdzIGNodW5rCisgICAgICAgIGlmKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlckRpc3QgLSAqcGxvd2VyICsgMTsKKyAgICAgICAgfSBlbHNlIGlmKGluY3IgPT0gLTEpIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlckRpc3QgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJpcF9jb3VudCA9IChTVCkoKnB1cHBlckRpc3QgLSAqcGxvd2VyKSAvIGluY3IgKyAxOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRyaXBfY291bnQgKTsKKyAgICAgICAgc3dpdGNoKCBzY2hlZHVsZSApIHsKKyAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHRyaXBfY291bnQgPD0gbnRoICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgICAgICAgICApOyAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAgICAgaWYoIHRpZCA8IHRyaXBfY291bnQgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0aWQgKiBpbmNyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgKyBpbmNyOyAvLyBubyBpdGVyYXRpb25zIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgIGlmKCAqcGxhc3RpdGVyICE9IDAgJiYgISggdGlkID09IHRyaXBfY291bnQgLSAxICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGNodW5rTCA9IHRyaXBfY291bnQgLyBudGg7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGV4dHJhcyA9IHRyaXBfY291bnQgJSBudGg7CisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICh0aWQgKiBjaHVua0wgKyAodGlkIDwgZXh0cmFzID8gdGlkIDogZXh0cmFzKSk7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmtMICogaW5jciAtICh0aWQgPCBleHRyYXMgPyAwIDogaW5jcik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEoIHRpZCA9PSBudGggLSAxICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgY2h1bmtfaW5jX2NvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICggdHJpcF9jb3VudCAvIG50aCArICggKCB0cmlwX2NvdW50ICUgbnRoICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgdXBwZXIgPSAqcHVwcGVyRGlzdDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAgICAgICAgICAgICAqcGxvd2VyICs9IHRpZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBjaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICBpZiggaW5jciA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA8ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwbGFzdGl0ZXIgIT0gMCAmJiAhKCpwbG93ZXIgPD0gdXBwZXIgJiYgKnB1cHBlciA+IHVwcGVyIC0gaW5jcikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSB1cHBlcjsvL3RyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA+ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwbGFzdGl0ZXIgIT0gMCAmJiAhKCpwbG93ZXIgPj0gdXBwZXIgJiYgKnB1cHBlciA8IHVwcGVyIC0gaW5jcikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSB1cHBlcjsvL3RyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFNUIHNwYW47CisgICAgICAgICAgICBpZiggY2h1bmsgPCAxICkKKyAgICAgICAgICAgICAgICBjaHVuayA9IDE7CisgICAgICAgICAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICAgICAgICAgKnBzdHJpZGUgPSBzcGFuICogbnRoOworICAgICAgICAgICAgKnBsb3dlciA9ICpwbG93ZXIgKyAoc3BhbiAqIHRpZCk7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIHNwYW4gLSBpbmNyOworICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEodGlkID09ICgodHJpcF9jb3VudCAtIDEpIC8gKCBVVCApY2h1bmspICUgbnRoKSApCisgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiB1bmtub3duIGxvb3Agc2NoZWR1bGluZyB0eXBlIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZW5kOjsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdDogbGFzdD0lJWQgbG89JSUlcyB1cD0lJSVzIHVwRGlzdD0lJSVzICJcCisgICAgICAgICAgICAic3RyaWRlPSUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwdXBwZXJEaXN0LCAqcHN0cmlkZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ3RpZCApICk7CisgICAgcmV0dXJuOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9zdGF0aWNfaW5pdCgKKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwX2xhc3QsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBfc3QsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGluY3IsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGNodW5rCispIHsKKyAgICAvLyBUaGUgcm91dGluZSByZXR1cm5zIHRoZSBmaXJzdCBjaHVuayBkaXN0cmlidXRlZCB0byB0aGUgdGVhbSBhbmQKKyAgICAvLyBzdHJpZGUgZm9yIG5leHQgY2h1bmtzIGNhbGN1bGF0aW9uLgorICAgIC8vIExhc3QgaXRlcmF0aW9uIGZsYWcgc2V0IGZvciB0aGUgdGVhbSB0aGF0IHdpbGwgZXhlY3V0ZQorICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC4KKyAgICAvLyBUaGUgcm91dGluZSBpcyBjYWxsZWQgZm9yIGRpc3Rfc2NoZWR1ZShzdGF0aWMsY2h1bmspIG9ubHkuCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIGttcF91aW50MzIgIHRlYW1faWQ7CisgICAga21wX3VpbnQzMiAgbnRlYW1zOworICAgIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgVCAgICAgICAgICAgbG93ZXI7CisgICAgVCAgICAgICAgICAgdXBwZXI7CisgICAgU1QgICAgICAgICAgc3BhbjsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggcF9sYXN0ICYmIHBfbGIgJiYgcF91YiAmJiBwX3N0ICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3RlYW1fc3RhdGljX2luaXQgY2FsbGVkICglZClcbiIsIGd0aWQpKTsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCAiX19rbXBfdGVhbV9zdGF0aWNfaW5pdCBlbnRlcjogVCMlJWQgbGl0ZXI9JSVkICJcCisgICAgICAgICAgICAiaXRlcj0oJSUlcywgJSUlcywgJSUlcykgY2h1bmsgJSUlczsgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCAqcF9sYXN0LCAqcF9sYiwgKnBfdWIsICpwX3N0LCBjaHVuayApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGxvd2VyID0gKnBfbGI7CisgICAgdXBwZXIgPSAqcF91YjsKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggaW5jciA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggaW5jciA+IDAgPyAodXBwZXIgPCBsb3dlcikgOiAobG93ZXIgPCB1cHBlcikgKSB7CisgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBpbGxlZ2FsLgorICAgICAgICAgICAgLy8gU29tZSB6ZXJvLXRyaXAgbG9vcHMgbWFpbnRhaW5lZCBieSBjb21waWxlciwgZS5nLjoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOysraSkgLy8gbG93ZXIgPj0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7LS1pKSAvLyBsb3dlciA8PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDsrK2kpIC8vIGluY3IgPiAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDstLWkpIC8vIGluY3IgPCAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyBDb21waWxlciBkb2VzIG5vdCBjaGVjayB0aGUgZm9sbG93aW5nIGlsbGVnYWwgbG9vcHM6CisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aTwxMDtpKz1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aT4wO2ktPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrKTsgICAvLyB3ZSBhcmUgaW4gdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgIG50ZWFtcyA9IHRoLT50aC50aF90ZWFtc19zaXplLm50ZWFtczsKKyAgICAjZW5kaWYKKyAgICB0ZWFtX2lkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGVhbXMgPT0gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jKTsKKworICAgIC8vIGNvbXB1dGUgdHJpcCBjb3VudAorICAgIGlmKCBpbmNyID09IDEgKSB7CisgICAgICAgIHRyaXBfY291bnQgPSB1cHBlciAtIGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gbG93ZXIgLSB1cHBlciArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJpcF9jb3VudCA9IChTVCkodXBwZXIgLSBsb3dlcikgLyBpbmNyICsgMTsgLy8gY2FzdCB0byBzaWduZWQgdG8gY292ZXIgaW5jcjwwIGNhc2UKKyAgICB9CisgICAgaWYoIGNodW5rIDwgMSApCisgICAgICAgIGNodW5rID0gMTsKKyAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICpwX3N0ID0gc3BhbiAqIG50ZWFtczsKKyAgICAqcF9sYiA9IGxvd2VyICsgKHNwYW4gKiB0ZWFtX2lkKTsKKyAgICAqcF91YiA9ICpwX2xiICsgc3BhbiAtIGluY3I7CisgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisgICAgICAgICpwX2xhc3QgPSAodGVhbV9pZCA9PSAoKHRyaXBfY291bnQgLSAxKS8oVVQpY2h1bmspICUgbnRlYW1zKTsKKyAgICAvLyBDb3JyZWN0IHVwcGVyIGJvdW5kIGlmIG5lZWRlZAorICAgIGlmKCBpbmNyID4gMCApIHsKKyAgICAgICAgaWYoICpwX3ViIDwgKnBfbGIgKSAvLyBvdmVyZmxvdz8KKyAgICAgICAgICAgICpwX3ViID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgIGlmKCAqcF91YiA+IHVwcGVyICkKKyAgICAgICAgICAgICpwX3ViID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgfSBlbHNlIHsgICAvLyBpbmNyIDwgMAorICAgICAgICBpZiggKnBfdWIgPiAqcF9sYiApCisgICAgICAgICAgICAqcF91YiA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICBpZiggKnBfdWIgPCB1cHBlciApCisgICAgICAgICAgICAqcF91YiA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgIH0KKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCAiX19rbXBfdGVhbV9zdGF0aWNfaW5pdCBleGl0OiBUIyUlZCB0ZWFtJSV1IGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIGNodW5rICUlJXNcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCB0ZWFtX2lkLCAqcF9sYXN0LCAqcF9sYiwgKnBfdWIsICpwX3N0LCBjaHVuayApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZXh0ZXJuICJDIiB7CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gICAgbG9jICAgICAgIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gICAgZ3RpZCAgICAgIEdsb2JhbCB0aHJlYWQgaWQgb2YgdGhpcyB0aHJlYWQKK0BwYXJhbSAgICBzY2hlZHR5cGUgIFNjaGVkdWxpbmcgdHlwZQorQHBhcmFtICAgIHBsYXN0aXRlciBQb2ludGVyIHRvIHRoZSAibGFzdCBpdGVyYXRpb24iIGZsYWcKK0BwYXJhbSAgICBwbG93ZXIgICAgUG9pbnRlciB0byB0aGUgbG93ZXIgYm91bmQKK0BwYXJhbSAgICBwdXBwZXIgICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQKK0BwYXJhbSAgICBwc3RyaWRlICAgUG9pbnRlciB0byB0aGUgc3RyaWRlCitAcGFyYW0gICAgaW5jciAgICAgIExvb3AgaW5jcmVtZW50CitAcGFyYW0gICAgY2h1bmsgICAgIFRoZSBjaHVuayBzaXplCisKK0VhY2ggb2YgdGhlIGZvdXIgZnVuY3Rpb25zIGhlcmUgYXJlIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSBhcmd1bWVudCB0eXBlcy4KKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGUgdG8gYmUgdXNlZCBmb3IgdGhlIHNldCBvZiBpdGVyYXRpb25zCit0byBiZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0aHJlYWQgZnJvbSB0aGUgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcCB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUKK2luaXRpYWwgdmFsdWVzIG9mIHRoZSBib3VuZHMsIHN0cmlkZSwgaW5jcmVtZW50IGFuZCBjaHVuayBzaXplLgorCitAeworKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwbG93ZXIsIGttcF9pbnQzMiAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfaW50MzIgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKnBsb3dlciwga21wX3VpbnQzMiAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfdWludDMyID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcGxvd2VyLCBrbXBfaW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDY0ID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpwbG93ZXIsIGttcF91aW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX3VpbnQ2NCA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorLyohCitAfQorKi8KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSAgICBsb2MgICAgICAgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSAgICBndGlkICAgICAgR2xvYmFsIHRocmVhZCBpZCBvZiB0aGlzIHRocmVhZAorQHBhcmFtICAgIHNjaGVkdWxlICBTY2hlZHVsaW5nIHR5cGUgZm9yIHRoZSBwYXJhbGxlbCBsb29wCitAcGFyYW0gICAgcGxhc3RpdGVyIFBvaW50ZXIgdG8gdGhlICJsYXN0IGl0ZXJhdGlvbiIgZmxhZworQHBhcmFtICAgIHBsb3dlciAgICBQb2ludGVyIHRvIHRoZSBsb3dlciBib3VuZAorQHBhcmFtICAgIHB1cHBlciAgICBQb2ludGVyIHRvIHRoZSB1cHBlciBib3VuZCBvZiBsb29wIGNodW5rCitAcGFyYW0gICAgcHVwcGVyRCAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIG9mIGRpc3RfY2h1bmsKK0BwYXJhbSAgICBwc3RyaWRlICAgUG9pbnRlciB0byB0aGUgc3RyaWRlIGZvciBwYXJhbGxlbCBsb29wCitAcGFyYW0gICAgaW5jciAgICAgIExvb3AgaW5jcmVtZW50CitAcGFyYW0gICAgY2h1bmsgICAgIFRoZSBjaHVuayBzaXplIGZvciB0aGUgcGFyYWxsZWwgbG9vcAorCitFYWNoIG9mIHRoZSBmb3VyIGZ1bmN0aW9ucyBoZXJlIGFyZSBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgYXJndW1lbnQgdHlwZXMuCisKK1RoZSBmdW5jdGlvbnMgY29tcHV0ZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBhbmQgc3RyaWRlcyB0byBiZSB1c2VkIGZvciB0aGUgc2V0IG9mIGl0ZXJhdGlvbnMKK3RvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBzdGF0aWNhbGx5IHNjaGVkdWxlZCBsb29wIHRoYXQgaXMgZGVzY3JpYmVkIGJ5IHRoZQoraW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGJvdW5kcywgc3RyaWRlcywgaW5jcmVtZW50IGFuZCBjaHVua3MgZm9yIHBhcmFsbGVsIGxvb3AgYW5kIGRpc3RyaWJ1dGUKK2NvbnN0cnVjdHMuCisKK0B7CisqLwordm9pZAorX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdWxlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICBrbXBfaW50MzIgKnBsb3dlciwga21wX2ludDMyICpwdXBwZXIsIGttcF9pbnQzMiAqcHVwcGVyRCwKKyAgICBrbXBfaW50MzIgKnBzdHJpZGUsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIF9fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0PCBrbXBfaW50MzIgPigKKyAgICAgICAgbG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzR1KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAga21wX3VpbnQzMiAqcGxvd2VyLCBrbXBfdWludDMyICpwdXBwZXIsIGttcF91aW50MzIgKnB1cHBlckQsCisgICAga21wX2ludDMyICpwc3RyaWRlLCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBfX2ttcF9kaXN0X2Zvcl9zdGF0aWNfaW5pdDwga21wX3VpbnQzMiA+KAorICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdWxlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwdXBwZXJELCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfOCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR1bGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgIGttcF9pbnQ2NCAqcGxvd2VyLCBrbXBfaW50NjQgKnB1cHBlciwga21wX2ludDY0ICpwdXBwZXJELAorICAgIGttcF9pbnQ2NCAqcHN0cmlkZSwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8IGttcF9pbnQ2NCA+KAorICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdWxlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwdXBwZXJELCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfOHUoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdWxlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICBrbXBfdWludDY0ICpwbG93ZXIsIGttcF91aW50NjQgKnB1cHBlciwga21wX3VpbnQ2NCAqcHVwcGVyRCwKKyAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0PCBrbXBfdWludDY0ID4oCisgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR1bGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisvKiEKK0B9CisqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdXhpbGlhcnkgcm91dGluZXMgZm9yIERpc3RyaWJ1dGUgUGFyYWxsZWwgTG9vcCBjb25zdHJ1Y3QgaW1wbGVtZW50YXRpb24KKy8vICAgIFRyYW5zZmVyIGNhbGwgdG8gdGVtcGxhdGU8IHR5cGUgVCA+CisvLyAgICBfX2ttcF90ZWFtX3N0YXRpY19pbml0KCBpZGVudF90ICpsb2MsIGludCBndGlkLAorLy8gICAgICAgIGludCAqcF9sYXN0LCBUICpsYiwgVCAqdWIsIFNUICpzdCwgU1QgaW5jciwgU1QgY2h1bmsgKQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHsKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gcF9sYXN0IHBvaW50ZXIgdG8gbGFzdCBpdGVyYXRpb24gZmxhZworQHBhcmFtIHBfbGIgIHBvaW50ZXIgdG8gTG93ZXIgYm91bmQKK0BwYXJhbSBwX3ViICBwb2ludGVyIHRvIFVwcGVyIGJvdW5kCitAcGFyYW0gcF9zdCAgU3RlcCAob3IgaW5jcmVtZW50IGlmIHlvdSBwcmVmZXIpCitAcGFyYW0gaW5jciAgTG9vcCBpbmNyZW1lbnQKK0BwYXJhbSBjaHVuayBUaGUgY2h1bmsgc2l6ZSB0byBibG9jayB3aXRoCisKK1RoZSBmdW5jdGlvbnMgY29tcHV0ZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBhbmQgc3RyaWRlIHRvIGJlIHVzZWQgZm9yIHRoZSBzZXQgb2YgaXRlcmF0aW9ucwordG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGN1cnJlbnQgdGVhbSBmcm9tIHRoZSBzdGF0aWNhbGx5IHNjaGVkdWxlZCBsb29wIHRoYXQgaXMgZGVzY3JpYmVkIGJ5IHRoZQoraW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGJvdW5kcywgc3RyaWRlLCBpbmNyZW1lbnQgYW5kIGNodW5rIGZvciB0aGUgZGlzdHJpYnV0ZSBjb25zdHJ1Y3QgYXMgcGFydCBvZgorY29tcG9zaXRlIGRpc3RyaWJ1dGUgcGFyYWxsZWwgbG9vcCBjb25zdHJ1Y3QuCitUaGVzZSBmdW5jdGlvbnMgYXJlIGFsbCBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4KKyovCisKK3ZvaWQKK19fa21wY190ZWFtX3N0YXRpY19pbml0XzQoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAga21wX2ludDMyICpwX2xiLCBrbXBfaW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNHUoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAga21wX3VpbnQzMiAqcF9sYiwga21wX3VpbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0LCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQ8IGttcF91aW50MzIgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX3RlYW1fc3RhdGljX2luaXRfOCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICBrbXBfaW50NjQgKnBfbGIsIGttcF9pbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0LCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84dSgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICBrbXBfdWludDY0ICpwX2xiLCBrbXBfdWludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCwgaW5jciwgY2h1bmsgKTsKK30KKy8qIQorQH0KKyovCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzU3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuYwpAQCAtMCwwICsxLDU0NjkgQEAKKy8qCisgKiBrbXBfc2V0dGluZ3MuYyAtLSBJbml0aWFsaXplIGVudmlyb25tZW50IHZhcmlhYmxlcworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX3NldHRpbmdzLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKworc3RhdGljIGludCBfX2ttcF9lbnZfdG9QcmludCggY2hhciBjb25zdCAqIG5hbWUsIGludCBmbGFnICk7CisKK2Jvb2wgX19rbXBfZW52X2Zvcm1hdCA9IDA7IC8vIDAgLSBvbGQgZm9ybWF0OyAxIC0gbmV3IGZvcm1hdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHN0cmluZyBmdW5jdGlvbnMuIFN1YmplY3QgdG8gbW92ZSB0byBrbXBfc3RyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgZG91YmxlCitfX2ttcF9jb252ZXJ0X3RvX2RvdWJsZSggY2hhciBjb25zdCAqIHMgKQoreworICAgIGRvdWJsZSByZXN1bHQ7CisKKyAgICBpZiAoIEtNUF9TU0NBTkYoIHMsICIlbGYiLCAmcmVzdWx0ICkgPCAxICkgeworICAgICAgICByZXN1bHQgPSAwLjA7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIEtNUF9ERUJVRworc3RhdGljIHVuc2lnbmVkIGludAorX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKGNoYXIgKmRlc3QsIGNoYXIgY29uc3QgKiBzcmMsIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCgqc3JjID09ICdcMCcpIHx8ICgqc3JjID09IHNlbnRpbmVsKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKihkZXN0KyspID0gKihzcmMrKyk7CisgICAgfQorICAgICpkZXN0ID0gJ1wwJzsKKyAgICByZXR1cm4gaTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitfX2ttcF9tYXRjaF93aXRoX3NlbnRpbmVsKCBjaGFyIGNvbnN0ICogYSwgY2hhciBjb25zdCAqIGIsIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwgKSB7CisgICAgc2l6ZV90IGwgPSAwOworCisgICAgaWYoYSA9PSBOVUxMKQorICAgICAgICBhID0gIiI7CisgICAgaWYoYiA9PSBOVUxMKQorICAgICAgICBiID0gIiI7CisgICAgd2hpbGUoKmEgJiYgKmIgJiYgKmIgIT0gc2VudGluZWwpIHsKKyAgICAgICAgY2hhciBjYSA9ICphLCBjYiA9ICpiOworCisgICAgICAgIGlmKGNhID49ICdhJyAmJiBjYSA8PSAneicpCisgICAgICAgICAgICBjYSAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNhICE9IGNiKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICArK2w7CisgICAgICAgICsrYTsKKyAgICAgICAgKytiOworICAgIH0KKyAgICByZXR1cm4gbCA+PSBsZW47Cit9CisKKy8vCisvLyBFeHBlY3RlZCB1c2FnZToKKy8vICAgICB0b2tlbiBpcyB0aGUgdG9rZW4gdG8gY2hlY2sgZm9yLgorLy8gICAgIGJ1ZiBpcyB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZC4KKy8vICAgICAqZW5kIHJldHVybnMgdGhlIGNoYXIgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdG9rZW4uCisvLyAgICAgICAgaXQgaXMgbm90IG1vZGlmaWVkIHVubGVzcyBhIG1hdGNoIG9jY3Vycy4KKy8vCisvLworLy8gRXhhbXBsZSAxOgorLy8KKy8vICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ0b2tlbiIsIGJ1ZiwgKmVuZCkgeworLy8gICAgICAgICA8ZG8gc29tZXRoaW5nPgorLy8gICAgICAgICBidWYgPSBlbmQ7CisvLyAgICAgfQorLy8KKy8vICBFeGFtcGxlIDI6CisvLworLy8gICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoInRva2VuIiwgYnVmLCAqZW5kKSB7CisvLyAgICAgICAgIGNoYXIgKnNhdmUgPSAqKmVuZDsKKy8vICAgICAgICAgKiplbmQgPSBzZW50aW5lbDsKKy8vICAgICAgICAgPHVzZSBhbnkgb2YgdGhlIF9fa21wKl93aXRoX3NlbnRpbmVsKCkgZnVuY3Rpb25zPgorLy8gICAgICAgICAqKmVuZCA9IHNhdmU7CisvLyAgICAgICAgIGJ1ZiA9IGVuZDsKKy8vICAgICB9CisvLworCitzdGF0aWMgaW50CitfX2ttcF9tYXRjaF9zdHIoIGNoYXIgY29uc3QgKnRva2VuLCBjaGFyIGNvbnN0ICpidWYsIGNvbnN0IGNoYXIgKiplbmQpIHsKKworICAgIEtNUF9BU1NFUlQodG9rZW4gIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVChidWYgIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVChlbmQgIT0gTlVMTCk7CisKKyAgICB3aGlsZSAoKnRva2VuICYmICpidWYpIHsKKyAgICAgICAgY2hhciBjdCA9ICp0b2tlbiwgY2IgPSAqYnVmOworCisgICAgICAgIGlmKGN0ID49ICdhJyAmJiBjdCA8PSAneicpCisgICAgICAgICAgICBjdCAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjdCAhPSBjYikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgKyt0b2tlbjsKKyAgICAgICAgKytidWY7CisgICAgfQorICAgIGlmICgqdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAqZW5kID0gYnVmOworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBzaXplX3QKK19fa21wX3JvdW5kNGsoIHNpemVfdCBzaXplICkgeworICAgIHNpemVfdCBfNGsgPSA0ICogMTAyNDsKKyAgICBpZiAoIHNpemUgJiAoIF80ayAtIDEgKSApIHsKKyAgICAgICAgc2l6ZSAmPSB+ICggXzRrIC0gMSApOworICAgICAgICBpZiAoIHNpemUgPD0gS01QX1NJWkVfVF9NQVggLSBfNGsgKSB7CisgICAgICAgICAgICBzaXplICs9IF80azsgICAgLy8gUm91bmQgdXAgaWYgdGhlcmUgaXMgbm8gb3ZlcmZsb3cuCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gc2l6ZTsKK30gLy8gX19rbXBfcm91bmQ0aworCisKKy8qCisgICAgSGVyZSwgbXVsdGlwbGllcnMgYXJlIGxpa2UgX19rbXBfY29udmVydF90b19zZWNvbmRzLCBidXQgZmxvYXRpbmctcG9pbnQKKyAgICB2YWx1ZXMgYXJlIGFsbG93ZWQsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIG1pbGxpc2Vjb25kcy4gIFRoZSBkZWZhdWx0CisgICAgbXVsdGlwbGllciBpcyBtaWxsaXNlY29uZHMuICBSZXR1cm5zIElOVF9NQVggb25seSBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkCisgICAgbWF0Y2hlcyAiaW5maW5pdCoiLiAgUmV0dXJucyAtMSBpZiBzcGVjaWZpZWQgc3RyaW5nIGlzIGludmFsaWQuCisqLworaW50CitfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggY2hhciBjb25zdCAqIGRhdGEgKQoreworICAgIGludCByZXQsIG52YWx1ZXMsIGZhY3RvcjsKKyAgICBjaGFyIG11bHQsIGV4dHJhOworICAgIGRvdWJsZSB2YWx1ZTsKKworICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAoLTEpOworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiaW5maW5pdCIsIC0xLCBkYXRhKSkgcmV0dXJuIChJTlRfTUFYKTsKKyAgICB2YWx1ZSA9IChkb3VibGUpIDAuMDsKKyAgICBtdWx0ID0gJ1wwJzsKKyAgICBudmFsdWVzID0gS01QX1NTQ0FORiAoZGF0YSwgIiVsZiVjJWMiLCAmdmFsdWUsICZtdWx0LCAmZXh0cmEpOworICAgIGlmIChudmFsdWVzIDwgMSkgcmV0dXJuICgtMSk7CisgICAgaWYgKG52YWx1ZXMgPT0gMSkgbXVsdCA9ICdcMCc7CisgICAgaWYgKG52YWx1ZXMgPT0gMykgcmV0dXJuICgtMSk7CisKKyAgICBpZiAodmFsdWUgPCAwKSAgICByZXR1cm4gKC0xKTsKKworICAgIHN3aXRjaCAobXVsdCkgeworICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgLyogIGRlZmF1bHQgaXMgbWlsbGlzZWNvbmRzICAqLworICAgICAgICBmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdzJzogY2FzZSAnUyc6CisgICAgICAgIGZhY3RvciA9IDEwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiA2MCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiAyNCAqIDYwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIGlmICggdmFsdWUgPj0gKCAoSU5UX01BWC0xKSAvIGZhY3RvcikgKQorICAgICAgICByZXQgPSBJTlRfTUFYLTE7ICAgICAgICAvKiBEb24ndCBhbGxvdyBpbmZpbml0ZSB2YWx1ZSBoZXJlICovCisgICAgZWxzZQorICAgICAgICByZXQgPSAoaW50KSAodmFsdWUgKiAoZG91YmxlKSBmYWN0b3IpOyAgLyogdHJ1bmNhdGUgdG8gaW50ICAqLworCisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50CitfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoIGNoYXIgY29uc3QgKiBhLCBjaGFyIGNvbnN0ICogYiwgY2hhciBzZW50aW5lbCApIHsKKyAgICBpZihhID09IE5VTEwpCisgICAgICAgIGEgPSAiIjsKKyAgICBpZihiID09IE5VTEwpCisgICAgICAgIGIgPSAiIjsKKyAgICB3aGlsZSgqYSAmJiAqYiAmJiAqYiAhPSBzZW50aW5lbCkgeworICAgICAgICBjaGFyIGNhID0gKmEsIGNiID0gKmI7CisKKyAgICAgICAgaWYoY2EgPj0gJ2EnICYmIGNhIDw9ICd6JykKKyAgICAgICAgICAgIGNhIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2IgPj0gJ2EnICYmIGNiIDw9ICd6JykKKyAgICAgICAgICAgIGNiIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2EgIT0gY2IpCisgICAgICAgICAgICByZXR1cm4gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmI7CisgICAgICAgICsrYTsKKyAgICAgICAgKytiOworICAgIH0KKyAgICByZXR1cm4gKmEgPworICAgICAgICAoKmIgJiYgKmIgIT0gc2VudGluZWwpID8gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmIgOiAxIDoKKyAgICAgICAgKCpiICYmICpiICE9IHNlbnRpbmVsKSA/IC0xIDogMDsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUYWJsZSBzdHJ1Y3R1cmVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zZXR0aW5nICAgICAgICBrbXBfc2V0dGluZ190OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEgICAga21wX3N0Z19zc19kYXRhX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YSAgICBrbXBfc3RnX3dwX2RhdGFfdDsKK3R5cGVkZWYgc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhICAgIGttcF9zdGdfZnJfZGF0YV90OworCit0eXBlZGVmIHZvaWQgKCAqIGttcF9zdGdfcGFyc2VfZnVuY190ICkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICk7Cit0eXBlZGVmIHZvaWQgKCAqIGttcF9zdGdfcHJpbnRfZnVuY190ICkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApOworCitzdHJ1Y3QgX19rbXBfc2V0dGluZyB7CisgICAgY2hhciBjb25zdCAqICAgICAgICAgbmFtZTsgICAgICAgIC8vIE5hbWUgb2Ygc2V0dGluZyAoZW52aXJvbm1lbnQgdmFyaWFibGUpLgorICAgIGttcF9zdGdfcGFyc2VfZnVuY190IHBhcnNlOyAgICAgICAvLyBQYXJzZXIgZnVuY3Rpb24uCisgICAga21wX3N0Z19wcmludF9mdW5jX3QgcHJpbnQ7ICAgICAgIC8vIFByaW50IGZ1bmN0aW9uLgorICAgIHZvaWQgKiAgICAgICAgICAgICAgIGRhdGE7ICAgICAgICAvLyBEYXRhIHBhc3NlZCB0byBwYXJzZXIgYW5kIHByaW50ZXIuCisgICAgaW50ICAgICAgICAgICAgICAgICAgc2V0OyAgICAgICAgIC8vIFZhcmlhYmxlIHNldCBkdXJpbmcgdGhpcyAic2Vzc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpIG9yIGttcF9zZXRfZGVmYXVsdHMoKSBjYWxsKS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICBkZWZpbmVkOyAgICAgLy8gVmFyaWFibGUgc2V0IGluIGFueSAic2Vzc2lvbiIuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc2V0dGluZworCitzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEgeworICAgIHNpemVfdCAgICAgICAgICAgICBmYWN0b3I7ICAvLyBEZWZhdWx0IGZhY3RvcjogMSBmb3IgS01QX1NUQUNLU0laRSwgMTAyNCBmb3Igb3RoZXJzLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z19zc19kYXRhCisKK3N0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YSB7CisgICAgaW50ICAgICAgICAgICAgICAgIG9tcDsgICAgIC8vIDAgLS0gS01QX0xJQlJBUlksIDEgLS0gT01QX1dBSVRfUE9MSUNZLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z193cF9kYXRhCisKK3N0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YSB7CisgICAgaW50ICAgICAgICAgICAgICAgIGZvcmNlOyAgLy8gMCAtLSBLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04sIDEgLS0gS01QX0ZPUkNFX1JFRFVDVElPTi4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzOyAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gcml2YWxzIChpbmNsdWRpbmcgaXRzZWxmKS4KK307IC8vIHN0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YQorCitzdGF0aWMgaW50CitfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCAgICAgICAgICAvLyAwIC0tIE9rLCAxIC0tIGVycm9ycyBmb3VuZC4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgbmFtZSwgICAgIC8vIE5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciBjb25zdCAqICAgICAgIHZhbHVlLCAgICAvLyBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFscyAgICAvLyBMaXN0IG9mIHJpdmFsIHNldHRpbmdzICh0aGUgbGlzdCBtdXN0IGluY2x1ZGUgY3VycmVudCBvbmUpLgorKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgcGFyc2UgZnVuY3Rpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Jvb2woCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGludCAqICAgICAgICBvdXQKKykgeworICAgIGlmICggX19rbXBfc3RyX21hdGNoX3RydWUoIHZhbHVlICkgKSB7CisgICAgICAgICogb3V0ID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggdmFsdWUgKSApIHsKKyAgICAgICAgKiBvdXQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgIEtNUF9NU0coIEJhZEJvb2xWYWx1ZSwgbmFtZSwgdmFsdWUgKSwKKyAgICAgICAgICAgIEtNUF9ITlQoIFZhbGlkQm9vbFZhbHVlcyApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYm9vbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIHNpemVfdCAgICAgICBzaXplX21pbiwKKyAgICBzaXplX3QgICAgICAgc2l6ZV9tYXgsCisgICAgaW50ICogICAgICAgIGlzX3NwZWNpZmllZCwKKyAgICBzaXplX3QgKiAgICAgb3V0LAorICAgIHNpemVfdCAgICAgICBmYWN0b3IKKykgeworICAgIGNoYXIgY29uc3QgKiBtc2cgPSBOVUxMOworICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgIHNpemVfbWluID0gX19rbXBfcm91bmQ0ayggc2l6ZV9taW4gKTsKKyAgICAgICAgc2l6ZV9tYXggPSBfX2ttcF9yb3VuZDRrKCBzaXplX21heCApOworICAgICNlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgaWYgKCBpc19zcGVjaWZpZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICogaXNfc3BlY2lmaWVkID0gMTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX3RvX3NpemUoIHZhbHVlLCBvdXQsIGZhY3RvciwgJiBtc2cgKTsKKyAgICAgICAgaWYgKCBtc2cgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGlmICggKiBvdXQgPiBzaXplX21heCApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgfSBlbHNlIGlmICggKiBvdXQgPCBzaXplX21pbiApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWluOworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAjaWYgS01QX09TX0RBUldJTgorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm91bmQ0ayA9IF9fa21wX3JvdW5kNGsoICogb3V0ICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKiBvdXQgIT0gcm91bmQ0ayApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICogb3V0ID0gcm91bmQ0azsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggTm90TXVsdGlwbGU0SyApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGludGVnZXIgb3ZlcmZsb3cgb2NjdXJyZWQsICogb3V0ID09IEtNUF9TSVpFX1RfTUFYLiBDdXQgaXQgdG8gc2l6ZV9tYXggc2lsZW50bHkuCisgICAgICAgICAgICBpZiAoICogb3V0IDwgc2l6ZV9taW4gKSB7CisgICAgICAgICAgICAgICAgKiBvdXQgPSBzaXplX21heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAqIG91dCA+ICBzaXplX21heCApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoICYgYnVmLCAqIG91dCApOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIG5hbWUsIHZhbHVlLCBtc2cgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwgYnVmLnN0ciApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZiApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zaXplCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0cigKKyAgICBjaGFyIGNvbnN0ICogICAgICBuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgIHZhbHVlLAorICAgIGNoYXIgY29uc3QgKiAqICAgIG91dAorKSB7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogb3V0ICk7CisgICAgKiBvdXQgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCB2YWx1ZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RyCisjZW5kaWYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbnQoCisgICAgY2hhciBjb25zdCAqIG5hbWUsICAgLy8gSTogTmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSAodXNlZCBpbiB3YXJuaW5nIG1lc3NhZ2VzKS4KKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsICAvLyBJOiBWYWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwYXJzZS4KKyAgICBpbnQgICAgICAgICAgbWluLCAgICAvLyBJOiBNaW1pbmFsIGFsbG93ZWQgdmFsdWUuCisgICAgaW50ICAgICAgICAgIG1heCwgICAgLy8gSTogTWF4aW11bSBhbGxvd2VkIHZhbHVlLgorICAgIGludCAqICAgICAgICBvdXQgICAgIC8vIE86IE91dHB1dCAocGFyc2VkKSB2YWx1ZS4KKykgeworICAgIGNoYXIgY29uc3QgKiBtc2cgID0gTlVMTDsKKyAgICBrbXBfdWludDY0ICAgdWludCA9ICogb3V0OworICAgIF9fa21wX3N0cl90b191aW50KCB2YWx1ZSwgJiB1aW50LCAmIG1zZyApOworICAgIGlmICggbXNnID09IE5VTEwgKSB7CisgICAgICAgIGlmICggdWludCA8ICh1bnNpZ25lZCBpbnQpbWluICkgeworICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICB1aW50ID0gbWluOworICAgICAgICB9IGVsc2UgaWYgKCB1aW50ID4gKHVuc2lnbmVkIGludCltYXggKSB7CisgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgIHVpbnQgPSBtYXg7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgb3ZlcmZsb3cgb2NjdXJyZWQgbXNnIGNvbnRhaW5zIGVycm9yIG1lc3NhZ2UgYW5kIHVpbnQgaXMgdmVyeSBiaWcuIEN1dCB0bXAgaXQKKyAgICAgICAgLy8gdG8gSU5UX01BWC4KKyAgICAgICAgaWYgKCB1aW50IDwgKHVuc2lnbmVkIGludCltaW4gKSB7CisgICAgICAgICAgICB1aW50ID0gbWluOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB1aW50ID4gKHVuc2lnbmVkIGludCltYXggKSB7CisgICAgICAgICAgICB1aW50ID0gbWF4OworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIlIiBLTVBfVUlOVDY0X1NQRUMgIiIsIHVpbnQgKTsKKyAgICAgICAgS01QX0lORk9STSggVXNpbmdfdWludDY0X1ZhbHVlLCBuYW1lLCBidWYuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJmJ1ZiApOworICAgIH07IC8vIGlmCisgICAgKiBvdXQgPSB1aW50OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW50CisKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9maWxlKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBjaGFyICogICAgICAgc3VmZml4LAorICAgIGNoYXIgKiAqICAgICBvdXQKKykgeworICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgY2hhciAqdDsKKyAgICBpbnQgaGFzU3VmZml4OworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIG91dCApOworICAgIHQgPSAoY2hhciAqKSBzdHJyY2hyKHZhbHVlLCAnLicpOworICAgIGhhc1N1ZmZpeCA9IHQgJiYgX19rbXBfc3RyX2VxZiggdCwgc3VmZml4ICk7CisgICAgdCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyVzIiwgdmFsdWUsIGhhc1N1ZmZpeCA/ICIiIDogc3VmZml4ICk7CisgICAgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgdCk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUodCk7CisgICAgKiBvdXQgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBidWZmZXIgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZpbGUKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMgY2hhciAqIHBhcl9yYW5nZV90b19wcmludCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBpbnQgKiAgICAgICAgb3V0X3JhbmdlLAorICAgIGNoYXIgKiAgICAgICBvdXRfcm91dGluZSwKKyAgICBjaGFyICogICAgICAgb3V0X2ZpbGUsCisgICAgaW50ICogICAgICAgIG91dF9sYiwKKyAgICBpbnQgKiAgICAgICAgb3V0X3ViCispIHsKKyAgICBzaXplX3QgbGVuID0gS01QX1NUUkxFTiggdmFsdWUgKyAxICk7CisgICAgcGFyX3JhbmdlX3RvX3ByaW50ID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICsxICk7CisgICAgS01QX1NUUk5DUFlfUyggcGFyX3JhbmdlX3RvX3ByaW50LCBsZW4gKyAxLCB2YWx1ZSwgbGVuICsgMSk7CisgICAgX19rbXBfcGFyX3JhbmdlID0gKzE7CisgICAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKKyAgICBfX2ttcF9wYXJfcmFuZ2VfdWIgPSBJTlRfTUFYOworICAgIGZvciAoOzspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGxlbjsKKyAgICAgICAgaWYgKCggdmFsdWUgPT0gTlVMTCApIHx8ICggKnZhbHVlID09ICdcMCcgKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggInJvdXRpbmUiLCB2YWx1ZSwgJz0nICkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJz0nICkgKyAxOworICAgICAgICAgICAgbGVuID0gX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKCBvdXRfcm91dGluZSwKKyAgICAgICAgICAgICAgdmFsdWUsIEtNUF9QQVJfUkFOR0VfUk9VVElORV9MRU4gLSAxLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggbGVuID09IDAgKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZmlsZW5hbWUiLCB2YWx1ZSwgJz0nICkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJz0nICkgKyAxOworICAgICAgICAgICAgbGVuID0gX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKCBvdXRfZmlsZSwKKyAgICAgICAgICAgICAgdmFsdWUsIEtNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOIC0gMSwgJywnICk7CisgICAgICAgICAgICBpZiAoIGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggInJhbmdlIiwgdmFsdWUsICc9JyApKQorICAgICAgICAgIHx8ICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJpbmNsX3JhbmdlIiwgdmFsdWUsICc9JyApKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBpZiAoIEtNUF9TU0NBTkYoIHZhbHVlLCAiJWQ6JWQiLCBvdXRfbGIsIG91dF91YiApICE9IDIgKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb3V0X3JhbmdlID0gKzE7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZXhjbF9yYW5nZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBpZiAoIEtNUF9TU0NBTkYoIHZhbHVlLCAiJWQ6JWQiLCBvdXRfbGIsIG91dF91YikgIT0gMiApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRfcmFuZ2UgPSAtMTsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBhcl9yYW5nZV9lcnJvcjoKKyAgICAgICAgS01QX1dBUk5JTkcoIFBhclJhbmdlU3ludGF4LCBuYW1lICk7CisgICAgICAgIF9fa21wX3Bhcl9yYW5nZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZQorI2VuZGlmCisKK2ludAorX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jICkKK3sKKyAgICBpbnQgbnRoID0gMzI7CisKKyAgICAvKiBNSU4oIE1BWCggMzIsIDQgKiAkT01QX05VTV9USFJFQURTLCA0ICogb21wX2dldF9udW1fcHJvY3MoKSApLCBfX2ttcF9tYXhfbnRoKSAqLworICAgIGlmIChudGggPCAoNCAqIHJlcV9ucHJvYykpCisgICAgICAgIG50aCA9ICg0ICogcmVxX25wcm9jKTsKKyAgICBpZiAobnRoIDwgKDQgKiBfX2ttcF94cHJvYykpCisgICAgICAgIG50aCA9ICg0ICogX19rbXBfeHByb2MpOworCisgICAgaWYgKG50aCA+IF9fa21wX21heF9udGgpCisgICAgICAgIG50aCA9IF9fa21wX21heF9udGg7CisKKyAgICByZXR1cm4gbnRoOworfQorCisKK2ludAorX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eSggaW50IHJlcV9ucHJvYywgaW50IG1heF9udGgsIGludCBhbGxfdGhyZWFkc19zcGVjaWZpZWQpIHsKKyAgICBpbnQgbnRoID0gMTI4OworCisgICAgaWYoYWxsX3RocmVhZHNfc3BlY2lmaWVkKQorICAgICAgICByZXR1cm4gbWF4X250aDsKKyAgICAvKiBNSU4oIE1BWCAoMTI4LCA0ICogJE9NUF9OVU1fVEhSRUFEUywgNCAqIG9tcF9nZXRfbnVtX3Byb2NzKCkgKSwgX19rbXBfbWF4X250aCApICovCisgICAgaWYgKG50aCA8ICg0ICogcmVxX25wcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiByZXFfbnByb2MpOworICAgIGlmIChudGggPCAoNCAqIF9fa21wX3hwcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiBfX2ttcF94cHJvYyk7CisKKyAgICBpZiAobnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIHJldHVybiBudGg7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHByaW50IGZ1bmN0aW9ucy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ib29sKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9CT09MOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9ib29sCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW50KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9JTlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JWRcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW50CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdWludDY0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwga21wX3VpbnQ2NCB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfVUlOVDY0OworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSUiIEtNUF9VSU5UNjRfU1BFQyAiXG4iLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3VpbnQ2NAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0cigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfU1RSOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0cgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NpemUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBzaXplX3QgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCB2YWx1ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9IiwgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgdmFsdWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiXG4iICk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zaXplCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGFyc2UgYW5kIHByaW50IGZ1bmN0aW9ucy4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FMTF9USFJFQURTLCBLTVBfTUFYX1RIUkVBRFMsIE9NUF9USFJFQURfTElNSVQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc2V0dGluZ190ICogKiByaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgcmM7CisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIF9fa21wX21heF9udGggPSBfX2ttcF94cHJvYzsKKyAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDEsIF9fa21wX3N5c19tYXhfbnRoLCAmIF9fa21wX21heF9udGggKTsKKyAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDA7CisgICAgfQorICAgIEtfRElBRyggMSwgKCAiX19rbXBfbWF4X250aCA9PSAlZFxuIiwgX19rbXBfbWF4X250aCApICk7CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX21heF9udGggKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9CTE9DS1RJTUUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gX19rbXBfY29udmVydF90b19taWxsaXNlY29uZHMoIHZhbHVlICk7CisgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA8IDAgKSB7CisgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX0RFRkFVTFRfQkxPQ0tUSU1FOworICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKKyAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSA9IEZBTFNFOyAgLy8gUmV2ZXJ0IHRvIGRlZmF1bHQgYXMgaWYgdmFyIG5vdCBzZXQuCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA8IEtNUF9NSU5fQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfTUlOX0JMT0NLVElNRTsKKyAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIFNtYWxsVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBNaW5WYWx1ZVVzaW5nLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA+IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfTUFYX0JMT0NLVElNRTsKKyAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIExhcmdlVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBNYXhWYWx1ZVVzaW5nLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lID0gVFJVRTsgICAgLy8gS01QX0JMT0NLVElNRSB3YXMgc3BlY2lmaWVkLgorICAgIH07IC8vIGlmCisgICAgLy8gY2FsY3VsYXRlIG51bWJlciBvZiBtb25pdG9yIHRocmVhZCB3YWtldXAgaW50ZXJ2YWxzIGNvcnJlc29uZGluZyB0byBibG9ja3RpbWUuCisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9lbnZfYmxvY2t0aW1lID09ICVkXG4iLCBfX2ttcF9lbnZfYmxvY2t0aW1lICkgKTsKKyAgICBpZiAoIF9fa21wX2Vudl9ibG9ja3RpbWUgKSB7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gJWRcbiIsIF9fa21wX2RmbHRfYmxvY2t0aW1lICkgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ibG9ja3RpbWUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ibG9ja3RpbWUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0RVUExJQ0FURV9MSUJfT0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvKiBhY3R1YWxseSB0aGlzIHZhcmlhYmxlIGlzIG5vdCBzdXBwb3J0ZWQsCisgICAgICAgcHV0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIGJ1aWxkcyBhbmQgZm9yIHN0YXRpYy9keW5hbWljIGNvbWJpbmF0aW9uICovCisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZHVwbGljYXRlX2xpYl9vaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTkhFUklUX0ZQX0NPTlRST0wKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2woIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2luaGVyaXRfZnBfY29udHJvbCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworI2lmIEtNUF9ERUJVRworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5oZXJpdF9mcF9jb250cm9sCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MSUJSQVJZLCBPTVBfV0FJVF9QT0xJQ1kKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX3dwX2RhdGFfdCAqIHdhaXQgPSAoa21wX3N0Z193cF9kYXRhX3QgKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgd2FpdC0+cml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIHdhaXQtPm9tcCApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJBQ1RJVkUiLCAxLCB2YWx1ZSApICkgeworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJQQVNTSVZFIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJzZXJpYWwiLCAxLCB2YWx1ZSApICkgeyAgICAgICAgICAgICAvKiBTICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3NlcmlhbDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidGhyb3VnaHB1dCIsIDIsIHZhbHVlICkgKSB7ICAvKiBUSCAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0dXJuYXJvdW5kIiwgMiwgdmFsdWUgKSApIHsgIC8qIFRVICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImRlZGljYXRlZCIsIDEsIHZhbHVlICkgKSB7ICAgLyogRCAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJtdWx0aXVzZXIiLCAxLCB2YWx1ZSApICkgeyAgIC8qIE0gKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9hdXhfc2V0X2xpYnJhcnkoIF9fa21wX2xpYnJhcnkgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3kKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z193cF9kYXRhX3QgKiB3YWl0ID0gKGttcF9zdGdfd3BfZGF0YV90ICopIGRhdGE7CisgICAgY2hhciBjb25zdCAqICAgICAgICB2YWx1ZSA9IE5VTEw7CisKKyAgICBpZiAoIHdhaXQtPm9tcCApIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gIkFDVElWRSI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiUEFTU0lWRSI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9saWJyYXJ5ICkgeworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3NlcmlhbCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJzZXJpYWwiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gInR1cm5hcm91bmQiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90aHJvdWdocHV0IDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gInRocm91Z2hwdXQiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorCit9IC8vIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9tb25pdG9yX3N0YWNrc2l6ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsCisgICAgICAgIHZhbHVlLAorICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUsCisgICAgICAgIEtNUF9NQVhfU1RLU0laRSwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgJiBfX2ttcF9tb25pdG9yX3N0a3NpemUsCisgICAgICAgIDEKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tb25pdG9yX3N0YWNrc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBpZiAoICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPiAwICkKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA+IDAgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCAmJiBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iKTsKKyAgICB9CisKK30gLy8gX19rbXBfc3RnX3ByaW50X21vbml0b3Jfc3RhY2tzaXplCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TRVRUSU5HUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NldHRpbmdzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfc2V0dGluZ3MgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3NldHRpbmdzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9zZXR0aW5ncyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUQUNLUEFECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RhY2twYWQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoCisgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgS01QX01JTl9TVEtQQURESU5HLCAgICAgICAgICAgICAgIC8vIE1pbiB2YWx1ZQorICAgICAgICBLTVBfTUFYX1NUS1BBRERJTkcsICAgICAgICAgICAgICAgLy8gTWF4IHZhbHVlCisgICAgICAgICYgX19rbXBfc3RrcGFkZGluZyAgICAgICAgICAgICAgICAvLyBWYXIgdG8gaW5pdGlhbGl6ZQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja3BhZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0YWNrcGFkKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9zdGtwYWRkaW5nICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdGFja3BhZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tPRkZTRVQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdGFja29mZnNldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgS01QX01JTl9TVEtPRkZTRVQsICAgICAgICAgICAgICAgIC8vIE1pbiB2YWx1ZQorICAgICAgICBLTVBfTUFYX1NUS09GRlNFVCwgICAgICAgICAgICAgICAgLy8gTWF4IHZhbHVlCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAmIF9fa21wX3N0a29mZnNldCwgICAgICAgICAgICAgICAgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICAgICAgMQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja29mZnNldAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X3NpemUoIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3Rrb2Zmc2V0ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdGFja29mZnNldAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tTSVpFLCBPTVBfU1RBQ0tTSVpFLCBHT01QX1NUQUNLU0laRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX3NzX2RhdGFfdCAqICBzdGFja3NpemUgPSAoa21wX3N0Z19zc19kYXRhX3QgKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHN0YWNrc2l6ZS0+cml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciBuYW1lCisgICAgICAgIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciB2YWx1ZQorICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUsICAgIC8vIE1pbiB2YWx1ZQorICAgICAgICBLTVBfTUFYX1NUS1NJWkUsICAgICAgICAgIC8vIE1heCB2YWx1ZQorICAgICAgICAmIF9fa21wX2Vudl9zdGtzaXplLCAgICAgIC8vCisgICAgICAgICYgX19rbXBfc3Rrc2l6ZSwgICAgICAgICAgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICAgICAgc3RhY2tzaXplLT5mYWN0b3IKKyAgICApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUKKworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHByaW50aW5nIGJvdGggS01QX1NUQUNLU0laRSAoZmFjdG9yIGlzIDEpIGFuZCBPTVBfU1RBQ0tTSVpFIChmYWN0b3IgaXMgMTAyNCkuCisvLyBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHByaW50IE9NUF9TVEFDS1NJWkUgdmFsdWUgaW4gYnl0ZXMuIFdlIGNhbiBjb25zaWRlciBhZGRpbmcgdGhpcworLy8gcG9zc2liaWxpdHkgYnkgYSBjdXN0b21lciByZXF1ZXN0IGluIGZ1dHVyZS4KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAga21wX3N0Z19zc19kYXRhX3QgKiAgc3RhY2tzaXplID0gKGttcF9zdGdfc3NfZGF0YV90ICopIGRhdGE7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCAoX19rbXBfc3Rrc2l6ZSAlIDEwMjQpID8gX19rbXBfc3Rrc2l6ZSAvIHN0YWNrc2l6ZS0+ZmFjdG9yIDogX19rbXBfc3Rrc2l6ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9IiwgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgKF9fa21wX3N0a3NpemUgJSAxMDI0KSA/IF9fa21wX3N0a3NpemUgLyBzdGFja3NpemUtPmZhY3RvciA6IF9fa21wX3N0a3NpemUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiXG4iICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9WRVJTSU9OCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdmVyc2lvbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX3ZlcnNpb24gKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF92ZXJzaW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfdmVyc2lvbiApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfV0FSTklOR1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV93YXJuaW5ncyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICk7CisgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICE9IGttcF93YXJuaW5nc19vZmYpIHsgICAvLyBBQzogd2UgaGF2ZSBvbmx5IDAvMSB2YWx1ZXMgZG9jdW1lbnRlZCwKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfZXhwbGljaXQ7IC8vICAgICBzbyByZXNldCBpdCB0byBleHBsaWNpdCBpbiBvcmRlciB0bworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRpc3Rpbmd1aXNoIGZyb20gZGVmYXVsdCBzZXR0aW5nCit9IC8vIF9fa21wX2Vudl9wYXJzZV93YXJuaW5ncworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3dhcm5pbmdzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgKTsgLy8gQUM6IFRPRE86IGNoYW5nZSB0byBwcmludF9pbnQ/Cit9IC8vIF9fa21wX2Vudl9wcmludF93YXJuaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChuZWVkcyBkb2N1bWVudGF0aW9uIGNoYW5nZSkuLi4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX05FU1RFRCwgT01QX05VTV9USFJFQURTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbmVzdGVkKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGZsdF9uZXN0ZWQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX25lc3RlZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X25lc3RlZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RmbHRfbmVzdGVkICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9uZXN0ZWQKKworc3RhdGljIHZvaWQKK19fa21wX3BhcnNlX25lc3RlZF9udW1fdGhyZWFkcyggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsIGttcF9uZXN0ZWRfbnRocmVhZHNfdCAqbnRoX2FycmF5ICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gZW52OworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBuZXh0OworCisgICAgaW50IHRvdGFsID0gMDsgICAgICAgICAgLy8gQ291bnQgZWxlbWVudHMgdGhhdCB3ZXJlIHNldC4gSXQnbGwgYmUgdXNlZCBhcyBhbiBhcnJheSBzaXplCisgICAgaW50IHByZXZfY29tbWEgPSBGQUxTRTsgLy8gRm9yIGNvcnJlY3QgcHJvY2Vzc2luZyBzZXF1ZW50aWFsIGNvbW1hcworCisgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGVudi4gdmFyIHN0cmluZworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworCisgICAgICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyIG9yIG5vdCBhIGNvbW1hID0+IGVuZCBvZiBsaXN0CisgICAgICAgIGlmICggKCAoICpuZXh0IDwgJzAnICkgfHwgKCAqbmV4dCA+ICc5JyApICkgJiYgKCAqbmV4dCAhPScsJykgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggTnRoU3ludGF4RXJyb3IsIHZhciwgZW52ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpuZXh0ID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpcyB0aGUgZmlzcnQgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgfHwgcHJldl9jb21tYSApIHsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBuZXh0Kys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JyApIHsKKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wID0gbmV4dDsKKyAgICAgICAgICAgIFNLSVBfV1MoIHRtcCApOworICAgICAgICAgICAgaWYgKCAoICpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnICkgJiYgKCAqdG1wID49ICcwJyAmJiAqdG1wIDw9ICc5JyApICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBOdGhTcGFjZXNOb3RBbGxvd2VkLCB2YXIsIGVudiApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0b3RhbCA+IDAgKTsKKyAgICBpZiggdG90YWwgPD0gMCApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIE50aFN5bnRheEVycm9yLCB2YXIsIGVudiApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheSBleGlzdHMKKyAgICBpZiAoICEgbnRoX2FycmF5LT5udGggKSB7CisgICAgICAgIC8vIEFsbG9jYXRlIGFuIGFycmF5IG9mIGRvdWJsZSBzaXplCisgICAgICAgIG50aF9hcnJheS0+bnRoID0gKCBpbnQgKiApS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBpbnQgKSAqIHRvdGFsICogMiApOworICAgICAgICBpZiAoIG50aF9hcnJheS0+bnRoID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgIH0KKyAgICAgICAgbnRoX2FycmF5LT5zaXplID0gdG90YWwgKiAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggbnRoX2FycmF5LT5zaXplIDwgdG90YWwgKSB7CisgICAgICAgICAgICAvLyBJbmNyZWFzZSB0aGUgYXJyYXkgc2l6ZQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG50aF9hcnJheS0+c2l6ZSAqPSAyOworICAgICAgICAgICAgfSB3aGlsZSAoIG50aF9hcnJheS0+c2l6ZSA8IHRvdGFsICk7CisKKyAgICAgICAgICAgIG50aF9hcnJheS0+bnRoID0gKGludCAqKSBLTVBfSU5URVJOQUxfUkVBTExPQygKKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPm50aCwgc2l6ZW9mKCBpbnQgKSAqIG50aF9hcnJheS0+c2l6ZSApOworICAgICAgICAgICAgaWYgKCBudGhfYXJyYXktPm50aCA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbnRoX2FycmF5LT51c2VkID0gdG90YWw7CisgICAgaW50IGkgPSAwOworCisgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgIHRvdGFsID0gMDsKKyAgICAvLyBTYXZlIHZhbHVlcyBpbiB0aGUgYXJyYXkKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIFNLSVBfV1MoIHNjYW4gKTsKKyAgICAgICAgaWYgKCAqc2NhbiA9PSAnXDAnICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpzY2FuID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHN1cHBvc2VkIHRvIGJlIGVxdWFsIHRvIF9fa21wX2F2YWlsX3Byb2MgYnV0IGl0IGlzIHVua25vd24gYXQgdGhlIG1vbWVudC4KKyAgICAgICAgICAgICAgICAvLyBTbyBsZXQncyBwdXQgYSBwbGFjZWhvbGRlciAoI3RocmVhZHMgPSAwKSB0byBjb3JyZWN0IGl0IGxhdGVyLgorICAgICAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2krK10gPSAwOworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9ZWxzZSBpZiAoIHByZXZfY29tbWEgKSB7CisgICAgICAgICAgICAgICAgLy8gTnVtIHRocmVhZHMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHByZXZpb3VzIGxldmVsCisgICAgICAgICAgICAgICAgbnRoX2FycmF5LT5udGhbaV0gPSBudGhfYXJyYXktPm50aFtpIC0gMV07CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIHNjYW4rKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggc2NhbiApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqc2NhbiA+PSAnMCcgJiYgKnNjYW4gPD0gJzknICkgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IHNjYW47CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggc2NhbiApOworICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqc2NhbiApOworICAgICAgICAgICAgaWYgKCBudW0gPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBLTVBfTUlOX05USDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG51bSA+IF9fa21wX3N5c19tYXhfbnRoICkgeworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N5c19tYXhfbnRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgdmFyLCBlbnYsIG1zZyApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgdmFyLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2krK10gPSBudW07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9wdGlvbi4gT01QX05VTV9USFJFQURTIGlzIGEgbGlzdCBvZiBwb3NpdGl2ZSBpbnRlZ2VycyEKKyAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYWxsIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgLy8gVGhlIGFycmF5IG9mIDEgZWxlbWVudAorICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aCA9ICggaW50KiApS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBpbnQgKSApOworICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLnNpemUgPSBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aFswXSA9IF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfeHByb2M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcGFyc2VfbmVzdGVkX251bV90aHJlYWRzKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9uZXN0ZWRfbnRoICk7CisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX250aC5udGggKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmVzdGVkX250aC5udGhbMF07CisgICAgICAgICAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPCBfX2ttcF9kZmx0X3RlYW1fbnRoICkgeworICAgICAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF9kZmx0X3RlYW1fbnRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsgLy8gaWYKKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2RmbHRfdGVhbV9udGggPT0gJWRcbiIsIF9fa21wX2RmbHRfdGVhbV9udGggKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9udW1fdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIF9fa21wX25lc3RlZF9udGgudXNlZCApIHsKKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJmJ1ZiApOworICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQ7IGkrKykgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiVkIiwgX19rbXBfbmVzdGVkX250aC5udGhbaV0gKTsKKyAgICAgICAgICAgIGlmICggaSA8IF9fa21wX25lc3RlZF9udGgudXNlZCAtIDEgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiwiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3Blbk1QIDMuMDogS01QX1RBU0tJTkcsIE9NUF9NQVhfQUNUSVZFX0xFVkVMUywKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV90YXNraW5nKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgKGludCl0c2ttX21heCwgKGludCAqKSZfX2ttcF90YXNraW5nX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90YXNraW5nKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90YXNraW5nX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgMSwgKGludCAqKSZfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Rhc2tfc3RlYWxpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3Rhc2tfc3RlYWxpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisJIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQsICYgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tYXhfYWN0aXZlX2xldmVscygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMKKworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSE9UX1RFQU1TX01BWF9MRVZFTCwgS01QX0hPVF9URUFNU19NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX2xldmVsKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52UGFyYWxsZWxXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9ICAgLy8gcmVhZCB2YWx1ZSBiZWZvcmUgZmlyc3QgcGFyYWxsZWwgb25seQorICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQsICYgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX2xldmVsCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX2xldmVsKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbGV2ZWwKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudlBhcmFsbGVsV2FybiwgbmFtZSApOworICAgICAgICByZXR1cm47CisgICAgfSAgIC8vIHJlYWQgdmFsdWUgYmVmb3JlIGZpcnN0IHBhcmFsbGVsIG9ubHkKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlULCAmIF9fa21wX2hvdF90ZWFtc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9ob3RfdGVhbXNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX21vZGUKKworI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9IQU5ETEVfU0lHTkFMUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaGFuZGxlX3NpZ25hbHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCV9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9oYW5kbGVfc2lnbmFscyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaGFuZGxlX3NpZ25hbHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2hhbmRsZV9zaWduYWxzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9YX0RFQlVHLCBLTVBfREVCVUcsIEtNUF9ERUJVR19CVUZfKiwgS01QX0RJQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9ERUJVRworCisjZGVmaW5lIEtNUF9TVEdfWF9ERUJVRyggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfIyN4IyNfZGVidWcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeyAgICAgXAorCV9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGttcF8jI3gjI19kZWJ1ZyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IC8qIF9fa21wX3N0Z19wYXJzZV94X2RlYnVnICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF8jI3gjI19kZWJ1Zygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeyBcCisJX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBrbXBfIyN4IyNfZGVidWcgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLyogX19rbXBfc3RnX3ByaW50X3hfZGVidWcgKi8KKworS01QX1NUR19YX0RFQlVHKCBhICkKK0tNUF9TVEdfWF9ERUJVRyggYiApCitLTVBfU1RHX1hfREVCVUcoIGMgKQorS01QX1NUR19YX0RFQlVHKCBkICkKK0tNUF9TVEdfWF9ERUJVRyggZSApCitLTVBfU1RHX1hfREVCVUcoIGYgKQorCisjdW5kZWYgS01QX1NUR19YX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGludCBkZWJ1ZyA9IDA7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYgZGVidWcgKTsKKyAgICBpZiAoIGttcF9hX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2FfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2JfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfYl9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfY19kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9jX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9kX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2RfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2VfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfZV9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfZl9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9mX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGVidWdfYnVmICk7CisgICAgLy8gISEhIFRPRE86IE1vdmUgYnVmZmVyIGluaXRpYWxpemF0aW9uIG9mIG9mIHRoaXMgZmlsZSEgSXQgbWF5IHdvcmtzIGluY29ycmVjdGx5IGlmCisgICAgLy8gS01QX0RFQlVHX0JVRiBpcyBwYXJzZWQgYmVmb3JlIEtNUF9ERUJVR19CVUZfTElORVMgb3IgS01QX0RFQlVHX0JVRl9DSEFSUy4KKyAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKwlpbnQgaTsKKwlpbnQgZWxlbWVudHMgPSBfX2ttcF9kZWJ1Z19idWZfbGluZXMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnM7CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbGwgZW50cmllcyBpbiBkZWJ1ZyBidWZmZXIgdG8gZW1wdHkgKi8KKwlfX2ttcF9kZWJ1Z19idWZmZXIgPSAoY2hhciAqKSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBlbGVtZW50cyAqIHNpemVvZiggY2hhciApICk7CisJZm9yICggaSA9IDA7IGkgPCBlbGVtZW50czsgaSArPSBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKQorCSAgIF9fa21wX2RlYnVnX2J1ZmZlcltpXSA9ICdcMCc7CisKKwlfX2ttcF9kZWJ1Z19jb3VudCA9IDA7CisgICAgfQorICAgIEtfRElBRyggMSwgKCAiX19rbXBfZGVidWdfYnVmID0gJWRcbiIsIF9fa21wX2RlYnVnX2J1ZiApICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWYgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1ZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9hdG9taWMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZWJ1Z19idWZfYXRvbWljICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfYXRvbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1Zl9hdG9taWMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfY2hhcnMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoCisJbmFtZSwKKwl2YWx1ZSwKKwlLTVBfREVCVUdfQlVGX0NIQVJTX01JTiwKKwlJTlRfTUFYLAorCSYgX19rbXBfZGVidWdfYnVmX2NoYXJzCisgICAgKTsKK30gLy8gX19rbXBfc3RnX2RlYnVnX3BhcnNlX2J1Zl9jaGFycworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2NoYXJzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoCisJbmFtZSwKKwl2YWx1ZSwKKwlLTVBfREVCVUdfQlVGX0xJTkVTX01JTiwKKwlJTlRfTUFYLAorCSYgX19rbXBfZGVidWdfYnVmX2xpbmVzCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9saW5lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9saW5lcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kaWFnKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBrbXBfZGlhZyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGlhZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RpYWcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIGttcF9kaWFnICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kaWFnCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FMSUdOX0FMTE9DCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWxpZ25fYWxsb2MoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLAorICAgICAgICB2YWx1ZSwKKyAgICAgICAgQ0FDSEVfTElORSwKKyAgICAgICAgSU5UX01BWCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgJiBfX2ttcF9hbGlnbl9hbGxvYywKKyAgICAgICAgMQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGlnbl9hbGxvYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FsaWduX2FsbG9jKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zaXplKCBidWZmZXIsIG5hbWUsIF9fa21wX2FsaWduX2FsbG9jICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hbGlnbl9hbGxvYworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfUExBSU5fQkFSUklFUiwgS01QX0ZPUktKT0lOX0JBUlJJRVIsIEtNUF9SRURVQ1RJT05fQkFSUklFUgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUT0RPOiBSZW1vdmUgX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lIHZhcmliYWxlLCByZW1vdmUgbG9vcHMgZnJvbSBwYXJzZSBhbmQgcHJpbnQKKy8vICAgICAgIGZ1bmN0aW9ucywgcGFzcyByZXF1aXJlZCBpbmZvIHRocm91Z2ggZGF0YSBhcmd1bWVudC4KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhcjsKKworICAgIC8qIC0tLS0tLS0tLS0gQmFycmllciBicmFuY2ggYml0IGNvbnRyb2wgLS0tLS0tLS0tLS0tICovCisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF07CisgICAgICAgIGlmICggKCBzdHJjbXAoIHZhciwgbmFtZSkgPT0gMCApICYmICggdmFsdWUgIT0gMCApICkgeworICAgICAgICAgICAgY2hhciAqY29tbWE7CisKKyAgICAgICAgICAgIGNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID0gKCBrbXBfdWludDMyICkgX19rbXBfc3RyX3RvX2ludCggdmFsdWUsICcsJyApOworICAgICAgICAgICAgLyogaXMgdGhlcmUgYSBzcGVjaWZpZWQgcmVsZWFzZSBwYXJhbWV0ZXI/ICovCisgICAgICAgICAgICBpZiAoIGNvbW1hID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSAoa21wX3VpbnQzMikgX19rbXBfc3RyX3RvX2ludCggY29tbWEgKyAxLCAwICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID4gS01QX01BWF9CUkFOQ0hfQklUUyApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQmFyclJlbGVhc2VWYWx1ZUludmFsaWQsIG5hbWUsIGNvbW1hICsgMSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSA+IEtNUF9NQVhfQlJBTkNIX0JJVFMgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBCYXJyR2F0aGVyVmFsdWVJbnZhbGlkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ191aW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICk7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSA9ICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtfRElBRygxLCAoIiVzID09ICVkLCVkXG4iLCBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSwgXAorICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdLCBcCisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgaSBdKSkKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF07CisgICAgICAgIGlmICggc3RyY21wKCB2YXIsIG5hbWUpID09IDAgICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQsJWQnXG4iLCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSwgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgaSBdKTsKKyAgICAgICAgfQorICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4sIEtNUF9GT1JLSk9JTl9CQVJSSUVSX1BBVFRFUk4sIEtNUF9SRURVQ1RJT05fQkFSUklFUl9QQVRURVJOCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRPRE86IFJlbW92ZSBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSB2YXJpYWJsZSwgcmVtb3ZlIGxvb3BzIGZyb20gcGFyc2UgYW5kIHByaW50IGZ1bmN0aW9ucywKKy8vICAgICAgIHBhc3MgcmVxdWlyZWQgZGF0YSB0byBmdW5jdGlvbnMgdGhyb3VnaCBkYXRhIGFyZ3VtZW50LgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworICAgIC8qIC0tLS0tLS0tLS0gQmFycmllciBtZXRob2QgY29udHJvbCAtLS0tLS0tLS0tLS0gKi8KKworICAgIGZvciAoIGludCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIHZhciA9IF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdOworCisgICAgICAgIGlmICggKCBzdHJjbXAgKCB2YXIsIG5hbWUgKSA9PSAwICkgJiYgKCB2YWx1ZSAhPSAwICkgKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGNoYXIgKmNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBmaXJzdCBwYXJhbWV0ZXI6IGdhdGhlciBwYXR0ZXJuICovCisgICAgICAgICAgICBmb3IgKCBqID0gYnBfbGluZWFyX2JhcjsgajxicF9sYXN0X2JhcjsgaisrICkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9tYXRjaF93aXRoX3NlbnRpbmVsKCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVtqXSwgdmFsdWUsIDEsICcsJyApKSB7CisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVyblsgaSBdID0gKGttcF9iYXJfcGF0X2UpIGo7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBqID09IGJwX2xhc3RfYmFyICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBCYXJyR2F0aGVyVmFsdWVJbnZhbGlkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIGJwX2xpbmVhcl9iYXIgXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgc2Vjb25kIHBhcmFtZXRlcjogcmVsZWFzZSBwYXR0ZXJuICovCisgICAgICAgICAgICBpZiAoIGNvbW1hICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgZm9yICggaiA9IGJwX2xpbmVhcl9iYXI7IGogPCBicF9sYXN0X2JhcjsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbal0sIDEsIGNvbW1hICsgMSApICkgeworICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdID0gKGttcF9iYXJfcGF0X2UpIGo7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IGJwX2xhc3RfYmFyKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEJhcnJSZWxlYXNlVmFsdWVJbnZhbGlkLCBuYW1lLCBjb21tYSArIDEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgYnBfbGluZWFyX2JhciBdICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworICAgIGZvciAoIGludCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIHZhciA9IF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdOworICAgICAgICBpZiAoIHN0cmNtcCAoIHZhciwgbmFtZSApID09IDAgKSB7CisgICAgICAgICAgICBpbnQgaiA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBpIF07CisgICAgICAgICAgICBpbnQgayA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuIFsgaSBdOworICAgICAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbIGkgXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJXMnXG4iLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSBbIGogXSwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWUgWyBrIF0pOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BQk9SVF9ERUxBWQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBVbml0cyBvZiBLTVBfREVMQVlfQUJPUlQgYXJlIHNlY29uZHMsIHVuaXRzIG9mIF9fa21wX2Fib3J0X2RlbGF5IGlzIG1pbGxpc2Vjb25kcy4KKyAgICBpbnQgZGVsYXkgPSBfX2ttcF9hYm9ydF9kZWxheSAvIDEwMDA7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVggLyAxMDAwLCAmIGRlbGF5ICk7CisgICAgX19rbXBfYWJvcnRfZGVsYXkgPSBkZWxheSAqIDEwMDA7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hYm9ydF9kZWxheQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Fib3J0X2RlbGF5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9hYm9ydF9kZWxheSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0NQVUlORk9fRklMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0ciggbmFtZSwgdmFsdWUsICYgX19rbXBfY3B1aW5mb19maWxlICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfY3B1aW5mb19maWxlID09ICVzXG4iLCBfX2ttcF9jcHVpbmZvX2ZpbGUgKSApOworICAgICNlbmRpZgorfSAvL19fa21wX3N0Z19wYXJzZV9jcHVpbmZvX2ZpbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2NwdWluZm9fZmlsZSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nJXMnXG4iLCBfX2ttcF9jcHVpbmZvX2ZpbGUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICAjZW5kaWYKK30gLy9fX2ttcF9zdGdfcHJpbnRfY3B1aW5mb19maWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JDRV9SRURVQ1RJT04sIEtNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGttcF9zdGdfZnJfZGF0YV90ICogcmVkdWN0aW9uID0gKGttcF9zdGdfZnJfZGF0YV90ICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJlZHVjdGlvbi0+cml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgaWYgKCByZWR1Y3Rpb24tPmZvcmNlICkgeworICAgICAgICBpZiggdmFsdWUgIT0gMCApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9zdHJfbWF0Y2goICJjcml0aWNhbCIsIDAsIHZhbHVlICkgKQorICAgICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgaWYoIF9fa21wX3N0cl9tYXRjaCggImF0b21pYyIsIDAsIHZhbHVlICkgKQorICAgICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICBlbHNlIGlmKCBfX2ttcF9zdHJfbWF0Y2goICJ0cmVlIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gdHJlZV9yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIFVua25vd25Gb3JjZVJlZHVjdGlvbiwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZXRlcm1fcmVkICk7CisgICAgICAgIGlmKCBfX2ttcF9kZXRlcm1fcmVkICkgeworICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHRyZWVfcmVkdWNlX2Jsb2NrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09ICVkXG4iLCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z19mcl9kYXRhX3QgKiByZWR1Y3Rpb24gPSAoa21wX3N0Z19mcl9kYXRhX3QgKikgZGF0YTsKKyAgICBpZiAoIHJlZHVjdGlvbi0+Zm9yY2UgKSB7CisgICAgICAgIGlmKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jaykgeworICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAiY3JpdGljYWwiKTsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAiYXRvbWljIik7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gdHJlZV9yZWR1Y2VfYmxvY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJ0cmVlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZXRlcm1fcmVkICk7CisgICAgfQorCisKK30gLy8gX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RPUkFHRV9NQVAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdG9yYWdlX21hcCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICAidmVyYm9zZSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwICAgICAgICAgPSBUUlVFOworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gVFJVRTsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQgPSBUUlVFOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IEZBTFNFOworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfc3RvcmFnZV9tYXAgKTsgLy8gISEhCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RvcmFnZV9tYXAoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgfHwgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInZlcmJvc2UiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3RvcmFnZV9tYXAgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxMX1RIUkVBRFBSSVZBVEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQgPyBfX2ttcF9tYXhfbnRoIDogMSwgX19rbXBfbWF4X250aCwKKyAgICAgICAgJiBfX2ttcF90cF9jYXBhY2l0eSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHByaXZhdGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcHJpdmF0ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfdHBfY2FwYWNpdHkgKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRk9SRUlHTl9USFJFQURTX1RIUkVBRFBSSVZBVEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2ZvcmVpZ25fdHAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9mb3JlaWduX3RwICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BRkZJTklUWSwgR09NUF9DUFVfQUZGSU5JVFksIEtNUF9UT1BPTE9HWV9NRVRIT0QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKy8vCisvLyBQYXJzZSB0aGUgcHJvYyBpZCBsaXN0LiAgUmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX3BhcnNlX2FmZmluaXR5X3Byb2NfaWRfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsCisgICAgY29uc3QgY2hhciAqKm5leHRFbnYsIGNoYXIgKipwcm9jbGlzdCApCit7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IGVudjsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gc2NhbjsKKyAgICBpbnQgZW1wdHkgPSBUUlVFOworCisgICAgKnByb2NsaXN0ID0gTlVMTDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBlbmQsIHN0cmlkZTsKKworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpuZXh0ID09ICd7JykgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ3snCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd9JworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbmV4dCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKG51bSA+PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyID0+IGVuZCBvZiBsaXN0CisgICAgICAgIC8vCisgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgIGlmIChlbXB0eSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyLgorICAgICAgICAvLworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdGFydCA+PSAwKTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgcmFuZ2UsIHRoZW4gZ28gb24uCisgICAgICAgIC8vCisgICAgICAgIGlmICgqbmV4dCAhPSAnLScpIHsKKyAgICAgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBpcyBhIHJhbmdlLiAgU2tpcCBvdmVyIHRoZSAnLScgYW5kIHJlYWQgaW4gdGhlIDJuZCBpbnQuCisgICAgICAgIC8vCisgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICctJworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgZW5kID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoZW5kID49IDApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgc3RyaWRlID0gMTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICc6JykgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgc3RyaWRlIGlzIHNwZWNpZmllZC4gIFNraXAgb3ZlciB0aGUgJzoiIGFuZCByZWFkIHRoZSAzcmQgaW50LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgICAgLy8gc2tpcCAnOicKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIERvIHNvbWUgcmFuZ2UgY2hlY2tzLgorICAgICAgICAvLworICAgICAgICBpZiAoc3RyaWRlID09IDApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZaZXJvU3RyaWRlLCB2YXIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN0YXJ0R3JlYXRlckVuZCwgdmFyLCBzdGFydCwgZW5kICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN0cmlkZUxlc3NaZXJvLCB2YXIsIHN0YXJ0LCBlbmQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlbmQgLSBzdGFydCkgLyBzdHJpZGUgPiA2NTUzNiApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZSYW5nZVRvb0JpZywgdmFyLCBlbmQsIHN0YXJ0LCBzdHJpZGUgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgIH0KKworICAgICpuZXh0RW52ID0gbmV4dDsKKworICAgIHsKKyAgICAgICAgaW50IGxlbiA9IG5leHQgLSBlbnY7CisgICAgICAgIGNoYXIgKnJldGxpc3QgPSAoY2hhciAqKV9fa21wX2FsbG9jYXRlKChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIEtNUF9NRU1DUFlfUyhyZXRsaXN0LCAobGVuKzEpKnNpemVvZihjaGFyKSwgZW52LCBsZW4gKiBzaXplb2YoY2hhcikpOworICAgICAgICByZXRsaXN0W2xlbl0gPSAnXDAnOworICAgICAgICAqcHJvY2xpc3QgPSByZXRsaXN0OworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLworLy8gSWYgS01QX0FGRklOSVRZIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgdHlwZSwgdGhlbgorLy8gX19rbXBfYWZmaW5pdHlfbm90eXBlIHNob3VsZCBwb2ludCB0byBpdHMgc2V0dGluZy4KKy8vCitzdGF0aWMga21wX3NldHRpbmdfdCAqX19rbXBfYWZmaW5pdHlfbm90eXBlID0gTlVMTDsKKworc3RhdGljIHZvaWQKK19fa21wX3BhcnNlX2FmZmluaXR5X2VudiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBlbnVtIGFmZmluaXR5X3R5cGUgICogb3V0X3R5cGUsCisgICAgY2hhciAgICAgICAgICAgICAgICAqKiBvdXRfcHJvY2xpc3QsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF92ZXJib3NlLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfd2FybiwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X3Jlc3BlY3QsCisgICAgZW51bSBhZmZpbml0eV9ncmFuICAqIG91dF9ncmFuLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfZ3Jhbl9sZXZlbHMsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9kdXBzLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfY29tcGFjdCwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X29mZnNldAorKQoreworICAgIGNoYXIgKiBidWZmZXIgPSBOVUxMOyAgICAvLyBDb3B5IG9mIGVudiB2YXIgdmFsdWUuCisgICAgY2hhciAqIGJ1ZiAgICA9IE5VTEw7ICAgIC8vIEJ1ZmZlciBmb3Igc3RydG9rX3IoKSBmdW5jdGlvbi4KKyAgICBjaGFyICogbmV4dCA9IE5VTEw7ICAgICAgLy8gZW5kIG9mIHRva2VuIC8gc3RhcnQgb2YgbmV4dC4KKyAgICBjb25zdCBjaGFyICogc3RhcnQ7ICAgICAgLy8gc3RhcnQgb2YgY3VycmVudCB0b2tlbiAoZm9yIGVyciBtc2dzKQorICAgIGludCAgICBjb3VudCAgPSAwOyAgICAgICAvLyBDb3VudGVyIG9mIHBhcnNlZCBpbnRlZ2VyIG51bWJlcnMuCisgICAgaW50ICAgIG51bWJlclsgMiBdOyAgICAgIC8vIFBhcnNlZCBudW1iZXJzLgorCisgICAgLy8gR3VhcmRzLgorICAgIGludCB0eXBlICAgICAgICAgPSAwOworICAgIGludCBwcm9jbGlzdCAgICAgPSAwOworICAgIGludCBtYXhfcHJvY2xpc3QgPSAwOworICAgIGludCB2ZXJib3NlICAgICAgPSAwOworICAgIGludCB3YXJuaW5ncyAgICAgPSAwOworICAgIGludCByZXNwZWN0ICAgICAgPSAwOworICAgIGludCBncmFuICAgICAgICAgPSAwOworICAgIGludCBkdXBzICAgICAgICAgPSAwOworCisgICAgS01QX0FTU0VSVCggdmFsdWUgIT0gTlVMTCApOworCisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZNaWRkbGVXYXJuLCBuYW1lICk7CisgICAgICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDEgKTsKKworICAgIGJ1ZmZlciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHZhbHVlICk7ICAgICAgICAgLy8gQ29weSBlbnYgdmFyIHRvIGtlZXAgb3JpZ2luYWwgaW50YWN0LgorICAgIGJ1ZiA9IGJ1ZmZlcjsKKyAgICBTS0lQX1dTKGJ1Zik7CisKKyAgICAvLyBIZWxwZXIgbWFjcm9zLgorCisgICAgLy8KKyAgICAvLyBJZiB3ZSBzZWUgYSBwYXJzZSBlcnJvciwgZW1pdCBhIHdhcm5pbmcgYW5kIHNjYW4gdG8gdGhlIG5leHQgIiwiLgorICAgIC8vCisgICAgLy8gRklYTUUgLSB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkgdG8gcHJpbnQgYW4gZXJyb3IKKyAgICAvLyBtZXNzYWdlLCBob3BlZnVsbHkgd2l0aG91dCBvdmVyd3JpdHRpbmcgcGVpY2VzIG9mIGJ1Zi4KKyAgICAvLworICAgICNkZWZpbmUgRU1JVF9XQVJOKHNraXAsZXJybGlzdCkgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2hhciBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHNraXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJywnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2ggPSAqbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKm5leHQgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX1dBUk5JTkcgZXJybGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKm5leHQgPSBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHNraXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLCcpIG5leHQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnVmID0gbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICAjZGVmaW5lIF9zZXRfcGFyYW0oX2d1YXJkLF92YXIsX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX2d1YXJkID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfdmFyID0gX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIEZBTFNFLCAoIEFmZlBhcmFtRGVmaW5lZCwgbmFtZSwgc3RhcnQgKSApOyAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrIF9ndWFyZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisgICAgI2RlZmluZSBzZXRfdHlwZSh2YWwpICAgICAgICAgIF9zZXRfcGFyYW0oIHR5cGUsICAgICAqb3V0X3R5cGUsICAgICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3ZlcmJvc2UodmFsKSAgICAgICBfc2V0X3BhcmFtKCB2ZXJib3NlLCAgKm91dF92ZXJib3NlLCAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF93YXJuaW5ncyh2YWwpICAgICAgX3NldF9wYXJhbSggd2FybmluZ3MsICpvdXRfd2FybiwgICAgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfcmVzcGVjdCh2YWwpICAgICAgIF9zZXRfcGFyYW0oIHJlc3BlY3QsICAqb3V0X3Jlc3BlY3QsICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X2R1cHModmFsKSAgICAgICAgICBfc2V0X3BhcmFtKCBkdXBzLCAgICAgKm91dF9kdXBzLCAgICAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF9wcm9jbGlzdCh2YWwpICAgICAgX3NldF9wYXJhbSggcHJvY2xpc3QsICpvdXRfcHJvY2xpc3QsICAgIHZhbCApCisKKyAgICAjZGVmaW5lIHNldF9ncmFuKHZhbCxsZXZlbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggZ3JhbiA9PSAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqb3V0X2dyYW4gPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqb3V0X2dyYW5fbGV2ZWxzID0gbGV2ZWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIEZBTFNFLCAoIEFmZlBhcmFtRGVmaW5lZCwgbmFtZSwgc3RhcnQgKSApOyAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrIGdyYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgIT0gTlVMTCApCisgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA+IDAgKSApOworIyBlbmRpZgorCisgICAgd2hpbGUgKCAqYnVmICE9ICdcMCcgKSB7CisgICAgICAgIHN0YXJ0ID0gbmV4dCA9IGJ1ZjsKKworICAgICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub25lIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9ub25lICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigic2NhdHRlciIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfc2NhdHRlciApOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImNvbXBhY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2NvbXBhY3QgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJsb2dpY2FsIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9sb2dpY2FsICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicGh5c2ljYWwiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X3BoeXNpY2FsICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZXhwbGljaXQiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2V4cGxpY2l0ICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiYmFsYW5jZWQiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2JhbGFuY2VkICk7CisjICBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyAgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJkaXNhYmxlZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfZGlzYWJsZWQgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ2ZXJib3NlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF92ZXJib3NlKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm92ZXJib3NlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF92ZXJib3NlKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIndhcm5pbmdzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF93YXJuaW5ncyggVFJVRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vd2FybmluZ3MiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3dhcm5pbmdzKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInJlc3BlY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3Jlc3BlY3QoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub3Jlc3BlY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3Jlc3BlY3QoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZHVwbGljYXRlcyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpCisgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCJkdXBzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF9kdXBzKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm9kdXBsaWNhdGVzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoIm5vZHVwcyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfZHVwcyggRkFMU0UgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJncmFudWxhcml0eSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpCisgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCJncmFuIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgIT0gJz0nKSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOyAgICAgIC8vIHNraXAgJz0nCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgaWYgKF9fa21wX21hdGNoX3N0cigiZmluZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fZmluZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInRocmVhZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fdGhyZWFkLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29yZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fY29yZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInBhY2thZ2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX3BhY2thZ2UsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub2RlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9ub2RlLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImdyb3VwIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9ncm91cCwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworIyBlbmRpZiAvKiBLTVBfR1JPVVAgQUZGSU5JVFkgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBuID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX2RlZmF1bHQsIG4gKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicHJvY2xpc3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgY2hhciAqdGVtcF9wcm9jbGlzdDsKKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnPScKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgIT0gJ1snKSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOyAgICAgIC8vIHNraXAgJ1snCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgaWYgKCEgX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KG5hbWUsIGJ1ZiwKKyAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopJm5leHQsICZ0ZW1wX3Byb2NsaXN0KSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gd2FybmluZyBhbHJlYWR5IGVtaXR0ZWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTS0lQX1RPKG5leHQsICddJyk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICddJykgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJywnKTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSBuZXh0Kys7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnXScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnXScKKyAgICAgICAgICAgIHNldF9wcm9jbGlzdCggdGVtcF9wcm9jbGlzdCApOworICAgICAgICB9IGVsc2UgaWYgKCgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSkgeworICAgICAgICAgICAgLy8gUGFyc2UgaW50ZWdlciBudW1iZXJzIC0tIHBlcm11dGUgYW5kIG9mZnNldC4KKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgbiA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoIGNvdW50IDwgMiApIHsKKyAgICAgICAgICAgICAgICBudW1iZXJbIGNvdW50IF0gPSBuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTWFueVBhcmFtcywgbmFtZSwgc3RhcnQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqbmV4dCAhPSAnXDAnKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0ZW1wID0gbmV4dDsKKyAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCB0ZW1wICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSAvLyB3aGlsZQorCisgICAgI3VuZGVmIEVNSVRfV0FSTgorICAgICN1bmRlZiBfc2V0X3BhcmFtCisgICAgI3VuZGVmIHNldF90eXBlCisgICAgI3VuZGVmIHNldF92ZXJib3NlCisgICAgI3VuZGVmIHNldF93YXJuaW5ncworICAgICN1bmRlZiBzZXRfcmVzcGVjdAorICAgICN1bmRlZiBzZXRfZ3JhbnVsYXJpdHkKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXIgKTsKKworICAgIGlmICggcHJvY2xpc3QgKSB7CisgICAgICAgIGlmICggISB0eXBlICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlByb2NMaXN0Tm9UeXBlLCBuYW1lICk7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZXhwbGljaXQgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmUHJvY0xpc3ROb3RFeHBsaWNpdCwgbmFtZSApOworICAgICAgICAgICAgS01QX0FTU0VSVCggKm91dF9wcm9jbGlzdCAhPSBOVUxMICk7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKm91dF9wcm9jbGlzdCApOworICAgICAgICAgICAgKm91dF9wcm9jbGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoICggKm91dF90eXBlICkgeworICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk1hbnlQYXJhbXNGb3JMb2dpYywgbmFtZSwgbnVtYmVyWyAxIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfY29tcGFjdCA9IG51bWJlclsgMCBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggY291bnQgPiAxICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkgeworICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuVXNpbmcsICJLTVBfQUZGSU5JVFkiLCAiZmluZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuVXNpbmcsICJLTVBfQUZGSU5JVFkiLCAiY29yZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9zY2F0dGVyOgorICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfY29tcGFjdCA9IG51bWJlclsgMCBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggY291bnQgPiAxICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OiB7CisgICAgICAgICAgICBpZiAoICpvdXRfcHJvY2xpc3QgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9Qcm9jTGlzdCwgbmFtZSApOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk5vUGFyYW0sIG5hbWUsICJleHBsaWNpdCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9ub25lOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgIm5vbmUiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2Rpc2FibGVkOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImRpc2FibGVkIiApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kZWZhdWx0OiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImRlZmF1bHQiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCAwICk7CisgICAgICAgIH07CisgICAgfTsgLy8gc3dpdGNoCit9IC8vIF9fa21wX3BhcnNlX2FmZmluaXR5X2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FmZmluaXR5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX2ttcF9wYXJzZV9hZmZpbml0eV9lbnYoIG5hbWUsIHZhbHVlLCAmIF9fa21wX2FmZmluaXR5X3R5cGUsCisgICAgICAmIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCAmIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UsCisgICAgICAmIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzLCAmIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaywKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfZ3JhbiwgJiBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscywKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfZHVwcywgJiBfX2ttcF9hZmZpbml0eV9jb21wYWN0LAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hZmZpbml0eSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgInZlcmJvc2UiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAibm92ZXJib3NlIik7CisgICAgfQorICAgIGlmICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJ3YXJuaW5ncyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub3dhcm5pbmdzIik7CisgICAgfQorICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAicmVzcGVjdCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vcmVzcGVjdCIpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X2dyYW4gKSB7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1kZWZhdWx0LCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2ZpbmU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9ZmluZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl90aHJlYWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9dGhyZWFkLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2NvcmU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9Y29yZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PXBhY2thZ2UsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fbm9kZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1ub2RlLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ncm91cDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1ncm91cCwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9kdXBzICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgImR1cGxpY2F0ZXMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub2R1cGxpY2F0ZXMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZGlzYWJsZWQiICk7CisgICAgfQorICAgIGVsc2Ugc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdHlwZSApeworICAgICAgICBjYXNlIGFmZmluaXR5X25vbmU6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJub25lIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkIiwgInBoeXNpY2FsIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQiLCAibG9naWNhbCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgImNvbXBhY3QiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCwlZCIsICJzY2F0dGVyIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9leHBsaWNpdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzPVslc10sJXMiLCAicHJvY2xpc3QiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCwgImV4cGxpY2l0IiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCwlZCIsICJiYWxhbmNlZCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGlzYWJsZWQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJkaXNhYmxlZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGVmYXVsdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiPHVua25vd24+Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKK30gLy9fX2ttcF9zdGdfcHJpbnRfYWZmaW5pdHkKKworIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9nb21wX2NwdV9hZmZpbml0eSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGNvbnN0IGNoYXIgKiBuZXh0ID0gTlVMTDsKKyAgICBjaGFyICogdGVtcF9wcm9jbGlzdDsKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52TWlkZGxlV2FybiwgbmFtZSApOworICAgICAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDEgKTsKKworICAgIGlmICggX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KCBuYW1lLCB2YWx1ZSwgJm5leHQsCisgICAgICAmdGVtcF9wcm9jbGlzdCApKSB7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gR09NUF9DUFVfQUZGSU5JVFkgPT4gZ3JhbnVsYXJpdHk9ZmluZSxleHBsaWNpdCxwcm9jbGlzdD0uLi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IHRlbXBfcHJvY2xpc3Q7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyBlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCBuYW1lICk7CisgICAgICAgICAgICBpZiAodGVtcF9wcm9jbGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKil0ZW1wX3Byb2NsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2FybmluZyBhbHJlYWR5IGVtaXR0ZWQKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9nb21wX2NwdV9hZmZpbml0eQorCisjIGVuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgT01QX1BMQUNFUyBwcm9jIGlkIGxpc3QgcGFyc2VyLiBIZXJlIGlzIHRoZSBncmFtbWFyOgorCitwbGFjZV9saXN0IDo9IHBsYWNlCitwbGFjZV9saXN0IDo9IHBsYWNlICwgcGxhY2VfbGlzdAorcGxhY2UgOj0gbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0gOiBzaWduZWQKK3BsYWNlIDo9IHsgc3VicGxhY2VsaXN0IH0KK3BsYWNlIDo9ICEgcGxhY2UgICAgICAgICAgICAgICAgICAvLyAobG93ZXN0IHByaW9yaXR5KQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZSAsIHN1YnBsYWNlX2xpc3QKK3N1YnBsYWNlIDo9IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0gOiBzaWduZWQKK3NpZ25lZCA6PSBudW0KK3NpZ25lZCA6PSArIHNpZ25lZAorc2lnbmVkIDo9IC0gc2lnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludAorX19rbXBfcGFyc2Vfc3VicGxhY2VfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICoqc2NhbiApCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgaW4gdGhlIHN0YXJ0aW5nIHByb2MgaWQKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgoKipzY2FuIDwgJzAnKSB8fCAoKipzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKCoqc2NhbiA8ICcwJykgfHwgKCoqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisgICAgICAgIHN0cmlkZSAqPSBzaWduOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3BhcnNlX3BsYWNlKCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKiogc2NhbiApCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIC8vCisgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICd7JyAnIScgYW5kIG51bQorICAgIC8vCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAneycpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ3snCisgICAgICAgIGlmICghIF9fa21wX3BhcnNlX3N1YnBsYWNlX2xpc3QodmFyLCBzY2FuKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gIT0gJ30nKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ30nCisgICAgfQorICAgIGVsc2UgaWYgKCoqc2NhbiA9PSAnIScpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJyEnCisgICAgICAgIHJldHVybiBfX2ttcF9wYXJzZV9wbGFjZSh2YXIsIHNjYW4pOyAvLychJyBoYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc6JworICAgIH0KKyAgICBlbHNlIGlmICgoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpKSB7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGludCBwcm9jID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHByb2MgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfcGFyc2VfcGxhY2VfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsIGNoYXIgKipwbGFjZV9saXN0ICkKK3sKKyAgICBjb25zdCBjaGFyICpzY2FuID0gZW52OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGU7CisKKyAgICAgICAgaWYgKCEgX19rbXBfcGFyc2VfcGxhY2UodmFyLCAmc2NhbikpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gIT0gJzonKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCgqc2NhbiA8ICcwJykgfHwgKCpzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKCpzY2FuIDwgJzAnKSB8fCAoKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHsKKyAgICAgICAgaW50IGxlbiA9IHNjYW4gLSBlbnY7CisgICAgICAgIGNoYXIgKnJldGxpc3QgPSAoY2hhciAqKV9fa21wX2FsbG9jYXRlKChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIEtNUF9NRU1DUFlfUyhyZXRsaXN0LCAobGVuKzEpKnNpemVvZihjaGFyKSwgZW52LCBsZW4gKiBzaXplb2YoY2hhcikpOworICAgICAgICByZXRsaXN0W2xlbl0gPSAnXDAnOworICAgICAgICAqcGxhY2VfbGlzdCA9IHJldGxpc3Q7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3BsYWNlcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGludCBjb3VudDsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gdmFsdWU7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHNjYW47CisgICAgY29uc3QgY2hhciAqa2luZCA9ICJcInRocmVhZHNcIiI7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIE9NUF9QUk9DX0JJTkQgaXMgbm90IHNwZWNpZmllZCBidXQgT01QX1BMQUNFUyBpcywKKyAgICAvLyB0aGVuIGxldCBPTVBfUFJPQ19CSU5EIGRlZmF1bHQgdG8gdHJ1ZS4KKyAgICAvLworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICB9CisKKyAgICAvL19fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworCisgICAgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJ0aHJlYWRzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAga2luZCA9ICJcInRocmVhZHNcIiI7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJjb3JlcyIsIHNjYW4sICZuZXh0ICkgKSB7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICBraW5kID0gIlwiY29yZXNcIiI7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJzb2NrZXRzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOworICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgIGtpbmQgPSAiXCJzb2NrZXRzXCIiOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMICkgeworICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX3BhcnNlX3BsYWNlX2xpc3QoIG5hbWUsIHZhbHVlLCAmX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3RydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICB9CisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICggKnNjYW4gPT0gJ1wwJyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gUGFyc2Ugb3B0aW9uIGNvdW50IHBhcmFtZXRlciBpbiBwYXJlbnRoZXNlcworICAgIC8vCisgICAgaWYgKCAqc2NhbiAhPSAnKCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCBuYW1lLCBraW5kICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnKCcKKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgbmV4dCA9IHNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgIHNjYW4gPSBuZXh0OworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuICE9ICcpJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIG5hbWUsIGtpbmQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzY2FuKys7ICAgICAvLyBza2lwICcpJworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuICE9ICdcMCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCBzY2FuICk7CisgICAgfQorICAgIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSBjb3VudDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wbGFjZXMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLAorICB2b2lkICogZGF0YSApCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPT0gMCApCisgICAgICB8fCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkKKyAgICAgIHx8ICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9mYWxzZSApICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9leHBsaWNpdCApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2NvbXBhY3QgKSB7CisgICAgICAgIGludCBudW07CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID4gMCApIHsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA+IDAgKSB7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbnVtID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQgKSB7CisgICAgICAgICAgICBpZiAoIG51bSA+IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSd0aHJlYWRzKCVkKSdcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSd0aHJlYWRzJ1xuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsKKyAgICAgICAgICAgIGlmICggbnVtID4gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J2NvcmVzKCVkKScgXG4iLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nY29yZXMnXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlICkgeworICAgICAgICAgICAgaWYgKCBudW0gPiAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nc29ja2V0cyglZCknXG4iLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nc29ja2V0cydcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorfQorCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyMgaWYgKCEgT01QXzQwX0VOQUJMRUQpCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaW50IGVuYWJsZWQ7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIGluIE9NUCAzLjEsIE9NUF9QUk9DX0JJTkQgaXMgc3RyaWN0bHkgYSBib29sZWFuCisgICAgLy8KKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgZW5hYmxlZCApOworICAgIGlmICggZW5hYmxlZCApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBPTVBfUFJPQ19CSU5EID0+IGdyYW51bGFyaXR5PWZpbmUsc2NhdHRlciBvbiBNSUMKKyAgICAgICAgICAgIC8vIE9NUF9QUk9DX0JJTkQgPT4gZ3JhbnVsYXJpdHk9Y29yZSxzY2F0dGVyIGVsc2V3aGVyZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9zY2F0dGVyOworIyAgaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICBpZiggX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYyApCisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgIGVsc2UKKyMgIGVuZGlmCisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgIH0KK30gLy8gX19rbXBfcGFyc2VfcHJvY19iaW5kCisKKyMgZW5kaWYgLyogaWYgKCEgT01QXzQwX0VOQUJMRUQpICovCisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV90b3BvbG9neV9tZXRob2QoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsCisgIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiYWxsIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgfQorIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIngyYXBpYyBpZCIsIDksIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggIngyYXBpY19pZCIsIDksIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggIngyYXBpYy1pZCIsIDksIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggIngyYXBpY2lkIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgbGVhZiAxMSIsIDEzLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmXzExIiwgMTMsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWYtMTEiLCAxMywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgbGVhZjExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWYxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmIDExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZl8xMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYtMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmMTEiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgMTEiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF8xMSIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLTExIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQxMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYgMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmXzExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZi0xMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYxMSIsIDYsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiYXBpYyBpZCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImFwaWNfaWQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJhcGljLWlkIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYXBpY2lkIiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgbGVhZiA0IiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWZfNCIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmLTQiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgbGVhZjQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZjQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZjQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmIDQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmXzQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmLTQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmNCIsIDEwLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCA0IiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfNCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLTQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZDQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmIDQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmXzQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmLTQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmNCIsIDUsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FwaWNpZDsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiL3Byb2MvY3B1aW5mbyIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWluZm8iLCA1LCB2YWx1ZSApKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm87CisgICAgfQorIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZ3JvdXAiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJmbGF0IiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdDsKKyAgICB9CisjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiaHdsb2MiLCAxLCB2YWx1ZSkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2h3bG9jOworICAgIH0KKyMgZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV90b3BvbG9neV9tZXRob2QKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90b3BvbG9neV9tZXRob2QoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLAorICB2b2lkICogZGF0YSApIHsKKyMgaWYgS01QX0RFQlVHCisgICAgY2hhciBjb25zdCAqIHZhbHVlID0gTlVMTDsKKworICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgKSB7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OgorICAgICAgICB2YWx1ZSA9ICJkZWZhdWx0IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDoKKyAgICAgICAgdmFsdWUgPSAiYWxsIjsKKyAgICAgICAgYnJlYWs7CisKKyMgIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkOgorICAgICAgICB2YWx1ZSA9ICJ4MkFQSUMgaWQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkOgorICAgICAgICB2YWx1ZSA9ICJBUElDIGlkIjsKKyAgICAgICAgYnJlYWs7CisjICBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm86CisgICAgICAgIHZhbHVlID0gImNwdWluZm8iOworICAgICAgICBicmVhazsKKworIyAgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDoKKyAgICAgICAgdmFsdWUgPSAiZ3JvdXAiOworICAgICAgICBicmVhazsKKyMgIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0OgorICAgICAgICB2YWx1ZSA9ICJmbGF0IjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorIyBlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZAorCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLworLy8gT01QX1BST0NfQklORCAvIGJpbmQtdmFyIGlzIGZ1bmN0aW9uYWwgb24gYWxsIDQuMCBidWlsZHMsIGluY2x1ZGluZyBPUyBYKgorLy8gT01QX1BMQUNFUyAvIHBsYWNlLXBhcnRpdGlvbi12YXIgaXMgbm90LgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIGluIE9NUCA0LjAgT01QX1BST0NfQklORCBpcyBhIHZlY3RvciBvZiBwcm9jX2JpbmQgdHlwZXMuCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzICE9IE5VTEwpCisgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA+IDAgKSApOworCisgICAgY29uc3QgY2hhciAqYnVmID0gdmFsdWU7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKyAgICBpbnQgbnVtOworICAgIFNLSVBfV1MoIGJ1ZiApOworICAgIGlmICggKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpICkgeworICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgIEtNUF9BU1NFUlQoIG51bSA+PSAwICk7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbnVtID0gLTE7CisgICAgfQorCisgICAgbmV4dCA9IGJ1ZjsKKyAgICBpZiAoIF9fa21wX21hdGNoX3N0ciggImRpc2FibGVkIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGlzYWJsZWQ7CisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfZmFsc2UgKQorICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAiZmFsc2UiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX3RydWUgKQorICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAidHJ1ZSIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF90cnVlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGVudiB2YXIgc3RyaW5nCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IGNoYXIgKnNjYW47CisgICAgICAgIGludCBuZWxlbSA9IDE7CisgICAgICAgIGZvciAoIHNjYW4gPSBidWY7ICpzY2FuICE9ICdcMCc7IHNjYW4rKyApIHsKKyAgICAgICAgICAgIGlmICggKnNjYW4gPT0gJywnICkgeworICAgICAgICAgICAgICAgIG5lbGVtKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBDcmVhdGUgLyBleHBhbmQgdGhlIG5lc3RlZCBwcm9jX2JpbmQgYXJyYXkgYXMgbmVlZGVkCisgICAgICAgIC8vCisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplIDwgbmVsZW0gKSB7CisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPSAoa21wX3Byb2NfYmluZF90ICopCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX1JFQUxMT0MoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcywKKyAgICAgICAgICAgICAgICBzaXplb2Yoa21wX3Byb2NfYmluZF90KSAqIG5lbGVtICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuc2l6ZSA9IG5lbGVtOworICAgICAgICB9CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IG5lbGVtOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNhdmUgdmFsdWVzIGluIHRoZSBuZXN0ZWQgcHJvY19iaW5kIGFycmF5CisgICAgICAgIC8vCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgZW51bSBrbXBfcHJvY19iaW5kX3QgYmluZDsKKworICAgICAgICAgICAgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9tYXN0ZXIgKQorICAgICAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJtYXN0ZXIiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgICAgICBiaW5kID0gcHJvY19iaW5kX21hc3RlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9jbG9zZSApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggImNsb3NlIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgICAgICAgICAgICAgYmluZCA9IHByb2NfYmluZF9jbG9zZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9zcHJlYWQgKQorICAgICAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJzcHJlYWQiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgICAgICBiaW5kID0gcHJvY19iaW5kX3NwcmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbaSsrXSA9IGJpbmQ7CisgICAgICAgICAgICBpZiAoIGkgPj0gbmVsZW0gKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAqYnVmID09ICcsJyApOworICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgbmV4dCB2YWx1ZSBpZiBpdCB3YXMgc3BlY2lmaWVkIGFzIGFuIGludGVnZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSApIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIG51bSA+PSAwICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG51bSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgIH0KKyAgICBpZiAoICpidWYgIT0gJ1wwJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlRXh0cmFDaGFyc1dhcm4sIG5hbWUsIGJ1ZiApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3Byb2NfYmluZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsCisgIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpbnQgbmVsZW0gPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQ7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggbmVsZW0gPT0gMCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9JyIsIG5hbWUgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBuZWxlbTsgaSsrICkgeworICAgICAgICAgICAgc3dpdGNoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2ldICkgeworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2ZhbHNlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImZhbHNlIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfdHJ1ZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJ0cnVlIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfbWFzdGVyOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIm1hc3RlciIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2Nsb3NlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImNsb3NlIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfc3ByZWFkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgInNwcmVhZCIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2ludGVsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImludGVsIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJkZWZhdWx0IiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpIDwgbmVsZW0gLSAxICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiwiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworICAgIH0KK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX0RZTkFNSUMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfZHluYW1pYyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiAoX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfZHluYW1pYygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9keW5hbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfa21wX2R5bmFtaWNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZQYXJhbGxlbFdhcm4sIG5hbWUgKTsKKyAgICAgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImxvYWQgYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWRfYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWQtYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWRiYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYmFsYW5jZSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19sb2FkX2JhbGFuY2U7CisgICAgfQorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidGhyZWFkIGxpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkX2xpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkLWxpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsaW1pdCIsIDIsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJyYW5kb20iLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfcmFuZG9tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9rbXBfZHluYW1pY19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlczogJXMgXG4iLCBuYW1lLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyMgaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2xvYWRfYmFsYW5jZSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAibG9hZCBiYWxhbmNlIiApOworICAgIH0KKyMgZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3RocmVhZF9saW1pdCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAidGhyZWFkIGxpbWl0IiApOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19yYW5kb20gKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInJhbmRvbSIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9BU1NFUlQoMCk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfa21wX2R5bmFtaWNfbW9kZQorCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MT0FEX0JBTEFOQ0VfSU5URVJWQUwKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9sZF9iYWxhbmNlX2ludGVydmFsKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgZG91YmxlIGludGVydmFsID0gX19rbXBfY29udmVydF90b19kb3VibGUoIHZhbHVlICk7CisgICAgaWYgKCBpbnRlcnZhbCA+PSAwICkgeworICAgICAgICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9sZF9iYWxhbmNlX2ludGVydmFsKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JTguNmZcbiIsIG5hbWUsIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCApOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbG9hZF9iYWxhbmNlX2ludGVydmFsCisKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTklUX0FUX0ZPUksKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbml0X2F0X2ZvcmsoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayApOworICAgIGlmICggX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmsgKSB7CisgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCA9IFRSVUU7CisgICAgfTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yaworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2luaXRfYXRfZm9yaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TQ0hFRFVMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NjaGVkdWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IEtNUF9TVFJMRU4oIHZhbHVlICk7CisgICAgICAgIGlmICggbGVuZ3RoID4gSU5UX01BWCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBMb25nVmFsdWUsIG5hbWUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKnNlbWljb2xvbjsKKyAgICAgICAgICAgIGlmKCB2YWx1ZVsgbGVuZ3RoIC0gMSBdID09ICciJyB8fCB2YWx1ZVsgbGVuZ3RoIC0xIF0gPT0gJ1wnJyApCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFVuYmFsYW5jZWRRdW90ZXMsIG5hbWUgKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjaGFyIHNlbnRpbmVsOworCisgICAgICAgICAgICAgICAgc2VtaWNvbG9uID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJzsnICk7CisgICAgICAgICAgICAgICAgaWYoICp2YWx1ZSAmJiBzZW1pY29sb24gIT0gdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjb21tYSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrY29tbWE7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbCA9ICcsJzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbCA9ICc7JzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAic3RhdGljIiwgdmFsdWUsIHNlbnRpbmVsICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImdyZWVkeSIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJiYWxhbmNlZCIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImd1aWRlZCIsIHZhbHVlLCBzZW50aW5lbCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiaXRlcmF0aXZlIiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFuYWx5dGljYWwiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5hbHl0aWNhbCBub3QgYWxsb3dlZCBmb3IgdG9vIG1hbnkgdGhyZWFkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggSW52YWxpZENsYXVzZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEVtcHR5Q2xhdXNlLCBuYW1lICk7CisgICAgICAgICAgICB9IHdoaWxlICggKHZhbHVlID0gc2VtaWNvbG9uID8gc2VtaWNvbG9uICsgMSA6IE5VTEwpICk7CisgICAgICAgIH0KKyAgICB9OyAvLyBpZgorCit9IC8vIF9fa21wX3N0Z19wYXJzZV9fc2NoZWR1bGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zY2hlZHVsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAic3RhdGljLGdyZWVkeSIpOworICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCAoIGJ1ZmZlciwgIiVzIiwgInN0YXRpYyxiYWxhbmNlZCIpOworICAgIH0KKyAgICBpZiAoIF9fa21wX2d1aWRlZCA9PSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOyVzJ1xuIiwgImd1aWRlZCxpdGVyYXRpdmUiKTsKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9ndWlkZWQgPT0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI7JXMnXG4iLCAiZ3VpZGVkLGFuYWx5dGljYWwiKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zY2hlZHVsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfU0NIRURVTEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfc2NoZWR1bGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBzaXplX3QgICAgICBsZW5ndGg7CisgICAgaWYoIHZhbHVlICkgeworICAgICAgICBsZW5ndGggPSBLTVBfU1RSTEVOKCB2YWx1ZSApOworICAgICAgICBpZiggbGVuZ3RoICkgeworICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZVsgbGVuZ3RoIC0gMSBdID09ICciJyB8fCB2YWx1ZVsgbGVuZ3RoIC0xIF0gPT0gJ1wnJykKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggVW5iYWxhbmNlZFF1b3RlcywgbmFtZSApOworICAgICAgICAgICAgLyogZ2V0IHRoZSBzcGVjaWZpZWQgc2NoZWR1bGluZyBzdHlsZSAqLworICAgICAgICAgICAgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImR5bmFtaWMiLCB2YWx1ZSwgJywnKSkgICAgICAgICAgLyogRFlOQU1JQyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJndWlkZWQiLCB2YWx1ZSwgJywnKSkgICAgICAvKiBHVUlERUQgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQ7CisvLyBBQzogVE9ETzogYWRkIEFVVE8gc2NoZWR1bGUsIGFuZCBwcHJvYmFibHkgcmVtb3ZlIFRSQVBFWk9JREFMIChPTVAgMy4wIGRvZXMgbm90IGFsbG93IGl0KQorICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiYXV0byIsIHZhbHVlLCAnLCcpKSB7ICAgICAgIC8qIEFVVE8gKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfYXV0bzsKKyAgICAgICAgICAgICAgICBpZiggY29tbWEgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIElnbm9yZUNodW5rLCBuYW1lLCBjb21tYSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBjb21tYSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgidHJhcGV6b2lkYWwiLCB2YWx1ZSwgJywnKSkgLyogVFJBUEVaT0lEQUwgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfdHJhcGV6b2lkYWw7CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJzdGF0aWMiLCB2YWx1ZSwgJywnKSkgICAgICAvKiBTVEFUSUMgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljOworI2lmZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorICAgICAgICAgICAgZWxzZSBpZiAoS01QX0FSQ0hfWDg2XzY0ICYmCisgICAgICAgICAgICAgICAgICAgICAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJzdGF0aWNfc3RlYWwiLCB2YWx1ZSwgJywnKSkKKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljX3N0ZWFsOworI2VuZGlmCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHZhbHVlID0gTlVMTDsgLyogc2tpcCBwcm9jZXNzaW5nIG9mIGNvbW1hICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdmFsdWUgJiYgY29tbWEgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZW52X2NodW5rID0gVFJVRTsKKworICAgICAgICAgICAgICAgIGlmKF9fa21wX3NjaGVkID09IGttcF9zY2hfc3RhdGljKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgKytjb21tYTsKKyAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IF9fa21wX3N0cl90b19pbnQoIGNvbW1hLCAwICk7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9jaHVuayA8IDEgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEludmFsaWRDaHVuaywgbmFtZSwgY29tbWEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9jaHVuayApOworLy8gQUM6IG5leHQgYmxvY2sgY29tbWVudGVkIG91dCB1bnRpbCBLTVBfREVGQVVMVF9DSFVOSyAhPSBLTVBfTUlOX0NIVU5LICh0byBpbXByb3ZlIGNvZGUgY292ZXJhZ2UgOikKKy8vICAgICBUaGUgZGVmYXVsdCBjaHVuayBzaXplIGlzIDEgYWNjb3JkaW5nIHRvIHN0YW5kYXJkLCB0aHVzIG1ha2luZyBLTVBfTUlOX0NIVU5LIG5vdCAxIHdlIHdvdWxkIGludHJvZHVjZSBtZXNzOgorLy8gICAgIHdyb25nIGNodW5rIGJlY29tZXMgMSwgYnV0IGl0IHdpbGwgYmUgaW1wb3NzaWJsZSB0byBleHBsaWNpdGVseSBzZXQgMSwgYmVjYXVzZSBpdCBiZWNvbWVzIEtNUF9NSU5fQ0hVTksuLi4KKy8vICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2NodW5rIDwgS01QX01JTl9DSFVOSyApIHsKKy8vICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9NSU5fQ0hVTks7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggX19rbXBfY2h1bmsgPiBLTVBfTUFYX0NIVU5LICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9NQVhfQ0hVTks7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIExhcmdlQ2h1bmssIG5hbWUsIGNvbW1hICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfY2h1bmsgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9lbnZfY2h1bmsgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBLTVBfV0FSTklORyggRW1wdHlTdHJpbmcsIG5hbWUgKTsKKyAgICB9CisgICAgS19ESUFHKDEsICgiX19rbXBfc3RhdGljID09ICVkXG4iLCBfX2ttcF9zdGF0aWMpKQorICAgIEtfRElBRygxLCAoIl9fa21wX2d1aWRlZCA9PSAlZFxuIiwgX19rbXBfZ3VpZGVkKSkKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9zY2hlZCA9PSAlZFxuIiwgX19rbXBfc2NoZWQpKQorICAgIEtfRElBRygxLCAoIl9fa21wX2NodW5rID09ICVkXG4iLCBfX2ttcF9jaHVuaykpCit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfc2NoZWR1bGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfc2NoZWR1bGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2NodW5rICkgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9zY2hlZCApIHsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAiZHluYW1pYyIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJndWlkZWQiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAidHJhcGV6b2lkYWwiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInN0YXRpYyIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAic3RhdGljX3N0ZWFsIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2F1dG86CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAiYXV0byIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX3NjaGVkICkgeworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJkeW5hbWljIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAiZ3VpZGVkIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAidHJhcGV6b2lkYWwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAic3RhdGljIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgInN0YXRpY19zdGVhbCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2F1dG86CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAiYXV0byIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX3NjaGVkdWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BVE9NSUNfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2F0b21pY19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBNb2RlczogMCAtLSBkbyBub3QgY2hhbmdlIGRlZmF1bHQ7IDEgLS0gSW50ZWwgcGVyZiBtb2RlLCAyIC0tIEdPTVAgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGludCBtb2RlID0gMDsKKyAgICBpbnQgbWF4ICA9IDE7CisgICAgI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBtYXggPSAyOworICAgICNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgbWF4LCAmIG1vZGUgKTsKKyAgICAvLyBUT0RPOyBwYXJzZV9pbnQgaXMgbm90IHZlcnkgc3VpdGFibGUgZm9yIHRoaXMgY2FzZS4gSW4gY2FzZSBvZiBvdmVyZmxvdyBpdCBpcyBiZXR0ZXIgdG8gdXNlCisgICAgLy8gMCByYXRoZXIgdGhhdCBtYXggdmFsdWUuCisgICAgaWYgKCBtb2RlID4gMCApIHsKKyAgICAgICAgX19rbXBfYXRvbWljX21vZGUgPSBtb2RlOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9hdG9taWNfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9hdG9taWNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYXRvbWljX21vZGUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIC8vIE5vdGUsIHRoaXMgd2lsbCBub3Qgd29yayBmcm9tIGttcF9zZXRfZGVmYXVsdHMgYmVjYXVzZSB0aF9jb25zIHN0YWNrIHdhcyBub3QgYWxsb2NhdGVkCisgICAgICAgIC8vIGZvciBleGlzdGVkIHRocmVhZChzKSB0aHVzIHRoZSBmaXJzdCBfX2ttcF9wdXNoXzxjb25zdHJ1Y3Q+IHdpbGwgYnJlYWsgd2l0aCBhc3NlcnRpb24uCisgICAgICAgIC8vIFRPRE86IGFsbG9jYXRlIHRoX2NvbnMgaWYgY2FsbGVkIGZyb20ga21wX3NldF9kZWZhdWx0cy4KKyAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggIm5vbmUiLCB2YWx1ZSwgMCApICkgeworICAgICAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjaworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2NvbnNpc3RlbmN5X2NoZWNrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHZhbHVlID0gImFsbCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSAibm9uZSI7CisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfY29uc2lzdGVuY3lfY2hlY2sKKworCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lUVF9QUkVQQVJFX0RFTEFZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBVU0VfSVRUX05PVElGWQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2l0dF9wcmVwYXJlX2RlbGF5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgLy8gRXhwZXJpbWVudGFsIGNvZGU6IEtNUF9JVFRfUFJFUEFSRV9ERUxBWSBzcGVjaWZpZXMgbnVtYmVydCBvZiBsb29wIGl0ZXJhdGlvbnMuCisgICAgaW50IGRlbGF5ID0gMDsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBkZWxheSApOworICAgIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ID0gZGVsYXk7Cit9IC8vIF9fa21wX3N0cl9wYXJzZV9pdHRfcHJlcGFyZV9kZWxheQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2l0dF9wcmVwYXJlX2RlbGF5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X3VpbnQ2NCggYnVmZmVyLCBuYW1lLCBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApOworCit9IC8vIF9fa21wX3N0cl9wcmludF9pdHRfcHJlcGFyZV9kZWxheQorCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9NQUxMT0NfUE9PTF9JTkNSCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jciggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBLTVBfTUlOX01BTExPQ19QT09MX0lOQ1IsCisgICAgICAgICAgICBLTVBfTUFYX01BTExPQ19QT09MX0lOQ1IsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgJiBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyLAorICAgICAgICAgICAgMQorICAgICAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jcgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21hbGxvY19wb29sX2luY3IoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2l6ZSggYnVmZmVyLCBuYW1lLCBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICk7CisKK30gLy8gX2ttcF9zdGdfcHJpbnRfbWFsbG9jX3Bvb2xfaW5jcgorCisKKyNpZmRlZiBLTVBfREVCVUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BBUl9SQU5HRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgJiBfX2ttcF9wYXJfcmFuZ2UsCisgICAgICAgICAgICBfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZSwKKyAgICAgICAgICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZSwKKyAgICAgICAgICAgICYgX19rbXBfcGFyX3JhbmdlX2xiLAorICAgICAgICAgICAgJiBfX2ttcF9wYXJfcmFuZ2VfdWIKKyAgICAgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wYXJfcmFuZ2VfZW52KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKF9fa21wX3Bhcl9yYW5nZSAhPSAwKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgcGFyX3JhbmdlX3RvX3ByaW50ICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2VudgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfWUlFTERfQ1lDTEUsIEtNUF9ZSUVMRF9PTiwgS01QX1lJRUxEX09GRgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpbnQgZmxhZyA9IF9fa21wX3lpZWxkX2N5Y2xlOworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBmbGFnICk7CisgICAgX19rbXBfeWllbGRfY3ljbGUgPSBmbGFnOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfY3ljbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3lpZWxkX2N5Y2xlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDIsIElOVF9NQVgsICYgX19rbXBfeWllbGRfb25fY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3lpZWxkX29uX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF95aWVsZF9vbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAyLCBJTlRfTUFYLCAmIF9fa21wX3lpZWxkX29mZl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF95aWVsZF9vZmZfY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSVRfV0FJVCwgS01QX05FWFRfV0FJVAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaXRfd2FpdCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICBpbnQgd2FpdDsKKyAgIEtNUF9BU1NFUlQoICggX19rbXBfaW5pdF93YWl0ICYgMSApID09IDAgKTsKKyAgIHdhaXQgPSBfX2ttcF9pbml0X3dhaXQgLyAyOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCBLTVBfTUlOX0lOSVRfV0FJVCwgS01QX01BWF9JTklUX1dBSVQsICYgd2FpdCApOworICAgIF9fa21wX2luaXRfd2FpdCA9IHdhaXQgKiAyOworICAgIEtNUF9BU1NFUlQoICggX19rbXBfaW5pdF93YWl0ICYgMSApID09IDAgKTsKKyAgICBfX2ttcF95aWVsZF9pbml0ID0gX19rbXBfaW5pdF93YWl0OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9pbml0X3dhaXQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2luaXRfd2FpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaW50IHdhaXQ7CisgICAgS01QX0FTU0VSVCggKCBfX2ttcF9uZXh0X3dhaXQgJiAxICkgPT0gMCApOworICAgIHdhaXQgPSBfX2ttcF9uZXh0X3dhaXQgLyAyOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCBLTVBfTUlOX05FWFRfV0FJVCwgS01QX01BWF9ORVhUX1dBSVQsICYgd2FpdCApOworICAgIF9fa21wX25leHRfd2FpdCA9IHdhaXQgKiAyOworICAgIEtNUF9BU1NFUlQoICggX19rbXBfbmV4dF93YWl0ICYgMSApID09IDAgKTsKKyAgICBfX2ttcF95aWVsZF9uZXh0ID0gX19rbXBfbmV4dF93YWl0OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbmV4dF93YWl0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9uZXh0X3dhaXQgKTsKK30gLy9fX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0dUSURfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2d0aWRfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8KKyAgICAvLyBNb2RlczoKKyAgICAvLyAgIDAgLS0gZG8gbm90IGNoYW5nZSBkZWZhdWx0CisgICAgLy8gICAxIC0tIHNwIHNlYXJjaAorICAgIC8vICAgMiAtLSB1c2UgImtleWVkIiBUTFMgdmFyLCBpLmUuCisgICAgLy8gICAgICAgIHB0aHJlYWRfZ2V0c3BlY2lmaWMoTGludXgqIE9TL09TIFgqKSBvciBUbHNHZXRWYWx1ZShXaW5kb3dzKiBPUykKKyAgICAvLyAgIDMgLS0gX19kZWNsc3BlYyh0aHJlYWQpIFRMUyB2YXIgaW4gdGRhdGEgc2VjdGlvbgorICAgIC8vCisgICAgaW50IG1vZGUgPSAwOworICAgIGludCBtYXggID0gMjsKKyAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgbWF4ID0gMzsKKyAgICAjZW5kaWYgLyogS01QX1REQVRBX0dUSUQgKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgbWF4LCAmIG1vZGUgKTsKKyAgICAvLyBUT0RPOyBwYXJzZV9pbnQgaXMgbm90IHZlcnkgc3VpdGFibGUgZm9yIHRoaXMgY2FzZS4gSW4gY2FzZSBvZiBvdmVyZmxvdyBpdCBpcyBiZXR0ZXIgdG8gdXNlCisgICAgLy8gMCByYXRoZXIgdGhhdCBtYXggdmFsdWUuCisgICAgaWYgKCBtb2RlID09IDAgKSB7CisgICAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gbW9kZTsKKyAgICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0cl9wYXJzZV9ndGlkX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ndGlkX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX2FkanVzdF9ndGlkX21vZGUgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgMCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9ndGlkX21vZGUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9ndGlkX21vZGUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTlVNX0xPQ0tTX0lOX0JMT0NLCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbG9ja19ibG9jayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIEtNUF9JTlRfTUFYLCAmIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayApOworfSAvLyBfX2ttcF9zdHJfcGFyc2VfbG9ja19ibG9jaworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2xvY2tfYmxvY2soIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbG9ja19ibG9jaworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTE9DS19LSU5ECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworIyBkZWZpbmUgS01QX1NUT1JFX0xPQ0tfU0VRKGEpIChfX2ttcF91c2VyX2xvY2tfc2VxID0gbG9ja3NlcV8jI2EpCisjZWxzZQorIyBkZWZpbmUgS01QX1NUT1JFX0xPQ0tfU0VRKGEpCisjZW5kaWYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9sb2NrX2tpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfaW5pdF91c2VyX2xvY2tzICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52TG9ja1dhcm4sIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAidGFzIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdCBhbmQgc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdF9hbmRfc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdC1hbmQtc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdCBhbmRzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0X2FuZHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3QtYW5kc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZCBzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kX3NldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmQtc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZHNldCIsIDIsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfdGFzOworICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEodGFzKTsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZnV0ZXgiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBpZiAoIF9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlKCkgKSB7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2Z1dGV4OworICAgICAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKGZ1dGV4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBGdXRleE5vdFN1cHBvcnRlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0aWNrZXQiLCAyLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3RpY2tldDsKKyAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHRpY2tldCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJxdWV1aW5nIiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAicXVldWUiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShxdWV1aW5nKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImRyZHBhIHRpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhX3RpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhLXRpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGEiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2RyZHBhOworICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEoZHJkcGEpOworICAgIH0KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImFkYXB0aXZlIiwgMSwgdmFsdWUgKSAgKSB7CisgICAgICAgIGlmKCBfX2ttcF9jcHVpbmZvLnJ0bSApIHsgLy8gPz8/IElzIGNwdWluZm8gYXZhaWxhYmxlIGhlcmU/CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2FkYXB0aXZlOworICAgICAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKGFkYXB0aXZlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZGFwdGl2ZU5vdFN1cHBvcnRlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShxdWV1aW5nKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgS01QX1VTRV9UU1gKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCJydG0iLCAxLCB2YWx1ZSkgKSB7CisgICAgICAgIGlmICggX19rbXBfY3B1aW5mby5ydG0gKSB7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3J0bTsKKyAgICAgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShydG0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFkYXB0aXZlTm90U3VwcG9ydGVkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19xdWV1aW5nOworICAgICAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHF1ZXVpbmcpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goImhsZSIsIDEsIHZhbHVlKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19obGU7CisgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShobGUpOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9sb2NrX2tpbmQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKCBfX2ttcF91c2VyX2xvY2tfa2luZCApIHsKKyAgICAgICAgY2FzZSBsa19kZWZhdWx0OgorICAgICAgICB2YWx1ZSA9ICJkZWZhdWx0IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa190YXM6CisgICAgICAgIHZhbHVlID0gInRhcyI7CisgICAgICAgIGJyZWFrOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorICAgICAgICBjYXNlIGxrX2Z1dGV4OgorICAgICAgICB2YWx1ZSA9ICJmdXRleCI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBLTVBfVVNFX1RTWAorICAgICAgICBjYXNlIGxrX3J0bToKKyAgICAgICAgdmFsdWUgPSAicnRtIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa19obGU6CisgICAgICAgIHZhbHVlID0gImhsZSI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgY2FzZSBsa190aWNrZXQ6CisgICAgICAgIHZhbHVlID0gInRpY2tldCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfcXVldWluZzoKKyAgICAgICAgdmFsdWUgPSAicXVldWluZyI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfZHJkcGE6CisgICAgICAgIHZhbHVlID0gImRyZHBhIjsKKyAgICAgICAgYnJlYWs7CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxrX2FkYXB0aXZlOgorICAgICAgICB2YWx1ZSA9ICJhZGFwdGl2ZSI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfQorCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQURBUFRJVkVfTE9DS19QUk9QUywgS01QX1NQRUNVTEFUSVZFX1NUQVRTRklMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBQYXJzZSBvdXQgdmFsdWVzIGZvciB0aGUgdHVuYWJsZSBwYXJhbWV0ZXJzIGZyb20gYSBzdHJpbmcgb2YgdGhlIGZvcm0KKy8vIEtNUF9BREFQVElWRV9MT0NLX1BST1BTPW1heF9zb2Z0X3JldHJpZXNbLG1heF9iYWRuZXNzXQorc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hZGFwdGl2ZV9sb2NrX3Byb3BzKCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqZGF0YSApCit7CisgICAgaW50IG1heF9yZXRyaWVzID0gMDsKKyAgICBpbnQgbWF4X2JhZG5lc3MgPSAwOworCisgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworCisgICAgaW50IHRvdGFsID0gMDsgICAgICAgICAgLy8gQ291bnQgZWxlbWVudHMgdGhhdCB3ZXJlIHNldC4gSXQnbGwgYmUgdXNlZCBhcyBhbiBhcnJheSBzaXplCisgICAgaW50IHByZXZfY29tbWEgPSBGQUxTRTsgLy8gRm9yIGNvcnJlY3QgcHJvY2Vzc2luZyBzZXF1ZW50aWFsIGNvbW1hcworICAgIGludCBpOworCisgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIHN0cnVjdHVyZSBfX2ttcF9zcGVjdWxhdGl2ZV9iYWNrb2ZmX3BhcmFtcworICAgIC8vIFJ1biBvbmx5IDMgaXRlcmF0aW9ucyBiZWNhdXNlIGl0IGlzIGVub3VnaCB0byByZWFkIHR3byB2YWx1ZXMgb3IgZmluZCBhIHN5bnRheCBlcnJvcgorICAgIGZvciAoIGkgPSAwOyBpIDwgMyA7IGkrKykgeworICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgb3Igbm90IGEgY29tbWEgT1IgbnVtYmVyIG9mIHZhbHVlcyA+IDIgPT4gZW5kIG9mIGxpc3QKKyAgICAgICAgaWYgKCAoICggKm5leHQgPCAnMCcgfHwgKm5leHQgPiAnOScgKSAmJiAqbmV4dCAhPScsJyApIHx8IHRvdGFsID4gMiApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgICAgIGlmICggKm5leHQgPT0gJywnICkgeworICAgICAgICAgICAgLy8gJywnIGlzIHRoZSBmaXNydCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICggdG90YWwgPT0gMCB8fCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIG5leHQrKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wID0gbmV4dDsKKyAgICAgICAgICAgIFNLSVBfV1MoIHRtcCApOworICAgICAgICAgICAgaWYgKCAoICpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnICkgJiYgKCAqdG1wID49ICcwJyAmJiAqdG1wIDw9ICc5JyApICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTcGFjZXNOb3RBbGxvd2VkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgaWYgKCBudW0gPCAwICkgeyAvLyBUaGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIGJlID49IDAKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgICAgICBudW0gPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICggbnVtID4gS01QX0lOVF9NQVggKSB7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICAgICAgICAgbnVtID0gS01QX0lOVF9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB0b3RhbCA9PSAxICkgeworICAgICAgICAgICAgICAgIG1heF9yZXRyaWVzID0gbnVtOworICAgICAgICAgICAgfSBlbHNlIGlmKCB0b3RhbCA9PSAyICkgeworICAgICAgICAgICAgICAgIG1heF9iYWRuZXNzID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRvdGFsID4gMCApOworICAgIGlmKCB0b3RhbCA8PSAwICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52U3ludGF4RXJyb3IsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllcyA9IG1heF9yZXRyaWVzOworICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzID0gbWF4X2JhZG5lc3M7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzKGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQsJWQnXG4iLCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzCisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9maWxlKCBuYW1lLCB2YWx1ZSwgIiIsICYgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIi0iLCAwLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgKSAgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInN0ZG91dCIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApOworICAgIH0KKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BMQUNFX1RIUkVBRFMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wbGFjZV90aHJlYWRzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBWYWx1ZSBleGFtcGxlOiA1Q3gyVHgxNU8KKyAgICAvLyBXaGljaCBtZWFucyAidXNlIDUgY29yZXMgd2l0aCBvZmZzZXQgMTUsIDIgdGhyZWFkcyBwZXIgY29yZSIKKyAgICAvLyBBQzogZXh0ZW5kZWQgdG8gc29ja2V0cyBsZXZlbCwgZXhhbXBsZXMgb2YKKyAgICAvLyAgICAgInVzZSAyIHNvY2tldHMgd2l0aCBvZmZzZXQgNiwgMiBjb3JlcyB3aXRoIG9mZnNldCAyIHBlciBzb2NrZXQsIDIgdGhyZWFkcyBwZXIgY29yZSI6CisgICAgLy8gICAgIDJzLDZvLDJjLDJvLDJ0OyAycyw2bywyYywydCwybzsgMnNANiwyY0AyLDJ0CisgICAgLy8gICAgIFRvIG5vdCBicmVhayBsZWdhY3kgY29kZSBjb3JlLW9mZnNldCBjYW4gYmUgbGFzdDsKKyAgICAvLyAgICAgcG9zdGZpeCAibyIgb3IgcHJlZml4IEAgY2FuIGJlIG9mZnNldCBkZXNpZ25hdG9yLgorICAgIC8vIE5vdGU6IG5vdCBhbGwgc3ludGF4IGVycm9ycyBhcmUgYW5hbHl6ZWQsIHNvbWUgbWF5IGJlIHNraXBwZWQuCisjZGVmaW5lIENIRUNLX0RFTElNKF94KSAgICgqKF94KSA9PSAnLCcgfHwgKihfeCkgPT0gJ3gnKQorICAgIGludCAgICAgICAgIG51bTsKKyAgICBpbnQgc2luZ2xlX3dhcm5pbmcgPSAwOworICAgIGludCBmbGFnUyA9IDAsIGZsYWdDID0gMCwgZmxhZ1QgPSAwLCBmbGFnU08gPSAwLCBmbGFnQ08gPSAwOworICAgIGNvbnN0IGNoYXIgKm5leHQgPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpwcmV2OworCisgICAgU0tJUF9XUyhuZXh0KTsgIC8vIHNraXAgd2hpdGUgc3BhY2VzCisgICAgaWYgKCpuZXh0ID09ICdcMCcpCisgICAgICAgIHJldHVybjsgICAvLyBubyBkYXRhIHByb3ZpZGVkLCByZXRhaW4gZGVmYXVsdCB2YWx1ZXMKKyAgICAvLyBHZXQgbnVtX3NvY2tldHMgZmlyc3QgKG9yIHdoYXRldmVyIHNwZWNpZmllZCkKKyAgICBpZiAoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJ3MnIHx8ICpuZXh0ID09ICdTJykgeyAgLy8gZS5nLiAiMnMiCisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9IG51bTsKKyAgICAgICAgICAgIGZsYWdTID0gMTsgLy8gZ290IG51bSBzb2NrZXRzCisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ0AnKSB7IC8vIHNvY2tldCBvZmZzZXQsIGUuZy4gIjJzQDQiCisgICAgICAgICAgICAgICAgZmxhZ1NPID0gMTsKKyAgICAgICAgICAgICAgICBwcmV2ID0gKytuZXh0OyAgLy8gZG9uJ3QgYWxsb3cgc3BhY2VzIGZvciBzaW1wbGljaXR5CisgICAgICAgICAgICAgICAgaWYgKCEoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgICAgICAgICAgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCA9IG51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAnYycgfHwgKm5leHQgPT0gJ0MnKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBmbGFnUyA9IGZsYWdDID0gMTsgLy8gc29ja2V0cyB3ZXJlIG5vdCBzcGVjaWZpZWQgLSB1c2UgZGVmYXVsdAorICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICdAJykgeyAvLyBjb3JlIG9mZnNldCwgZS5nLiAiMmNANiIKKyAgICAgICAgICAgICAgICBmbGFnQ08gPSAxOworICAgICAgICAgICAgICAgIHByZXYgPSArK25leHQ7ICAvLyBkb24ndCBhbGxvdyBzcGFjZXMgZm9yIHNpbXBsaWNpdHkKKyAgICAgICAgICAgICAgICBpZiAoISgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChDSEVDS19ERUxJTShuZXh0KSkgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbnVtOyAvLyBubyBsZXR0ZXItZGVzaWduYXRvciAtIG51bSBjb3JlcworICAgICAgICAgICAgZmxhZ1MgPSBmbGFnQyA9IDE7IC8vIHNvY2tldHMgd2VyZSBub3Qgc3BlY2lmaWVkIC0gdXNlIGRlZmF1bHQKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAndCcgfHwgKm5leHQgPT0gJ1QnKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIC8vIHNvY2tldHMsIGNvcmVzIHdlcmUgbm90IHNwZWNpZmllZCAtIHVzZSBkZWZhdWx0CisgICAgICAgICAgICByZXR1cm47ICAgLy8gd2UgaWdub3JlIG9mZnNldCB2YWx1ZSBpbiBjYXNlIGFsbCBjb3JlcyBhcmUgdXNlZAorICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG51bTsKKyAgICAgICAgICAgIHJldHVybjsgICAvLyB0aGUgb25seSB2YWx1ZSBwcm92aWRlZCAtIHNldCBudW0gY29yZXMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnUyk7IC8vIG51bSBzb2NrZXRzIHNob3VsZCBhbHJlYWR5IGJlIHNldCBoZXJlCisgICAgU0tJUF9XUyhuZXh0KTsKKyAgICBpZiAoKm5leHQgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuOyAgIC8vICIgbiAgIiAtIHNvbWV0aGluZyBsaWtlIHRoaXMKKyAgICBpZiAoQ0hFQ0tfREVMSU0obmV4dCkpIHsKKyAgICAgICAgbmV4dCsrOyAgIC8vIHNraXAgZGVsaW1pdGVyCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgfQorCisgICAgLy8gR2V0IHNlY29uZCB2YWx1ZSAoY291bGQgYmUgb2Zmc2V0LCBudW1fY29yZXMsIG51bV90aHJlYWRzKQorICAgIGlmICgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSB7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnYycgfHwgKm5leHQgPT0gJ0MnKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdDID09IDApOworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbnVtOworICAgICAgICAgICAgZmxhZ0MgPSAxOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICdAJykgeyAvLyBjb3JlIG9mZnNldCwgZS5nLiAiMmNANiIKKyAgICAgICAgICAgICAgICBmbGFnQ08gPSAxOworICAgICAgICAgICAgICAgIHByZXYgPSArK25leHQ7ICAvLyBkb24ndCBhbGxvdyBzcGFjZXMgZm9yIHNpbXBsaWNpdHkKKyAgICAgICAgICAgICAgICBpZiAoISgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAnbycgfHwgKm5leHQgPT0gJ08nKSB7IC8vIG9mZnNldCBzcGVjaWZpZWQKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlRGVwcmVjYXRlZCk7CisgICAgICAgICAgICBzaW5nbGVfd2FybmluZyA9IDE7CisgICAgICAgICAgICBpZiAoZmxhZ0MpIHsgLy8gd2hldGhlciBudW1fY29yZXMgYWxyZWFkeSBzcGVjaWZpZWQgKHNvY2tldHMgc2tpcHBlZCkKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCFmbGFnQ08pOyAvLyBlaXRoZXIgIm8iIG9yIEAsIG5vdCBib3RoCisgICAgICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIWZsYWdTTyk7IC8vIGVpdGhlciAibyIgb3IgQCwgbm90IGJvdGgKKyAgICAgICAgICAgICAgICBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICd0JyB8fCAqbmV4dCA9PSAnVCcpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ1QgPT0gMCk7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIGZsYWdDID0gMTsgLy8gbnVtX2NvcmVzIGNvdWxkIGJlIHNraXBwZWQgPworICAgICAgICAgICAgZmxhZ1QgPSAxOworICAgICAgICAgICAgbmV4dCsrOyAvLyBjYW4gaGF2ZSBjb3JlLW9mZnNldCBzcGVjaWZpZWQgYWZ0ZXIgbnVtIHRocmVhZHMKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdDKTsgLy8gNHgyIG1lYW5zIDQgY29yZXMgMiB0aHJlYWRzIHBlciBjb3JlCisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIHJldHVybjsgICAvLyB0d28gdmFsdWVzIHByb3ZpZGVkIHdpdGhvdXQgbGV0dGVyLWRlc2lnbmF0b3IKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU0tJUF9XUyhuZXh0KTsKKyAgICBpZiAoKm5leHQgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuOyAgIC8vICIgTnMsTmMgICIgLSBzb21ldGhpbmcgbGlrZSB0aGlzCisgICAgaWYgKENIRUNLX0RFTElNKG5leHQpKSB7CisgICAgICAgIG5leHQrKzsgICAvLyBza2lwIGRlbGltaXRlcgorICAgICAgICBTS0lQX1dTKG5leHQpOworICAgIH0KKworICAgIC8vIEdldCB0aGlyZCB2YWx1ZSAoY291bGQgYmUgY29yZS1vZmZzZXQsIG51bV9jb3JlcywgbnVtX3RocmVhZHMpCisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICd0JyB8fCAqbmV4dCA9PSAnVCcpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ1QgPT0gMCk7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIGlmIChmbGFnQyA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbnVtX2NvcmVzIGNvdWxkIGJlIHNraXBwZWQgKGUuZy4gMnMsNG8sMnQpCisgICAgICAgICAgICBmbGFnVCA9IDE7CisgICAgICAgICAgICBuZXh0Kys7IC8vIGNhbiBoYXZlIGNvcmUtb2Zmc2V0IHNwZWNpZmllZCBsYXRlciAoZS5nLiAycywxYywydCwzbykKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAnYycgfHwgKm5leHQgPT0gJ0MnKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdDID09IDApOworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbnVtOworICAgICAgICAgICAgZmxhZ0MgPSAxOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgLy9LTVBfREVCVUdfQVNTRVJUKCpuZXh0ICE9ICdAJyk7IC8vIHNvY2tldCBvZmZzZXQgdXNlZCAibyIgZGVzaWduYXRvcgorICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdvJyB8fCAqbmV4dCA9PSAnTycpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlRGVwcmVjYXRlZCk7CisgICAgICAgICAgICBzaW5nbGVfd2FybmluZyA9IDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdDKTsKKyAgICAgICAgICAgIC8vS01QX0RFQlVHX0FTU0VSVCghZmxhZ1NPKTsgLy8gc29ja2V0IG9mZnNldCBjb3VsZG4ndCB1c2UgQCBkZXNpZ25hdG9yCisgICAgICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnQyk7CisgICAgU0tJUF9XUyhuZXh0KTsKKyAgICBpZiAoICpuZXh0ID09ICdcMCcgKQorICAgICAgICAgICAgcmV0dXJuOworICAgIGlmIChDSEVDS19ERUxJTShuZXh0KSkgeworICAgICAgICBuZXh0Kys7ICAgLy8gc2tpcCBkZWxpbWl0ZXIKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICB9CisKKyAgICAvLyBHZXQgNC10aCB2YWx1ZSAoY291bGQgYmUgY29yZS1vZmZzZXQsIG51bV90aHJlYWRzKQorICAgIGlmICgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSB7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnbycgfHwgKm5leHQgPT0gJ08nKSB7CisgICAgICAgICAgICBpZiAoIXNpbmdsZV93YXJuaW5nKSB7IC8vIHdhcm4gb25jZQorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlRGVwcmVjYXRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCFmbGFnU08pOyAvLyBzb2NrZXQgb2Zmc2V0IGNvdWxkbid0IHVzZSBAIGRlc2lnbmF0b3IKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICd0JyB8fCAqbmV4dCA9PSAnVCcpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ1QgPT0gMCk7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIGZsYWdUID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsgLy8gY2FuIGhhdmUgY29yZS1vZmZzZXQgc3BlY2lmaWVkIGFmdGVyIG51bSB0aHJlYWRzCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFNLSVBfV1MobmV4dCk7CisgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChDSEVDS19ERUxJTShuZXh0KSkgeworICAgICAgICBuZXh0Kys7ICAgLy8gc2tpcCBkZWxpbWl0ZXIKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICB9CisKKyAgICAvLyBHZXQgNS10aCB2YWx1ZSAoY291bGQgYmUgY29yZS1vZmZzZXQsIG51bV90aHJlYWRzKQorICAgIGlmICgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSB7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnbycgfHwgKm5leHQgPT0gJ08nKSB7CisgICAgICAgICAgICBpZiAoIXNpbmdsZV93YXJuaW5nKSB7IC8vIHdhcm4gb25jZQorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlRGVwcmVjYXRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdUKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIWZsYWdTTyk7IC8vIHNvY2tldCBvZmZzZXQgY291bGRuJ3QgdXNlIEAgZGVzaWduYXRvcgorICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ3QnIHx8ICpuZXh0ID09ICdUJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnVCA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuOworI3VuZGVmIENIRUNLX0RFTElNCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcGxhY2VfdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmIChfX2ttcF9wbGFjZV9udW1fc29ja2V0cyArIF9fa21wX3BsYWNlX251bV9jb3JlcyArIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKSB7CisgICAgICAgIGludCBjb21tYSA9IDA7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICAgIGlmKF9fa21wX2Vudl9mb3JtYXQpCisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lKTsKKyAgICAgICAgaWYgKF9fa21wX3BsYWNlX251bV9zb2NrZXRzKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZHMiLCBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyk7CisgICAgICAgICAgICBpZiAoX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCkKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJAJWQiLCBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0KTsKKyAgICAgICAgICAgIGNvbW1hID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfcGxhY2VfbnVtX2NvcmVzKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyVkYyIsIGNvbW1hPyIsIjoiIiwgX19rbXBfcGxhY2VfbnVtX2NvcmVzKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9wbGFjZV9jb3JlX29mZnNldCkKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJAJWQiLCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCk7CisgICAgICAgICAgICBjb21tYSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMlZHQiLCBjb21tYT8iLCI6IiIsIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcydcbiIsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworLyoKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlczogJXMgXG4iLCBuYW1lLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworKi8KKyAgICB9Cit9CisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRk9SS0pPSU5fRlJBTUVTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZm9ya2pvaW5fZnJhbWVzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9mb3Jram9pbl9mcmFtZXMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lcworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRk9SS0pPSU5fRlJBTUVTX01PREUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIDMsICYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lc19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfRElTUExBWV9FTlYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIE9NUF80MF9FTkFCTEVECisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfb21wX2Rpc3BsYXlfZW52KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJWRVJCT1NFIiwgMSwgdmFsdWUgKSApCisgICAgeworICAgICAgICBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGlzcGxheV9lbnYgKTsKKyAgICB9CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X29tcF9kaXNwbGF5X2Vudigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiAoIF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgKQorICAgIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAiVkVSQk9TRSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kaXNwbGF5X2VudiApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9kaXNwbGF5X2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZQYXJhbGxlbFdhcm4sIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gICAvLyByZWFkIHZhbHVlIGJlZm9yZSBmaXJzdCBwYXJhbGxlbCBvbmx5CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX29tcF9jYW5jZWxsYXRpb24gKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfb21wX2NhbmNlbGxhdGlvbiApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2NhbmNlbGxhdGlvbgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGFibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdGljIGttcF9zZXR0aW5nX3QgX19rbXBfc3RnX3RhYmxlW10gPSB7CisKKyAgICB7ICJLTVBfQUxMX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0JMT0NLVElNRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9EVVBMSUNBVEVfTElCX09LIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rLCAgIF9fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rLCAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTElCUkFSWSIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3ksICAgICAgICBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3ksICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX01BWF9USFJFQURTIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzLCAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LCAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIHsgIktNUF9NT05JVE9SX1NUQUNLU0laRSIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9tb25pdG9yX3N0YWNrc2l6ZSwgIF9fa21wX3N0Z19wcmludF9tb25pdG9yX3N0YWNrc2l6ZSwgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU0VUVElOR1MiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUQUNLT0ZGU0VUIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrb2Zmc2V0LCAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVEFDS1NJWkUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdGFja3NpemUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1RBQ0tQQUQiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2twYWQsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RhY2twYWQsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1ZFUlNJT04iLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24sICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3ZlcnNpb24sICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9XQVJOSU5HUyIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV93YXJuaW5ncywgICAgICAgICAgIF9fa21wX3N0Z19wcmludF93YXJuaW5ncywgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKworICAgIHsgIk9NUF9ORVNURUQiLCAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9uZXN0ZWQsICAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9uZXN0ZWQsICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfTlVNX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1NUQUNLU0laRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1RBU0tJTkciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9UQVNLX1NURUFMSU5HX0NPTlNUUkFJTlQiLCAgICAgIF9fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nLCAgICAgIF9fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nLCAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfTUFYX0FDVElWRV9MRVZFTFMiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMsICBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMsICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1RIUkVBRF9MSU1JVCIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRzLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9XQUlUX1BPTElDWSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeSwgICAgICAgIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIHsgIktNUF9IT1RfVEVBTVNfTUFYX0xFVkVMIiwgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbGV2ZWwsICAgIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbGV2ZWwsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfSE9UX1RFQU1TX01PREUiLCAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX21vZGUsICAgICBfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX21vZGUsICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIHsgIktNUF9IQU5ETEVfU0lHTkFMUyIsICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscywgICAgIF9fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscywgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIHsgIktNUF9JTkhFUklUX0ZQX0NPTlRST0wiLCAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2wsIF9fa21wX3N0Z19wcmludF9pbmhlcml0X2ZwX2NvbnRyb2wsIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICB7ICJHT01QX1NUQUNLU0laRSIsICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplLCAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHsgIktNUF9BX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9hX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQl9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYl9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYl9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0NfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2NfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2NfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9EX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9kX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRV9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZV9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZV9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ZfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2ZfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1ZywgICAgICAgICAgICAgIE5VTEwsIC8qIG5vIHByaW50ICovICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHX0JVRl9BVE9NSUMiLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9hdG9taWMsICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMsICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUZfQ0hBUlMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfY2hhcnMsICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGX0xJTkVTIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2xpbmVzLCAgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2xpbmVzLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RJQUciLCAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RpYWcsICAgICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2RpYWcsICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1BBUl9SQU5HRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYsICAgICAgX19rbXBfc3RnX3ByaW50X3Bhcl9yYW5nZV9lbnYsICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ZSUVMRF9DWUNMRSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV95aWVsZF9jeWNsZSwgICAgICAgIF9fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfWUlFTERfT04iLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb24sICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24sICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1lJRUxEX09GRiIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZiwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZiwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8vIEtNUF9ERUJVRworCisgICAgeyAiS01QX0FMSUdOX0FMTE9DIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2FsaWduX2FsbG9jLCAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1BMQUlOX0JBUlJJRVIiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4iLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SS0pPSU5fQkFSUklFUiIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0LCBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0LCBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiIsICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiwgICAgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybiwgICAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgeyAiS01QX1JFRFVDVElPTl9CQVJSSUVSIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9SRURVQ1RJT05fQkFSUklFUl9QQVRURVJOIiwgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisgICAgeyAiS01QX0FCT1JUX0RFTEFZIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5LCAgICAgICAgX19rbXBfc3RnX3ByaW50X2Fib3J0X2RlbGF5LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9DUFVJTkZPX0ZJTEUiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9jcHVpbmZvX2ZpbGUsICAgICAgIF9fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUsICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SQ0VfUkVEVUNUSU9OIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uLCAgICBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIiwgICAgICAgX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbiwgICAgX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVE9SQUdFX01BUCIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdG9yYWdlX21hcCwgICAgICAgIF9fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcCwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQUxMX1RIUkVBRFBSSVZBVEUiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHByaXZhdGUsICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHByaXZhdGUsICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUkVJR05fVEhSRUFEU19USFJFQURQUklWQVRFIiwgX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlLCBfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUsICAgICBOVUxMLCAwLCAwIH0sCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgeyAiS01QX0FGRklOSVRZIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FmZmluaXR5LCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2FmZmluaXR5LCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICB7ICJHT01QX0NQVV9BRkZJTklUWSIsICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZ29tcF9jcHVfYWZmaW5pdHksICBOVUxMLCAvKiBubyBwcmludCAqLyAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHsgIk9NUF9QUk9DX0JJTkQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9wcm9jX2JpbmQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfUExBQ0VTIiwgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGxhY2VzLCAgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcGxhY2VzLCAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVsc2UKKyAgICB7ICJPTVBfUFJPQ19CSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kLCAgICAgICAgICBOVUxMLCAvKiBubyBwcmludCAqLyAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICB7ICJLTVBfVE9QT0xPR1lfTUVUSE9EIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfdG9wb2xvZ3lfbWV0aG9kLCAgICBfX2ttcF9zdGdfcHJpbnRfdG9wb2xvZ3lfbWV0aG9kLCAgICBOVUxMLCAwLCAwIH0sCisKKyNlbHNlCisKKyAgICAvLworICAgIC8vIEtNUF9BRkZJTklUWSBpcyBub3Qgc3VwcG9ydGVkIG9uIE9TIFgqLCBub3IgaXMgT01QX1BMQUNFUy4KKyAgICAvLyBPTVBfUFJPQ19CSU5EIGFuZCBwcm9jLWJpbmQtdmFyIGFyZSBzdXBwb3J0ZWQsIGhvd2V2ZXIuCisgICAgLy8KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfUFJPQ19CSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVuZGlmCisKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyAgICB7ICJLTVBfSU5JVF9BVF9GT1JLIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW5pdF9hdF9mb3JrLCAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrLCAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NDSEVEVUxFIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3NjaGVkdWxlLCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlLCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9TQ0hFRFVMRSIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9vbXBfc2NoZWR1bGUsICAgICAgIF9fa21wX3N0Z19wcmludF9vbXBfc2NoZWR1bGUsICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQVRPTUlDX01PREUiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYXRvbWljX21vZGUsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0NPTlNJU1RFTkNZX0NIRUNLIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2NvbnNpc3RlbmN5X2NoZWNrLCAgX19rbXBfc3RnX3ByaW50X2NvbnNpc3RlbmN5X2NoZWNrLCAgTlVMTCwgMCwgMCB9LAorCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIHsgIktNUF9JVFRfUFJFUEFSRV9ERUxBWSIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pdHRfcHJlcGFyZV9kZWxheSwgIF9fa21wX3N0Z19wcmludF9pdHRfcHJlcGFyZV9kZWxheSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgeyAiS01QX01BTExPQ19QT09MX0lOQ1IiLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX21hbGxvY19wb29sX2luY3IsICAgX19rbXBfc3RnX3ByaW50X21hbGxvY19wb29sX2luY3IsICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9JTklUX1dBSVQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbml0X3dhaXQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9pbml0X3dhaXQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTkVYVF9XQUlUIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbmV4dF93YWl0LCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0LCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0dUSURfTU9ERSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2d0aWRfbW9kZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2d0aWRfbW9kZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9EWU5BTUlDIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9vbXBfZHluYW1pYywgICAgICAgIF9fa21wX3N0Z19wcmludF9vbXBfZHluYW1pYywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRFlOQU1JQ19NT0RFIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfa21wX2R5bmFtaWNfbW9kZSwgICBfX2ttcF9zdGdfcHJpbnRfa21wX2R5bmFtaWNfbW9kZSwgICBOVUxMLCAwLCAwIH0sCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgeyAiS01QX0xPQURfQkFMQU5DRV9JTlRFUlZBTCIsICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2xkX2JhbGFuY2VfaW50ZXJ2YWwsX19rbXBfc3RnX3ByaW50X2xkX2JhbGFuY2VfaW50ZXJ2YWwsTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyAgICB7ICJLTVBfTlVNX0xPQ0tTX0lOX0JMT0NLIiwgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbG9ja19ibG9jaywgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbG9ja19ibG9jaywgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0xPQ0tfS0lORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2xvY2tfa2luZCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2xvY2tfa2luZCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICB7ICJLTVBfQURBUFRJVkVfTE9DS19QUk9QUyIsICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWRhcHRpdmVfbG9ja19wcm9wcyxfX2ttcF9zdGdfcHJpbnRfYWRhcHRpdmVfbG9ja19wcm9wcywgIE5VTEwsIDAsIDAgfSwKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICB7ICJLTVBfU1BFQ1VMQVRJVkVfU1RBVFNGSUxFIiwgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLF9fa21wX3N0Z19wcmludF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgeyAiS01QX1BMQUNFX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3BsYWNlX3RocmVhZHMsICAgICAgX19rbXBfc3RnX3ByaW50X3BsYWNlX3RocmVhZHMsICAgICAgTlVMTCwgMCwgMCB9LAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICB7ICJLTVBfRk9SS0pPSU5fRlJBTUVTIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzLCAgICBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUktKT0lOX0ZSQU1FU19NT0RFIiwgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lc19tb2RlLF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXNfbW9kZSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgeyAiT01QX0RJU1BMQVlfRU5WIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudiwgICAgX19rbXBfc3RnX3ByaW50X29tcF9kaXNwbGF5X2VudiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9DQU5DRUxMQVRJT04iLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9vbXBfY2FuY2VsbGF0aW9uLCAgIF9fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uLCAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorICAgIHsgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfQorfTsgLy8gc2V0dGluZ3MKKworc3RhdGljIGludCBjb25zdCBfX2ttcF9zdGdfY291bnQgPSBzaXplb2YoIF9fa21wX3N0Z190YWJsZSApIC8gc2l6ZW9mKCBrbXBfc2V0dGluZ190ICk7CisKK3N0YXRpYyBpbmxpbmUKK2ttcF9zZXR0aW5nX3QgKgorX19rbXBfc3RnX2ZpbmQoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgaW50IGk7CisgICAgaWYgKCBuYW1lICE9IE5VTEwgKSB7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICAgICAgaWYgKCBzdHJjbXAoIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsIG5hbWUgKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHJldHVybiAmIF9fa21wX3N0Z190YWJsZVsgaSBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gTlVMTDsKKworfSAvLyBfX2ttcF9zdGdfZmluZAorCisKK3N0YXRpYyBpbnQKK19fa21wX3N0Z19jbXAoIHZvaWQgY29uc3QgKiBfYSwgdm9pZCBjb25zdCAqIF9iICkgeworICAgIGttcF9zZXR0aW5nX3QgKiBhID0gKGttcF9zZXR0aW5nX3QgKikgX2E7CisgICAga21wX3NldHRpbmdfdCAqIGIgPSAoa21wX3NldHRpbmdfdCAqKSBfYjsKKworICAgIC8vCisgICAgLy8gUHJvY2VzcyBLTVBfQUZGSU5JVFkgbGFzdC4KKyAgICAvLyBJdCBuZWVkcyB0byBjb21lIGFmdGVyIE9NUF9QTEFDRVMgYW5kIEdPTVBfQ1BVX0FGRklOSVRZLgorICAgIC8vCisgICAgaWYgKCBzdHJjbXAoIGEtPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgaWYgKCBzdHJjbXAoIGItPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICggc3RyY21wKCBiLT5uYW1lLCAiS01QX0FGRklOSVRZIiApID09IDAgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmNtcCggYS0+bmFtZSwgYi0+bmFtZSApOworfSAvLyBfX2ttcF9zdGdfY21wCisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19pbml0KCB2b2lkCispIHsKKworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKCAhIGluaXRpYWxpemVkICkgeworCisgICAgICAgIC8vIFNvcnQgdGFibGUuCisgICAgICAgIHFzb3J0KCBfX2ttcF9zdGdfdGFibGUsIF9fa21wX3N0Z19jb3VudCAtIDEsIHNpemVvZigga21wX3NldHRpbmdfdCApLCBfX2ttcF9zdGdfY21wICk7CisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplICpfU1RBQ0tTSVpFIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfc3RhY2tzaXplICA9IF9fa21wX3N0Z19maW5kKCAiS01QX1NUQUNLU0laRSIgICk7ICAgICAgLy8gMXN0IHByaW9yaXR5LgorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGdvbXBfc3RhY2tzaXplID0gX19rbXBfc3RnX2ZpbmQoICJHT01QX1NUQUNLU0laRSIgKTsgICAgICAvLyAybmQgcHJpb3JpdHkuCisjZW5kaWYKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfc3RhY2tzaXplICA9IF9fa21wX3N0Z19maW5kKCAiT01QX1NUQUNLU0laRSIgICk7ICAgICAgLy8gM3JkIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgLy8gISEhIENvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgcml2YWxzIGlzIHVzZWQgYW5kIG9wdGltaXplcyBvdXQgYXNzaWdubWVudHMKKyAgICAgICAgICAgIC8vICEhISAgICAgcml2YWxzWyBpICsrIF0gPSAuLi47CisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgNCBdOworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfc3NfZGF0YV90IGttcF9kYXRhICA9IHsgICAgMSwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3QgZ29tcF9kYXRhID0geyAxMDI0LCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyNlbmRpZgorICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfc3NfZGF0YV90IG9tcF9kYXRhICA9IHsgMTAyNCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX3N0YWNrc2l6ZTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGlmICggZ29tcF9zdGFja3NpemUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGdvbXBfc3RhY2tzaXplOworICAgICAgICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfc3RhY2tzaXplOworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfc3RhY2tzaXplLT5kYXRhID0gJiBrbXBfZGF0YTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGlmICggZ29tcF9zdGFja3NpemUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBnb21wX3N0YWNrc2l6ZS0+ZGF0YSA9ICYgZ29tcF9kYXRhOworICAgICAgICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgICAgICAgb21wX3N0YWNrc2l6ZS0+ZGF0YSA9ICYgb21wX2RhdGE7CisKKyAgICAgICAgfQorCisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfTElCUkFSWSBhbmQgT01QX1dBSVRfUE9MSUNZIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfbGlicmFyeSAgICAgPSBfX2ttcF9zdGdfZmluZCggIktNUF9MSUJSQVJZIiApOyAgICAgICAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF93YWl0X3BvbGljeSA9IF9fa21wX3N0Z19maW5kKCAiT01QX1dBSVRfUE9MSUNZIiApOyAgICAvLyAybmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgMyBdOworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfd3BfZGF0YV90IGttcF9kYXRhICA9IHsgMCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z193cF9kYXRhX3Qgb21wX2RhdGEgID0geyAxLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfbGlicmFyeTsKKyAgICAgICAgICAgIGlmICggb21wX3dhaXRfcG9saWN5ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfd2FpdF9wb2xpY3k7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfbGlicmFyeS0+ZGF0YSAgPSAmIGttcF9kYXRhOworICAgICAgICAgICAgaWYgKCBvbXBfd2FpdF9wb2xpY3kgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBvbXBfd2FpdF9wb2xpY3ktPmRhdGEgPSAmIG9tcF9kYXRhOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICB9CisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplIEtNUF9BTExfVEhSRUFEUywgS01QX01BWF9USFJFQURTLCBhbmQgT01QX1RIUkVBRF9MSU1JVCBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2FsbF90aHJlYWRzICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FMTF9USFJFQURTIiAgKTsgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfbWF4X3RocmVhZHMgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfTUFYX1RIUkVBRFMiICApOyAgLy8gMm5kIHByaW9yaXR5LgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF90aHJlYWRfbGltaXQgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9USFJFQURfTElNSVQiICk7ICAvLyAzcmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgNCBdOworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9hbGxfdGhyZWFkczsKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX21heF90aHJlYWRzOworICAgICAgICAgICAgaWYgKCBvbXBfdGhyZWFkX2xpbWl0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfdGhyZWFkX2xpbWl0OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworICAgICAgICAgICAga21wX2FsbF90aHJlYWRzLT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworICAgICAgICAgICAga21wX21heF90aHJlYWRzLT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworICAgICAgICAgICAgaWYgKCBvbXBfdGhyZWFkX2xpbWl0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgb21wX3RocmVhZF9saW1pdC0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgfQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0FGRklOSVRZLCBHT01QX0NQVV9BRkZJTklUWSwgYW5kIE9NUF9QUk9DX0JJTkQgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9hZmZpbml0eSA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FGRklOSVRZIiAgKTsgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGttcF9hZmZpbml0eSAhPSBOVUxMICk7CisKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogZ29tcF9jcHVfYWZmaW5pdHkgPSBfX2ttcF9zdGdfZmluZCggIkdPTVBfQ1BVX0FGRklOSVRZIiAgKTsgIC8vIDJuZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGdvbXBfY3B1X2FmZmluaXR5ICE9IE5VTEwgKTsKKyMgZW5kaWYKKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF9wcm9jX2JpbmQgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9QUk9DX0JJTkQiICk7ICAvLyAzcmQgcHJpb3JpdHkuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBvbXBfcHJvY19iaW5kICE9IE5VTEwgKTsKKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyA0IF07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2FmZmluaXR5OworCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBnb21wX2NwdV9hZmZpbml0eTsKKyAgICAgICAgICAgIGdvbXBfY3B1X2FmZmluaXR5LT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworIyBlbmRpZgorCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF9wcm9jX2JpbmQ7CisgICAgICAgICAgICBvbXBfcHJvY19iaW5kLT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHBsYWNlc19yaXZhbHNbIDQgXTsKKyAgICAgICAgICAgIGkgPSAwOworCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3BsYWNlcyA9IF9fa21wX3N0Z19maW5kKCAiT01QX1BMQUNFUyIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9tcF9wbGFjZXMgIT0gTlVMTCApOworCisgICAgICAgICAgICBwbGFjZXNfcml2YWxzWyBpICsrIF0gPSBrbXBfYWZmaW5pdHk7CisjICBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIHBsYWNlc19yaXZhbHNbIGkgKysgXSA9IGdvbXBfY3B1X2FmZmluaXR5OworIyAgZW5kaWYKKyAgICAgICAgICAgIHBsYWNlc19yaXZhbHNbIGkgKysgXSA9IG9tcF9wbGFjZXM7CisgICAgICAgICAgICBvbXBfcGxhY2VzLT5kYXRhID0gKHZvaWQqKSYgcGxhY2VzX3JpdmFsczsKKyAgICAgICAgICAgIHBsYWNlc19yaXZhbHNbIGkgKysgXSA9IE5VTEw7CisjIGVuZGlmCisgICAgICAgIH0KKyNlbHNlCisgICAgLy8gS01QX0FGRklOSVRZIG5vdCBzdXBwb3J0ZWQsIHNvIE9NUF9QUk9DX0JJTkQgaGFzIG5vIHJpdmFscy4KKyAgICAvLyBPTVBfUExBQ0VTIG5vdCBzdXBwb3J0ZWQgeWV0LgorI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIGFuZCBLTVBfRk9SQ0VfUkVEVUNUSU9OIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfZm9yY2VfcmVkICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0ZPUkNFX1JFRFVDVElPTiIgKTsgICAgICAgICAvLyAxc3QgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2RldGVybV9yZWQgPSBfX2ttcF9zdGdfZmluZCggIktNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiIgKTsgLy8gMm5kIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDMgXTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX2ZyX2RhdGFfdCBmb3JjZV9kYXRhICAgPSB7IDEsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfZnJfZGF0YV90IGRldGVybV9kYXRhICA9IHsgMCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2ZvcmNlX3JlZDsKKyAgICAgICAgICAgIGlmICgga21wX2RldGVybV9yZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9kZXRlcm1fcmVkOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworICAgICAgICAgICAga21wX2ZvcmNlX3JlZC0+ZGF0YSA9ICYgZm9yY2VfZGF0YTsKKyAgICAgICAgICAgIGlmICgga21wX2RldGVybV9yZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBrbXBfZGV0ZXJtX3JlZC0+ZGF0YSAgPSAmIGRldGVybV9kYXRhOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorCisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKworICAgIH07IC8vIGlmCisKKyAgICAvLyBSZXNldCBmbGFncy4KKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKysgaSApIHsKKyAgICAgICAgX19rbXBfc3RnX3RhYmxlWyBpIF0uc2V0ID0gMDsKKyAgICB9OyAvLyBmb3IKKworfSAvLyBfX2ttcF9zdGdfaW5pdAorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2UoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlCispIHsKKworICAgIC8vIE9uIFdpbmRvd3MqIE9TIHRoZXJlIGFyZSBzb21lIG5hbWVsZXNzIHZhcmlhYmxlcyBsaWtlICJDOj1DOlwiICh5ZWFoLCByZWFsbHkgbmFtZWxlc3MsIHRoZXkgYXJlCisgICAgLy8gcHJlc2VudGVkIGluIGVudmlyb25tZW50IGJsb2NrIGFzICI9Qzo9Q1xcXHgwMD1EOj1EOlxcXHgwMC4uLiIsIHNvIGxldCB1cyBza2lwIHRoZW0uCisgICAgaWYgKCBuYW1lWyAwIF0gPT0gMCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIG5hbWUgKTsKKyAgICAgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5wYXJzZSggbmFtZSwgdmFsdWUsIHNldHRpbmctPmRhdGEgKTsKKyAgICAgICAgICAgIHNldHRpbmctPmRlZmluZWQgPSAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RnX3BhcnNlCisKKworc3RhdGljIGludAorX19rbXBfc3RnX2NoZWNrX3JpdmFscyggICAgICAgICAgLy8gMCAtLSBPaywgMSAtLSBlcnJvcnMgZm91bmQuCisgICAgY2hhciBjb25zdCAqICAgICAgIG5hbWUsICAgICAvLyBOYW1lIG9mIHZhcmlhYmxlLgorICAgIGNoYXIgY29uc3QgKiAgICAgICB2YWx1ZSwgICAgLy8gVmFsdWUgb2YgdGhlIHZhcmlhYmxlLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHMgICAgLy8gTGlzdCBvZiByaXZhbCBzZXR0aW5ncyAodGhlIGxpc3QgbXVzdCBpbmNsdWRlIGN1cnJlbnQgb25lKS4KKykgeworCisgICAgaWYgKCByaXZhbHMgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gTG9vcCB0aHJ1IGhpZ2hlciBwcmlvcml0eSBzZXR0aW5ncyAobGlzdGVkIGJlZm9yZSBjdXJyZW50KS4KKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICggOyBzdHJjbXAoIHJpdmFsc1sgaSBdLT5uYW1lLCBuYW1lICkgIT0gMDsgaSsrICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByaXZhbHNbIGkgXSAhPSBOVUxMICk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIGlmICggcml2YWxzWyBpIF0gPT0gX19rbXBfYWZmaW5pdHlfbm90eXBlICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIEtNUF9BRkZJTklUWSBpcyBzcGVjaWZpZWQgd2l0aG91dCBhIHR5cGUgbmFtZSwKKyAgICAgICAgICAgIC8vIGl0IGRvZXMgbm90IHJpdmFsIE9NUF9QUk9DX0JJTkQgb3IgR09NUF9DUFVfQUZGSU5JVFkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmICggcml2YWxzWyBpIF0tPnNldCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJZ25vcmVkLCBuYW1lLCByaXZhbHNbIGkgXS0+bmFtZSApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gd2hpbGUKKworICAgICsrIGk7IC8vIFNraXAgY3VycmVudCBzZXR0aW5nLgorICAgIHJldHVybiAwOworCit9OyAvLyBfX2ttcF9zdGdfY2hlY2tfcml2YWxzCisKKworc3RhdGljIGludAorX19rbXBfZW52X3RvUHJpbnQoIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgZmxhZyApIHsKKyAgICBpbnQgcmMgPSAwOworICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIG5hbWUgKTsKKyAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgcmMgPSBzZXR0aW5nLT5kZWZpbmVkOworICAgICAgICBpZiAoIGZsYWcgPj0gMCApIHsKKyAgICAgICAgICAgIHNldHRpbmctPmRlZmluZWQgPSBmbGFnOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdXhfZW52X2luaXRpYWxpemUoIGttcF9lbnZfYmxrX3QqIGJsb2NrICkgeworCisgICAgY2hhciBjb25zdCAqIHZhbHVlOworCisgICAgLyogT01QX05VTV9USFJFQURTICovCisgICAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggYmxvY2ssICJPTVBfTlVNX1RIUkVBRFMiICk7CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgb21wY19zZXRfbnVtX3RocmVhZHMoIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKyAgICB9CisKKyAgICAvKiBLTVBfQkxPQ0tUSU1FICovCisgICAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggYmxvY2ssICJLTVBfQkxPQ0tUSU1FIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZSggX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKKyAgICB9CisKKyAgICAvKiBPTVBfTkVTVEVEICovCisgICAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggYmxvY2ssICJPTVBfTkVTVEVEIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIG9tcGNfc2V0X25lc3RlZCggX19rbXBfZGZsdF9uZXN0ZWQgKTsKKyAgICB9CisKKyAgICAvKiBPTVBfRFlOQU1JQyAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiT01QX0RZTkFNSUMiICk7CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgb21wY19zZXRfZHluYW1pYyggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljICk7CisgICAgfQorCit9CisKK3ZvaWQKK19fa21wX2Vudl9pbml0aWFsaXplKCBjaGFyIGNvbnN0ICogc3RyaW5nICkgeworCisgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICBpbnQgICAgICAgICAgIGk7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworCisgICAgLy8gSGFjayEhIQorICAgIGlmICggc3RyaW5nID09IE5VTEwgKSB7CisgICAgICAgIC8vIF9fa21wX21heF9udGggPSBfX2ttcF9zeXNfbWF4X250aDsKKyAgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IF9fa21wX2luaXRpYWxfdGhyZWFkc19jYXBhY2l0eSggX19rbXBfZGZsdF90ZWFtX250aF91YiApOworICAgIH07IC8vIGlmCisgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBzdHJpbmcgKTsKKworICAgIC8vCisgICAgLy8gdXBkYXRlIHRoZSBzZXQgZmxhZyBvbiBhbGwgZW50cmllcyB0aGF0IGhhdmUgYW4gZW52IHZhcgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgaWYgKCggYmxvY2sudmFyc1sgaSBdLm5hbWUgPT0gTlVMTCApCisgICAgICAgICAgfHwgKCAqYmxvY2sudmFyc1sgaSBdLm5hbWUgPT0gJ1wwJykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggYmxvY2sudmFyc1sgaSBdLnZhbHVlID09IE5VTEwgKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBrbXBfc2V0dGluZ190ICogc2V0dGluZyA9IF9fa21wX3N0Z19maW5kKCBibG9jay52YXJzWyBpIF0ubmFtZSApOworICAgICAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHNldHRpbmctPnNldCA9IDE7CisgICAgICAgIH0KKyAgICB9OyAvLyBmb3IgaQorCisgICAgLy8gU3BlY2lhbCBjYXNlLiBJZiB3ZSBwYXJzZSBlbnZpcm9ubWVudCwgbm90IGEgc3RyaW5nLCBwcm9jZXNzIEtNUF9XQVJOSU5HUyBmaXJzdC4KKyAgICBpZiAoIHN0cmluZyA9PSBOVUxMICkgeworICAgICAgICBjaGFyIGNvbnN0ICogbmFtZSAgPSAiS01QX1dBUk5JTkdTIjsKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoICYgYmxvY2ssIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlKCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8KKyAgICAvLyBTcGVjaWFsIGNhc2UuIEtNUF9BRkZJTklUWSBpcyBub3QgYSByaXZhbCB0byBvdGhlciBhZmZpbml0eSBlbnYgdmFycworICAgIC8vIGlmIG5vIGFmZmluaXR5IHR5cGUgaXMgc3BlY2lmaWVkLiAgV2Ugd2FudCB0byBhbGxvdworICAgIC8vIEtNUF9BRkZJTklUWT1bbm9dLHZlcmJvc2UvW25vXXdhcm5pbmdzL2V0Yy4gIHRvIGJlIGVuYWJsZWQgd2hlbgorICAgIC8vIHNwZWNpZnlpbmcgdGhlIGFmZmluaXR5IHR5cGUgdmlhIEdPTVBfQ1BVX0FGRklOSVRZIG9yIHRoZSBPTVAgNC4wCisgICAgLy8gYWZmaW5pdHkgbWVjaGFuaXNtLgorICAgIC8vCisgICAgX19rbXBfYWZmaW5pdHlfbm90eXBlID0gTlVMTDsKKyAgICBjaGFyIGNvbnN0ICphZmZfc3RyID0gX19rbXBfZW52X2Jsa192YXIoICYgYmxvY2ssICJLTVBfQUZGSU5JVFkiICk7CisgICAgaWYgKCBhZmZfc3RyICE9IE5VTEwgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBLTVBfQUZGSU5JVFkgdHlwZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZy4KKyAgICAgICAgLy8gV2UganVzdCBzZWFyY2ggdGhlIHN0cmluZyBmb3IgImNvbXBhY3QiLCAic2NhdHRlciIsIGV0Yy4KKyAgICAgICAgLy8gd2l0aG91dCByZWFsbHkgcGFyc2luZyB0aGUgc3RyaW5nLiAgVGhlIHN5bnRheCBvZiB0aGUKKyAgICAgICAgLy8gS01QX0FGRklOSVRZIGVudiB2YXIgaXMgc3VjaCB0aGF0IG5vbmUgb2YgdGhlIGFmZmluaXR5CisgICAgICAgIC8vIHR5cGUgbmFtZXMgY2FuIGFwcGVhciBhbnl3aGVyZSBvdGhlciB0aGF0IHRoZSB0eXBlCisgICAgICAgIC8vIHNwZWNpZmllciwgZXZlbiBhcyBzdWJzdHJpbmdzLgorICAgICAgICAvLworICAgICAgICAvLyBJIGNhbid0IGZpbmQgYSBjYXNlLWluc2Vuc2l0aXZlIHZlcnNpb24gb2Ygc3Ryc3RyIG9uIFdpbmRvd3MqIE9TLgorICAgICAgICAvLyBVc2UgdGhlIGNhc2Utc2Vuc2l0aXZlIHZlcnNpb24gZm9yIG5vdy4KKyAgICAgICAgLy8KKworIyBpZiBLTVBfT1NfV0lORE9XUworIyAgZGVmaW5lIEZJTkQgc3Ryc3RyCisjIGVsc2UKKyMgIGRlZmluZSBGSU5EIHN0cmNhc2VzdHIKKyMgZW5kaWYKKworICAgICAgICBpZiAoICggRklORCggYWZmX3N0ciwgIm5vbmUiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAicGh5c2ljYWwiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAibG9naWNhbCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJjb21wYWN0IiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgInNjYXR0ZXIiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiZXhwbGljaXQiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiYmFsYW5jZWQiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiZGlzYWJsZWQiICkgPT0gTlVMTCApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbm90eXBlID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUZGSU5JVFkiICApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgbmV3IGFmZmluaXR5IHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGFmZmluaXR5IGZsYWdzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLAorICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGlzIGlzIGNhbGxlZCBmcm9tIGttcF9zZXRfZGVmYXVsdHMoKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQ7CisgICAgICAgIH0KKyMgdW5kZWYgRklORAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxzbyByZXNldCB0aGUgYWZmaW5pdHkgZmxhZ3MgaWYgT01QX1BST0NfQklORCBpcyBzcGVjaWZpZWQuCisgICAgICAgIC8vCisgICAgICAgIGFmZl9zdHIgPSBfX2ttcF9lbnZfYmxrX3ZhciggJiBibG9jaywgIk9NUF9QUk9DX0JJTkQiICk7CisgICAgICAgIGlmICggYWZmX3N0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0OworICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB9CisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vCisgICAgLy8gU2V0IHVwIHRoZSBuZXN0ZWQgcHJvYyBiaW5kIHR5cGUgdmVjdG9yLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID0gKGttcF9wcm9jX2JpbmRfdCAqKQorICAgICAgICAgIEtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICk7CisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyMgZWxzZQorICAgICAgICAvLyBkZWZhdWx0IHByb2MgYmluZCBpcyBmYWxzZSBpZiBhZmZpbml0eSBub3Qgc3VwcG9ydGVkCisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLy8KKyAgICAvLyBOb3cgcHJvY2VzcyBhbGwgb2YgdGhlIHNldHRpbmdzLgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlKCBibG9jay52YXJzWyBpIF0ubmFtZSwgYmxvY2sudmFyc1sgaSBdLnZhbHVlICk7CisgICAgfTsgLy8gZm9yIGkKKworICAgIC8vCisgICAgLy8gSWYgdXNlciBsb2NrcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgZG9uJ3QgcmVzZXQgdGhlIGxvY2sgdnB0ciB0YWJsZS4KKyAgICAvLworICAgIGlmICggISBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSB7CisgICAgICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZGVmYXVsdCApIHsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgfQorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgIF9fa21wX2luaXRfZHluYW1pY191c2VyX2xvY2tzKCk7CisjZWxzZQorICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBfX2ttcF91c2VyX2xvY2tfa2luZCApOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHJpbmcgIT0gTlVMTCk7IC8vIGttcF9zZXRfZGVmYXVsdHMoKSB3YXMgY2FsbGVkCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3VzZXJfbG9ja19raW5kICE9IGxrX2RlZmF1bHQgKTsKKyAgICAgICAgLy8gQmluZHMgbG9jayBmdW5jdGlvbnMgYWdhaW4gdG8gZm9sbG93IHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGlmZmVyZW50CisgICAgICAgIC8vIEtNUF9DT05TSVNURU5DWV9DSEVDSyB2YWx1ZXMuIENhbGxpbmcgdGhpcyBhZ2FpbiBpcyBoYXJtbGVzcyBhcyBsb25nCisgICAgICAgIC8vIGFzIHdlIGRvIG5vdCBhbGxvdyBsb2NrIGtpbmQgY2hhbmdlcyBhZnRlciBtYWtpbmcgYSBjYWxsIHRvIGFueQorICAgICAgICAvLyB1c2VyIGxvY2sgZnVuY3Rpb25zICh0cnVlKS4KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgICBfX2ttcF9pbml0X2R5bmFtaWNfdXNlcl9sb2NrcygpOworI2Vsc2UKKyAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycyggX19rbXBfdXNlcl9sb2NrX2tpbmQgKTsKKyNlbmRpZgorICAgIH0KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbWFjaGluZS9PUyBpcyBhY3R1YWxseSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcKKyAgICAgICAgLy8gYWZmaW5pdHkuCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IGNoYXIgKnZhciA9ICJLTVBfQUZGSU5JVFkiOworIyBpZiBLTVBfVVNFX0hXTE9DCisgICAgICAgIGlmKGh3bG9jX3RvcG9sb2d5X2luaXQoJl9fa21wX2h3bG9jX3RvcG9sb2d5KSA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2h3bG9jX2Vycm9yID0gVFJVRTsKKyAgICAgICAgICAgIGlmKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSHdsb2NFcnJvck9jY3VycmVkLCB2YXIsICJod2xvY190b3BvbG9neV9pbml0KCkiKTsKKyAgICAgICAgfQorICAgICAgICBod2xvY190b3BvbG9neV9pZ25vcmVfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgSFdMT0NfT0JKX0NBQ0hFKTsKKyMgZW5kaWYKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkICkgeworICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworIyBpZiBLTVBfVVNFX0hXTE9DCisgICAgICAgICAgICBjb25zdCBod2xvY190b3BvbG9neV9zdXBwb3J0KiB0b3BvbG9neV9zdXBwb3J0ID0gaHdsb2NfdG9wb2xvZ3lfZ2V0X3N1cHBvcnQoX19rbXBfaHdsb2NfdG9wb2xvZ3kpOworICAgICAgICAgICAgaWYoaHdsb2NfdG9wb2xvZ3lfbG9hZChfX2ttcF9od2xvY190b3BvbG9neSkgPCAwKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaHdsb2NfZXJyb3IgPSBUUlVFOworICAgICAgICAgICAgICAgIGlmKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkh3bG9jRXJyb3JPY2N1cnJlZCwgdmFyLCAiaHdsb2NfdG9wb2xvZ3lfbG9hZCgpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJcyB0aGUgc3lzdGVtIGNhcGFibGUgb2Ygc2V0dGluZy9nZXR0aW5nIHRoaXMgdGhyZWFkJ3MgYWZmaW5pdHk/CisgICAgICAgICAgICAvLyBhbHNvLCBpcyB0b3BvbG9neSBkaXNjb3ZlcnkgcG9zc2libGU/IChwdSBpbmRpY2F0ZXMgYWJpbGl0eSB0byBkaXNjb3ZlciBwcm9jZXNzaW5nIHVuaXRzKQorICAgICAgICAgICAgLy8gYW5kIGZpbmFsbHksIHdlcmUgdGhlcmUgbm8gZXJyb3JzIHdoZW4gY2FsbGluZyBhbnkgaHdsb2NfKiBBUEkgZnVuY3Rpb25zPworICAgICAgICAgICAgaWYodG9wb2xvZ3lfc3VwcG9ydC0+Y3B1YmluZC0+c2V0X3RoaXN0aHJlYWRfY3B1YmluZCAmJgorICAgICAgICAgICAgICAgdG9wb2xvZ3lfc3VwcG9ydC0+Y3B1YmluZC0+Z2V0X3RoaXN0aHJlYWRfY3B1YmluZCAmJgorICAgICAgICAgICAgICAgdG9wb2xvZ3lfc3VwcG9ydC0+ZGlzY292ZXJ5LT5wdSAmJgorICAgICAgICAgICAgICAgIV9fa21wX2h3bG9jX2Vycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGVuYWJsZXMgYWZmaW5pdHkgYWNjb3JkaW5nIHRvIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgbWFjcm8KKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKFRSVUUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IGh3bG9jIGRpZG4ndCB3b3JrIGFuZCBkaXNhYmxlIGFmZmluaXR5CisgICAgICAgICAgICAgICAgX19rbXBfaHdsb2NfZXJyb3IgPSBUUlVFOworICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgICAgICAgICB9CisjIGVsc2UKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCB2YXIgKTsKKyMgZW5kaWYgLy8gS01QX1VTRV9IV0xPQworICAgICAgICAgICAgaWYgKCAhIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8ICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0ICkKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lICkKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCApICkgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb3RTdXBwb3J0ZWQsIHZhciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkICkgIHsKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF90cnVlICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9NUF9QUk9DX0JJTkQ9dHJ1ZSBtYXBzIHRvIE9NUF9QUk9DX0JJTkQ9c3ByZWFkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9zcHJlYWQ7CisgICAgICAgIH0KKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgICAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIFdpbiA2NCBncm91cCBhZmZpbml0eSBzdHVmZiBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgICAgICAgIC8vIHByb2Nlc3NvciBncm91cHMsIG9yIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpdCwgYW5kIE9NUCA0LjAKKyAgICAgICAgICAgIC8vIGFmZmluaXR5IGlzIG5vdCBpbiBlZmZlY3QuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAoICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSApCisgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkKKyMgIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgKQorIyAgZW5kaWYKKyAgICAgICAgICAgICAgfHwgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXAgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9PSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyMgIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgIGVuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2dyb3VwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZ3JvdXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICggX19rbXBfYWZmaW5pdHlfZ3JhbiAhPSBhZmZpbml0eV9ncmFuX2dyb3VwICkKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl9maW5lICkKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0ciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBfX2ttcF9hZmZpbml0eV9ncmFuICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9jb3JlOiBzdHIgPSAiY29yZSI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOiBzdHIgPSAicGFja2FnZSI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ub2RlOiBzdHIgPSAibm9kZSI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuVG9wR3JvdXAsIHZhciwgc3RyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2dyb3VwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X3R5cGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDogc3RyID0gInBoeXNpY2FsIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOiBzdHIgPSAibG9naWNhbCI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDogc3RyID0gImNvbXBhY3QiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6IHN0ciA9ICJzY2F0dGVyIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9leHBsaWNpdDogc3RyID0gImV4cGxpY2l0IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gTUlDIG9uIHdpbmRvd3MsIHNvIG5vIGFmZmluaXR5X2JhbGFuY2VkIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmR3Jhbkdyb3VwVHlwZSwgdmFyLCBzdHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9PSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdCApIHsKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgaWYgKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfaW50ZWwgKQorICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gIT0gcHJvY19iaW5kX2RlZmF1bHQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKSB7CisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX21pY190eXBlICE9IG5vbl9taWMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X3NjYXR0ZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkKKyAgICAgICAgICAgICAgICAgICYmICAoIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCApICkgeworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfdHlwZSAgICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV90eXBlICAgICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X2NvbXBhY3QgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9vZmZzZXQgICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfZ3JhbiAgICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9ncmFuICAgICAgICAgKSApOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfZGVmYXVsdCApOworIyBlbmRpZgorICAgIH0KKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIGlmICggX19rbXBfdmVyc2lvbiApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdmVyc2lvbl8xKCk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIFBvc3QtaW5pdGlhbGl6YXRpb24gc3RlcDogc29tZSBlbnYuIHZhcnMgbmVlZCB0aGVpciB2YWx1ZSdzIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgIGlmICggc3RyaW5nICE9IE5VTEwpIHsgLy8ga21wX3NldF9kZWZhdWx0cygpIHdhcyBjYWxsZWQKKyAgICAgICAgX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCAmYmxvY2sgKTsKKyAgICB9CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKworICAgIEtNUF9NQigpOworCit9IC8vIF9fa21wX2Vudl9pbml0aWFsaXplCisKKwordm9pZAorX19rbXBfZW52X3ByaW50KCkgeworCisgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICBpbnQgICAgICAgICAgIGk7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgTlVMTCApOworICAgIF9fa21wX2Vudl9ibGtfc29ydCggJiBibG9jayApOworCisgICAgLy8gUHJpbnQgcmVhbCBlbnZpcm9ubWVudCB2YWx1ZXMuCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiVzXG5cbiIsIEtNUF9JMThOX1NUUiggVXNlclNldHRpbmdzICkgICk7CisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgID0gYmxvY2sudmFyc1sgaSBdLm5hbWU7CisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGJsb2NrLnZhcnNbIGkgXS52YWx1ZTsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgKCBLTVBfU1RSTEVOKCBuYW1lICkgPiA0ICYmIHN0cm5jbXAoIG5hbWUsICJLTVBfIiwgNCApID09IDAgKQorICAgICAgICAgICAgfHwgc3RybmNtcCggbmFtZSwgIk9NUF8iLCA0ICkgPT0gMAorICAgICAgICAgICAgI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgICAgIHx8IHN0cm5jbXAoIG5hbWUsICJHT01QXyIsIDUgKSA9PSAwCisgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0dPTVBfQ09NUEFUCisgICAgICAgICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICAlcz0lc1xuIiwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuIiApOworCisgICAgLy8gUHJpbnQgaW50ZXJuYWwgKGVmZmVjdGl2ZSkgc2V0dGluZ3MuCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuXG4iLCBLTVBfSTE4Tl9TVFIoIEVmZmVjdGl2ZVNldHRpbmdzICkgKTsKKyAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICggIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCggJiBidWZmZXIsIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsIF9fa21wX3N0Z190YWJsZVsgaSBdLmRhdGEgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworCisgICAgX19rbXBfZW52X2Jsa19mcmVlKCAmIGJsb2NrICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCit9IC8vIF9fa21wX2Vudl9wcmludAorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZAorX19rbXBfZW52X3ByaW50XzIoKSB7CisKKyAgICBrbXBfZW52X2Jsa190IGJsb2NrOworICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworCisgICAgX19rbXBfZW52X2Zvcm1hdCA9IDE7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgTlVMTCApOworICAgIF9fa21wX2Vudl9ibGtfc29ydCggJiBibG9jayApOworCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiVzXG4iLCBLTVBfSTE4Tl9TVFIoIERpc3BsYXlFbnZCZWdpbiApICApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgX09QRU5NUD0nJWQnXG4iLCBfX2ttcF9vcGVubXBfdmVyc2lvbiApOworCisgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICBpZiAoICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICggKCBfX2ttcF9kaXNwbGF5X2VudiAmJiBzdHJuY21wKCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCAiT01QXyIsIDQgKSA9PSAwICkgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSApICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQoICYgYnVmZmVyLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5kYXRhICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCBLTVBfSTE4Tl9TVFIoIERpc3BsYXlFbnZFbmQgKSAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuIiApOworCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKK30gLy8gX19rbXBfZW52X3ByaW50XzIKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisvLyBlbmQgb2YgZmlsZQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzJlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuaApAQCAtMCwwICsxLDUwIEBACisvKgorICoga21wX3NldHRpbmdzLmggLS0gSW5pdGlhbGl6ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfU0VUVElOR1NfSAorI2RlZmluZSBLTVBfU0VUVElOR1NfSAorCit2b2lkIF9fa21wX3Jlc2V0X2dsb2JhbF92YXJzKCB2b2lkICk7Cit2b2lkIF9fa21wX2Vudl9pbml0aWFsaXplKCBjaGFyIGNvbnN0ICogKTsKK3ZvaWQgX19rbXBfZW52X3ByaW50KCk7CisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQgX19rbXBfZW52X3ByaW50XzIoKTsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCitpbnQgX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jICk7Cit2b2lkIF9fa21wX2luaXRfZGZsdF90ZWFtX250aCgpOworaW50IF9fa21wX2NvbnZlcnRfdG9fbWlsbGlzZWNvbmRzKCBjaGFyIGNvbnN0ICogKTsKK2ludCBfX2ttcF9kZWZhdWx0X3RwX2NhcGFjaXR5KCBpbnQsIGludCwgaW50KTsKKworI2lmIEtNUF9NSUMKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRSAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKHgpICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCB4ICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfQk9PTCAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSA/ICJUUlVFIiA6ICJGQUxTRSIgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfSU5UICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclZCdcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NCAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJSIgS01QX1VJTlQ2NF9TUEVDICInXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfU1RSICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSApCisjZWxzZQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXMiLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKHgpICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyIsIEtNUF9JMThOX1NUUihIb3N0KSwgeCApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0wgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlID8gIlRSVUUiIDogIkZBTFNFIiApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9JTlQgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVkJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NCAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJSIgS01QX1VJTlQ2NF9TUEVDICInXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1NUUiAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlICkKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1NFVFRJTkdTX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmNDNhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5jcHAKQEAgLTAsMCArMSw2MDkgQEAKKy8qKiBAZmlsZSBrbXBfc3RhdHMuY3BwCisgKiBTdGF0aXN0aWNzIGdhdGhlcmluZyBhbmQgcHJvY2Vzc2luZy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYXRleGl0CisKKyNkZWZpbmUgU1RSSU5HSVpFMih4KSAjeAorI2RlZmluZSBTVFJJTkdJWkUoeCkgU1RSSU5HSVpFMih4KQorCisjZGVmaW5lIGV4cGFuZE5hbWUobmFtZSxmbGFncyxpZ25vcmUpICB7U1RSSU5HSVpFKG5hbWUpLGZsYWdzfSwKK3N0YXRJbmZvIHRpbWVTdGF0Ojp0aW1lckluZm9bXSA9IHsKKyAgICBLTVBfRk9SRUFDSF9USU1FUihleHBhbmROYW1lLDApCisgICAgezAsMH0KK307Citjb25zdCBzdGF0SW5mbyBjb3VudGVyOjpjb3VudGVySW5mb1tdID0geworICAgIEtNUF9GT1JFQUNIX0NPVU5URVIoZXhwYW5kTmFtZSwwKQorICAgIHswLDB9Cit9OworI3VuZGVmIGV4cGFuZE5hbWUKKworI2RlZmluZSBleHBhbmROYW1lKGlnbm9yZTEsaWdub3JlMixpZ25vcmUzKSAgezAuMCwwLjAsMC4wfSwKK2ttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpyZ2JfY29sb3Iga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnRpbWVyQ29sb3JJbmZvW10gPSB7CisgICAgS01QX0ZPUkVBQ0hfVElNRVIoZXhwYW5kTmFtZSwwKQorICAgIHswLjAsMC4wLDAuMH0KK307CisjdW5kZWYgZXhwYW5kTmFtZQorCitjb25zdCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cmdiX2NvbG9yIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpnbG9iYWxDb2xvckFycmF5W10gPSB7CisgICAgezEuMCwgMC4wLCAwLjB9LCAvLyByZWQKKyAgICB7MS4wLCAwLjYsIDAuMH0sIC8vIG9yYW5nZQorICAgIHsxLjAsIDEuMCwgMC4wfSwgLy8geWVsbG93CisgICAgezAuMCwgMS4wLCAwLjB9LCAvLyBncmVlbiAKKyAgICB7MC4wLCAwLjAsIDEuMH0sIC8vIGJsdWUKKyAgICB7MC42LCAwLjIsIDAuOH0sIC8vIHB1cnBsZQorICAgIHsxLjAsIDAuMCwgMS4wfSwgLy8gbWFnZW50YQorICAgIHswLjAsIDAuNCwgMC4yfSwgLy8gZGFyayBncmVlbgorICAgIHsxLjAsIDEuMCwgMC42fSwgLy8gbGlnaHQgeWVsbG93CisgICAgezAuNiwgMC40LCAwLjZ9LCAvLyBkaXJ0eSBwdXJwbGUKKyAgICB7MC4wLCAxLjAsIDEuMH0sIC8vIGN5YW4KKyAgICB7MS4wLCAwLjQsIDAuOH0sIC8vIHBpbmsKKyAgICB7MC41LCAwLjUsIDAuNX0sIC8vIGdyZXkKKyAgICB7MC44LCAwLjcsIDAuNX0sIC8vIGJyb3duCisgICAgezAuNiwgMC42LCAxLjB9LCAvLyBsaWdodCBibHVlCisgICAgezEuMCwgMC43LCAwLjV9LCAvLyBwZWFjaAorICAgIHswLjgsIDAuNSwgMS4wfSwgLy8gbGF2ZW5kZXIKKyAgICB7MC42LCAwLjAsIDAuMH0sIC8vIGRhcmsgcmVkCisgICAgezAuNywgMC42LCAwLjB9LCAvLyBnb2xkCisgICAgezAuMCwgMC4wLCAwLjB9ICAvLyBibGFjaworfTsKKworLy8gRW5zdXJlIHRoYXQgdGhlIGF0ZXhpdCBoYW5kbGVyIG9ubHkgcnVucyBvbmNlLgorc3RhdGljIHVpbnQzMl90IHN0YXRzUHJpbnRlZCA9IDA7CisKKy8vIG91dHB1dCBpbnRlcmZhY2UKK3N0YXRpYyBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSBfX2ttcF9zdGF0c19nbG9iYWxfb3V0cHV0OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKiogc3RhdGlzdGljIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCit2b2lkIHN0YXRpc3RpYzo6YWRkU2FtcGxlKGRvdWJsZSBzYW1wbGUpCit7CisgICAgZG91YmxlIGRlbHRhID0gc2FtcGxlIC0gbWVhblZhbDsKKworICAgIHNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQgKyAxOworICAgIG1lYW5WYWwgICAgID0gbWVhblZhbCArIGRlbHRhL3NhbXBsZUNvdW50OworICAgIG0yICAgICAgICAgID0gbTIgKyBkZWx0YSooc2FtcGxlIC0gbWVhblZhbCk7CisKKyAgICBtaW5WYWwgPSBzdGQ6Om1pbihtaW5WYWwsIHNhbXBsZSk7CisgICAgbWF4VmFsID0gc3RkOjptYXgobWF4VmFsLCBzYW1wbGUpOworfQorCitzdGF0aXN0aWMgJiBzdGF0aXN0aWM6Om9wZXJhdG9yKz0gKGNvbnN0IHN0YXRpc3RpYyAmIG90aGVyKQoreworICAgIGlmIChzYW1wbGVDb3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHVpbnQ2NF90IG5ld1NhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQgKyBvdGhlci5zYW1wbGVDb3VudDsKKyAgICBkb3VibGUgZG5zYyAgPSBkb3VibGUobmV3U2FtcGxlQ291bnQpOworICAgIGRvdWJsZSBkc2MgICA9IGRvdWJsZShzYW1wbGVDb3VudCk7CisgICAgZG91YmxlIGRzY0J5ZG5zYyA9IGRzYy9kbnNjOworICAgIGRvdWJsZSBkb3NjICA9IGRvdWJsZShvdGhlci5zYW1wbGVDb3VudCk7CisgICAgZG91YmxlIGRlbHRhID0gb3RoZXIubWVhblZhbCAtIG1lYW5WYWw7CisKKyAgICAvLyBUcnkgdG8gb3JkZXIgdGhlc2UgY2FsY3VsYXRpb25zIHRvIGF2b2lkIG92ZXJmbG93cy4KKyAgICAvLyBJZiB0aGlzIHdlcmUgRm9ydHJhbiwgdGhlbiB0aGUgY29tcGlsZXIgd291bGQgbm90IGJlIGFibGUgdG8gcmUtb3JkZXIgb3ZlciBicmFja2V0cy4KKyAgICAvLyBJbiBDKysgaXQgbWF5IGJlIGxlZ2FsIHRvIGRvIHRoYXQgKHdlIGNlcnRhaW5seSBob3BlIGl0IGRvZXNuJ3QsIGFuZCBDQysgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgMm5kIGVkaXRpb24KKyAgICAvLyBzdWdnZXN0cyBpdCBzaG91bGRuJ3QsIHNpbmNlIGl0IHNheXMgdGhhdCBleHBsb2l0YXRpb24gb2YgYXNzb2NpYXRpdml0eSBjYW4gb25seSBiZSBtYWRlIGlmIHRoZSBvcGVyYXRpb24KKyAgICAvLyByZWFsbHkgaXMgYXNzb2NpYXRpdmUgKHdoaWNoIGZsb2F0aW5nIGFkZGl0aW9uIGlzbid0Li4uKSkuCisgICAgbWVhblZhbCAgICAgPSBtZWFuVmFsKmRzY0J5ZG5zYyArIG90aGVyLm1lYW5WYWwqKDEtZHNjQnlkbnNjKTsKKyAgICBtMiAgICAgICAgICA9IG0yICsgb3RoZXIubTIgKyBkc2NCeWRuc2MqZG9zYypkZWx0YSpkZWx0YTsKKyAgICBtaW5WYWwgICAgICA9IHN0ZDo6bWluIChtaW5WYWwsIG90aGVyLm1pblZhbCk7CisgICAgbWF4VmFsICAgICAgPSBzdGQ6Om1heCAobWF4VmFsLCBvdGhlci5tYXhWYWwpOworICAgIHNhbXBsZUNvdW50ID0gbmV3U2FtcGxlQ291bnQ7CisKKworICAgIHJldHVybiAqdGhpczsKK30KKwordm9pZCBzdGF0aXN0aWM6OnNjYWxlKGRvdWJsZSBmYWN0b3IpCit7CisgICAgbWluVmFsID0gbWluVmFsKmZhY3RvcjsKKyAgICBtYXhWYWwgPSBtYXhWYWwqZmFjdG9yOworICAgIG1lYW5WYWw9IG1lYW5WYWwqZmFjdG9yOworICAgIG0yICAgICA9IG0yKmZhY3RvcipmYWN0b3I7CisgICAgcmV0dXJuOworfQorCitzdGQ6OnN0cmluZyBzdGF0aXN0aWM6OmZvcm1hdChjaGFyIHVuaXQsIGJvb2wgdG90YWwpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gZm9ybWF0U0koc2FtcGxlQ291bnQsOSwnICcpOworCisgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtaW5WYWwsICA5LCB1bml0KTsKKyAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKG1lYW5WYWwsIDksIHVuaXQpOworICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0kobWF4VmFsLCAgOSwgdW5pdCk7CisgICAgaWYgKHRvdGFsKQorICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKG1lYW5WYWwqc2FtcGxlQ291bnQsIDksIHVuaXQpOworICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0koZ2V0U0QoKSwgOSwgdW5pdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqIGV4cGxpY2l0VGltZXIgbWVtYmVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqICovCisKK3ZvaWQgZXhwbGljaXRUaW1lcjo6c3RhcnQodGltZXJfZSB0aW1lckVudW1WYWx1ZSkgeyAKKyAgICBzdGFydFRpbWUgPSB0c2NfdGlja19jb3VudDo6bm93KCk7IAorICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCh0aW1lckVudW1WYWx1ZSkpIHsKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+aW5jcmVtZW50TmVzdFZhbHVlKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBleHBsaWNpdFRpbWVyOjpzdG9wKHRpbWVyX2UgdGltZXJFbnVtVmFsdWUpIHsKKyAgICBpZiAoc3RhcnRUaW1lLmdldFZhbHVlKCkgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHNjX3RpY2tfY291bnQgZmluaXNoVGltZSA9IHRzY190aWNrX2NvdW50Ojpub3coKTsKKworICAgIC8vc3RhdC0+YWRkU2FtcGxlICgodHNjX3RpY2tfY291bnQ6Om5vdygpIC0gc3RhcnRUaW1lKS50aWNrcygpKTsKKyAgICBzdGF0LT5hZGRTYW1wbGUgKChmaW5pc2hUaW1lIC0gc3RhcnRUaW1lKS50aWNrcygpKTsKKworICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCh0aW1lckVudW1WYWx1ZSkpIHsKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+cHVzaF9ldmVudChzdGFydFRpbWUuZ2V0VmFsdWUoKSAtIF9fa21wX3N0YXRzX3N0YXJ0X3RpbWUuZ2V0VmFsdWUoKSwgZmluaXNoVGltZS5nZXRWYWx1ZSgpIC0gX19rbXBfc3RhdHNfc3RhcnRfdGltZS5nZXRWYWx1ZSgpLCBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXROZXN0VmFsdWUoKSwgdGltZXJFbnVtVmFsdWUpOyAKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+ZGVjcmVtZW50TmVzdFZhbHVlKCk7CisgICAgfQorCisgICAgLyogV2UgYWNjZXB0IHRoZSByaXNrIHRoYXQgd2UgZHJvcCBhIHNhbXBsZSBiZWNhdXNlIGl0IHJlYWxseSBkaWQgc3RhcnQgYXQgdD09MC4gKi8KKyAgICBzdGFydFRpbWUgPSAwOyAKKyAgICByZXR1cm47Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioga21wX3N0YXRzX2V2ZW50X3ZlY3RvciBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KKwordm9pZCBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yOjpkZWFsbG9jYXRlKCkgeworICAgIF9fa21wX2ZyZWUoZXZlbnRzKTsKKyAgICBpbnRlcm5hbF9zaXplID0gMDsKKyAgICBhbGxvY2F0ZWRfc2l6ZSA9IDA7CisgICAgZXZlbnRzID0gTlVMTDsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBpcyBmb3IgcXNvcnQoKSB3aGljaCByZXF1aXJlcyB0aGUgY29tcGFyZSBmdW5jdGlvbiB0byByZXR1cm4KKy8vIGVpdGhlciBhIG5lZ2F0aXZlIG51bWJlciBpZiBldmVudDEgPCBldmVudDIsIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGV2ZW50MSA+IGV2ZW50MgorLy8gb3IgemVybyBpZiBldmVudDEgPT0gZXZlbnQyLiAgCisvLyBUaGlzIHNvcnRzIGJ5IHN0YXJ0IHRpbWUgKGxvd2VzdCB0byBoaWdoZXN0KS4KK2ludCBjb21wYXJlX3R3b19ldmVudHMoY29uc3Qgdm9pZCogZXZlbnQxLCBjb25zdCB2b2lkKiBldmVudDIpIHsKKyAgICBrbXBfc3RhdHNfZXZlbnQqIGV2MSA9IChrbXBfc3RhdHNfZXZlbnQqKWV2ZW50MTsKKyAgICBrbXBfc3RhdHNfZXZlbnQqIGV2MiA9IChrbXBfc3RhdHNfZXZlbnQqKWV2ZW50MjsKKworICAgIGlmKGV2MS0+Z2V0U3RhcnQoKSA8IGV2Mi0+Z2V0U3RhcnQoKSkgcmV0dXJuIC0xOworICAgIGVsc2UgaWYoZXYxLT5nZXRTdGFydCgpID4gZXYyLT5nZXRTdGFydCgpKSByZXR1cm4gMTsKKyAgICBlbHNlIHJldHVybiAwOworfQorCit2b2lkIGttcF9zdGF0c19ldmVudF92ZWN0b3I6OnNvcnQoKSB7CisgICAgcXNvcnQoZXZlbnRzLCBpbnRlcm5hbF9zaXplLCBzaXplb2Yoa21wX3N0YXRzX2V2ZW50KSwgY29tcGFyZV90d29fZXZlbnRzKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioga21wX3N0YXRzX2xpc3QgbWVtYmVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqICovCisKKy8vIHJldHVybnMgYSBwb2ludGVyIHRvIG5ld2x5IGNyZWF0ZWQgc3RhdHMgbm9kZQora21wX3N0YXRzX2xpc3QqIGttcF9zdGF0c19saXN0OjpwdXNoX2JhY2soaW50IGd0aWQpIHsgCisgICAga21wX3N0YXRzX2xpc3QqIG5ld25vZGUgPSAoa21wX3N0YXRzX2xpc3QqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfc3RhdHNfbGlzdCkpOworICAgIC8vIHBsYWNlbWVudCBuZXcsIG9ubHkgcmVxdWlyZXMgc3BhY2UgYW5kIHBvaW50ZXIgYW5kIGluaXRpYWxpemVzIChzbyBfX2ttcF9hbGxvY2F0ZSBpbnN0ZWFkIG9mIEMrKyBuZXdbXSBpcyB1c2VkKQorICAgIG5ldyAobmV3bm9kZSkga21wX3N0YXRzX2xpc3QoKTsKKyAgICBuZXdub2RlLT5zZXRHdGlkKGd0aWQpOworICAgIG5ld25vZGUtPnByZXYgPSB0aGlzLT5wcmV2OworICAgIG5ld25vZGUtPm5leHQgPSB0aGlzOworICAgIG5ld25vZGUtPnByZXYtPm5leHQgPSBuZXdub2RlOworICAgIG5ld25vZGUtPm5leHQtPnByZXYgPSBuZXdub2RlOworICAgIHJldHVybiBuZXdub2RlOworfQordm9pZCBrbXBfc3RhdHNfbGlzdDo6ZGVhbGxvY2F0ZSgpIHsKKyAgICBrbXBfc3RhdHNfbGlzdCogcHRyID0gdGhpcy0+bmV4dDsKKyAgICBrbXBfc3RhdHNfbGlzdCogZGVscHRyID0gdGhpcy0+bmV4dDsKKyAgICB3aGlsZShwdHIgIT0gdGhpcykgeworICAgICAgICBkZWxwdHIgPSBwdHI7CisgICAgICAgIHB0cj1wdHItPm5leHQ7CisgICAgICAgIC8vIHBsYWNlbWVudCBuZXcgbWVhbnMgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3Rvci4KKyAgICAgICAgZGVscHRyLT5fZXZlbnRfdmVjdG9yLmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVscHRyLT5+a21wX3N0YXRzX2xpc3QoKTsKKyAgICAgICAgX19rbXBfZnJlZShkZWxwdHIpOworICAgIH0KK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6YmVnaW4oKSB7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGl0LnB0ciA9IHRoaXMtPm5leHQ7CisgICAgcmV0dXJuIGl0OworfQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjplbmQoKSB7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGl0LnB0ciA9IHRoaXM7CisgICAgcmV0dXJuIGl0OworfQoraW50IGttcF9zdGF0c19saXN0OjpzaXplKCkgeworICAgIGludCByZXR2YWw7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvcihyZXR2YWw9MCwgaXQ9YmVnaW4oKTsgaXQhPWVuZCgpOyBpdCsrLCByZXR2YWwrKykge30KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Oml0ZXJhdG9yKCkgOiBwdHIoTlVMTCkge30gCitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6On5pdGVyYXRvcigpIHt9CitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvcisrKCkgeworICAgIHRoaXMtPnB0ciA9IHRoaXMtPnB0ci0+bmV4dDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvcisrKGludCBkdW1teSkgeworICAgIHRoaXMtPnB0ciA9IHRoaXMtPnB0ci0+bmV4dDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvci0tKCkgeworICAgIHRoaXMtPnB0ciA9IHRoaXMtPnB0ci0+cHJldjsKKyAgICByZXR1cm4gKnRoaXM7Cit9CitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvci0tKGludCBkdW1teSkgeworICAgIHRoaXMtPnB0ciA9IHRoaXMtPnB0ci0+cHJldjsKKyAgICByZXR1cm4gKnRoaXM7Cit9Citib29sIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgJiByaHMpIHsKKyAgIHJldHVybiB0aGlzLT5wdHIhPXJocy5wdHI7IAorfQorYm9vbCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3Qga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yICYgcmhzKSB7CisgICByZXR1cm4gdGhpcy0+cHRyPT1yaHMucHRyOyAKK30KK2ttcF9zdGF0c19saXN0KiBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+cHRyOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKiogIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKiAqLworCitjb25zdCBjaGFyKiBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6b3V0cHV0RmlsZU5hbWUgPSBOVUxMOworY29uc3QgY2hhcioga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OmV2ZW50c0ZpbGVOYW1lID0gTlVMTDsKK2NvbnN0IGNoYXIqIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwbG90RmlsZU5hbWUgICA9IE5VTEw7CitpbnQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50UGVyVGhyZWFkRmxhZyAgICAgICA9IDA7CitpbnQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50UGVyVGhyZWFkRXZlbnRzRmxhZyA9IDA7CisKKy8vIGluaXQoKSBpcyBjYWxsZWQgdmVyeSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgZXhlY3V0aW9uIHRpbWUgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIF9fa21wX3N0YXRzX2dsb2JhbF9vdXRwdXQKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OmluaXQoKSAKK3sKKyAgICBjaGFyICogc3RhdHNGaWxlTmFtZSAgPSBnZXRlbnYoIktNUF9TVEFUU19GSUxFIik7CisgICAgZXZlbnRzRmlsZU5hbWUgICAgICAgID0gZ2V0ZW52KCJLTVBfU1RBVFNfRVZFTlRTX0ZJTEUiKTsKKyAgICBwbG90RmlsZU5hbWUgICAgICAgICAgPSBnZXRlbnYoIktNUF9TVEFUU19QTE9UX0ZJTEUiKTsKKyAgICBjaGFyICogdGhyZWFkU3RhdHMgICAgPSBnZXRlbnYoIktNUF9TVEFUU19USFJFQURTIik7CisgICAgY2hhciAqIHRocmVhZEV2ZW50cyAgID0gZ2V0ZW52KCJLTVBfU1RBVFNfRVZFTlRTIik7CisKKyAgICAvLyBzZXQgdGhlIHN0YXRzIG91dHB1dCBmaWxlbmFtZXMgYmFzZWQgb24gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBkZWZhdWx0cworICAgIG91dHB1dEZpbGVOYW1lID0gc3RhdHNGaWxlTmFtZTsKKyAgICBldmVudHNGaWxlTmFtZSA9IGV2ZW50c0ZpbGVOYW1lID8gZXZlbnRzRmlsZU5hbWUgOiAiZXZlbnRzLmRhdCI7CisgICAgcGxvdEZpbGVOYW1lICAgPSBwbG90RmlsZU5hbWUgICA/IHBsb3RGaWxlTmFtZSAgIDogImV2ZW50cy5wbHQiOworCisgICAgLy8gc2V0IHRoZSBmbGFncyBiYXNlZCBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF0Y2hpbmc6IHRydWUsIG9uLCAxLCAudHJ1ZS4gLCAudC4gLCB5ZXMKKyAgICBwcmludFBlclRocmVhZEZsYWcgICAgICAgID0gX19rbXBfc3RyX21hdGNoX3RydWUodGhyZWFkU3RhdHMpOworICAgIHByaW50UGVyVGhyZWFkRXZlbnRzRmxhZyAgPSBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSh0aHJlYWRFdmVudHMpOworCisgICAgaWYocHJpbnRQZXJUaHJlYWRFdmVudHNGbGFnKSB7CisgICAgICAgIC8vIGFzc2lnbnMgYSBjb2xvciB0byBlYWNoIHRpbWVyIGZvciBwcmludGluZworICAgICAgICBzZXR1cEV2ZW50Q29sb3JzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gd2lsbCBjbGVhciBmbGFnIHNvIHRoYXQgbm8gZXZlbnQgd2lsbCBiZSBsb2dnZWQKKyAgICAgICAgdGltZVN0YXQ6OmNsZWFyRXZlbnRGbGFncygpOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6c2V0dXBFdmVudENvbG9ycygpIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgZ2xvYmFsQ29sb3JJbmRleCA9IDA7CisgICAgaW50IG51bUdsb2JhbENvbG9ycyA9IHNpemVvZihnbG9iYWxDb2xvckFycmF5KSAvIHNpemVvZihyZ2JfY29sb3IpOworICAgIGZvcihpPTA7aTxUSU1FUl9MQVNUO2krKykgeworICAgICAgICBpZih0aW1lU3RhdDo6bG9nRXZlbnQoKHRpbWVyX2UpaSkpIHsKKyAgICAgICAgICAgIHRpbWVyQ29sb3JJbmZvW2ldID0gZ2xvYmFsQ29sb3JBcnJheVtnbG9iYWxDb2xvckluZGV4XTsKKyAgICAgICAgICAgIGdsb2JhbENvbG9ySW5kZXggPSAoZ2xvYmFsQ29sb3JJbmRleCsxKSVudW1HbG9iYWxDb2xvcnM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludFN0YXRzKEZJTEUgKnN0YXRzT3V0LCBzdGF0aXN0aWMgY29uc3QgKiB0aGVTdGF0cywgYm9vbCBhcmVUaW1lcnMpCit7CisgICAgaWYgKGFyZVRpbWVycykKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgdXNlZnVsIHRpbWVycywgc2luY2Ugd2UgZG9uJ3QgcHJpbnQgemVybyB2YWx1ZSB0aW1lcnMgd2UgbmVlZCB0byBhdm9pZAorICAgICAgICAvLyBwcmludGluZyBhIGhlYWRlciBhbmQgdGhlbiBubyBkYXRhLgorICAgICAgICBib29sIGhhdmVUaW1lcnMgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgcyA9IDA7IHM8VElNRVJfTEFTVDsgcysrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhlU3RhdHNbc10uZ2V0Q291bnQoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhdmVUaW1lcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaGF2ZVRpbWVycykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBQcmludAorICAgIGNvbnN0IGNoYXIgKiB0aXRsZSA9IGFyZVRpbWVycyA/ICJUaW1lciwgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQsIiA6ICJDb3VudGVyLCAgICAgICAgICAgICAgICAgVGhyZWFkQ291bnQsIjsKKyAgICBmcHJpbnRmIChzdGF0c091dCwgIiVzICAgIE1pbiwgICAgICBNZWFuLCAgICAgICBNYXgsICAgICBUb3RhbCwgICAgICAgIFNEXG4iLCB0aXRsZSk7ICAgIAorICAgIGlmIChhcmVUaW1lcnMpIHsKKyAgICAgICAgZm9yIChpbnQgcyA9IDA7IHM8VElNRVJfTEFTVDsgcysrKSB7CisgICAgICAgICAgICBzdGF0aXN0aWMgY29uc3QgKiBzdGF0ID0gJnRoZVN0YXRzW3NdOworICAgICAgICAgICAgaWYgKHN0YXQtPmdldENvdW50KCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgdGFnID0gdGltZVN0YXQ6Om5vVW5pdHModGltZXJfZShzKSkgPyAnICcgOiAnVCc7CisgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsICIlLTI1cywgJXNcbiIsIHRpbWVTdGF0OjpuYW1lKHRpbWVyX2UocykpLCBzdGF0LT5mb3JtYXQodGFnLCB0cnVlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgLy8gQ291bnRlcnMKKyAgICAgICAgZm9yIChpbnQgcyA9IDA7IHM8Q09VTlRFUl9MQVNUOyBzKyspIHsKKyAgICAgICAgICAgIHN0YXRpc3RpYyBjb25zdCAqIHN0YXQgPSAmdGhlU3RhdHNbc107CisgICAgICAgICAgICBmcHJpbnRmIChzdGF0c091dCwgIiUtMjVzLCAlc1xuIiwgY291bnRlcjo6bmFtZShjb3VudGVyX2UocykpLCBzdGF0LT5mb3JtYXQoJyAnLCB0cnVlKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KK30gCisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50Q291bnRlcnMoRklMRSAqIHN0YXRzT3V0LCBjb3VudGVyIGNvbnN0ICogdGhlQ291bnRlcnMpCit7CisgICAgLy8gV2UgcHJpbnQgYWxsIHRoZSBjb3VudGVycyBldmVuIGlmIHRoZXkgYXJlIHplcm8uCisgICAgLy8gVGhhdCBtYWtlcyBpdCBlYXNpZXIgdG8gc2xpY2UgdGhlbSBpbnRvIGEgc3ByZWFkc2hlZXQgaWYgeW91IG5lZWQgdG8uCisgICAgZnByaW50ZiAoc3RhdHNPdXQsICJcbkNvdW50ZXIsICAgICAgICAgICAgICAgICAgICBDb3VudFxuIik7CisgICAgZm9yIChpbnQgYyA9IDA7IGM8Q09VTlRFUl9MQVNUOyBjKyspIHsKKyAgICAgICAgY291bnRlciBjb25zdCAqIHN0YXQgPSAmdGhlQ291bnRlcnNbY107CisgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCAiJS0yNXMsICVzXG4iLCBjb3VudGVyOjpuYW1lKGNvdW50ZXJfZShjKSksIGZvcm1hdFNJKHN0YXQtPmdldFZhbHVlKCksIDksICcgJykuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludEV2ZW50cyhGSUxFKiBldmVudHNPdXQsIGttcF9zdGF0c19ldmVudF92ZWN0b3IqIHRoZUV2ZW50cywgaW50IGd0aWQpIHsKKyAgICAvLyBzb3J0IGJ5IHN0YXJ0IHRpbWUgYmVmb3JlIHByaW50aW5nCisgICAgdGhlRXZlbnRzLT5zb3J0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVFdmVudHMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgIGttcF9zdGF0c19ldmVudCBldiA9IHRoZUV2ZW50cy0+YXQoaSk7CisgICAgICAgIHJnYl9jb2xvciBjb2xvciA9IGdldEV2ZW50Q29sb3IoZXYuZ2V0VGltZXJOYW1lKCkpOworICAgICAgICBmcHJpbnRmKGV2ZW50c091dCwgIiVkICVsdSAlbHUgJTEuMWYgcmdiKCUxLjFmLCUxLjFmLCUxLjFmKSAlc1xuIiwgCisgICAgICAgICAgICAgICAgZ3RpZCwgCisgICAgICAgICAgICAgICAgZXYuZ2V0U3RhcnQoKSwgCisgICAgICAgICAgICAgICAgZXYuZ2V0U3RvcCgpLCAKKyAgICAgICAgICAgICAgICAxLjIgLSAoZXYuZ2V0TmVzdExldmVsKCkgKiAwLjIpLAorICAgICAgICAgICAgICAgIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsCisgICAgICAgICAgICAgICAgdGltZVN0YXQ6Om5hbWUoZXYuZ2V0VGltZXJOYW1lKCkpCisgICAgICAgICAgICAgICApOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OndpbmR1cEV4cGxpY2l0VGltZXJzKCkKK3sKKyAgICAvLyBXaW5kIHVwIGFueSBleHBsaWNpdCB0aW1lcnMuIFdlIGFzc3VtZSB0aGF0IGl0J3MgZmFpciBhdCB0aGlzIHBvaW50IHRvIGp1c3Qgd2FsayBhbGwgdGhlIGV4cGxjaXQgdGltZXJzIGluIGFsbCB0aHJlYWRzIAorICAgIC8vIGFuZCBzYXkgIml0J3Mgb3ZlciIuCisgICAgLy8gSWYgdGhlIHRpbWVyIHdhc24ndCBydW5uaW5nLCB0aGlzIHdvbid0IHJlY29yZCBhbnl0aGluZyBhbnl3YXkuCisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IF9fa21wX3N0YXRzX2xpc3QuYmVnaW4oKTsgaXQgIT0gX19rbXBfc3RhdHNfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBmb3IgKGludCB0aW1lcj0wOyB0aW1lcjxFWFBMSUNJVF9USU1FUl9MQVNUOyB0aW1lcisrKSB7CisgICAgICAgICAgICAoKml0KS0+Z2V0RXhwbGljaXRUaW1lcihleHBsaWNpdF90aW1lcl9lKHRpbWVyKSktPnN0b3AoKHRpbWVyX2UpdGltZXIpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludFBsb3RpY3VzRmlsZSgpIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgc2l6ZSA9IF9fa21wX3N0YXRzX2xpc3Quc2l6ZSgpOworICAgIEZJTEUqIHBsb3RPdXQgPSBmb3BlbihwbG90RmlsZU5hbWUsICJ3KyIpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgcGFnZVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHBhZ2VzaXplOiAxNSAxMFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHNjYWxlOiAxLjBcblxuIik7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBnZXRkYXRhXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgZmlsZTogJXNcblxuIiwgCisgICAgICAgICAgICAgICAgICAgICBldmVudHNGaWxlTmFtZSk7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBhcmVhZGVmXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgdGl0bGU6IE9wZW5NUCBTYW1wbGluZyBUaW1lbGluZVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHRpdGxlZGV0YWlsczogYWxpZ249Y2VudGVyIHNpemU9MTZcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICByZWN0YW5nbGU6IDEgMSAxMyA5XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgeGF1dG9yYW5nZTogZGF0YWZpZWxkPTIsM1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHlhdXRvcmFuZ2U6IC0xICVkXG5cbiIsIAorICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyB4YXhpc1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHN0dWJzOiBpbmNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHViZGV0YWlsczogc2l6ZT0xMlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsOiBUaW1lICh0aWNrcylcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbGRldGFpbHM6IHNpemU9MTRcblxuIik7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyB5YXhpc1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHN0dWJzOiBpbmMgMVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHN0dWJyYW5nZTogMCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHN0dWJkZXRhaWxzOiBzaXplPTEyXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbGFiZWw6IFRocmVhZCAjXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbGFiZWxkZXRhaWxzOiBzaXplPTE0XG5cbiIsIAorICAgICAgICAgICAgICAgICAgICAgc2l6ZS0xKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGJhcnNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBleGFjdGNvbG9yZmllbGQ6IDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBheGlzOiB4XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbG9jZmllbGQ6IDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzZWdtZW50ZmllbGRzOiAyIDNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBiYXJ3aWR0aGZpZWxkOiA0XG5cbiIpOworCisgICAgLy8gY3JlYXRlIGxlZ2VuZCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbWVyIGNvbG9yCisgICAgZm9yKGk9MDtpPFRJTUVSX0xBU1Q7aSsrKSB7CisgICAgICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCgodGltZXJfZSlpKSkgeworICAgICAgICAgICAgcmdiX2NvbG9yIGMgPSBnZXRFdmVudENvbG9yKCh0aW1lcl9lKWkpOworICAgICAgICAgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgbGVnZW5kZW50cnlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIHNhbXBsZXR5cGU6IGNvbG9yXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbDogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGRldGFpbHM6IHJnYiglMS4xZiwlMS4xZiwlMS4xZilcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVN0YXQ6Om5hbWUoKHRpbWVyX2UpaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuciwgYy5nLCBjLmIpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBsZWdlbmRcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBmb3JtYXQ6IGRvd25cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsb2NhdGlvbjogbWF4IG1heFxuXG4iKTsKKyAgICBmY2xvc2UocGxvdE91dCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpvdXRwdXRTdGF0cyhjb25zdCBjaGFyKiBoZWFkaW5nKSAKK3sKKyAgICBzdGF0aXN0aWMgYWxsU3RhdHNbVElNRVJfTEFTVF07CisgICAgc3RhdGlzdGljIGFsbENvdW50ZXJzW0NPVU5URVJfTEFTVF07CisKKyAgICAvLyBzdG9wIGFsbCB0aGUgZXhwbGljaXQgdGltZXJzIGZvciBhbGwgdGhyZWFkcworICAgIHdpbmR1cEV4cGxpY2l0VGltZXJzKCk7CisKKyAgICBGSUxFICogZXZlbnRzT3V0OworICAgIEZJTEUgKiBzdGF0c091dCA9IG91dHB1dEZpbGVOYW1lID8gZm9wZW4gKG91dHB1dEZpbGVOYW1lLCAiYSsiKSA6IHN0ZGVycjsKKworICAgIGlmIChldmVudFByaW50aW5nRW5hYmxlZCgpKSB7CisgICAgICAgIGV2ZW50c091dCA9IGZvcGVuKGV2ZW50c0ZpbGVOYW1lLCAidysiKTsKKyAgICB9CisKKyAgICBpZiAoIXN0YXRzT3V0KQorICAgICAgICBzdGF0c091dCA9IHN0ZGVycjsKKworICAgIGZwcmludGYoc3RhdHNPdXQsICIlc1xuIixoZWFkaW5nKTsKKyAgICAvLyBBY2N1bXVsYXRlIGFjcm9zcyB0aHJlYWRzLgorICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gX19rbXBfc3RhdHNfbGlzdC5iZWdpbigpOyBpdCAhPSBfX2ttcF9zdGF0c19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGludCB0ID0gKCppdCktPmdldEd0aWQoKTsKKyAgICAgICAgLy8gT3V0cHV0IHBlciB0aHJlYWQgc3RhdHMgaWYgcmVxdWVzdGVkLgorICAgICAgICBpZiAocGVyVGhyZWFkUHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCAiVGhyZWFkICVkXG4iLCB0KTsKKyAgICAgICAgICAgIHByaW50U3RhdHMoc3RhdHNPdXQsICgqaXQpLT5nZXRUaW1lcnMoKSwgdHJ1ZSk7CisgICAgICAgICAgICBwcmludENvdW50ZXJzKHN0YXRzT3V0LCAoKml0KS0+Z2V0Q291bnRlcnMoKSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0YXRzT3V0LCJcbiIpOworICAgICAgICB9CisgICAgICAgIC8vIE91dHB1dCBwZXIgdGhyZWFkIGV2ZW50cyBpZiByZXF1ZXN0ZWQuCisgICAgICAgIGlmIChldmVudFByaW50aW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yIGV2ZW50cyA9ICgqaXQpLT5nZXRFdmVudFZlY3RvcigpOworICAgICAgICAgICAgcHJpbnRFdmVudHMoZXZlbnRzT3V0LCAmZXZlbnRzLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IHMgPSAwOyBzPFRJTUVSX0xBU1Q7IHMrKykgeworICAgICAgICAgICAgLy8gU2VlIGlmIHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lciB3aGVuIGFnZ3JlZ2F0aW5nCisgICAgICAgICAgICBpZiAoKHRpbWVTdGF0OjptYXN0ZXJPbmx5KHRpbWVyX2UocykpICYmICh0ICE9IDApKSB8fCAvLyBUaW1lciBpcyBvbmx5IHZhbGlkIG9uIHRoZSBtYXN0ZXIgYW5kIHRoaXMgdGhyZWFkIGlzIGEgd29ya2VyCisgICAgICAgICAgICAgICAgKHRpbWVTdGF0Ojp3b3JrZXJPbmx5KHRpbWVyX2UocykpICYmICh0ID09IDApKSB8fCAvLyBUaW1lciBpcyBvbmx5IHZhbGlkIG9uIGEgd29ya2VyIGFuZCB0aGlzIHRocmVhZCBpcyB0aGUgbWFzdGVyCisgICAgICAgICAgICAgICAgdGltZVN0YXQ6OnN5bnRoZXNpemVkKHRpbWVyX2UocykpICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgc3ludGhlc2l6ZWQgc3RhdCwgc28gdGhlcmUncyBubyByYXcgZGF0YSBmb3IgaXQuCisgICAgICAgICAgICAgICApICAgICAgICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRpc3RpYyAqIHRocmVhZFN0YXQgPSAoKml0KS0+Z2V0VGltZXIodGltZXJfZShzKSk7CisgICAgICAgICAgICBhbGxTdGF0c1tzXSArPSAqdGhyZWFkU3RhdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHN5bnRoZXNpemVkIHN0YXRpc3RpY3MuCisgICAgICAgIC8vIFRoZXNlIGp1c3QgaGF2ZSB0byBiZSBjb2RlZCBzcGVjaWFsbHkgaGVyZSBmb3Igbm93LiAKKyAgICAgICAgLy8gQXQgcHJlc2VudCB3ZSBvbmx5IGhhdmUgYSBmZXc6IAorICAgICAgICAvLyBUaGUgdG90YWwgcGFyYWxsZWwgd29yayBkb25lIGluIGVhY2ggdGhyZWFkLgorICAgICAgICAvLyBUaGUgdmFyaWFuY2UgaGVyZSBtYWtlcyBpdCBlYXN5IHRvIHNlZSBsb2FkIGltYmFsYW5jZSBvdmVyIHRoZSB3aG9sZSBwcm9ncmFtICh0aG91Z2gsIG9mIGNvdXJzZSwKKyAgICAgICAgLy8gaXQncyBwb3NzaWJsZSB0byBoYXZlIGEgY29kZSB3aXRoIGF3ZnVsIGxvYWQgYmFsYW5jZSBpbiBldmVyeSBwYXJhbGxlbCByZWdpb24gYnV0IHBlcmZlY3QgbG9hZAorICAgICAgICAvLyBiYWxhbmNlIG9ldmVyIHRoZSB3aG9sZSBwcm9ncmFtLikKKyAgICAgICAgLy8gVGhlIHRpbWUgc3BlbnQgaW4gYmFycmllcnMgaW4gZWFjaCB0aHJlYWQuCisgICAgICAgIGFsbFN0YXRzW1RJTUVSX1RvdGFsX3dvcmtdLmFkZFNhbXBsZSAoKCppdCktPmdldFRpbWVyKFRJTUVSX09NUF93b3JrKS0+Z2V0VG90YWwoKSk7CisKKyAgICAgICAgLy8gVGltZSBpbiBleHBsaWNpdCBiYXJyaWVycy4KKyAgICAgICAgYWxsU3RhdHNbVElNRVJfVG90YWxfYmFycmllcl0uYWRkU2FtcGxlICgoKml0KS0+Z2V0VGltZXIoVElNRVJfT01QX2JhcnJpZXIpLT5nZXRUb3RhbCgpKTsKKworICAgICAgICBmb3IgKGludCBjID0gMDsgYzxDT1VOVEVSX0xBU1Q7IGMrKykgeworICAgICAgICAgICAgaWYgKGNvdW50ZXI6Om1hc3Rlck9ubHkoY291bnRlcl9lKGMpKSAmJiB0ICE9IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhbGxDb3VudGVyc1tjXS5hZGRTYW1wbGUgKCgqaXQpLT5nZXRDb3VudGVyKGNvdW50ZXJfZShjKSktPmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGV2ZW50UHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgcHJpbnRQbG90aWN1c0ZpbGUoKTsKKyAgICAgICAgZmNsb3NlKGV2ZW50c091dCk7CisgICAgfQorCisgICAgZnByaW50ZiAoc3RhdHNPdXQsICJBZ2dyZWdhdGUgZm9yIGFsbCB0aHJlYWRzXG4iKTsKKyAgICBwcmludFN0YXRzIChzdGF0c091dCwgJmFsbFN0YXRzWzBdLCB0cnVlKTsKKyAgICBmcHJpbnRmIChzdGF0c091dCwgIlxuIik7CisgICAgcHJpbnRTdGF0cyAoc3RhdHNPdXQsICZhbGxDb3VudGVyc1swXSwgZmFsc2UpOworCisgICAgaWYgKHN0YXRzT3V0ICE9IHN0ZGVycikKKyAgICAgICAgZmNsb3NlKHN0YXRzT3V0KTsKKworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiAgZXhwb3J0ZWQgQyBmdW5jdGlvbnMgKioqKioqKioqKioqKiogKi8KKworLy8gbm8gbmFtZSBtYW5nbGluZyBmb3IgdGhlc2UgZnVuY3Rpb25zLCB3ZSB3YW50IHRoZSBjIGZpbGVzIHRvIGJlIGFibGUgdG8gZ2V0IGF0IHRoZXNlIGZ1bmN0aW9ucworZXh0ZXJuICJDIiB7CisKK3ZvaWQgX19rbXBfcmVzZXRfc3RhdHMoKQoreworICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBpdDsKKyAgICBmb3IoaXQgPSBfX2ttcF9zdGF0c19saXN0LmJlZ2luKCk7IGl0ICE9IF9fa21wX3N0YXRzX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgdGltZVN0YXQgKiB0aW1lcnMgICAgID0gKCppdCktPmdldFRpbWVycygpOworICAgICAgICBjb3VudGVyICogY291bnRlcnMgICAgPSAoKml0KS0+Z2V0Q291bnRlcnMoKTsKKyAgICAgICAgZXhwbGljaXRUaW1lciAqIGVUaW1lcnMgPSAoKml0KS0+Z2V0RXhwbGljaXRUaW1lcnMoKTsKKworICAgICAgICBmb3IgKGludCB0ID0gMDsgdDxUSU1FUl9MQVNUOyB0KyspCisgICAgICAgICAgICB0aW1lcnNbdF0ucmVzZXQoKTsKKworICAgICAgICBmb3IgKGludCBjID0gMDsgYzxDT1VOVEVSX0xBU1Q7IGMrKykKKyAgICAgICAgICAgIGNvdW50ZXJzW2NdLnJlc2V0KCk7CisKKyAgICAgICAgZm9yIChpbnQgdD0wOyB0PEVYUExJQ0lUX1RJTUVSX0xBU1Q7IHQrKykKKyAgICAgICAgICAgIGVUaW1lcnNbdF0ucmVzZXQoKTsKKworICAgICAgICAvLyByZXNldCB0aGUgZXZlbnQgdmVjdG9yIHNvIGFsbCBwcmV2aW91cyBldmVudHMgYXJlICJlcmFzZWQiCisgICAgICAgICgqaXQpLT5yZXNldEV2ZW50VmVjdG9yKCk7CisKKyAgICAgICAgLy8gTWF5IG5lZWQgdG8gcmVzdGFydCB0aGUgZXhwbGljaXQgdGltZXJzIGluIHRocmVhZCB6ZXJvPworICAgIH0KKyAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3NlcmlhbCk7CisgICAgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKE9NUF9zdGFydF9lbmQpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYWxsIHN0YXRzIGFuZCBzdG9wIGFsbCB0aHJlYWRzJyBleHBsaWNpdCB0aW1lcnMgaWYgdGhleSBoYXZlbid0IGJlZW4gc3RvcHBlZCBhbHJlYWR5Lgordm9pZCBfX2ttcF9vdXRwdXRfc3RhdHMoY29uc3QgY2hhciAqIGhlYWRpbmcpCit7CisgICAgX19rbXBfc3RhdHNfZ2xvYmFsX291dHB1dC5vdXRwdXRTdGF0cyhoZWFkaW5nKTsKKyAgICBfX2ttcF9yZXNldF9zdGF0cygpOworfQorCit2b2lkIF9fa21wX2FjY3VtdWxhdGVfc3RhdHNfYXRfZXhpdCh2b2lkKQoreworICAgIC8vIE9ubHkgZG8gdGhpcyBvbmNlLgorICAgIGlmIChLTVBfWENIR19GSVhFRDMyKCZzdGF0c1ByaW50ZWQsIDEpICE9IDApCisgICAgICAgIHJldHVybjsKKworICAgIF9fa21wX291dHB1dF9zdGF0cygiU3RhdGlzdGljcyBvbiBleGl0Iik7CisgICAgcmV0dXJuOworfQorCit2b2lkIF9fa21wX3N0YXRzX2luaXQodm9pZCkgCit7CisgICAgcmV0dXJuOworfQorCit9IC8vIGV4dGVybiAiQyIgCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjZWMzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5oCkBAIC0wLDAgKzEsNzQ4IEBACisjaWZuZGVmIEtNUF9TVEFUU19ICisjZGVmaW5lIEtNUF9TVEFUU19ICisKKy8qKiBAZmlsZSBrbXBfc3RhdHMuaAorICogRnVuY3Rpb25zIGZvciBjb2xsZWN0aW5nIHN0YXRpc3RpY3MuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKy8qCisgKiBTdGF0aXN0aWNzIGFjY3VtdWxhdG9yLgorICogQWNjdW11bGF0ZXMgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIGNvbXB1dGVzIG1pbiwgbWF4LCBtZWFuLCBzdGFuZGFyZCBkZXZpYXRpb24gb24gdGhlIGZseS4KKyAqCisgKiBPbmxpbmUgdmFyaWFuY2UgY2FsY3VsYXRpb24gYWxnb3JpdGhtIGZyb20gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BbGdvcml0aG1zX2Zvcl9jYWxjdWxhdGluZ192YXJpYW5jZSNPbi1saW5lX2FsZ29yaXRobQorICovCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxuZXc+IC8vIHBsYWNlbWVudCBuZXcKKyNpbmNsdWRlICJrbXBfc3RhdHNfdGltaW5nLmgiCisKKy8qCisgKiBFbmFibGUgZGV2ZWxvcGVyIHN0YXRpc3RpY3MgaGVyZSBpZiB5b3Ugd2FudCB0aGVtLiBUaGV5IGFyZSBtb3JlIGRldGFpbGVkIHRoYW4gaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbiBjaGFyYWN0ZXJpc2F0aW9uIGFuZAorICogYXJlIGludGVuZGVkIGZvciB0aGUgcnVudGltZSBsaWJyYXJ5IGRldmVsb3Blci4KKyAqLworLy8gI2RlZmluZSBLTVBfREVWRUxPUEVSX1NUQVRTIDEKKworLyohCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyAqIFxicmllZiBmbGFncyB0byBkZXNjcmliZSB0aGUgc3RhdGlzdGljICggdGltZXJzIG9yIGNvdW50ZXIgKQorICoKKyovCitjbGFzcyBzdGF0c19mbGFnc19lIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgb25seUluTWFzdGVyID0gMTw8MDsgLy8hPCBzdGF0aXN0aWMgaXMgdmFsaWQgb25seSBmb3IgbWFzdGVyCisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbm9Vbml0cyAgICAgID0gMTw8MTsgLy8hPCBzdGF0aXN0aWMgZG9lc24ndCBuZWVkIHVuaXRzIHByaW50ZWQgbmV4dCB0byBpdCBpbiBvdXRwdXQKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBzeW50aGVzaXplZCAgPSAxPDwyOyAvLyE8IHN0YXRpc3RpYydzIHZhbHVlIGlzIGNyZWF0ZWQgYXRleGl0IHRpbWUgaW4gdGhlIF9fa21wX291dHB1dF9zdGF0cyBmdW5jdGlvbgorICAgICAgICBjb25zdCBzdGF0aWMgaW50IG5vdEluTWFzdGVyICA9IDE8PDM7IC8vITwgc3RhdGlzdGljIGlzIHZhbGlkIGZvciBub24tbWFzdGVyIHRocmVhZHMKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBsb2dFdmVudCAgICAgPSAxPDw0OyAvLyE8IHN0YXRpc3RpYyBjYW4gYmUgbG9nZ2VkIHdoZW4gS01QX1NUQVRTX0VWRU5UUyBpcyBvbiAodmFsaWQgb25seSBmb3IgdGltZXJzKQorfTsKKworLyohCisgKiBcYnJpZWYgQWRkIG5ldyBjb3VudGVycyB1bmRlciBLTVBfRk9SRUFDSF9DT1VOVEVSKCkgbWFjcm8gaW4ga21wX3N0YXRzLmgKKyAqCisgKiBAcGFyYW0gbWFjcm8gYSB1c2VyIGRlZmluZWQgbWFjcm8gdGhhdCB0YWtlcyB0aHJlZSBhcmd1bWVudHMgLSBtYWNybyhDT1VOVEVSX05BTUUsIGZsYWdzLCBhcmcpCisgKiBAcGFyYW0gYXJnIGEgdXNlciBkZWZpbmVkIGFyZ3VtZW50IHRvIHNlbmQgdG8gdGhlIHVzZXIgZGVmaW5lZCBtYWNybworICoKKyAqIFxkZXRhaWxzIEEgY291bnRlciBjb3VudHMgdGhlIG9jY3VycmVuY2Ugb2Ygc29tZSBldmVudC4KKyAqIEVhY2ggdGhyZWFkIGFjY3VtdWxhdGVzIGl0cyBvd24gY291bnQsIGF0IHRoZSBlbmQgb2YgZXhlY3V0aW9uIHRoZSBjb3VudHMgYXJlIGFnZ3JlZ2F0ZWQgdHJlYXRpbmcgZWFjaCB0aHJlYWQKKyAqIGFzIGEgc2VwYXJhdGUgbWVhc3VyZW1lbnQuIChVbmxlc3Mgb25seUluTWFzdGVyIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGVyZSdzIG9ubHkgYSBzaW5nbGUgbWVhc3VyZW1lbnQpLgorICogVGhlIG1pbixtZWFuLG1heCBhcmUgdGhlcmVmb3JlIHRoZSB2YWx1ZXMgZm9yIHRoZSB0aHJlYWRzLgorICogQWRkaW5nIHRoZSBjb3VudGVyIGhlcmUgYW5kIHRoZW4gcHV0dGluZyBhIEtNUF9CTE9DS19DT1VOVEVSKG5hbWUpIGF0IHRoZSBwb2ludCB5b3Ugd2FudCB0byBjb3VudCBpcyBhbGwgeW91IG5lZWQgdG8gZG8uCisgKiBBbGwgb2YgdGhlIHRhYmxlcyBhbmQgcHJpbnRpbmcgaXMgZ2VuZXJhdGVkIGZyb20gdGhpcyBtYWNyby4KKyAqIEZvcm1hdCBpcyAibWFjcm8obmFtZSwgZmxhZ3MsIGFyZykiCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfRk9SRUFDSF9DT1VOVEVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1BBUkFMTEVMLCBzdGF0c19mbGFnc19lOjpvbmx5SW5NYXN0ZXIsIGFyZykgICAgICBcCisgICAgbWFjcm8gKE9NUF9ORVNURURfUEFSQUxMRUwsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfRk9SX3N0YXRpYywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX0ZPUl9keW5hbWljLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9ESVNUUklCVVRFLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfQkFSUklFUiwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX0NSSVRJQ0FMLDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9TSU5HTEUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfTUFTVEVSLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1RFQU1TLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9zZXRfbG9jaywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGVzdF9sb2NrLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoUkVEVUNFX3dhaXQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFJFRFVDRV9ub3dhaXQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfVEFTS1lJRUxELCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVEFTS19leGVjdXRlZCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFRBU0tfY2FuY2VsbGVkLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChUQVNLX3N0b2xlbiwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoTEFTVCwwLGFyZykKKworLy8gT01QX1BBUkFMTEVMX2FyZ3MgICAgICAtLSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBmb3JrCisvLyBGT1Jfc3RhdGljX2l0ZXJhdGlvbnMgIC0tIE51bWJlciBvZiBhdmFpbGFibGUgcGFyYWxsZWwgY2h1bmtzIG9mIHdvcmsgaW4gYSBzdGF0aWMgZm9yCisvLyBGT1JfZHluYW1pY19pdGVyYXRpb25zIC0tIE51bWJlciBvZiBhdmFpbGFibGUgcGFyYWxsZWwgY2h1bmtzIG9mIHdvcmsgaW4gYSBkeW5hbWljIGZvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBCb3RoIGFkanVzdCBmb3IgYW55IGNodW5raW5nLCBzbyBpZiB0aGVyZSB3ZXJlIGFuIGl0ZXJhdGlvbiBjb3VudCBvZiAyMCBidXQgYSBjaHVuayBzaXplIG9mIDEwLCB3ZSdkIHJlY29yZCAyLgorCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IHRpbWVycyB1bmRlciBLTVBfRk9SRUFDSF9USU1FUigpIG1hY3JvIGluIGttcF9zdGF0cy5oCisgKgorICogQHBhcmFtIG1hY3JvIGEgdXNlciBkZWZpbmVkIG1hY3JvIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzIC0gbWFjcm8oVElNRVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXGRldGFpbHMgQSB0aW1lciBjb2xsZWN0cyBtdWx0aXBsZSBzYW1wbGVzIG9mIHNvbWUgY291bnQgaW4gZWFjaCB0aHJlYWQgYW5kIHRoZW4gZmluYWxseSBhZ2dyZWdhdGVzIG92ZXIgYWxsIHRoZSB0aHJlYWRzLgorICogVGhlIGNvdW50IGlzIG5vcm1hbGx5IGEgdGltZSAoaW4gdGlja3MpLCBoZW5jZSB0aGUgbmFtZSAidGltZXIiLiAoQnV0IGNhbiBiZSBhbnkgdmFsdWUsIHNvIHdlIHVzZSB0aGlzIGZvciAibnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gZm9yayIKKyAqIGFzIHdlbGwpLgorICogRm9yIHRpbWVycyB0aGUgdGhyZWFkcyBhcmUgbm90IHNpZ25pZmljYW50LCBpdCdzIHRoZSBpbmRpdmlkdWFsIG9ic2VydmF0aW9ucyB0aGF0IGNvdW50LCBzbyB0aGUgc3RhdGlzdGljcyBhcmUgYXQgdGhhdCBsZXZlbC4KKyAqIEZvcm1hdCBpcyAibWFjcm8obmFtZSwgZmxhZ3MsIGFyZykiCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HMgorICovCisjZGVmaW5lIEtNUF9GT1JFQUNIX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9zdGFydF9lbmQsIHN0YXRzX2ZsYWdzX2U6Om9ubHlJbk1hc3RlciwgYXJnKSAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9zZXJpYWwsIHN0YXRzX2ZsYWdzX2U6Om9ubHlJbk1hc3RlciwgYXJnKSAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF93b3JrLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFRvdGFsX3dvcmssIHN0YXRzX2ZsYWdzX2U6OnN5bnRoZXNpemVkLCBhcmcpICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9iYXJyaWVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFRvdGFsX2JhcnJpZXIsIHN0YXRzX2ZsYWdzX2U6OnN5bnRoZXNpemVkLCBhcmcpICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEZPUl9zdGF0aWNfaXRlcmF0aW9ucywgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cywgYXJnKSAgICAgICAgICBcCisgICAgbWFjcm8gKEZPUl9zdGF0aWNfc2NoZWR1bGluZywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEZPUl9keW5hbWljX2l0ZXJhdGlvbnMsIHN0YXRzX2ZsYWdzX2U6Om5vVW5pdHMsIGFyZykgICAgICAgICBcCisgICAgbWFjcm8gKEZPUl9keW5hbWljX3NjaGVkdWxpbmcsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFRBU0tfZXhlY3V0aW9uLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9zZXRfbnVtdGhyZWFkcywgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cywgYXJnKSAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9QQVJBTExFTF9hcmdzLCAgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cywgYXJnKSAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9zaW5nbGUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9tYXN0ZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0ZPUkVBQ0hfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKExBU1QsMCwgYXJnKQorCisKKy8vIE9NUF9zdGFydF9lbmQgICAgICAgICAgLS0gdGltZSBmcm9tIHdoZW4gT3Blbk1QIGlzIGluaXRpYWxpemVkIHVudGlsIHRoZSBzdGF0cyBhcmUgcHJpbnRlZCBhdCBleGl0CisvLyBPTVBfc2VyaWFsICAgICAgICAgICAgIC0tIHRocmVhZCB6ZXJvIHRpbWUgZXhlY3V0aW5nIHNlcmlhbCBjb2RlCisvLyBPTVBfd29yayAgICAgICAgICAgICAgIC0tIGVsYXBzZWQgdGltZSBpbiBjb2RlIGRpc3BhdGNoZWQgYnkgYSBmb3JrIChtZWFzdXJlZCBpbiB0aGUgdGhyZWFkKQorLy8gVG90YWxfd29yayAgICAgICAgICAgICAtLSBhIHN5bnRoZXNpemVkIHN0YXRpc3RpYyBzdW1tYXJpemluZyBob3cgbXVjaCBwYXJhbGxlbCB3b3JrIGVhY2ggdGhyZWFkIGV4ZWN1dGVkLgorLy8gT01QX2JhcnJpZXIgICAgICAgICAgICAtLSB0aW1lIGF0ICJyZWFsIiBiYXJyaWVycworLy8gVG90YWxfYmFycmllciAgICAgICAgICAtLSBhIHN5bnRoZXNpemVkIHN0YXRpc3RpYyBzdW1tYXJpemluZyBob3cgbXVjaCB0aW1lIGF0IHJlYWwgYmFycmllcnMgaW4gZWFjaCB0aHJlYWQKKy8vIEZPUl9zdGF0aWNfc2NoZWR1bGluZyAgLS0gdGltZSBzcGVudCBkb2luZyBzY2hlZHVsaW5nIGZvciBhIHN0YXRpYyAiZm9yIgorLy8gRk9SX2R5bmFtaWNfc2NoZWR1bGluZyAtLSB0aW1lIHNwZW50IGRvaW5nIHNjaGVkdWxpbmcgZm9yIGEgZHluYW1pYyAiZm9yIgorCisjaWYgKEtNUF9ERVZFTE9QRVJfU1RBVFMpCisvLyBUaW1lcnMgd2hpY2ggYXJlIG9mIGludGVyZXN0IHRpbyBydW50aW1lIGxpYnJhcnkgZGV2ZWxvcGVycywgbm90IGVuZCB1c2Vycy4KKy8vIFRIZXNlIGhhdmUgdG8gYmUgZXhwbGljaXRseSBlbmFibGVkIGluIGFkZGl0aW9uIHRvIHRoZSBvdGhlciBzdGF0cy4KKworLy8gS01QX2ZvcmtfYmFycmllciAgICAgICAtLSB0aW1lIGluIF9fa21wX2ZvcmtfYmFycmllcgorLy8gS01QX2pvaW5fYmFycmllciAgICAgICAtLSB0aW1lIGluIF9fa21wX2pvaW5fYmFycmllcgorLy8gS01QX2JhcnJpZXIgICAgICAgICAgICAtLSB0aW1lIGluIF9fa21wX2JhcnJpZXIKKy8vIEtNUF9lbmRfc3BsaXRfYmFycmllciAgLS0gdGltZSBpbiBfX2ttcF9lbmRfc3BsaXRfYmFycmllcgorLy8gS01QX3NldHVwX2ljdl9jb3B5ICAgICAtLSB0aW1lIGluIF9fa21wX3NldHVwX2ljdl9jb3B5CisvLyBLTVBfaWN2X2NvcHkgICAgICAgICAgIC0tIHN0YXJ0L3N0b3AgdGltZXIgZm9yIGFueSBJQ1YgY29weWluZworLy8gS01QX2xpbmVhcl9nYXRoZXIgICAgICAtLSB0aW1lIGluIF9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcgorLy8gS01QX2xpbmVhcl9yZWxlYXNlICAgICAtLSB0aW1lIGluIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UKKy8vIEtNUF90cmVlX2dhdGhlciAgICAgICAgLS0gdGltZSBpbiBfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyCisvLyBLTVBfdHJlZV9yZWxlYXNlICAgICAgIC0tIHRpbWUgaW4gX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UKKy8vIEtNUF9oeXBlcl9nYXRoZXIgICAgICAgLS0gdGltZSBpbiBfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcgorLy8gS01QX2h5cGVyX3JlbGVhc2UgICAgICAtLSB0aW1lIGluIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZQorIyBkZWZpbmUgS01QX0ZPUkVBQ0hfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfZm9ya19jYWxsLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfam9pbl9jYWxsLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfZm9ya19iYXJyaWVyLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfam9pbl9iYXJyaWVyLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfYmFycmllciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfZW5kX3NwbGl0X2JhcnJpZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfaGllcl9nYXRoZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfaGllcl9yZWxlYXNlLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfaHlwZXJfZ2F0aGVyLCAgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfaHlwZXJfcmVsZWFzZSwgIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfbGluZWFyX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfbGluZWFyX3JlbGVhc2UsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfdHJlZV9nYXRoZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfdHJlZV9yZWxlYXNlLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChVU0VSX21hc3Rlcl9pbnZva2UsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgXAorICAgIG1hY3JvIChVU0VSX3dvcmtlcl9pbnZva2UsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgXAorICAgIG1hY3JvIChVU0VSX3Jlc3VtZSwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChVU0VSX3N1c3BlbmQsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChVU0VSX2xhdW5jaF90aHJlYWRfbG9vcCwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgXAorICAgIG1hY3JvIChLTVBfYWxsb2NhdGVfdGVhbSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfc2V0dXBfaWN2X2NvcHksIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChVU0VSX2ljdl9jb3B5LCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZWxzZQorIyBkZWZpbmUgS01QX0ZPUkVBQ0hfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpCisjZW5kaWYKKworLyohCisgKiBcYnJpZWYgQWRkIG5ldyBleHBsaWNpdCB0aW1lcnMgdW5kZXIgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoKSBtYWNyby4KKyAqCisgKiBAcGFyYW0gbWFjcm8gYSB1c2VyIGRlZmluZWQgbWFjcm8gdGhhdCB0YWtlcyB0aHJlZSBhcmd1bWVudHMgLSBtYWNybyhUSU1FUl9OQU1FLCBmbGFncywgYXJnKQorICogQHBhcmFtIGFyZyBhIHVzZXIgZGVmaW5lZCBhcmd1bWVudCB0byBzZW5kIHRvIHRoZSB1c2VyIGRlZmluZWQgbWFjcm8KKyAqCisgKiBcd2FybmluZyBZT1UgTVVTVCBIQVZFIFRIRSBTQU1FIE5BTUVEIFRJTUVSIFVOREVSIEtNUF9GT1JFQUNIX1RJTUVSKCkgT1IgRUxTRSBCQUQgVEhJTkdTIFdJTEwgSEFQUEVOIQorICoKKyAqIFxkZXRhaWxzIEV4cGxpY2l0IHRpbWVycyBhcmUgb25lcyB3aGVyZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgdGltZXIgaXRzZWxmIChhcyB3ZWxsIGFzIHRoZSBhY2N1bXVsYXRlZCB0aW1pbmcgc3RhdGlzdGljcykuCisgKiBXZSBhbGxvY2F0ZSB0aGVzZSBvbiBhIHBlci10aHJlYWQgYmFzaXMsIGFuZCBleHBsaWNpdGx5IHN0YXJ0IGFuZCBzdG9wIHRoZW0uCisgKiBCbG9jayB0aW1lcnMganVzdCBhbGxvY2F0ZSB0aGUgdGltZXIgaXRzZWxmIG9uIHRoZSBzdGFjaywgYW5kIHVzZSB0aGUgZGVzdHJ1Y3RvciB0byBub3RpY2UgYmxvY2sgZXhpdDsgdGhleSBkb24ndAorICogbmVlZCB0byBiZSBkZWZpbmVkIGhlcmUuCisgKiBUaGUgbmFtZSBoZXJlIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGF0IG9mIGEgdGltZXIgYWJvdmUuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUihtYWNybywgYXJnKSAgICAgICAgICBcCisgICAgbWFjcm8oT01QX3NlcmlhbCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfc3RhcnRfZW5kLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKE9NUF9zaW5nbGUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oT01QX21hc3RlciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRk9SRUFDSF9FWFBMSUNJVF9ERVZFTE9QRVJfVElNRVIobWFjcm8sYXJnKSAgICAgXAorICAgIG1hY3JvKExBU1QsIDAsIGFyZykKKworI2lmIChLTVBfREVWRUxPUEVSX1NUQVRTKQorIyBkZWZpbmUgS01QX0ZPUkVBQ0hfRVhQTElDSVRfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKFVTRVJfbGF1bmNoX3RocmVhZF9sb29wLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9GT1JFQUNIX0VYUExJQ0lUX0RFVkVMT1BFUl9USU1FUihtYWNybywgYXJnKSAgICAgICAgICAgICAgIAorI2VuZGlmCisKKyNkZWZpbmUgRU5VTUVSQVRFKG5hbWUsaWdub3JlLHByZWZpeCkgcHJlZml4IyNuYW1lLAorZW51bSB0aW1lcl9lIHsKKyAgICBLTVBfRk9SRUFDSF9USU1FUihFTlVNRVJBVEUsIFRJTUVSXykKK307CisKK2VudW0gZXhwbGljaXRfdGltZXJfZSB7CisgICAgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoRU5VTUVSQVRFLCBFWFBMSUNJVF9USU1FUl8pCit9OworCitlbnVtIGNvdW50ZXJfZSB7CisgICAgS01QX0ZPUkVBQ0hfQ09VTlRFUihFTlVNRVJBVEUsIENPVU5URVJfKQorfTsKKyN1bmRlZiBFTlVNRVJBVEUKKworY2xhc3Mgc3RhdGlzdGljCit7CisgICAgZG91YmxlICAgbWluVmFsOworICAgIGRvdWJsZSAgIG1heFZhbDsKKyAgICBkb3VibGUgICBtZWFuVmFsOworICAgIGRvdWJsZSAgIG0yOworICAgIHVpbnQ2NF90IHNhbXBsZUNvdW50OworCisgcHVibGljOgorICAgIHN0YXRpc3RpYygpIHsgcmVzZXQoKTsgfQorICAgIHN0YXRpc3RpYyAoc3RhdGlzdGljIGNvbnN0ICZvKTogbWluVmFsKG8ubWluVmFsKSwgbWF4VmFsKG8ubWF4VmFsKSwgbWVhblZhbChvLm1lYW5WYWwpLCBtMihvLm0yKSwgc2FtcGxlQ291bnQoby5zYW1wbGVDb3VudCkge30KKworICAgIGRvdWJsZSAgIGdldE1pbigpICAgY29uc3QgeyByZXR1cm4gbWluVmFsOyB9CisgICAgZG91YmxlICAgZ2V0TWVhbigpICBjb25zdCB7IHJldHVybiBtZWFuVmFsOyB9CisgICAgZG91YmxlICAgZ2V0TWF4KCkgICBjb25zdCB7IHJldHVybiBtYXhWYWw7IH0KKyAgICB1aW50NjRfdCBnZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZUNvdW50OyB9CisgICAgZG91YmxlICAgZ2V0U0QoKSAgICBjb25zdCB7IHJldHVybiBzcXJ0KG0yL3NhbXBsZUNvdW50KTsgfQorICAgIGRvdWJsZSAgIGdldFRvdGFsKCkgY29uc3QgeyByZXR1cm4gc2FtcGxlQ291bnQqbWVhblZhbDsgfQorCisgICAgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBtaW5WYWwgPSAgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKTsKKyAgICAgICAgbWF4VmFsID0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7CisgICAgICAgIG1lYW5WYWw9IDAuMDsKKyAgICAgICAgbTIgICAgID0gMC4wOworICAgICAgICBzYW1wbGVDb3VudCA9IDA7CisgICAgfQorICAgIHZvaWQgYWRkU2FtcGxlKGRvdWJsZSBzYW1wbGUpOworICAgIHZvaWQgc2NhbGUgICAgKGRvdWJsZSBmYWN0b3IpOworICAgIHZvaWQgc2NhbGVEb3duKGRvdWJsZSBmKSAgeyBzY2FsZSAoMS4vZik7IH0KKyAgICBzdGF0aXN0aWMgJiBvcGVyYXRvcis9IChzdGF0aXN0aWMgY29uc3QgJiBvdGhlcik7CisKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXQoY2hhciB1bml0LCBib29sIHRvdGFsPWZhbHNlKSBjb25zdDsKK307CisKK3N0cnVjdCBzdGF0SW5mbworeworICAgIGNvbnN0IGNoYXIgKiBuYW1lOworICAgIHVpbnQzMl90ICAgICBmbGFnczsKK307CisKK2NsYXNzIHRpbWVTdGF0IDogcHVibGljIHN0YXRpc3RpYworeworICAgIHN0YXRpYyBzdGF0SW5mbyB0aW1lckluZm9bXTsKKworIHB1YmxpYzoKKyAgICB0aW1lU3RhdCgpIDogc3RhdGlzdGljKCkge30KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIG5hbWUodGltZXJfZSBlKSB7IHJldHVybiB0aW1lckluZm9bZV0ubmFtZTsgfQorICAgIHN0YXRpYyBib29sICBtYXN0ZXJPbmx5ICh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6Om9ubHlJbk1hc3RlcjsgfQorICAgIHN0YXRpYyBib29sICB3b3JrZXJPbmx5ICh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6Om5vdEluTWFzdGVyOyAgfQorICAgIHN0YXRpYyBib29sICBub1VuaXRzICAgICh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6Om5vVW5pdHM7ICAgICAgfQorICAgIHN0YXRpYyBib29sICBzeW50aGVzaXplZCh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6OnN5bnRoZXNpemVkOyAgfQorICAgIHN0YXRpYyBib29sICBsb2dFdmVudCAgICh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50OyAgICAgfQorICAgIHN0YXRpYyB2b2lkICBjbGVhckV2ZW50RmxhZ3MoKSAgICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTA7aTxUSU1FUl9MQVNUO2krKykgeworICAgICAgICAgICAgdGltZXJJbmZvW2ldLmZsYWdzICY9ICh+KHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50KSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBXaGVyZSB3ZSBuZWVkIGV4cGxpY2l0bHkgdG8gc3RhcnQgYW5kIGVuZCB0aGUgdGltZXIsIHRoaXMgdmVyc2lvbiBjYW4gYmUgdXNlZAorLy8gU2luY2UgdGhlc2UgdGltZXJzIG5vcm1hbGx5IGFyZW4ndCBuaWNlbHkgc2NvcGVkLCBzbyBkb24ndCBoYXZlIGEgZ29vZCBwbGFjZSB0byBsaXZlCisvLyBvbiB0aGUgc3RhY2sgb2YgdGhlIHRocmVhZCwgdGhleSdyZSBtb3JlIHdvcmsgdG8gdXNlLgorY2xhc3MgZXhwbGljaXRUaW1lcgoreworICAgIHRpbWVTdGF0ICogc3RhdDsKKyAgICB0c2NfdGlja19jb3VudCBzdGFydFRpbWU7CisKKyBwdWJsaWM6CisgICAgZXhwbGljaXRUaW1lciAoKSA6IHN0YXQoMCksIHN0YXJ0VGltZSgwKSB7IH0KKyAgICBleHBsaWNpdFRpbWVyICh0aW1lU3RhdCAqIHMpIDogc3RhdChzKSwgc3RhcnRUaW1lKCkgeyB9CisKKyAgICB2b2lkIHNldFN0YXQgKHRpbWVTdGF0ICpzKSB7IHN0YXQgPSBzOyB9CisgICAgdm9pZCBzdGFydCh0aW1lcl9lIHRpbWVyRW51bVZhbHVlKTsKKyAgICB2b2lkIHN0b3AodGltZXJfZSB0aW1lckVudW1WYWx1ZSk7CisgICAgdm9pZCByZXNldCgpIHsgc3RhcnRUaW1lID0gMDsgfQorfTsKKworLy8gV2hlcmUgYWxsIHlvdSBuZWVkIGlzIHRvIHRpbWUgYSBibG9jaywgdGhpcyBpcyBlbm91Z2guCisvLyAoSXQgYXZvaWRzIHRoZSBuZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQgZW5kLCBsZWF2aW5nIHRoZSBzY29wZSBzdWZmaWNlcy4pCitjbGFzcyBibG9ja1RpbWVyIDogcHVibGljIGV4cGxpY2l0VGltZXIKK3sKKyAgICB0aW1lcl9lIHRpbWVyRW51bVZhbHVlOworIHB1YmxpYzoKKyAgICBibG9ja1RpbWVyICh0aW1lU3RhdCAqIHMsIHRpbWVyX2UgbmV3VGltZXJFbnVtVmFsdWUpIDogdGltZXJFbnVtVmFsdWUobmV3VGltZXJFbnVtVmFsdWUpLCBleHBsaWNpdFRpbWVyKHMpIHsgc3RhcnQodGltZXJFbnVtVmFsdWUpOyB9CisgICAgfmJsb2NrVGltZXIoKSB7IHN0b3AodGltZXJFbnVtVmFsdWUpOyB9Cit9OworCisvLyBJZiBhbGwgeW91IHdhbnQgaXMgYSBjb3VudCwgdGhlbiB5b3UgY2FuIHVzZSB0aGlzLi4uCisvLyBUaGUgaW5kaXZpZHVhbCBwZXItdGhyZWFkIGNvdW50cyB3aWxsIGJlIGFnZ3JlZ2F0ZWQgaW50byBhIHN0YXRpc3RpYyBhdCBwcm9ncmFtIGV4aXQuCitjbGFzcyBjb3VudGVyCit7CisgICAgdWludDY0X3QgdmFsdWU7CisgICAgc3RhdGljIGNvbnN0IHN0YXRJbmZvIGNvdW50ZXJJbmZvW107CisKKyBwdWJsaWM6CisgICAgY291bnRlcigpIDogdmFsdWUoMCkge30KKyAgICB2b2lkIGluY3JlbWVudCgpIHsgdmFsdWUrKzsgfQorICAgIHVpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKyAgICB2b2lkIHJlc2V0KCkgeyB2YWx1ZSA9IDA7IH0KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIG5hbWUoY291bnRlcl9lIGUpIHsgcmV0dXJuIGNvdW50ZXJJbmZvW2VdLm5hbWU7IH0KKyAgICBzdGF0aWMgYm9vbCAgbWFzdGVyT25seSAoY291bnRlcl9lIGUpIHsgcmV0dXJuIGNvdW50ZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyOyB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGFuIGV2ZW50CisKKyAgICBUaGVyZSBhcmUgZm91ciBjb21wb25lbnRzIHRvIGFuIGV2ZW50OiBzdGFydCB0aW1lLCBzdG9wIHRpbWUKKyAgICBuZXN0X2xldmVsLCBhbmQgdGltZXJfbmFtZS4KKyAgICBUaGUgc3RhcnQgYW5kIHN0b3AgdGltZSBzaG91bGQgYmUgb2J2aW91cyAocmVjb3JkZWQgaW4gY2xvY2sgdGlja3MpLgorICAgIFRoZSBuZXN0X2xldmVsIHJlbGF0ZXMgdG8gdGhlIGJhciB3aWR0aCBpbiB0aGUgdGltZWxpbmUgZ3JhcGguCisgICAgVGhlIHRpbWVyX25hbWUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdGltZXIgZXZlbnQgdHJpZ2dlcmVkIHRoaXMgZXZlbnQuCisKKyAgICB0aGUgaW50ZXJmYWNlIHRvIHRoaXMgY2xhc3MgaXMgdGhyb3VnaCBmb3VyIHJlYWQtb25seSBvcGVyYXRpb25zOgorICAgIDEpIGdldFN0YXJ0KCkgICAgIC0tIHJldHVybnMgdGhlIHN0YXJ0IHRpbWUgYXMgNjQgYml0IGludGVnZXIKKyAgICAyKSBnZXRTdG9wKCkgICAgICAtLSByZXR1cm5zIHRoZSBzdG9wIHRpbWUgYXMgNjQgYml0IGludGVnZXIKKyAgICAzKSBnZXROZXN0TGV2ZWwoKSAtLSByZXR1cm5zIHRoZSBuZXN0IGxldmVsIG9mIHRoZSBldmVudAorICAgIDQpIGdldFRpbWVyTmFtZSgpIC0tIHJldHVybnMgdGhlIHRpbWVyIG5hbWUgdGhhdCB0cmlnZ2VyZWQgZXZlbnQKKworICAgICpNT1JFIE9OIE5FU1RfTEVWRUwqCisgICAgVGhlIG5lc3QgbGV2ZWwgaXMgdXNlZCBpbiB0aGUgYmFyIGdyYXBoIHRoYXQgcmVwcmVzZW50cyB0aGUgdGltZWxpbmUuCisgICAgSXRzIG1haW4gcHVycG9zZSBpcyBmb3Igc2hvd2luZyBob3cgZXZlbnRzIGFyZSBuZXN0ZWQgaW5zaWRlIGVhY2hvdGhlci4KKyAgICBGb3IgZXhhbXBsZSwgc2F5IGV2ZW50cywgQSwgQiwgYW5kIEMgYXJlIHJlY29yZGVkLiAgSWYgdGhlIHRpbWVsaW5lCisgICAgbG9va3MgbGlrZSB0aGlzOgorCitCZWdpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBUaW1lCisgICAgICAgICB8ICAgIHwgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICB8CisgICAgICAgICBBICAgIEIgICAgICAgICAgQyAgICAgICAgQyAgICAgICAgICBCICAgICAgICAgICAgICBBCisgICAgICAgc3RhcnQgc3RhcnQgICAgIHN0YXJ0ICAgICBlbmQgICAgICAgIGVuZCAgICAgICAgICAgIGVuZAorCisgICAgICAgVGhlbiBBLCBCLCBDIHdpbGwgaGF2ZSBhIG5lc3QgbGV2ZWwgb2YgMSwgMiwgMyByZXNwZWN0aXZlbHkuCisgICAgICAgVGhlc2UgdmFsdWVzIGFyZSB0aGVuIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBiYXJ3aWR0aCBzbyB5b3UgY2FuCisgICAgICAgc2VlIHRoYXQgaW5zaWRlIEEsIEIgaGFzIG9jY3VycmVkLCBhbmQgaW5zaWRlIEIsIEMgaGFzIG9jY3VycmVkLgorICAgICAgIEN1cnJlbnRseSwgdGhpcyBpcyBzaG93biB3aXRoIEEncyBiYXIgd2lkdGggYmVpbmcgbGFyZ2VyIHRoYW4gQidzCisgICAgICAgYmFyIHdpZHRoLCBhbmQgQidzIGJhciB3aWR0aCBiZWluZyBsYXJnZXIgdGhhbiBDJ3MgYmFyIHdpZHRoLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfZXZlbnQgeworICAgIHVpbnQ2NF90IHN0YXJ0OworICAgIHVpbnQ2NF90IHN0b3A7CisgICAgaW50IG5lc3RfbGV2ZWw7CisgICAgdGltZXJfZSB0aW1lcl9uYW1lOworIHB1YmxpYzoKKyAgICBrbXBfc3RhdHNfZXZlbnQoKSA6IHN0YXJ0KDApLCBzdG9wKDApLCBuZXN0X2xldmVsKDApLCB0aW1lcl9uYW1lKFRJTUVSX0xBU1QpIHt9CisgICAga21wX3N0YXRzX2V2ZW50KHVpbnQ2NF90IHN0cnQsIHVpbnQ2NF90IHN0cCwgaW50IG5zdCwgdGltZXJfZSBubWUpIDogc3RhcnQoc3RydCksIHN0b3Aoc3RwKSwgbmVzdF9sZXZlbChuc3QpLCB0aW1lcl9uYW1lKG5tZSkge30KKyAgICBpbmxpbmUgdWludDY0X3QgIGdldFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gc3RhcnQ7IH0KKyAgICBpbmxpbmUgdWludDY0X3QgIGdldFN0b3AoKSBjb25zdCAgeyByZXR1cm4gc3RvcDsgIH0KKyAgICBpbmxpbmUgaW50ICAgICAgIGdldE5lc3RMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIG5lc3RfbGV2ZWw7IH0KKyAgICBpbmxpbmUgdGltZXJfZSAgIGdldFRpbWVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRpbWVyX25hbWU7IH0KK307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBDbGFzcyB0byBpbXBsZW1lbnQgYSBkeW5hbWljYWxseSBleHBhbmRhYmxlIGFycmF5IG9mIGV2ZW50cworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCBldmVudCAxIHwgZXZlbnQgMiB8IGV2ZW50IDMgfCBldmVudCA0IHwgLi4uIHwgZXZlbnQgTiB8CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBbiBldmVudCBpcyBwdXNoZWQgb250byB0aGUgYmFjayBvZiB0aGlzIGFycmF5IGF0IGV2ZXJ5CisgICAgZXhwbGljaXRUaW1lci0+c3RvcCgpIGNhbGwuICBUaGUgZXZlbnQgcmVjb3JkcyB0aGUgdGhyZWFkICMsCisgICAgc3RhcnQgdGltZSwgc3RvcCB0aW1lLCBhbmQgbmVzdCBsZXZlbCByZWxhdGVkIHRvIHRoZSBiYXIgd2lkdGguCisKKyAgICBUaGUgZXZlbnQgdmVjdG9yIHN0YXJ0cyBhdCBzaXplIElOSVRfU0laRSBhbmQgZ3Jvd3MgKGRvdWJsZXMgaW4gc2l6ZSkKKyAgICBpZiBuZWVkZWQuICBBbiBpbXBsaWNhdGlvbiBvZiB0aGlzIGJlaGF2aW9yIGlzIHRoYXQgbG9nKE4pCisgICAgcmVhbGxvY2F0aW9ucyBhcmUgbmVlZGVkICh3aGVyZSBOIGlzIG51bWJlciBvZiBldmVudHMpLiAgSWYgeW91IHdhbnQKKyAgICB0byBhdm9pZCByZWFsbG9jYXRpb25zLCB0aGVuIHNldCBJTklUX1NJWkUgdG8gYSBsYXJnZSB2YWx1ZS4KKworICAgIHRoZSBpbnRlcmZhY2UgdG8gdGhpcyBjbGFzcyBpcyB0aHJvdWdoIHNpeCBvcGVyYXRpb25zOgorICAgIDEpIHJlc2V0KCkgLS0gc2V0cyB0aGUgaW50ZXJuYWxfc2l6ZSBiYWNrIHRvIDAgYnV0IGRvZXMgbm90IGRlYWxsb2NhdGUgYW55IG1lbW9yeQorICAgIDIpIHNpemUoKSAgLS0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbGlkIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IKKyAgICAzKSBwdXNoX2JhY2soc3RhcnQsIHN0b3AsIG5lc3QsIHRpbWVyX25hbWUpIC0tIHB1c2hlcyBhbiBldmVudCBvbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFjayBvZiB0aGUgYXJyYXkKKyAgICA0KSBkZWFsbG9jYXRlKCkgLS0gZnJlZXMgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHZlY3RvcgorICAgIDUpIHNvcnQoKSAtLSBzb3J0cyB0aGUgdmVjdG9yIGJ5IHN0YXJ0IHRpbWUKKyAgICA2KSBvcGVyYXRvcltpbmRleF0gb3IgYXQoaW5kZXgpIC0tIHJldHVybnMgZXZlbnQgcmVmZXJlbmNlIGF0IHRoYXQgaW5kZXgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworY2xhc3Mga21wX3N0YXRzX2V2ZW50X3ZlY3RvciB7CisgICAga21wX3N0YXRzX2V2ZW50KiBldmVudHM7CisgICAgaW50IGludGVybmFsX3NpemU7CisgICAgaW50IGFsbG9jYXRlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBpbnQgSU5JVF9TSVpFID0gMTAyNDsKKyBwdWJsaWM6CisgICAga21wX3N0YXRzX2V2ZW50X3ZlY3RvcigpIHsKKyAgICAgICAgZXZlbnRzID0gKGttcF9zdGF0c19ldmVudCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9zdGF0c19ldmVudCkqSU5JVF9TSVpFKTsKKyAgICAgICAgaW50ZXJuYWxfc2l6ZSA9IDA7CisgICAgICAgIGFsbG9jYXRlZF9zaXplID0gSU5JVF9TSVpFOworICAgIH0KKyAgIH5rbXBfc3RhdHNfZXZlbnRfdmVjdG9yKCkge30KKyAgICBpbmxpbmUgdm9pZCByZXNldCgpIHsgaW50ZXJuYWxfc2l6ZSA9IDA7IH0KKyAgICBpbmxpbmUgaW50ICBzaXplKCkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWxfc2l6ZTsgfQorICAgIHZvaWQgcHVzaF9iYWNrKHVpbnQ2NF90IHN0YXJ0X3RpbWUsIHVpbnQ2NF90IHN0b3BfdGltZSwgaW50IG5lc3RfbGV2ZWwsIHRpbWVyX2UgbmFtZSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaWYoaW50ZXJuYWxfc2l6ZSA9PSBhbGxvY2F0ZWRfc2l6ZSkgeworICAgICAgICAgICAga21wX3N0YXRzX2V2ZW50KiB0bXAgPSAoa21wX3N0YXRzX2V2ZW50KilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3N0YXRzX2V2ZW50KSphbGxvY2F0ZWRfc2l6ZSoyKTsKKyAgICAgICAgICAgIGZvcihpPTA7aTxpbnRlcm5hbF9zaXplO2krKykgdG1wW2ldID0gZXZlbnRzW2ldOworICAgICAgICAgICAgX19rbXBfZnJlZShldmVudHMpOworICAgICAgICAgICAgZXZlbnRzID0gdG1wOworICAgICAgICAgICAgYWxsb2NhdGVkX3NpemUqPTI7CisgICAgICAgIH0KKyAgICAgICAgZXZlbnRzW2ludGVybmFsX3NpemVdID0ga21wX3N0YXRzX2V2ZW50KHN0YXJ0X3RpbWUsIHN0b3BfdGltZSwgbmVzdF9sZXZlbCwgbmFtZSk7CisgICAgICAgIGludGVybmFsX3NpemUrKzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2b2lkIGRlYWxsb2NhdGUoKTsKKyAgICB2b2lkIHNvcnQoKTsKKyAgICBjb25zdCBrbXBfc3RhdHNfZXZlbnQgJiBvcGVyYXRvcltdKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorICAgICAgICAgIGttcF9zdGF0c19ldmVudCAmIG9wZXJhdG9yW10oaW50IGluZGV4KSB7IHJldHVybiBldmVudHNbaW5kZXhdOyB9CisgICAgY29uc3Qga21wX3N0YXRzX2V2ZW50ICYgYXQoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBldmVudHNbaW5kZXhdOyB9CisgICAgICAgICAga21wX3N0YXRzX2V2ZW50ICYgYXQoaW50IGluZGV4KSB7IHJldHVybiBldmVudHNbaW5kZXhdOyB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGEgZG91Ymx5LWxpbmtlZCwgY2lyY3VsYXIsIHN0YXRpc3RpY3MgbGlzdAorCisgICAgfC0tLXwgLS0tPiB8LS0tfCAtLS0+IHwtLS18IC0tLT4gfC0tLXwgLS0tPiAuLi4gbmV4dAorICAgIHwgICB8ICAgICAgfCAgIHwgICAgICB8ICAgfCAgICAgIHwgICB8CisgICAgfC0tLXwgPC0tLSB8LS0tfCA8LS0tIHwtLS18IDwtLS0gfC0tLXwgPC0tLSAuLi4gcHJldgorICAgIFNlbnRpbmVsICAgZmlyc3QgICAgICBzZWNvbmQgICAgIHRoaXJkCisgICAgTm9kZSAgICAgICBub2RlICAgICAgIG5vZGUgICAgICAgbm9kZQorCisgICAgVGhlIFNlbnRpbmVsIE5vZGUgaXMgdGhlIHVzZXIgaGFuZGxlIG9uIHRoZSBsaXN0LgorICAgIFRoZSBmaXJzdCBub2RlIGNvcnJlc3BvbmRzIHRvIHRocmVhZCAwJ3Mgc3RhdGlzdGljcy4KKyAgICBUaGUgc2Vjb25kIG5vZGUgY29ycmVzcG9uZHMgdG8gdGhyZWFkIDEncyBzdGF0aXN0aWNzIGFuZCBzbyBvbi4uLgorCisgICAgRWFjaCBub2RlIGhhcyBhIF90aW1lcnMsIF9jb3VudGVycywgYW5kIF9leHBsaWNpdFRpbWVycyBhcnJheSB0bworICAgIGhvbGQgdGhhdCB0aHJlYWQncyBzdGF0aXN0aWNzLiAgVGhlIF9leHBsaWNpdFRpbWVycworICAgIHBvaW50IHRvIHRoZSBjb3JyZWN0IF90aW1lciBhbmQgdXBkYXRlIGl0cyBzdGF0aXN0aWNzIGF0IGV2ZXJ5IHN0b3AoKSBjYWxsLgorICAgIFRoZSBleHBsaWNpdFRpbWVycycgcG9pbnRlcnMgYXJlIHNldCB1cCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgRWFjaCBub2RlIGFsc28gaGFzIGFuIGV2ZW50IHZlY3RvciB0byBob2xkIHRoYXQgdGhyZWFkJ3MgdGltaW5nIGV2ZW50cy4KKyAgICBUaGUgZXZlbnQgdmVjdG9yIGV4cGFuZHMgYXMgbmVjZXNzYXJ5IGFuZCByZWNvcmRzIHRoZSBzdGFydC1zdG9wIHRpbWVzCisgICAgZm9yIGVhY2ggdGltZXIuCisKKyAgICBUaGUgbmVzdExldmVsIHZhcmlhYmxlIGlzIGZvciBwbG90dGluZyBldmVudHMgYW5kIGlzIHJlbGF0ZWQKKyAgICB0byB0aGUgYmFyIHdpZHRoIGluIHRoZSB0aW1lbGluZSBncmFwaC4KKworICAgIEV2ZXJ5IHRocmVhZCB3aWxsIGhhdmUgYSBfX3RocmVhZCBsb2NhbCBwb2ludGVyIHRvIGl0cyBub2RlIGluCisgICAgdGhlIGxpc3QuICBUaGUgc2VudGluZWwgbm9kZSBpcyB1c2VkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIHRvCisgICAgc3RvcmUgImR1bW15IiBzdGF0aXN0aWNzIGJlZm9yZSBfX2ttcF9jcmVhdGVfd29ya2VyKCkgaXMgY2FsbGVkLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfbGlzdCB7CisgICAgaW50IGd0aWQ7CisgICAgdGltZVN0YXQgICAgICBfdGltZXJzW1RJTUVSX0xBU1QrMV07CisgICAgY291bnRlciAgICAgICBfY291bnRlcnNbQ09VTlRFUl9MQVNUKzFdOworICAgIGV4cGxpY2l0VGltZXIgX2V4cGxpY2l0VGltZXJzW0VYUExJQ0lUX1RJTUVSX0xBU1QrMV07CisgICAgaW50ICAgICAgICAgICBfbmVzdExldmVsOyAvLyBvbmUgcGVyIHRocmVhZAorICAgIGttcF9zdGF0c19ldmVudF92ZWN0b3IgX2V2ZW50X3ZlY3RvcjsKKyAgICBrbXBfc3RhdHNfbGlzdCogbmV4dDsKKyAgICBrbXBfc3RhdHNfbGlzdCogcHJldjsKKyBwdWJsaWM6CisgICAga21wX3N0YXRzX2xpc3QoKSA6IG5leHQodGhpcykgLCBwcmV2KHRoaXMpICwgX2V2ZW50X3ZlY3RvcigpLCBfbmVzdExldmVsKDApIHsKKyNkZWZpbmUgZG9Jbml0KG5hbWUsaWdub3JlMSxpZ25vcmUyKSBcCisgICAgICAgIGdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKS0+c2V0U3RhdChnZXRUaW1lcihUSU1FUl8jI25hbWUpKTsKKyAgICAgICAgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoZG9Jbml0LDApOworI3VuZGVmIGRvSW5pdAorICAgIH0KKyAgIH5rbXBfc3RhdHNfbGlzdCgpIHsgfQorICAgIGlubGluZSB0aW1lU3RhdCAqICAgICAgZ2V0VGltZXIodGltZXJfZSBpZHgpICAgICAgICAgICAgICAgICAgeyByZXR1cm4gJl90aW1lcnNbaWR4XTsgfQorICAgIGlubGluZSBjb3VudGVyICAqICAgICAgZ2V0Q291bnRlcihjb3VudGVyX2UgaWR4KSAgICAgICAgICAgICAgeyByZXR1cm4gJl9jb3VudGVyc1tpZHhdOyB9CisgICAgaW5saW5lIGV4cGxpY2l0VGltZXIgKiBnZXRFeHBsaWNpdFRpbWVyKGV4cGxpY2l0X3RpbWVyX2UgaWR4KSB7IHJldHVybiAmX2V4cGxpY2l0VGltZXJzW2lkeF07IH0KKyAgICBpbmxpbmUgdGltZVN0YXQgKiAgICAgIGdldFRpbWVycygpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF90aW1lcnM7IH0KKyAgICBpbmxpbmUgY291bnRlciAgKiAgICAgIGdldENvdW50ZXJzKCkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9jb3VudGVyczsgfQorICAgIGlubGluZSBleHBsaWNpdFRpbWVyICogZ2V0RXhwbGljaXRUaW1lcnMoKSAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gX2V4cGxpY2l0VGltZXJzOyB9CisgICAgaW5saW5lIGttcF9zdGF0c19ldmVudF92ZWN0b3IgJiBnZXRFdmVudFZlY3RvcigpICAgICAgICAgICAgICB7IHJldHVybiBfZXZlbnRfdmVjdG9yOyB9CisgICAgaW5saW5lIHZvaWQgcmVzZXRFdmVudFZlY3RvcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IF9ldmVudF92ZWN0b3IucmVzZXQoKTsgfQorICAgIGlubGluZSB2b2lkIGluY3JlbWVudE5lc3RWYWx1ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBfbmVzdExldmVsKys7IH0KKyAgICBpbmxpbmUgaW50ICBnZXROZXN0VmFsdWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9uZXN0TGV2ZWw7IH0KKyAgICBpbmxpbmUgdm9pZCBkZWNyZW1lbnROZXN0VmFsdWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgX25lc3RMZXZlbC0tOyB9CisgICAgaW5saW5lIGludCAgZ2V0R3RpZCgpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBndGlkOyB9CisgICAgaW5saW5lIHZvaWQgc2V0R3RpZChpbnQgbmV3Z3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGd0aWQgPSBuZXdndGlkOyB9CisgICAga21wX3N0YXRzX2xpc3QqIHB1c2hfYmFjayhpbnQgZ3RpZCk7IC8vIHJldHVybnMgbmV3bHkgY3JlYXRlZCBsaXN0IG5vZGUKKyAgICBpbmxpbmUgdm9pZCAgICAgcHVzaF9ldmVudCh1aW50NjRfdCBzdGFydF90aW1lLCB1aW50NjRfdCBzdG9wX3RpbWUsIGludCBuZXN0X2xldmVsLCB0aW1lcl9lIG5hbWUpIHsKKyAgICAgICAgX2V2ZW50X3ZlY3Rvci5wdXNoX2JhY2soc3RhcnRfdGltZSwgc3RvcF90aW1lLCBuZXN0X2xldmVsLCBuYW1lKTsKKyAgICB9CisgICAgdm9pZCBkZWFsbG9jYXRlKCk7CisgICAgY2xhc3MgaXRlcmF0b3I7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGJlZ2luKCk7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGVuZCgpOworICAgIGludCBzaXplKCk7CisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBrbXBfc3RhdHNfbGlzdCogcHRyOworICAgICAgICBmcmllbmQga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjpiZWdpbigpOworICAgICAgICBmcmllbmQga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjplbmQoKTsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKTsKKyAgICAgICB+aXRlcmF0b3IoKTsKKyAgICAgICAgaXRlcmF0b3Igb3BlcmF0b3IrKygpOworICAgICAgICBpdGVyYXRvciBvcGVyYXRvcisrKGludCBkdW1teSk7CisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yLS0oKTsKKyAgICAgICAgaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQgZHVtbXkpOworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3IgJiByaHMpOworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJiByaHMpOworICAgICAgICBrbXBfc3RhdHNfbGlzdCogb3BlcmF0b3IqKCkgY29uc3Q7IC8vIGRlcmVmZXJlbmNlIG9wZXJhdG9yCisgICAgfTsKK307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCBvdXRwdXQgZnVuY3Rpb25zIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisKKyAgIFRoaXMgbW9kdWxlIGhvbGRzIGZpbGVuYW1lcyBmb3IgdmFyaW91cyBvdXRwdXRzIChub3JtYWwgc3RhdHMsIGV2ZW50cywgcGxvdCBmaWxlKSwKKyAgIGFzIHdlbGwgYXMgY29sb3JpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBwbG90IGZpbGUuCisKKyAgIFRoZSBmaWxlbmFtZXMgYW5kIGZsYWdzIHZhcmlhYmxlcyBhcmUgcmVhZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgIFRoZXNlIGFyZSByZWFkIG9uY2UgYnkgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUgX19rbXBfc3RhdHNfb3V0cHV0CisgICB3aGljaCBjYWxscyBpbml0KCkuCisKKyAgIER1cmluZyB0aGlzIGluaXQoKSBjYWxsLCBldmVudCBmbGFncyBmb3IgdGhlIHRpbWVTdGF0Ojp0aW1lckluZm9bXSBnbG9iYWwgYXJyYXkKKyAgIGFyZSBjbGVhcmVkIGlmIEtNUF9TVEFUU19FVkVOVFMgaXMgbm90IHRydWUgKG9uLCAxLCB5ZXMpLgorCisgICBUaGUgb25seSBpbnRlcmZhY2UgZnVuY3Rpb24gdGhhdCBpcyBwdWJsaWMgaXMgb3V0cHV0U3RhdHMoaGVhZGluZykuICBUaGlzIGZ1bmN0aW9uCisgICBzaG91bGQgcHJpbnQgb3V0IGV2ZXJ5dGhpbmcgaXQgbmVlZHMgdG8sIGVpdGhlciB0byBmaWxlcyBvciBzdGRlcnIsCisgICBkZXBlbmRpbmcgb24gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZXNjcmliZWQgYmVsb3cKKworICAgRU5WSVJPTk1FTlQgVkFSSUFCTEVTOgorICAgS01QX1NUQVRTX0ZJTEUgLS0gaWYgc2V0LCBhbGwgc3RhdGlzdGljcyAobm90IGV2ZW50cykgd2lsbCBiZSBwcmludGVkIHRvIHRoaXMgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgcHJpbnQgdG8gc3RkZXJyCisgICBLTVBfU1RBVFNfVEhSRUFEUyAtLSBpZiBzZXQgdG8gIm9uIiwgdGhlbiB3aWxsIHByaW50IHBlciB0aHJlYWQgc3RhdGlzdGljcyB0byBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9TVEFUU19GSUxFIG9yIHN0ZGVycgorICAgS01QX1NUQVRTX1BMT1RfRklMRSAtLSBpZiBzZXQsIHByaW50IHRoZSBwbG90aWN1cyBwbG90IGZpbGUgdG8gdGhpcyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCB0aGUgcGxvdCBmaWxlIGlzIHNlbnQgdG8gImV2ZW50cy5wbHQiCisgICBLTVBfU1RBVFNfRVZFTlRTIC0tIGlmIHNldCB0byAib24iLCB0aGVuIGxvZyBldmVudHMsIG90aGVyd2lzZSwgZG9uJ3QgbG9nIGV2ZW50cworICAgS01QX1NUQVRTX0VWRU5UU19GSUxFIC0tIGlmIHNldCwgYWxsIGV2ZW50cyBhcmUgb3V0cHV0dGVkIHRvIHRoaXMgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIG91dHB1dCBpcyBzZW50IHRvICJldmVudHMuZGF0IgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSB7CisKKyBwdWJsaWM6CisgICAgc3RydWN0IHJnYl9jb2xvciB7CisgICAgICAgIGZsb2F0IHI7CisgICAgICAgIGZsb2F0IGc7CisgICAgICAgIGZsb2F0IGI7CisgICAgfTsKKworIHByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIG91dHB1dEZpbGVOYW1lOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBldmVudHNGaWxlTmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogcGxvdEZpbGVOYW1lOworICAgIHN0YXRpYyBpbnQgcHJpbnRQZXJUaHJlYWRGbGFnOworICAgIHN0YXRpYyBpbnQgcHJpbnRQZXJUaHJlYWRFdmVudHNGbGFnOworICAgIHN0YXRpYyBjb25zdCByZ2JfY29sb3IgZ2xvYmFsQ29sb3JBcnJheVtdOworICAgIHN0YXRpYyAgICAgICByZ2JfY29sb3IgdGltZXJDb2xvckluZm9bXTsKKworICAgIHZvaWQgaW5pdCgpOworICAgIHN0YXRpYyB2b2lkIHNldHVwRXZlbnRDb2xvcnMoKTsKKyAgICBzdGF0aWMgdm9pZCBwcmludFBsb3RpY3VzRmlsZSgpOworICAgIHN0YXRpYyB2b2lkIHByaW50U3RhdHMoRklMRSAqc3RhdHNPdXQsIHN0YXRpc3RpYyBjb25zdCAqIHRoZVN0YXRzLCBib29sIGFyZVRpbWVycyk7CisgICAgc3RhdGljIHZvaWQgcHJpbnRDb3VudGVycyhGSUxFICogc3RhdHNPdXQsIGNvdW50ZXIgY29uc3QgKiB0aGVDb3VudGVycyk7CisgICAgc3RhdGljIHZvaWQgcHJpbnRFdmVudHMoRklMRSAqIGV2ZW50c091dCwga21wX3N0YXRzX2V2ZW50X3ZlY3RvciogdGhlRXZlbnRzLCBpbnQgZ3RpZCk7CisgICAgc3RhdGljIHJnYl9jb2xvciBnZXRFdmVudENvbG9yKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJDb2xvckluZm9bZV07IH0KKyAgICBzdGF0aWMgdm9pZCB3aW5kdXBFeHBsaWNpdFRpbWVycygpOworICAgIGJvb2wgZXZlbnRQcmludGluZ0VuYWJsZWQoKSB7CisgICAgICAgIGlmKHByaW50UGVyVGhyZWFkRXZlbnRzRmxhZykgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIHBlclRocmVhZFByaW50aW5nRW5hYmxlZCgpIHsKKyAgICAgICAgaWYocHJpbnRQZXJUaHJlYWRGbGFnKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CisgICAgfQorCisgcHVibGljOgorICAgIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlKCkgeyBpbml0KCk7IH0KKyAgICB2b2lkIG91dHB1dFN0YXRzKGNvbnN0IGNoYXIqIGhlYWRpbmcpOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordm9pZCBfX2ttcF9zdGF0c19pbml0KCk7Cit2b2lkIF9fa21wX3Jlc2V0X3N0YXRzKCk7Cit2b2lkIF9fa21wX291dHB1dF9zdGF0cyhjb25zdCBjaGFyICopOwordm9pZCBfX2ttcF9hY2N1bXVsYXRlX3N0YXRzX2F0X2V4aXQodm9pZCk7CisvLyB0aHJlYWQgbG9jYWwgcG9pbnRlciB0byBzdGF0cyBub2RlIHdpdGhpbiBsaXN0CitleHRlcm4gX190aHJlYWQga21wX3N0YXRzX2xpc3QqIF9fa21wX3N0YXRzX3RocmVhZF9wdHI7CisvLyBoZWFkIHRvIHN0YXRzIGxpc3QuCitleHRlcm4ga21wX3N0YXRzX2xpc3QgX19rbXBfc3RhdHNfbGlzdDsKKy8vIGxvY2sgZm9yIF9fa21wX3N0YXRzX2xpc3QKK2V4dGVybiBrbXBfdGFzX2xvY2tfdCAgX19rbXBfc3RhdHNfbG9jazsKKy8vIHJlZmVyZW5jZSBzdGFydCB0aW1lCitleHRlcm4gdHNjX3RpY2tfY291bnQgX19rbXBfc3RhdHNfc3RhcnRfdGltZTsKKy8vIGludGVyZmFjZSB0byBvdXRwdXQKK2V4dGVybiBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSBfX2ttcF9zdGF0c19vdXRwdXQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIFNpbXBsZSwgc3RhbmRhcmQgaW50ZXJmYWNlcyB0aGF0IGRyb3Agb3V0IGNvbXBsZXRlbHkgaWYgc3RhdHMgYXJlbid0IGVuYWJsZWQKKworCisvKiEKKyAqIFxicmllZiBVc2VzIHNwZWNpZmllZCB0aW1lciAobmFtZSkgdG8gdGltZSBjb2RlIGJsb2NrLgorICoKKyAqIEBwYXJhbSBuYW1lIHRpbWVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZSBLTVBfRk9SRUFDSF9USU1FUigpIG1hY3JvCisgKgorICogXGRldGFpbHMgVXNlIEtNUF9USU1FX0JMT0NLKG5hbWUpIG1hY3JvIHRvIHRpbWUgYSBjb2RlIGJsb2NrLiAgVGhpcyB3aWxsIHJlY29yZCB0aGUgdGltZSB0YWtlbiBpbiB0aGUgYmxvY2sKKyAqIGFuZCB1c2UgdGhlIGRlc3RydWN0b3IgdG8gc3RvcCB0aGUgdGltZXIuICBDb252ZW5pZW50IQorICogV2l0aCB0aGlzIGRlZmluaXRpb24geW91IGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBLTVBfVElNRV9CTE9DSyBpbiB0aGUgc2FtZSBjb2RlIGJsb2NrLgorICogSSBkb24ndCB0aGluayB0aGF0J3MgYSBwcm9ibGVtLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1RJTUVfQkxPQ0sobmFtZSkgXAorICAgIGJsb2NrVGltZXIgX19CTE9DS1RJTUVfXyhfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRUaW1lcihUSU1FUl8jI25hbWUpLCBUSU1FUl8jI25hbWUpCisKKy8qIQorICogXGJyaWVmIEFkZHMgdmFsdWUgdG8gc3BlY2lmaWVkIHRpbWVyIChuYW1lKS4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aW1lciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfVElNRVIoKSBtYWNybworICogQHBhcmFtIHZhbHVlIGRvdWJsZSBwcmVjaXNpb24gc2FtcGxlIHZhbHVlIHRvIGFkZCB0byBzdGF0aXN0aWNzIGZvciB0aGUgdGltZXIKKyAqCisgKiBcZGV0YWlscyBVc2UgS01QX0NPVU5UX1ZBTFVFKG5hbWUsIHZhbHVlKSBtYWNybyB0byBhZGQgYSBwYXJ0aWN1bGFyIHZhbHVlIHRvIGEgdGltZXIgc3RhdGlzdGljcy4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9DT1VOVF9WQUxVRShuYW1lLCB2YWx1ZSkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFRpbWVyKFRJTUVSXyMjbmFtZSktPmFkZFNhbXBsZSh2YWx1ZSkKKworLyohCisgKiBcYnJpZWYgSW5jcmVtZW50cyBzcGVjaWZpZWQgY291bnRlciAobmFtZSkuCisgKgorICogQHBhcmFtIG5hbWUgY291bnRlciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfQ09VTlRFUigpIG1hY3JvCisgKgorICogXGRldGFpbHMgVXNlIEtNUF9DT1VOVF9CTE9DSyhuYW1lLCB2YWx1ZSkgbWFjcm8gdG8gaW5jcmVtZW50IGEgc3RhdGlzdGljcyBjb3VudGVyIGZvciB0aGUgZXhlY3V0aW5nIHRocmVhZC4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9DT1VOVF9CTE9DSyhuYW1lKSBcCisgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRDb3VudGVyKENPVU5URVJfIyNuYW1lKS0+aW5jcmVtZW50KCkKKworLyohCisgKiBcYnJpZWYgIlN0YXJ0cyIgYW4gZXhwbGljaXQgdGltZXIgd2hpY2ggd2lsbCBuZWVkIGEgY29ycmVzcG9uZGluZyBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUigpIG1hY3JvLgorICoKKyAqIEBwYXJhbSBuYW1lIGV4cGxpY2l0IHRpbWVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZSBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUigpIG1hY3JvCisgKgorICogXGRldGFpbHMgVXNlIHRvIHN0YXJ0IGEgdGltZXIuICBUaGlzIHdpbGwgbmVlZCBhIGNvcnJlc3BvbmRpbmcgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoKQorICogbWFjcm8gdG8gc3RvcCB0aGUgdGltZXIgdW5saWtlIHRoZSBLTVBfVElNRV9CTE9DSyhuYW1lKSBtYWNybyB3aGljaCBoYXMgYW4gaW1wbGljaXQgc3RvcHBpbmcgbWFjcm8gYXQgdGhlIGVuZAorICogb2YgdGhlIGNvZGUgYmxvY2suICBBbGwgZXhwbGljaXQgdGltZXJzIGFyZSBzdG9wcGVkIGF0IGxpYnJhcnkgZXhpdCB0aW1lIGJlZm9yZSB0aGUgZmluYWwgc3RhdGlzdGljcyBhcmUgb3V0cHV0dGVkLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG5hbWUpIFwKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRFeHBsaWNpdFRpbWVyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSktPnN0YXJ0KFRJTUVSXyMjbmFtZSkKKworLyohCisgKiBcYnJpZWYgIlN0b3BzIiBhbiBleHBsaWNpdCB0aW1lci4KKyAqCisgKiBAcGFyYW0gbmFtZSBleHBsaWNpdCB0aW1lciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuYW1lKSB0byBzdG9wIGEgdGltZXIuICBXaGVuIHRoaXMgaXMgZG9uZSwgdGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIobmFtZSkKKyAqIGFuZCB0aGlzIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG5hbWUpIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRpbWVyJ3Mgc3RhdCB2YWx1ZS4gIFRoZSB0aW1lciB3aWxsIHRoZW4gYmUgcmVzZXQuCisgKiBBZnRlciB0aGUgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobmFtZSkgbWFjcm8gaXMgY2FsbGVkLCBhbm90aGVyIGNhbGwgdG8gS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG5hbWUpIHdpbGwgc3RhcnQgdGhlIHRpbWVyIG9uY2UgYWdhaW4uCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuYW1lKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0RXhwbGljaXRUaW1lcihFWFBMSUNJVF9USU1FUl8jI25hbWUpLT5zdG9wKFRJTUVSXyMjbmFtZSkKKworLyohCisgKiBcYnJpZWYgT3V0cHV0cyB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGlzdGljcyBhbmQgcmVzZXQgdGhlbS4KKyAqCisgKiBAcGFyYW0gaGVhZGluZ19zdHJpbmcgaGVhZGluZyBwdXQgYWJvdmUgdGhlIGZpbmFsIHN0YXRzIG91dHB1dAorICoKKyAqIFxkZXRhaWxzIEV4cGxpY2l0bHkgc3RvcHMgYWxsIHRpbWVycyBhbmQgb3V0cHV0cyBhbGwgc3RhdHMuCisgKiBFbnZpcm9ubWVudCB2YXJpYWJsZSwgYE9NUFRCX1NUQVRTRklMRT1maWxlbmFtZWAsIGNhbiBiZSB1c2VkIHRvIG91dHB1dCB0aGUgc3RhdHMgdG8gYSBmaWxlbmFtZSBpbnN0ZWFkIG9mIHN0ZGVycgorICogRW52aXJvbm1lbnQgdmFyaWFibGUsIGBPTVBUQl9TVEFUU1RIUkVBRFM9dHJ1ZXx1bmRlZmluZWRgLCBjYW4gYmUgdXNlZCB0byBvdXRwdXQgdGhyZWFkIHNwZWNpZmljIHN0YXRzCisgKiBGb3Igbm93IHRoZSBgT01QVEJfU1RBVFNUSFJFQURTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gZWl0aGVyIGJlIGRlZmluZWQgd2l0aCBhbnkgdmFsdWUsIHdoaWNoIHdpbGwgcHJpbnQgb3V0IHRocmVhZAorICogc3BlY2lmaWMgc3RhdHMsIG9yIGl0IGNhbiBiZSB1bmRlZmluZWQgKG5vdCBzcGVjaWZpZWQgaW4gdGhlIGVudmlyb25tZW50KSBhbmQgdGhyZWFkIHNwZWNpZmljIHN0YXRzIHdvbid0IGJlIHByaW50ZWQKKyAqIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGFsbCBzdGF0aXN0aWNzIGFyZSByZXNldCB3aGVuIHRoaXMgbWFjcm8gaXMgY2FsbGVkLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX09VVFBVVF9TVEFUUyhoZWFkaW5nX3N0cmluZykgXAorICAgIF9fa21wX291dHB1dF9zdGF0cyhoZWFkaW5nX3N0cmluZykKKworLyohCisgKiBcYnJpZWYgcmVzZXRzIGFsbCBzdGF0cyAoY291bnRlcnMgdG8gMCwgdGltZXJzIHRvIDAgZWxhcHNlZCB0aWNrcykKKyAqCisgKiBcZGV0YWlscyBSZXNldCBhbGwgc3RhdHMgZm9yIGFsbCB0aHJlYWRzLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1JFU0VUX1NUQVRTKCkgIF9fa21wX3Jlc2V0X3N0YXRzKCkKKworI2lmIChLTVBfREVWRUxPUEVSX1NUQVRTKQorIyBkZWZpbmUgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKG4pICAgICAgICAgICAgIEtNUF9USU1FX0JMT0NLKG4pCisjIGRlZmluZSBLTVBfQ09VTlRfREVWRUxPUEVSX1ZBTFVFKG4sdikgICAgICAgICAgS01QX0NPVU5UX1ZBTFVFKG4sdikKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfQkxPQ0sobikgICAgICAgICAgICBLTVBfQ09VTlRfQkxPQ0sobikKKyMgZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIobikKKyMgZGVmaW5lIEtNUF9TVE9QX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAgICBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuKQorI2Vsc2UKKy8vIE51bGwgZGVmaW5pdGlvbnMKKyMgZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfVkFMVUUobix2KSAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfQkxPQ0sobikgICAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9TVE9QX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAgICAoKHZvaWQpMCkKKyNlbmRpZgorCisjZWxzZSAvLyBLTVBfU1RBVFNfRU5BQkxFRAorCisvLyBOdWxsIGRlZmluaXRpb25zCisjZGVmaW5lIEtNUF9USU1FX0JMT0NLKG4pICAgICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfVkFMVUUobix2KSAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0JMT0NLKG4pICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuKSAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuKSAgICAoKHZvaWQpMCkKKworI2RlZmluZSBLTVBfT1VUUFVUX1NUQVRTKGhlYWRpbmdfc3RyaW5nKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1JFU0VUX1NUQVRTKCkgICgodm9pZCkwKQorCisjZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9WQUxVRShuLHYpICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfREVWRUxPUEVSX0JMT0NLKG4pICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUT1BfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKG4pICAgICgodm9pZCkwKQorI2VuZGlmICAvLyBLTVBfU1RBVFNfRU5BQkxFRAorCisjZW5kaWYgLy8gS01QX1NUQVRTX0gKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlMjllYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuY3BwCkBAIC0wLDAgKzEsMTY4IEBACisvKiogQGZpbGUga21wX3N0YXRzX3RpbWluZy5jcHAKKyAqIFRpbWluZyBmdW5jdGlvbnMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3N0YXRzX3RpbWluZy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisjaWYgS01QX0hBVkVfVElDS19USU1FCisjIGlmIEtNUF9NSUMKK2RvdWJsZSB0c2NfdGlja19jb3VudDo6dGlja190aW1lKCkKK3sKKyAgICAvLyBwcmV0dHkgYmFkIGFzc3VtcHRpb24gb2YgMUdIeiBjbG9jayBmb3IgTUlDCisgICAgcmV0dXJuIDEvKChkb3VibGUpMTAwMCoxLmU2KTsKK30KKyMgZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKy8vIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIENQVUlEIGluZm9ybWF0aW9uCitkb3VibGUgdHNjX3RpY2tfY291bnQ6OnRpY2tfdGltZSgpCit7CisgICAgc3RhdGljIGRvdWJsZSByZXN1bHQgPSAwLjA7CisKKyAgICBpZiAocmVzdWx0ID09IDAuMCkKKyAgICB7CisgICAgICAgIGttcF9jcHVpZF90IGNwdWluZm87CisgICAgICAgIGNoYXIgYnJhbmRbMjU2XTsKKworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMHg4MDAwMDAwMCwgMCwgJmNwdWluZm8pOworICAgICAgICBtZW1zZXQoYnJhbmQsIDAsIHNpemVvZihicmFuZCkpOworICAgICAgICBpbnQgaWRzID0gY3B1aW5mby5lYXg7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0yOyBpPChpZHNeMHg4MDAwMDAwMCkrMjsgaSsrKQorICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKGkgfCAweDgwMDAwMDAwLCAwLCAoa21wX2NwdWlkX3QqKShicmFuZCsoaS0yKSpzaXplb2Yoa21wX2NwdWlkX3QpKSk7CisKKyAgICAgICAgY2hhciAqIHN0YXJ0ID0gJmJyYW5kWzBdOworICAgICAgICBmb3IgKDsqc3RhcnQgPT0gJyAnOyBzdGFydCsrKQorICAgICAgICAgICAgOworICAgIAorICAgICAgICBjaGFyICogZW5kID0gYnJhbmQgKyBLTVBfU1RSTEVOKGJyYW5kKSAtIDM7CisgICAgICAgIHVpbnQ2NF90IG11bHRpcGxpZXI7CisKKyAgICAgICAgaWYgKCplbmQgPT0gJ00nKSBtdWx0aXBsaWVyID0gMTAwMExMKjEwMDBMTDsKKyAgICAgICAgZWxzZSBpZiAoKmVuZCA9PSAnRycpIG11bHRpcGxpZXIgPSAxMDAwTEwqMTAwMExMKjEwMDBMTDsKKyAgICAgICAgZWxzZSBpZiAoKmVuZCA9PSAnVCcpIG11bHRpcGxpZXIgPSAxMDAwTEwqMTAwMExMKjEwMDBMTCoxMDAwTEw7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIkVycm9yIGRldGVybWluaW5nIG11bHRpcGxpZXIgJyIgPDwgKmVuZCA8PCAiJ1xuIjsKKyAgICAgICAgICAgIGV4aXQgKC0xKTsKKyAgICAgICAgfQorICAgICAgICAqZW5kID0gMDsKKyAgICAgICAgd2hpbGUgKCplbmQgIT0gJyAnKSBlbmQtLTsKKyAgICAgICAgZW5kKys7CisgICAgCisgICAgICAgIGRvdWJsZSBmcmVxID0gc3RydG9kKGVuZCwgJnN0YXJ0KTsKKyAgICAgICAgaWYgKGZyZXEgPT0gMC4wKSAKKyAgICAgICAgeworICAgICAgICAgICAgY291dCA8PCAiRXJyb3IgY2FsY3VsYXRpbmcgZnJlcXVlbmN5ICIgPDwgIGVuZCA8PCAiXG4iOworICAgICAgICAgICAgZXhpdCAoLTEpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gKChkb3VibGUpMS4wKS8oZnJlcSAqIG11bHRpcGxpZXIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorIyBlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBib29sIHVzZVNJID0gdHJ1ZTsKKworLy8gUmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyBhZnRlciBub3JtYWxpc2luZyB0aGUgdmFsdWUgaW50bworLy8gZW5naW5lZXJpbmcgc3R5bGUgYW5kIHVzaW5nIGEgc3VpdGFibGUgdW5pdCBwcmVmaXggKGUuZy4gbXMsIHVzLCBucykuCitzdGQ6OnN0cmluZyBmb3JtYXRTSShkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCwgY2hhciB1bml0KQoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zOworCisgICAgaWYgKHVzZVNJKQorICAgIHsKKyAgICAgICAgLy8gUHJlc2VydmUgYWNjdXJhY3kgZm9yIHNtYWxsIG51bWJlcnMsIHNpbmNlIHdlIG9ubHkgbXVsdGlwbHkgYW5kIHRoZSBwb3NpdGl2ZSBwb3dlcnMKKyAgICAgICAgLy8gb2YgdGVuIGFyZSBwcmVjaXNlbHkgcmVwcmVzZW50YWJsZS4gCisgICAgICAgIHN0YXRpYyBzdHJ1Y3QgeyBkb3VibGUgc2NhbGU7IGNoYXIgcHJlZml4OyB9IHJhbmdlc1tdID0geworICAgICAgICAgICAgezEuZTEyLCdmJ30sCisgICAgICAgICAgICB7MS5lOSwgJ3AnfSwKKyAgICAgICAgICAgIHsxLmU2LCAnbid9LAorICAgICAgICAgICAgezEuZTMsICd1J30sCisgICAgICAgICAgICB7MS4wLCAgJ20nfSwKKyAgICAgICAgICAgIHsxLmUtMywnICd9LAorICAgICAgICAgICAgezEuZS02LCdrJ30sCisgICAgICAgICAgICB7MS5lLTksJ00nfSwKKyAgICAgICAgICAgIHsxLmUtMTIsJ0cnfSwKKyAgICAgICAgICAgIHsxLmUtMTUsJ1QnfSwKKyAgICAgICAgICAgIHsxLmUtMTgsJ1AnfSwKKyAgICAgICAgICAgIHsxLmUtMjEsJ0UnfSwKKyAgICAgICAgICAgIHsxLmUtMjQsJ1onfSwKKyAgICAgICAgICAgIHsxLmUtMjcsJ1knfQorICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgaWYgKGludGVydmFsID09IDAuMCkKKyAgICAgICAgeworICAgICAgICAgICAgb3MgPDwgc3RkOjpzZXR3KHdpZHRoLTMpIDw8IHN0ZDo6cmlnaHQgPDwgIjAuMDAiIDw8IHN0ZDo6c2V0dygzKSA8PCB1bml0OworICAgICAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBuZWdhdGl2ZSA9IGZhbHNlOworICAgICAgICBpZiAoaW50ZXJ2YWwgPCAwLjApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIGludGVydmFsID0gLWludGVydmFsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpPTA7IGk8KGludCkoc2l6ZW9mKHJhbmdlcykvc2l6ZW9mKHJhbmdlc1swXSkpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnRlcnZhbCpyYW5nZXNbaV0uc2NhbGUgPCAxLmUwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWwgKiAxMDAwLmUwICogcmFuZ2VzW2ldLnNjYWxlOworICAgICAgICAgICAgICAgIG9zIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikgPDwgc3RkOjpzZXR3KHdpZHRoLTMpIDw8IHN0ZDo6cmlnaHQgPDwgCisgICAgICAgICAgICAgICAgICAgIChuZWdhdGl2ZSA/IC1pbnRlcnZhbCA6IGludGVydmFsKSA8PCBzdGQ6OnNldHcoMikgPDwgcmFuZ2VzW2ldLnByZWZpeCA8PCBzdGQ6OnNldHcoMSkgPDwgdW5pdDsKKworICAgICAgICAgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBvcyA8PCBzdGQ6OnNldHByZWNpc2lvbigyKSA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6cmlnaHQgPDwgc3RkOjpzZXR3KHdpZHRoLTMpIDw8IGludGVydmFsIDw8IHN0ZDo6c2V0dygzKSA8PCB1bml0OworCisgICAgcmV0dXJuIG9zLnN0cigpOworfQorCit0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgY29tcHV0ZUxhc3RJbkxhc3RPdXRJbnRlcnZhbCh0aW1lUGFpciAqIHRpbWVzLCBpbnQgblRpbWVzKQoreworICAgIHRpbWVQYWlyIGxhc3RUaW1lcyA9IHRpbWVzWzBdOworICAgIHRzY190aWNrX2NvdW50ICogc3RhcnRwID0gbGFzdFRpbWVzLmdldF9zdGFydHAoKTsKKyAgICB0c2NfdGlja19jb3VudCAqIGVuZHAgICA9IGxhc3RUaW1lcy5nZXRfZW5kcCgpOworCisgICAgZm9yIChpbnQgaT0xOyBpPG5UaW1lczsgaSsrKQorICAgIHsKKyAgICAgICAoKnN0YXJ0cCkgPSBzdGFydHAtPmxhdGVyKHRpbWVzW2ldLmdldF9zdGFydCgpKTsKKyAgICAgICAoKmVuZHApICAgPSBlbmRwLT5sYXRlciAgKHRpbWVzW2ldLmdldF9lbmQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGxhc3RUaW1lcy5kdXJhdGlvbigpOworfQorCitzdGQ6OnN0cmluZyB0aW1lUGFpcjo6Zm9ybWF0KCkgY29uc3QKK3sKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisgICAgb3NzIDw8IHN0YXJ0LmdldFZhbHVlKCkgPDwgIjoiIDw8IGVuZC5nZXRWYWx1ZSgpIDw8ICIgPSAiIDw8IChlbmQtc3RhcnQpLmdldFZhbHVlKCk7CisKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzhiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmgKQEAgLTAsMCArMSwxMTkgQEAKKyNpZm5kZWYgS01QX1NUQVRTX1RJTUlOR19ICisjZGVmaW5lIEtNUF9TVEFUU19USU1JTkdfSAorCisvKiogQGZpbGUga21wX3N0YXRzX3RpbWluZy5oCisgKiBBY2Nlc3MgdG8gcmVhbCB0aW1lIGNsb2NrIGFuZCB0aW1lcnMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSAia21wX29zLmgiCisjaWYgS01QX0hBVkVfWDg2SU5UUklOX0gKKyMgaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYKKworY2xhc3MgdHNjX3RpY2tfY291bnQgeworICBwcml2YXRlOgorICAgIGludDY0X3QgbXlfY291bnQ7CisKKyAgcHVibGljOgorICAgIGNsYXNzIHRzY19pbnRlcnZhbF90IHsKKyAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgZXhwbGljaXQgdHNjX2ludGVydmFsX3QoaW50NjRfdCBfdmFsdWUpIDogdmFsdWUoX3ZhbHVlKSB7fQorICAgICBwdWJsaWM6CisgICAgICAgIHRzY19pbnRlcnZhbF90KCkgOiB2YWx1ZSgwKSB7fTsgLy8gQ29uc3RydWN0IDAgdGltZSBkdXJhdGlvbgorI2lmIEtNUF9IQVZFX1RJQ0tfVElNRQorICAgICAgICBkb3VibGUgc2Vjb25kcygpIGNvbnN0OyAvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiBhIHRpbWUgaW50ZXJ2YWwgaW4gc2Vjb25kcworI2VuZGlmCisgICAgICAgIGRvdWJsZSB0aWNrcygpIGNvbnN0IHsgcmV0dXJuIGRvdWJsZSh2YWx1ZSk7IH0KKyAgICAgICAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIHRzY190aWNrX2NvdW50OworCisgICAgICAgIGZyaWVuZCB0c2NfaW50ZXJ2YWxfdCBvcGVyYXRvci0oCisgICAgICAgIGNvbnN0IHRzY190aWNrX2NvdW50IHQxLCBjb25zdCB0c2NfdGlja19jb3VudCB0MCk7CisgICAgfTsKKworI2lmIEtNUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSCisgICAgdHNjX3RpY2tfY291bnQoKSA6IG15X2NvdW50KHN0YXRpY19jYXN0PGludDY0X3Q+KF9fYnVpbHRpbl9yZWFkY3ljbGVjb3VudGVyKCkpKSB7fQorI2VsaWYgS01QX0hBVkVfX19SRFRTQworICAgIHRzY190aWNrX2NvdW50KCkgOiBteV9jb3VudChzdGF0aWNfY2FzdDxpbnQ2NF90PihfX3JkdHNjKCkpKSB7fTsKKyNlbHNlCisjIGVycm9yIE11c3QgaGF2ZSBoaWdoIHJlc29sdXRpb24gdGltZXIgZGVmaW5lZAorI2VuZGlmCisgICAgdHNjX3RpY2tfY291bnQoaW50NjRfdCB2YWx1ZSkgOiBteV9jb3VudCh2YWx1ZSkge307CisgICAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG15X2NvdW50OyB9CisgICAgdHNjX3RpY2tfY291bnQgbGF0ZXIgKHRzY190aWNrX2NvdW50IGNvbnN0IG90aGVyKSBjb25zdCB7IAorICAgICAgICByZXR1cm4gbXlfY291bnQgPiBvdGhlci5teV9jb3VudCA/ICgqdGhpcykgOiBvdGhlcjsgCisgICAgfQorICAgIHRzY190aWNrX2NvdW50IGVhcmxpZXIodHNjX3RpY2tfY291bnQgY29uc3Qgb3RoZXIpIGNvbnN0IHsgCisgICAgICAgIHJldHVybiBteV9jb3VudCA8IG90aGVyLm15X2NvdW50ID8gKCp0aGlzKSA6IG90aGVyOyAKKyAgICB9CisjaWYgS01QX0hBVkVfVElDS19USU1FCisgICAgc3RhdGljIGRvdWJsZSB0aWNrX3RpbWUoKTsgLy8gcmV0dXJucyBzZWNvbmRzIHBlciBjeWNsZSAocGVyaW9kKSBvZiBjbG9jaworI2VuZGlmCisgICAgc3RhdGljIHRzY190aWNrX2NvdW50IG5vdygpIHsgcmV0dXJuIHRzY190aWNrX2NvdW50KCk7IH0gLy8gcmV0dXJucyB0aGUgcmR0c2MgcmVnaXN0ZXIgdmFsdWUKKyAgICBmcmllbmQgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90IG9wZXJhdG9yLShjb25zdCB0c2NfdGlja19jb3VudCB0MSwgY29uc3QgdHNjX3RpY2tfY291bnQgdDApOworfTsKKworaW5saW5lIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBvcGVyYXRvci0oY29uc3QgdHNjX3RpY2tfY291bnQgdDEsIGNvbnN0IHRzY190aWNrX2NvdW50IHQwKSAKK3sKKyAgICByZXR1cm4gdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90KCB0MS5teV9jb3VudC10MC5teV9jb3VudCApOworfQorCisjaWYgS01QX0hBVkVfVElDS19USU1FCitpbmxpbmUgZG91YmxlIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdDo6c2Vjb25kcygpIGNvbnN0IAoreworICAgIHJldHVybiB2YWx1ZSp0aWNrX3RpbWUoKTsKK30KKyNlbmRpZgorCitleHRlcm4gc3RkOjpzdHJpbmcgZm9ybWF0U0koZG91YmxlIGludGVydmFsLCBpbnQgd2lkdGgsIGNoYXIgdW5pdCk7CisKK2lubGluZSBzdGQ6OnN0cmluZyBmb3JtYXRTZWNvbmRzKGRvdWJsZSBpbnRlcnZhbCwgaW50IHdpZHRoKQoreworICAgIHJldHVybiBmb3JtYXRTSShpbnRlcnZhbCwgd2lkdGgsICdTJyk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyBmb3JtYXRUaWNrcyhkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCkKK3sKKyAgICByZXR1cm4gZm9ybWF0U0koaW50ZXJ2YWwsIHdpZHRoLCAnVCcpOworfQorCitjbGFzcyB0aW1lUGFpcgoreworICAgIHRzY190aWNrX2NvdW50IEtNUF9BTElHTl9DQUNIRSBzdGFydDsKKyAgICB0c2NfdGlja19jb3VudCBlbmQ7CisKK3B1YmxpYzoKKyAgICB0aW1lUGFpcigpIDogc3RhcnQoLXN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpKSwgZW5kKC1zdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSkge30KKyAgICB0c2NfdGlja19jb3VudCBnZXRfc3RhcnQoKSBjb25zdCB7IHJldHVybiBzdGFydDsgfQorICAgIHRzY190aWNrX2NvdW50IGdldF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIGVuZDsgfQorICAgIHRzY190aWNrX2NvdW50ICogZ2V0X3N0YXJ0cCgpICAgIHsgcmV0dXJuICZzdGFydDsgfQorICAgIHRzY190aWNrX2NvdW50ICogZ2V0X2VuZHAoKSAgICAgIHsgcmV0dXJuICZlbmQ7IH0KKworICAgIHZvaWQgbWFya1N0YXJ0KCkgeyBzdGFydCA9IHRzY190aWNrX2NvdW50Ojpub3coKTsgfQorICAgIHZvaWQgbWFya0VuZCgpICAgeyBlbmQgICA9IHRzY190aWNrX2NvdW50Ojpub3coKTsgfQorICAgIHZvaWQgc2V0X3N0YXJ0KHRzY190aWNrX2NvdW50IHMpIHsgc3RhcnQgPSBzOyB9CisgICAgdm9pZCBzZXRfZW5kICAodHNjX3RpY2tfY291bnQgZSkgeyBlbmQgPSBlOyB9CisKKyAgICB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBlbmQtc3RhcnQ7IH0KKyAgICBzdGQ6OnN0cmluZyBmb3JtYXQoKSBjb25zdDsKKworfTsKKworZXh0ZXJuIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBjb21wdXRlTGFzdEluTGFzdE91dEludGVydmFsKHRpbWVQYWlyICogdGltZXMsIGludCBuVGltZXMpOworI2VuZGlmIC8vIEtNUF9TVEFUU19USU1JTkdfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjcwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmMKQEAgLTAsMCArMSw4ODMgQEAKKy8qCisgKiBrbXBfc3RyLmMgLS0gU3RyaW5nIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPiAgICAvLyB2YV8qCisjaW5jbHVkZSA8c3RkaW8uaD4gICAgIC8vIHZzbnByaW50ZigpCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIG1hbGxvYygpLCByZWFsbG9jKCkKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3RyaW5nIGJ1ZmZlci4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFVzYWdlOgorCisgICAgICAgIC8vIERlY2xhcmUgYnVmZmVyIGFuZCBpbml0aWFsaXplIGl0LgorICAgICAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisJX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgICAgIC8vIFByaW50IHRvIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJFcnJvciBpbiBmaWxlIFwiJXNcIiBsaW5lICVkXG4iLCAiZm9vLmMiLCAxMiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICA8JXM+XG4iLCBsaW5lICk7CisKKyAgICAgICAgLy8gVXNlIGJ1ZmZlciBjb250ZW50cy4gYnVmZmVyLnN0ciBpcyBhIHBvaW50ZXIgdG8gZGF0YSwgYnVmZmVyLnVzZWQgaXMgYSBudW1iZXIgb2YgcHJpbnRlZAorICAgICAgICAvLyBjaGFyYWN0ZXJzIChub3QgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8pLgorICAgICAgICB3cml0ZSggZmQsIGJ1ZmZlci5zdHIsIGJ1ZmZlci51c2VkICk7CisKKyAgICAgICAgLy8gRnJlZSBidWZmZXIuCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRldGFjaCBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gYnVmZmVyOgorICAgICAgICBfX2ttcF9zdHJfYnVmX2RldGFjaCggJiBidWZmZXIgKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5zdHI7ICAgIC8vIFRoYXQgbWVtb3J5IHNob3VsZCBiZSBmcmVlZCBldmVudHVhbGx5LgorCisKKyAgICBOb3RlczoKKworICAgICAgICAqIEJ1ZmZlciB1c2VycyBtYXkgdXNlIGJ1ZmZlci5zdHIgYW5kIGJ1ZmZlci51c2VkLiBVc2VycyBzaG91bGQgbm90IGNoYW5nZSBhbnkgZmllbGRzIG9mCisgICAgICAgICAgYnVmZmVyIGRpcmVjdGx5LgorCisgICAgICAgICogYnVmZmVyLnN0ciBpcyBuZXZlciBOVUxMLiBJZiBidWZmZXIgaXMgZW1wdHksIGJ1ZmZlci5zdHIgcG9pbnRzIHRvIGVtcHR5IHN0cmluZyAoIiIpLgorCisgICAgICAgICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGJ1ZmZlciB1c2VzIHN0YWNrIG1lbW9yeSAoYnVmZmVyLmJ1bGspIGZpcnN0LiBJZiBzdGFjayBtZW1vcnkgaXMKKyAgICAgICAgICBleGhhdXN0ZWQsIGJ1ZmZlciBhbGxvY2F0ZXMgbWVtb3J5IG9uIGhlYXAgYnkgbWFsbG9jKCksIGFuZCByZWFsbG9jYXRlcyBpdCBieSByZWFsbG9jKCkKKyAgICAgICAgICBhcyBhbW91bnQgb2YgdXNlZCBtZW1vcnkgZ3Jvd3MuCisKKyAgICAgICAgKiBCdWZmZXIgZG91YmxlcyBhbW91bnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBlYWNoIHRpbWUgaXQgaXMgZXhoYXVzdGVkLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyBUT0RPOiBfX2ttcF9zdHJfYnVmX3ByaW50KCkgY2FuIHVzZSB0aHJlYWQgbG9jYWwgbWVtb3J5IGFsbG9jYXRvci4KKworI2RlZmluZSBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zdHIgIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnNpemUgPj0gc2l6ZW9mKCAoYiktPmJ1bGsgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSAlIHNpemVvZiggKGIpLT5idWxrICkgPT0gMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHVuc2lnbmVkKShiKS0+dXNlZCA8IChiKS0+c2l6ZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnNpemUgPT0gc2l6ZW9mKCAoYiktPmJ1bGsgKSA/IChiKS0+c3RyID09ICYgKGIpLT5idWxrWyAwIF0gOiAxICk7ICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA+IHNpemVvZiggKGIpLT5idWxrICkgPyAoYiktPnN0ciAhPSAmIChiKS0+YnVsa1sgMCBdIDogMSApOyAgIFwKKyAgICB9CisKK3ZvaWQKKyBfX2ttcF9zdHJfYnVmX2NsZWFyKAorICAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIGlmICggYnVmZmVyLT51c2VkID4gMCApIHsKKyAgICAgICAgYnVmZmVyLT51c2VkID0gMDsKKyAgICAgICAgYnVmZmVyLT5zdHJbIDAgXSA9IDA7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdHJfYnVmX2NsZWFyCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9yZXNlcnZlKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsCisgICAgaW50ICAgICAgICAgICAgIHNpemUKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID49IDAgKTsKKworICAgIGlmICggYnVmZmVyLT5zaXplIDwgKHVuc2lnbmVkIGludClzaXplICkgeworCisgICAgICAgIC8vIENhbGN1bGF0ZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgZG8geworICAgICAgICAgICAgYnVmZmVyLT5zaXplICo9IDI7CisgICAgICAgIH0gd2hpbGUgKCBidWZmZXItPnNpemUgPCAodW5zaWduZWQgaW50KXNpemUgKTsKKworICAgICAgICAvLyBFbmxhcmdlIGJ1ZmZlci4KKyAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSAmIGJ1ZmZlci0+YnVsa1sgMCBdICkgeworICAgICAgICAgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBidWZmZXItPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIEtNUF9NRU1DUFlfUyggYnVmZmVyLT5zdHIsIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5idWxrLCBidWZmZXItPnVzZWQgKyAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXItPnN0ciwgYnVmZmVyLT5zaXplICk7CisgICAgICAgICAgICBpZiAoIGJ1ZmZlci0+c3RyID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisKKyAgICB9OyAvLyBpZgorCisgICAgS01QX0RFQlVHX0FTU0VSVCggYnVmZmVyLT5zaXplID4gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+PSAodW5zaWduZWQpc2l6ZSApOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl9yZXNlcnZlCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9kZXRhY2goCisgICAga21wX3N0cl9idWZfdCAqICBidWZmZXIKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKworICAgIC8vIElmIGludGVybmFsIGJ1bGsgaXMgdXNlZCwgYWxsb2NhdGUgbWVtb3J5IGFuZCBjb3B5IGl0LgorICAgIGlmICggYnVmZmVyLT5zaXplIDw9IHNpemVvZiggYnVmZmVyLT5idWxrICkgKSB7CisgICAgICAgIGJ1ZmZlci0+c3RyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggYnVmZmVyLT5zaXplICk7CisgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBLTVBfTUVNQ1BZX1MoIGJ1ZmZlci0+c3RyLCBidWZmZXItPnNpemUsIGJ1ZmZlci0+YnVsaywgYnVmZmVyLT51c2VkICsgMSApOworICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RyX2J1Zl9kZXRhY2gKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX2ZyZWUoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZmZlcgorKSB7CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKyAgICBpZiAoIGJ1ZmZlci0+c2l6ZSA+IHNpemVvZiggYnVmZmVyLT5idWxrICkgKSB7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXItPnN0ciApOworICAgIH07IC8vIGlmCisgICAgYnVmZmVyLT5zdHIgID0gYnVmZmVyLT5idWxrOworICAgIGJ1ZmZlci0+c2l6ZSA9IHNpemVvZiggYnVmZmVyLT5idWxrICk7CisgICAgYnVmZmVyLT51c2VkID0gMDsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdHJfYnVmX2ZyZWUKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX2NhdCgKKyAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLAorICAgIGNoYXIgY29uc3QgKiAgICBzdHIsCisgICAgaW50ICAgICAgICAgICAgIGxlbgorKSB7CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxlbiA+PSAwICk7CisgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCBidWZmZXIsIGJ1ZmZlci0+dXNlZCArIGxlbiArIDEgKTsKKyAgICBLTVBfTUVNQ1BZKCBidWZmZXItPnN0ciArIGJ1ZmZlci0+dXNlZCwgc3RyLCBsZW4gKTsKKyAgICBidWZmZXItPnN0clsgYnVmZmVyLT51c2VkICsgbGVuIF0gPSAwOworICAgIGJ1ZmZlci0+dXNlZCArPSBsZW47CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKK30gLy8gX19rbXBfc3RyX2J1Zl9jYXQKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ZwcmludCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlciwKKyAgICBjaGFyIGNvbnN0ICogICAgIGZvcm1hdCwKKyAgICB2YV9saXN0ICAgICAgICAgIGFyZ3MKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKworICAgIGZvciAoIDsgOyApIHsKKworICAgICAgICBpbnQgY29uc3QgZnJlZSA9IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+dXNlZDsKKyAgICAgICAgaW50ICAgICAgIHJjOworICAgICAgICBpbnQgICAgICAgc2l6ZTsKKworICAgICAgICAvLyBUcnkgdG8gZm9ybWF0IHN0cmluZy4KKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBPbiBMaW51eCogT1MgSW50ZWwoUikgNjQsIHZzbnByaW50ZigpIG1vZGlmaWVzIGFyZ3MgYXJndW1lbnQsIHNvIHZzbnByaW50ZigpIGNyYXNoZXMgaWYgaXQKKyAgICAgICAgICAgICAgICBpcyBjYWxsZWQgZm9yIHRoZSBzZWNvbmQgdGltZSB3aXRoIHRoZSBzYW1lIGFyZ3MuIFRvIHByZXZlbnQgdGhlIGNyYXNoLCB3ZSBoYXZlIHRvCisgICAgICAgICAgICAgICAgcGFzcyBhIGZyZXNoIGludGFjdCBjb3B5IG9mIGFyZ3MgdG8gdnNucHJpbnRmKCkgb24gZWFjaCBpdGVyYXRpb24uCisKKyAgICAgICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCB2YV9jb3B5KCkgbWFjcm8gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzKiBPUy4gSG93ZXZlciwgaXQKKyAgICAgICAgICAgICAgICBzZWVtcyB2c25wcmludGYoKSBkb2VzIG5vdCBtb2RpZnkgYXJncyBhcmd1bWVudCBvbiBXaW5kb3dzKiBPUy4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICNpZiAhIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgdmFfbGlzdCBfYXJnczsKKyAgICAgICAgICAgICAgICBfX3ZhX2NvcHkoIF9hcmdzLCBhcmdzICk7ICAvLyBNYWtlIGNvcHkgb2YgYXJncy4KKyAgICAgICAgICAgICAgICAjZGVmaW5lIGFyZ3MgX2FyZ3MgICAgICAgICAvLyBTdWJzdGl0dXRlIGFyZ3Mgd2l0aCBpdHMgY29weSwgX2FyZ3MuCisgICAgICAgICAgICAjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIHJjID0gS01QX1ZTTlBSSU5URiggYnVmZmVyLT5zdHIgKyBidWZmZXItPnVzZWQsIGZyZWUsIGZvcm1hdCwgYXJncyApOworICAgICAgICAgICAgI2lmICEgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAjdW5kZWYgYXJncyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vic3RpdHV0aW9uLgorICAgICAgICAgICAgICAgIHZhX2VuZCggX2FyZ3MgKTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gZXJyb3JzLCBzdHJpbmcgaGFzIGJlZW4gZm9ybWF0dGVkLgorICAgICAgICBpZiAoIHJjID49IDAgJiYgcmMgPCBmcmVlICkgeworICAgICAgICAgICAgYnVmZmVyLT51c2VkICs9IHJjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQsIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgIGlmICggcmMgPj0gMCApIHsKKyAgICAgICAgICAgIC8vIEM5OS1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9uIG9mIHZzbnByaW50ZiByZXR1cm5zIHJlcXVpcmVkIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+dXNlZCArIHJjICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9sZGVyIGltcGxlbWVudGF0aW9ucyBqdXN0IHJldHVybiAtMS4gRG91YmxlIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSAqIDI7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRW5sYXJnZSBidWZmZXIuCisgICAgICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggYnVmZmVyLCBzaXplICk7CisKKyAgICAgICAgLy8gQW5kIHRyeSBhZ2Fpbi4KKworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+IDAgKTsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCit9IC8vIF9fa21wX3N0cl9idWZfdnByaW50CisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlciwKKyAgICBjaGFyIGNvbnN0ICogICAgIGZvcm1hdCwKKyAgICAuLi4KKykgeworCisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KCBhcmdzLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggYnVmZmVyLCBmb3JtYXQsIGFyZ3MgKTsKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKworfSAvLyBfX2ttcF9zdHJfYnVmX3ByaW50CisKKworLyoKKyAgICBUaGUgZnVuY3Rpb24gcHJpbnRzIHNwZWNpZmllZCBzaXplIHRvIGJ1ZmZlci4gU2l6ZSBpcyBleHByZXNzZWQgdXNpbmcgYmlnZ2VzdCBwb3NzaWJsZSB1bml0LCBmb3IKKyAgICBleGFtcGxlIDEwMjQgaXMgcHJpbnRlZCBhcyAiMWsiLgorKi8KKwordm9pZAorX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWYsCisgICAgc2l6ZV90ICAgICAgICAgIHNpemUKKykgeworCisgICAgY2hhciBjb25zdCAqIG5hbWVzW10gPSB7ICIiLCAiayIsICJNIiwgIkciLCAiVCIsICJQIiwgIkUiLCAiWiIsICJZIiB9OworICAgIGludCBjb25zdCAgICB1bml0cyAgID0gc2l6ZW9mKCBuYW1lcyApIC8gc2l6ZW9mKCBjaGFyIGNvbnN0ICogKTsKKyAgICBpbnQgICAgICAgICAgdSAgICAgICA9IDA7CisgICAgaWYgKCBzaXplID4gMCApIHsKKyAgICAgICAgd2hpbGUgKCAoIHNpemUgJSAxMDI0ID09IDAgKSAmJiAoIHUgKyAxIDwgdW5pdHMgKSApIHsKKyAgICAgICAgICAgIHNpemUgPSBzaXplIC8gMTAyNDsKKyAgICAgICAgICAgICsrIHU7CisgICAgICAgIH07IC8vIHdoaWxlCisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZiwgIiUiIEtNUF9TSVpFX1RfU1BFQyAiJXMiLCBzaXplLCBuYW1lc1sgdSBdICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl9wcmludF9zaXplCisKKwordm9pZAorX19rbXBfc3RyX2ZuYW1lX2luaXQoCisgICAga21wX3N0cl9mbmFtZV90ICogZm5hbWUsCisgICAgY2hhciBjb25zdCAqICAgICAgcGF0aAorKSB7CisKKyAgICBmbmFtZS0+cGF0aCA9IE5VTEw7CisgICAgZm5hbWUtPmRpciAgPSBOVUxMOworICAgIGZuYW1lLT5iYXNlID0gTlVMTDsKKworICAgIGlmICggcGF0aCAhPSBOVUxMICkgeworICAgICAgICBjaGFyICogc2xhc2ggPSBOVUxMOyAgICAvLyBQb2ludGVyIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBkaXIuCisgICAgICAgIGNoYXIgKiBiYXNlICA9IE5VTEw7ICAgIC8vIFBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBiYXNlbmFtZS4KKyAgICAgICAgZm5hbWUtPnBhdGggPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBwYXRoICk7CisgICAgICAgICAgICAvLyBPcmlnaW5hbCBjb2RlIHVzZWQgc3RyZHVwKCkgZnVuY3Rpb24gdG8gY29weSBhIHN0cmluZywgYnV0IG9uIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0IGl0CisgICAgICAgICAgICAvLyBjYXVzZXMgYXNzZXJ0aW9vbiBpZCBkZWJ1ZyBoZWFwLCBzbyBJIGhhZCB0byByZXBsYWNlIHN0cmR1cCB3aXRoIF9fa21wX3N0cl9mb3JtYXQoKS4KKyAgICAgICAgaWYgKCBLTVBfT1NfV0lORE9XUyApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9yZXBsYWNlKCBmbmFtZS0+cGF0aCwgJ1xcJywgJy8nICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGZuYW1lLT5kaXIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBmbmFtZS0+cGF0aCApOworICAgICAgICBzbGFzaCA9IHN0cnJjaHIoIGZuYW1lLT5kaXIsICcvJyApOworICAgICAgICBpZiAoIEtNUF9PU19XSU5ET1dTICYmIHNsYXNoID09IE5VTEwgKSB7ICAgICAgICAgICAvLyBPbiBXaW5kb3dzKiBPUywgaWYgc2xhc2ggbm90IGZvdW5kLAorICAgICAgICAgICAgY2hhciBmaXJzdCA9IFRPTE9XRVIoIGZuYW1lLT5kaXJbIDAgXSApOyAgICAgLy8gbG9vayBmb3IgZHJpdmUuCisgICAgICAgICAgICBpZiAoICdhJyA8PSBmaXJzdCAmJiBmaXJzdCA8PSAneicgJiYgZm5hbWUtPmRpclsgMSBdID09ICc6JyApIHsKKyAgICAgICAgICAgICAgICBzbGFzaCA9ICYgZm5hbWUtPmRpclsgMSBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgYmFzZSA9ICggc2xhc2ggPT0gTlVMTCA/IGZuYW1lLT5kaXIgOiBzbGFzaCArIDEgKTsKKyAgICAgICAgZm5hbWUtPmJhc2UgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBiYXNlICk7ICAgIC8vIENvcHkgYmFzZW5hbWUKKyAgICAgICAgKiBiYXNlID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0cnVuY2F0ZSBkaXIuCisgICAgfTsgLy8gaWYKKworfSAvLyBrbXBfc3RyX2ZuYW1lX2luaXQKKworCit2b2lkCitfX2ttcF9zdHJfZm5hbWVfZnJlZSgKKyAgICBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZQorKSB7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+cGF0aCApICk7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+ZGlyICApICk7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+YmFzZSApICk7Cit9IC8vIGttcF9zdHJfZm5hbWVfZnJlZQorCisKK2ludAorX19rbXBfc3RyX2ZuYW1lX21hdGNoKAorICAgIGttcF9zdHJfZm5hbWVfdCBjb25zdCAqIGZuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgICAgICAgIHBhdHRlcm4KKykgeworCisgICAgaW50IGRpcl9tYXRjaCAgPSAxOworICAgIGludCBiYXNlX21hdGNoID0gMTsKKworICAgIGlmICggcGF0dGVybiAhPSBOVUxMICkgeworICAgICAgICBrbXBfc3RyX2ZuYW1lX3QgcHRybjsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoICYgcHRybiwgcGF0dGVybiApOworICAgICAgICBkaXJfbWF0Y2ggPQorICAgICAgICAgICAgc3RyY21wKCBwdHJuLmRpciwgIiovIiApID09IDAKKyAgICAgICAgICAgIHx8CisgICAgICAgICAgICAoIGZuYW1lLT5kaXIgIT0gTlVMTCAmJiBfX2ttcF9zdHJfZXFmKCBmbmFtZS0+ZGlyLCBwdHJuLmRpciApICk7CisgICAgICAgIGJhc2VfbWF0Y2ggPQorICAgICAgICAgICAgc3RyY21wKCBwdHJuLmJhc2UsICIqIiApID09IDAKKyAgICAgICAgICAgIHx8CisgICAgICAgICAgICAoIGZuYW1lLT5iYXNlICE9IE5VTEwgJiYgX19rbXBfc3RyX2VxZiggZm5hbWUtPmJhc2UsIHB0cm4uYmFzZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIHB0cm4gKTsKKyAgICB9OyAvLyBpZgorCisgICAgcmV0dXJuIGRpcl9tYXRjaCAmJiBiYXNlX21hdGNoOworCit9IC8vIF9fa21wX3N0cl9mbmFtZV9tYXRjaAorCisKK2ttcF9zdHJfbG9jX3QKK19fa21wX3N0cl9sb2NfaW5pdCgKKyAgICBjaGFyIGNvbnN0ICogcHNvdXJjZSwKKyAgICBpbnQgICAgICAgICAgaW5pdF9mbmFtZQorKSB7CisKKyAgICBrbXBfc3RyX2xvY190IGxvYzsKKworICAgIGxvYy5fYnVsayA9IE5VTEw7CisgICAgbG9jLmZpbGUgID0gTlVMTDsKKyAgICBsb2MuZnVuYyAgPSBOVUxMOworICAgIGxvYy5saW5lICA9IDA7CisgICAgbG9jLmNvbCAgID0gMDsKKworICAgIGlmICggcHNvdXJjZSAhPSBOVUxMICkgeworCisgICAgICAgIGNoYXIgKiBzdHIgICA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBkdW1teSA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBsaW5lICA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBjb2wgICA9IE5VTEw7CisKKyAgICAgICAgLy8gQ29weSBwc291cmNlIHRvIGtlZXAgaXQgaW50YWN0LgorICAgICAgICBsb2MuX2J1bGsgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBwc291cmNlICk7CisKKyAgICAgICAgLy8gUGFyc2UgcHNvdXJjZSBzdHJpbmc6ICI7ZmlsZTtmdW5jO2xpbmU7Y29sOzsiCisgICAgICAgIHN0ciA9IGxvYy5fYnVsazsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBkdW1teSwgICAgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsb2MuZmlsZSwgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsb2MuZnVuYywgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsaW5lLCAgICAgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBjb2wsICAgICAgJiBzdHIgKTsKKworICAgICAgICAvLyBDb252ZXJ0IGxpbmUgYW5kIGNvbCBpbnRvIG51bWJlcmljIHZhbHVlcy4KKyAgICAgICAgaWYgKCBsaW5lICE9IE5VTEwgKSB7CisgICAgICAgICAgICBsb2MubGluZSA9IGF0b2koIGxpbmUgKTsKKyAgICAgICAgICAgIGlmICggbG9jLmxpbmUgPCAwICkgeworICAgICAgICAgICAgICAgIGxvYy5saW5lID0gMDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggY29sICE9IE5VTEwgKSB7CisgICAgICAgICAgICBsb2MuY29sID0gYXRvaSggY29sICk7CisgICAgICAgICAgICBpZiAoIGxvYy5jb2wgPCAwICkgeworICAgICAgICAgICAgICAgIGxvYy5jb2wgPSAwOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9zdHJfZm5hbWVfaW5pdCggJiBsb2MuZm5hbWUsIGluaXRfZm5hbWUgPyBsb2MuZmlsZSA6IE5VTEwgKTsKKworICAgIHJldHVybiBsb2M7CisKK30gLy8ga21wX3N0cl9sb2NfaW5pdAorCisKK3ZvaWQKK19fa21wX3N0cl9sb2NfZnJlZSgKKyAgICBrbXBfc3RyX2xvY190ICogbG9jCispIHsKKyAgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBsb2MtPmZuYW1lICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGxvYy0+X2J1bGsgKTsKKyAgICBsb2MtPl9idWxrID0gTlVMTDsKKyAgICBsb2MtPmZpbGUgID0gTlVMTDsKKyAgICBsb2MtPmZ1bmMgID0gTlVMTDsKK30gLy8ga21wX3N0cl9sb2NfZnJlZQorCisKKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGNvbXBhcmUgZmlsZSBuYW1lcy4gT24gV2luZG93cyogT1MgZmlsZSBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwKKyAgICBzbyBmdW5jdGlvbnMgcGVyZm9ybXMgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLiBPbiBMaW51eCogT1MgaXQgcGVyZm9ybXMgY2FzZS1zZW5zaXRpdmUKKyAgICBjb21wYXJpc29uLgorICAgIE5vdGU6IFRoZSBmdW5jdGlvbiByZXR1cm5zICp0cnVlKiBpZiBzdHJpbmdzIGFyZSAqZXF1YWwqLgorKi8KKworaW50CitfX2ttcF9zdHJfZXFmKCAgICAgICAgIC8vIFRydWUsIGlmIHN0cmluZ3MgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgY2hhciBjb25zdCAqIGxocywgIC8vIEZpcnN0IHN0cmluZy4KKyAgICBjaGFyIGNvbnN0ICogcmhzICAgLy8gU2Vjb25kIHN0cmluZy4KKykgeworICAgIGludCByZXN1bHQ7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIHJlc3VsdCA9ICggX3N0cmljbXAoIGxocywgcmhzICkgPT0gMCApOworICAgICNlbHNlCisgICAgICAgIHJlc3VsdCA9ICggc3RyY21wKCBsaHMsIHJocyApID09IDAgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfZXFmCisKKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGxpa2Ugc3ByaW50ZiwgYnV0IGl0ICphbGxvY2F0ZXMqIG5ldyBidWZmZXIsIHdoaWNoIG11c3QgYmUgZnJlZWQgZXZlbnR1YWxseSBieQorICAgIF9fa21wX3N0cl9mcmVlKCkuIFRoZSBmdW5jdGlvbiBpcyB2ZXJ5IGNvbnZlbmllbnQgZm9yIGNvbnN0cnVjdGluZyBzdHJpbmdzLCBpdCBzdWNjZXNzZnVsbHkKKyAgICByZXBsYWNlcyBzdHJkdXAoKSwgc3RyY2F0KCksIGl0IGZyZWVzIHByb2dyYW1tZXIgZnJvbSBidWZmZXIgYWxsb2NhdGlvbnMgYW5kIGhlbHBzIHRvIGF2b2lkCisgICAgYnVmZmVyIG92ZXJmbG93cy4gRXhhbXBsZXM6CisKKyAgICAgICAgc3RyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgb3JpZyApOyAgICAgICAgICAgICAgLy8gc3RyZHVwKCksIGRvIG5vdCBjYXJlIGFib3V0IGJ1ZmZlciBzaXplLgorICAgICAgICBfX2ttcF9zdHJfZnJlZSggJiBzdHIgKTsKKyAgICAgICAgc3RyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzJXMiLCBvcmlnMSwgb3JpZzIgKTsgICAgLy8gc3RyY2F0KCksIGRvIG5vdCBjYXJlIGFib3V0IGJ1ZmZlciBzaXplLgorICAgICAgICBfX2ttcF9zdHJfZnJlZSggJiBzdHIgKTsKKyAgICAgICAgc3RyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzLyVzLnR4dCIsIHBhdGgsIGZpbGUgKTsgLy8gY29uc3RydWN0aW5nIHN0cmluZy4KKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICYgc3RyICk7CisKKyAgICBQZXJmb3JtYW5jZSBub3RlOgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgd2l0aCBtYWxsb2MoKSBjYWxscywgc28gZG8gbm90IGNhbGwgaXQgZnJvbQorICAgICAgICBwZXJmb3JtYW5jZS1jcml0aWNhbCBjb2RlLiBJbiBwZXJmb3JtYW5jZS1jcml0aWNhbCBjb2RlIGNvbnNpZGVyIHVzaW5nIGttcF9zdHJfYnVmX3QKKyAgICAgICAgaW5zdGVhZCwgc2luY2UgaXQgdXNlcyBzdGFjay1hbGxvY2F0ZWQgYnVmZmVyIGZvciBzaG9ydCBzdHJpbmdzLgorCisgICAgV2h5IGRvZXMgdGhpcyBmdW5jdGlvbiB1c2UgbWFsbG9jKCk/CisgICAgICAgIDEuIF9fa21wX2FsbG9jYXRlKCkgcmV0dXJucyBjYWNoZS1hbGlnbmVkIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4gVGhlcmUgYXJlIG5vCisgICAgICAgICAgIHJlYXNvbnMgaW4gdXNpbmcgX19rbXBfYWxsb2NhdGUoKSBmb3Igc3RyaW5ncyBkdWUgdG8gZXh0cmEgb3ZlcmhlYWQgd2hpbGUgY2FjaGUtYWxpZ25lZAorICAgICAgICAgICBtZW1vcnkgaXMgbm90IG5lY2Vzc2FyeS4KKyAgICAgICAgMi4gX19rbXBfdGhyZWFkX21hbGxvYygpIGNhbm5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgcmVxdWlyZXMgcG9pbnRlciB0byB0aHJlYWQgc3RydWN0dXJlLgorICAgICAgICAgICBXZSBuZWVkIHRvIHBlcmZvcm0gc3RyaW5nIG9wZXJhdGlvbnMgZHVyaW5nIGxpYnJhcnkgc3RhcnR1cCAoZm9yIGV4YW1wbGUsIGluCisgICAgICAgICAgIF9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cCgpKSB3aGVuIG5vIHRocmVhZCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgeWV0LgorICAgIFNvIHN0YW5kYXJkIG1hbGxvYygpIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSBvcHRpb24uCisqLworCisvLyBUT0RPOiBGaW5kIGFuZCByZXBsYWNlIGFsbCByZWd1bGFyIGZyZWUoKSB3aXRoIF9fa21wX3N0cl9mcmVlKCkuCisKK2NoYXIgKgorX19rbXBfc3RyX2Zvcm1hdCggICAgICAgICAgIC8vIEFsbG9jYXRlZCBzdHJpbmcuCisgICAgY2hhciBjb25zdCAqIGZvcm1hdCwgICAgLy8gRm9ybWF0IHN0cmluZy4KKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBwYXJhbWV0ZXJzLgorKSB7CisKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50ICAgICBzaXplICAgPSA1MTI7CisgICAgY2hhciAqICBidWZmZXIgPSBOVUxMOworICAgIGludCAgICAgcmM7CisKKyAgICAvLyBBbGxvY2F0ZSBidWZmZXIuCisgICAgYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZSApOworICAgIGlmICggYnVmZmVyID09IE5VTEwgKSB7CisJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgIH07IC8vIGlmCisKKyAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZvcm1hdCBzdHJpbmcuCisgICAgICAgIHZhX3N0YXJ0KCBhcmdzLCBmb3JtYXQgKTsKKyAgICAgICAgcmMgPSBLTVBfVlNOUFJJTlRGKCBidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyApOworICAgICAgICB2YV9lbmQoIGFyZ3MgKTsKKworICAgICAgICAvLyBObyBlcnJvcnMsIHN0cmluZyBoYXMgYmVlbiBmb3JtYXR0ZWQuCisgICAgICAgIGlmICggcmMgPj0gMCAmJiByYyA8IHNpemUgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgICAgaWYgKCByYyA+PSAwICkgeworICAgICAgICAgICAgLy8gQzk5LWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gb2YgdnNucHJpbnRmIHJldHVybnMgcmVxdWlyZWQgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gcmMgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgcmV0dXJuIC0xLgorICAgICAgICAgICAgc2l6ZSA9IHNpemUgKiAyOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIEVubGFyZ2UgYnVmZmVyIGFuZCB0cnkgYWdhaW4uCisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXIsIHNpemUgKTsKKyAgICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKyAgICAJICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIHJldHVybiBidWZmZXI7CisKK30gLy8gZnVuYyBfX2ttcF9zdHJfZm9ybWF0CisKKwordm9pZAorX19rbXBfc3RyX2ZyZWUoCisgICAgY2hhciBjb25zdCAqICogc3RyCispIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIHN0ciApOworICAgICogc3RyID0gTlVMTDsKK30gLy8gZnVuYyBfX2ttcF9zdHJfZnJlZQorCisKKy8qIElmIGxlbiBpcyB6ZXJvLCByZXR1cm5zIHRydWUgaWZmIHRhcmdldCBhbmQgZGF0YSBoYXZlIGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2guCisgICBJZiBsZW4gaXMgbmVnYXRpdmUsIHJldHVybnMgdHJ1ZSBpZmYgdGFyZ2V0IGlzIGEgY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgb2YgZGF0YS4KKyAgIElmIGxlbiBpcyBwb3NpdGl2ZSwgcmV0dXJucyB0cnVlIGlmZiB0YXJnZXQgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvZiBkYXRhIG9yCisgICAgIHZpY2UgdmVyc2EsIGFuZCBuZWl0aGVyIGlzIHNob3J0ZXIgdGhhbiBsZW4uCisqLworaW50CitfX2ttcF9zdHJfbWF0Y2goCisgICAgY2hhciBjb25zdCAqIHRhcmdldCwKKyAgICBpbnQgICAgICAgICAgbGVuLAorICAgIGNoYXIgY29uc3QgKiBkYXRhCispIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoIHRhcmdldCA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH07IC8vIGlmCisgICAgZm9yICggaSA9IDA7IHRhcmdldFtpXSAmJiBkYXRhW2ldOyArKyBpICkgeworICAgICAgICBpZiAoIFRPTE9XRVIoIHRhcmdldFtpXSApICE9IFRPTE9XRVIoIGRhdGFbaV0gKSApIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IgaQorICAgIHJldHVybiAoICggbGVuID4gMCApID8gaSA+PSBsZW4gOiAoICEgdGFyZ2V0W2ldICYmICggbGVuIHx8ICEgZGF0YVtpXSApICkgKTsKK30gLy8gX19rbXBfc3RyX21hdGNoCisKKworaW50CitfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGNoYXIgY29uc3QgKiBkYXRhICkgeworICAgIGludCByZXN1bHQgPQorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJmYWxzZSIsICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIm9mZiIsICAgICAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiMCIsICAgICAgIDEsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIuZmFsc2UuIiwgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi5mLiIsICAgICAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAibm8iLCAgICAgIDEsIGRhdGEgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UKKworCitpbnQKK19fa21wX3N0cl9tYXRjaF90cnVlKCBjaGFyIGNvbnN0ICogZGF0YSApIHsKKyAgICBpbnQgcmVzdWx0ID0KKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAidHJ1ZSIsICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIm9uIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIxIiwgICAgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLnRydWUuIiwgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi50LiIsICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJ5ZXMiLCAgICAxLCBkYXRhICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gX19rbXBfc3RyX21hdGNoX3RydWUKKwordm9pZAorX19rbXBfc3RyX3JlcGxhY2UoCisgICAgY2hhciAqIHN0ciwKKyAgICBjaGFyICAgc2VhcmNoX2ZvciwKKyAgICBjaGFyICAgcmVwbGFjZV93aXRoCispIHsKKworICAgIGNoYXIgKiBmb3VuZCA9IE5VTEw7CisKKyAgICBmb3VuZCA9IHN0cmNociggc3RyLCBzZWFyY2hfZm9yICk7CisgICAgd2hpbGUgKCBmb3VuZCApIHsKKyAgICAgICAgKiBmb3VuZCA9IHJlcGxhY2Vfd2l0aDsKKyAgICAgICAgZm91bmQgPSBzdHJjaHIoIGZvdW5kICsgMSwgc2VhcmNoX2ZvciApOworICAgIH07IC8vIHdoaWxlCisKK30gLy8gX19rbXBfc3RyX3JlcGxhY2UKKworCit2b2lkCitfX2ttcF9zdHJfc3BsaXQoCisgICAgY2hhciAqICBzdHIsICAgIC8vIEk6IFN0cmluZyB0byBzcGxpdC4KKyAgICBjaGFyICAgIGRlbGltLCAgLy8gSTogQ2hhcmFjdGVyIHRvIHNwbGl0IG9uLgorICAgIGNoYXIgKiogaGVhZCwgICAvLyBPOiBQb2ludGVyIHRvIGhlYWQgKG1heSBiZSBOVUxMKS4KKyAgICBjaGFyICoqIHRhaWwgICAgLy8gTzogUG9pbnRlciB0byB0YWlsIChtYXkgYmUgTlVMTCkuCispIHsKKyAgICBjaGFyICogaCA9IHN0cjsKKyAgICBjaGFyICogdCA9IE5VTEw7CisgICAgaWYgKCBzdHIgIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHB0ciA9IHN0cmNociggc3RyLCBkZWxpbSApOworICAgICAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgKiBwdHIgID0gMDsKKyAgICAgICAgICAgIHQgPSBwdHIgKyAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBoZWFkICE9IE5VTEwgKSB7CisgICAgICAgICogaGVhZCA9IGg7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHRhaWwgIT0gTlVMTCApIHsKKyAgICAgICAgKiB0YWlsID0gdDsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdHJfc3BsaXQKKworLyoKKyAgICBzdHJ0b2tfcigpIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyogT1MuIFRoaXMgZnVuY3Rpb24gcmVpbXBsZW1lbnRzIHN0cnRva19yKCkuCisqLworY2hhciAqCitfX2ttcF9zdHJfdG9rZW4oCisgICAgY2hhciAqICAgICAgIHN0ciwgICAvLyBTdHJpbmcgdG8gc3BsaXQgaW50byB0b2tlbnMuIE5vdGU6IFN0cmluZyAqaXMqIG1vZGlmaWVkIQorICAgIGNoYXIgY29uc3QgKiBkZWxpbSwgLy8gRGVsaW1pdGVycy4KKyAgICBjaGFyICoqICAgICAgYnVmICAgIC8vIEludGVybmFsIGJ1ZmZlci4KKykgeworICAgIGNoYXIgKiB0b2tlbiA9IE5VTEw7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8vIE9uIFdpbmRvd3MqIE9TIHRoZXJlIGlzIG5vIHN0cnRva19yKCkgZnVuY3Rpb24uIExldCB1cyBpbXBsZW1lbnQgaXQuCisgICAgICAgIGlmICggc3RyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAqIGJ1ZiA9IHN0cjsgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNhbGwsIGluaXRpYWxpemUgYnVmLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqIGJ1ZiArPSBzdHJzcG4oICogYnVmLCBkZWxpbSApOyAgICAgICAvLyBTa2lwIGxlYWRpbmcgZGVsaW1pdGVycy4KKyAgICAgICAgaWYgKCAqKiBidWYgIT0gMCApIHsgICAgICAgICAgICAgICAgICAgLy8gUmVzdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCB5ZXQgZW1wdHkuCisgICAgICAgICAgICB0b2tlbiA9ICogYnVmOyAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBpdCBhcyByZXN1bHQuCisgICAgICAgICAgICAqIGJ1ZiArPSBzdHJjc3BuKCAqIGJ1ZiwgZGVsaW0gKTsgIC8vIFNraXAgbm9uLWRlbGltaXRlcnMuCisgICAgICAgICAgICBpZiAoICoqIGJ1ZiAhPSAwICkgeyAgICAgICAgICAgICAgIC8vIFJlc3Qgb2YgdGhlIHN0cmluZyBpcyBub3QgeWV0IGVtcHR5LgorICAgICAgICAgICAgICAgICoqIGJ1ZiA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgdG9rZW4gaGVyZS4KKyAgICAgICAgICAgICAgICAqIGJ1ZiArPSAxOyAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBidWYgdG8gc3RhcnQgd2l0aCB0aGUgbmV4dCB0b2tlbiBuZXh0IHRpbWUuCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHN0cnRva19yKCkgaXMgYXZhaWxhYmxlLiBMZXQgdXMgdXNlIGl0LgorICAgICAgICB0b2tlbiA9IHN0cnRva19yKCBzdHIsIGRlbGltLCBidWYgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gdG9rZW47Cit9OyAvLyBfX2ttcF9zdHJfdG9rZW4KKworCitpbnQKK19fa21wX3N0cl90b19pbnQoCisgICAgY2hhciBjb25zdCAqIHN0ciwKKyAgICBjaGFyICAgICAgICAgc2VudGluZWwKKykgeworICAgIGludCByZXN1bHQsIGZhY3RvcjsKKyAgICBjaGFyIGNvbnN0ICogdDsKKworICAgIHJlc3VsdCA9IDA7CisKKyAgICBmb3IgKHQgPSBzdHI7ICp0ICE9ICdcMCc7ICsrdCkgeworICAgICAgICBpZiAoKnQgPCAnMCcgfHwgKnQgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIDEwKSArICgqdCAtICcwJyk7CisgICAgfQorCisgICAgc3dpdGNoICgqdCkgeworICAgIGNhc2UgJ1wwJzogICAgICAgICAgLyogdGhlIGN1cnJlbnQgZGVmYXVsdCBmb3Igbm8gc3VmZml4IGlzIGJ5dGVzICovCisJZmFjdG9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6IGNhc2UgJ0InOiAvKiBieXRlcyAqLworCSsrdDsKKwlmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdrJzogY2FzZSAnSyc6IC8qIGtpbG8tYnl0ZXMgKi8KKwkrK3Q7CisJZmFjdG9yID0gMTAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOiAvKiBtZWdhLWJ5dGVzICovCisJKyt0OworCWZhY3RvciA9ICgxMDI0ICogMTAyNCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisJaWYoKnQgIT0gc2VudGluZWwpCisJICAgIHJldHVybiAoLTEpOworCXQgPSAiIjsKKwlmYWN0b3IgPSAxOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPiAoSU5UX01BWCAvIGZhY3RvcikpCisJcmVzdWx0ID0gSU5UX01BWDsKKyAgICBlbHNlCisJcmVzdWx0ICo9IGZhY3RvcjsKKworICAgIHJldHVybiAoKnQgIT0gMCA/IDAgOiByZXN1bHQpOworCit9IC8vIF9fa21wX3N0cl90b19pbnQKKworCisvKgorICAgIFRoZSByb3V0aW5lIHBhcnNlcyBpbnB1dCBzdHJpbmcuIEl0IGlzIGV4cGVjdGVkIGl0IGlzIGEgdW5zaWduZWQgaW50ZWdlciB3aXRoIG9wdGlvbmFsIHVuaXQuCisgICAgVW5pdHMgYXJlOiAiYiIgZm9yIGJ5dGVzLCAia2IiIG9yIGp1c3QgImsiIGZvciBraWxvYnl0ZXMsICJtYiIgb3IgIm0iIGZvciBtZWdhYnl0ZXMsIC4uLiwgInliIgorICAgIG9yICJ5IiBmb3IgeW90dGFieXRlcy4gOi0pIFVuaXQgbmFtZSBpcyBjYXNlLWluc2Vuc2l0aXZlLiBUaGUgcm91dGluZSByZXR1cm5zIDAgaWYgZXZlcnl0aGluZyBpcworICAgIG9rLCBvciBlcnJvciBjb2RlOiAtMSBpbiBjYXNlIG9mIG92ZXJmbG93LCAtMiBpbiBjYXNlIG9mIHVua25vd24gdW5pdC4gKnNpemUgaXMgc2V0IHRvIHBhcnNlZAorICAgIHZhbHVlLiBJbiBjYXNlIG9mIG92ZXJmbG93ICpzaXplIGlzIHNldCB0byBLTVBfU0laRV9UX01BWCwgaW4gY2FzZSBvZiB1bmtub3duIHVuaXQgKnNpemUgaXMgc2V0CisgICAgdG8gemVyby4KKyovCit2b2lkCitfX2ttcF9zdHJfdG9fc2l6ZSggICAgICAgICAvLyBSOiBFcnJvciBjb2RlLgorICAgIGNoYXIgY29uc3QgKiAgIHN0ciwgICAgLy8gSTogU3RyaW5nIG9mIGNoYXJhY3RlcnMsIHVuc2lnbmVkIG51bWJlciBhbmQgdW5pdCAoImIiLCAia2IiLCBldGMpLgorICAgIHNpemVfdCAqICAgICAgIG91dCwgICAgLy8gTzogUGFyc2VkIG51bWJlci4KKyAgICBzaXplX3QgICAgICAgICBkZmFjdG9yLCAvLyBJOiBUaGUgZmFjdG9yIGlmIG5vbmUgb2YgdGhlIGxldHRlcnMgc3BlY2lmaWVkLgorICAgIGNoYXIgY29uc3QgKiAqIGVycm9yICAgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKykgeworCisgICAgc2l6ZV90IHZhbHVlICAgID0gMDsKKyAgICBzaXplX3QgZmFjdG9yICAgPSAwOworICAgIGludCAgICBvdmVyZmxvdyA9IDA7CisgICAgaW50ICAgIGkgICAgICAgID0gMDsKKyAgICBpbnQgICAgZGlnaXQ7CisKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisKKyAgICAvLyBTa2lwIHNwYWNlcy4KKyAgICB3aGlsZSAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIFBhcnNlIG51bWJlci4KKyAgICBpZiAoIHN0clsgaSBdIDwgJzAnIHx8IHN0clsgaSBdID4gJzknICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBOb3RBTnVtYmVyICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGRvIHsKKyAgICAgICAgZGlnaXQgPSBzdHJbIGkgXSAtICcwJzsKKyAgICAgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAoIHZhbHVlID4gKCBLTVBfU0laRV9UX01BWCAtIGRpZ2l0ICkgLyAxMCApOworICAgICAgICB2YWx1ZSA9ICggdmFsdWUgKiAxMCApICsgZGlnaXQ7CisgICAgICAgICsrIGk7CisgICAgfSB3aGlsZSAoIHN0clsgaSBdID49ICcwJyAmJiBzdHJbIGkgXSA8PSAnOScgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIFBhcnNlIHVuaXQuCisgICAgI2RlZmluZSBfY2FzZSggY2gsIGV4cCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBjaCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIGNoIC0gKCAnYScgLSAnQScgKSA6IHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3Qgc2hpZnQgPSAoZXhwKSAqIDEwOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBzaGlmdCA8IHNpemVvZiggc2l6ZV90ICkgKiA4ICkgeyAgICAgICBcCisgICAgICAgICAgICAgICAgZmFjdG9yID0gKHNpemVfdCkoIDEgKSA8PCBzaGlmdDsgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBicmVhazsKKyAgICBzd2l0Y2ggKCBzdHJbIGkgXSApIHsKKyAgICAgICAgX2Nhc2UoICdrJywgMSApOyAvLyBLaWxvCisgICAgICAgIF9jYXNlKCAnbScsIDIgKTsgLy8gTWVnYQorICAgICAgICBfY2FzZSggJ2cnLCAzICk7IC8vIEdpZ2EKKyAgICAgICAgX2Nhc2UoICd0JywgNCApOyAvLyBUZXJhCisgICAgICAgIF9jYXNlKCAncCcsIDUgKTsgLy8gUGV0YQorICAgICAgICBfY2FzZSggJ2UnLCA2ICk7IC8vIEV4YQorICAgICAgICBfY2FzZSggJ3onLCA3ICk7IC8vIFpldHRhCisgICAgICAgIF9jYXNlKCAneScsIDggKTsgLy8gWW90dGEKKyAgICAgICAgLy8gT29wcy4gTm8gbW9yZSB1bml0cy4uLgorICAgIH07IC8vIHN3aXRjaAorICAgICN1bmRlZiBfY2FzZQorICAgIGlmICggc3RyWyBpIF0gPT0gJ2InIHx8IHN0clsgaSBdID09ICdCJyApIHsgICAgLy8gU2tpcCBvcHRpb25hbCAiYiIuCisJaWYgKCBmYWN0b3IgPT0gMCApIHsKKwkgICAgZmFjdG9yID0gMTsKKwl9CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoICEgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyB8fCBzdHJbIGkgXSA9PSAwICkgKSB7IC8vIEJhZCB1bml0CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIEJhZFVuaXQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIGZhY3RvciA9PSAwICkgeworCWZhY3RvciA9IGRmYWN0b3I7CisgICAgfQorCisgICAgLy8gQXBwbHkgZmFjdG9yLgorICAgIG92ZXJmbG93ID0gb3ZlcmZsb3cgfHwgKCB2YWx1ZSA+ICggS01QX1NJWkVfVF9NQVggLyBmYWN0b3IgKSApOworICAgIHZhbHVlICo9IGZhY3RvcjsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIGlmICggc3RyWyBpIF0gIT0gMCApIHsKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggSWxsZWdhbENoYXJhY3RlcnMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIG92ZXJmbG93ICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICogb3V0ID0gS01QX1NJWkVfVF9NQVg7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgKiBlcnJvciA9IE5VTEw7CisgICAgKiBvdXQgPSB2YWx1ZTsKKworfSAvLyBfX2ttcF9zdHJfdG9fc2l6ZQorCisKK3ZvaWQKK19fa21wX3N0cl90b191aW50KCAgICAgICAgIC8vIFI6IEVycm9yIGNvZGUuCisgICAgY2hhciBjb25zdCAqICAgc3RyLCAgICAvLyBJOiBTdHJpbmcgb2YgY2hhcmFjdGVycywgdW5zaWduZWQgbnVtYmVyLgorICAgIGttcF91aW50NjQgKiAgIG91dCwgICAgLy8gTzogUGFyc2VkIG51bWJlci4KKyAgICBjaGFyIGNvbnN0ICogKiBlcnJvciAgIC8vIE86IE51bGwgaWYgZXZlcnl0aGluZyBpcyBvaywgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCispIHsKKworICAgIHNpemVfdCB2YWx1ZSAgICA9IDA7CisgICAgaW50ICAgIG92ZXJmbG93ID0gMDsKKyAgICBpbnQgICAgaSAgICAgICAgPSAwOworICAgIGludCAgICBkaWdpdDsKKworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyICE9IE5VTEwgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIFBhcnNlIG51bWJlci4KKyAgICBpZiAoIHN0clsgaSBdIDwgJzAnIHx8IHN0clsgaSBdID4gJzknICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBOb3RBTnVtYmVyICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGRvIHsKKyAgICAgICAgZGlnaXQgPSBzdHJbIGkgXSAtICcwJzsKKyAgICAgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAoIHZhbHVlID4gKCBLTVBfU0laRV9UX01BWCAtIGRpZ2l0ICkgLyAxMCApOworICAgICAgICB2YWx1ZSA9ICggdmFsdWUgKiAxMCApICsgZGlnaXQ7CisgICAgICAgICsrIGk7CisgICAgfSB3aGlsZSAoIHN0clsgaSBdID49ICcwJyAmJiBzdHJbIGkgXSA8PSAnOScgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIGlmICggc3RyWyBpIF0gIT0gMCApIHsKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggSWxsZWdhbENoYXJhY3RlcnMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIG92ZXJmbG93ICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICogb3V0ID0gKGttcF91aW50NjQpIC0xOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgICogZXJyb3IgPSBOVUxMOworICAgICogb3V0ID0gdmFsdWU7CisKK30gLy8gX19rbXBfc3RyX3RvX3VuaXQKKworCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3MWJiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIGttcF9zdHIuaCAtLSBTdHJpbmcgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TVFJfSAorI2RlZmluZSBLTVBfU1RSX0gKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAia21wX29zLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBkZWZpbmUgc3RyZHVwICAgIF9zdHJkdXAKKyNlbmRpZgorCisvKiAgc29tZSBtYWNyb3MgdG8gcmVwbGFjZSBjdHlwZS5oIGZ1bmN0aW9ucyAgKi8KKyNkZWZpbmUgVE9MT1dFUihjKQkoKCgoYykgPj0gJ0EnKSAmJiAoKGMpIDw9ICdaJykpID8gKChjKSArICdhJyAtICdBJykgOiAoYykpCisKK3N0cnVjdCBrbXBfc3RyX2J1ZiB7CisgICAgY2hhciAgICAgICAqIHN0cjsgICAgICAgICAvLyBQb2ludGVyIHRvIGJ1ZmZlciBjb250ZW50LCByZWFkIG9ubHkuCisgICAgdW5zaWduZWQgaW50IHNpemU7ICAgICAgICAvLyBEbyBub3QgY2hhbmdlIHRoaXMgZmllbGQhCisgICAgaW50ICAgICAgICAgIHVzZWQ7ICAgICAgICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkIHRvIGJ1ZmZlciwgcmVhZCBvbmx5LgorICAgIGNoYXIgICAgICAgICBidWxrWyA1MTIgXTsgLy8gRG8gbm90IHVzZSB0aGlzIGZpZWxkIQorfTsgLy8gc3RydWN0IGttcF9zdHJfYnVmCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2J1ZiAga21wX3N0cl9idWZfdDsKKworI2RlZmluZSBfX2ttcF9zdHJfYnVmX2luaXQoIGIgKSAgIHsgKGIpLT5zdHIgPSAoYiktPmJ1bGs7IChiKS0+c2l6ZSA9IHNpemVvZiggKGIpLT5idWxrICk7IChiKS0+dXNlZCA9IDA7IChiKS0+YnVsa1sgMCBdID0gMDsgfQorCit2b2lkICAgX19rbXBfc3RyX2J1Zl9jbGVhcigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgaW50IHNpemUgKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX2RldGFjaCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfZnJlZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfY2F0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogc3RyLCBpbnQgbGVuICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl92cHJpbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBmb3JtYXQsIHZhX2xpc3QgYXJncyApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgc2l6ZV90IHNpemUgKTsKKworLyoKKyAgICBGaWxlIG5hbWUgcGFyc2VyLiBVc2FnZToKKworICAgICAgICBrbXBfc3RyX2ZuYW1lX3QgZm5hbWUgPSBfX2ttcF9zdHJfZm5hbWVfaW5pdCggcGF0aCApOworICAgICAgICAvLyBVc2UgZm5hbWUucGF0aCAoY29weSBvZiBvcmlnaW5hbCBwYXRoICksIGZuYW1lLmRpciwgZm5hbWUuYmFzZS4KKyAgICAgICAgLy8gTm90ZSBmbmFtZS5kaXIgY29uY2F0ZW5hdGVkIHdpdGggZm5hbWUuYmFzZSBnaXZlcyBleGFjdCBjb3B5IG9mIHBhdGguCisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIGZuYW1lICk7CisKKyovCitzdHJ1Y3Qga21wX3N0cl9mbmFtZSB7CisgICAgY2hhciAqIHBhdGg7CisgICAgY2hhciAqIGRpcjsKKyAgICBjaGFyICogYmFzZTsKK307IC8vIHN0cnVjdCBrbXBfc3RyX2ZuYW1lCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2ZuYW1lIGttcF9zdHJfZm5hbWVfdDsKK3ZvaWQgX19rbXBfc3RyX2ZuYW1lX2luaXQoIGttcF9zdHJfZm5hbWVfdCAqIGZuYW1lLCBjaGFyIGNvbnN0ICogcGF0aCApOwordm9pZCBfX2ttcF9zdHJfZm5hbWVfZnJlZSgga21wX3N0cl9mbmFtZV90ICogZm5hbWUgKTsKKy8vIENvbXBhcmVzIGZpbGUgbmFtZSB3aXRoIHNwZWNpZmllZCBwYXRlcm4uIElmIHBhdHRlcm4gaXMgTlVMTCwgYW55IGZuYW1lIG1hdGNoZWQuCitpbnQgX19rbXBfc3RyX2ZuYW1lX21hdGNoKCBrbXBfc3RyX2ZuYW1lX3QgY29uc3QgKiBmbmFtZSwgY2hhciBjb25zdCAqIHBhdHRlcm4gKTsKKworLyoKKyAgICBUaGUgY29tcGlsZXIgcHJvdmlkZXMgc291cmNlIGxvY2F0aW9ucyBpbiBzdHJpbmcgZm9ybSAiO2ZpbGU7ZnVuYztsaW5lO2NvbDs7Ii4gSXQgbm90IG5vdAorICAgIGNvbnZlbmllbnQgZm9yIG1hbnVwdWxhdGlvbi4gVGhlc2Ugc3RydWN0dXJlIGtlZXBzIHNvdXJjZSBsb2NhdGlvbiBpbiBtb3JlIGNvbnZlbmllbnQgZm9ybS4KKyAgICBVc2FnZToKKworICAgICAgICBrbXBfc3RyX2xvY190IGxvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggaWRlbnQtPnBzb3VyY2UsIDAgKTsKKyAgICAgICAgLy8gdXNlIGxvYy5maWxlLCBsb2MuZnVuYywgbG9jLmxpbmUsIGxvYy5jb2wuCisgICAgICAgIC8vIGxvYy5mbmFtZSBpcyBhdmFpbGFibGUgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBvZiBfX2ttcF9zdHJfbG9jX2luaXQgaXMgdHJ1ZS4KKyAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmIGxvYyApOworCisgICAgSWYgcHNvdXJjZSBpcyBOVUxMIG9yIGRvZXMgbm90IGZvbGxvdyBmb3JtYXQgYWJvdmUsIGZpbGUgYW5kL29yIGZ1bmMgbWF5IGJlIE5VTEwgcG9pbnRlcnMuCisqLworc3RydWN0IGttcF9zdHJfbG9jIHsKKyAgICBjaGFyICogICAgICAgICAgX2J1bGs7ICAvLyBEbyBub3QgdXNlIHRoaWQgZmllbGQuCisgICAga21wX3N0cl9mbmFtZV90IGZuYW1lOyAgLy8gV2lsbCBiZSBpbml0aWFsaXplZCBpZiBpbml0X2ZuYW1lIGlzIHRydWUuCisgICAgY2hhciAqICAgICAgICAgIGZpbGU7CisgICAgY2hhciAqICAgICAgICAgIGZ1bmM7CisgICAgaW50ICAgICAgICAgICAgIGxpbmU7CisgICAgaW50ICAgICAgICAgICAgIGNvbDsKK307IC8vIHN0cnVjdCBrbXBfc3RyX2xvYwordHlwZWRlZiBzdHJ1Y3Qga21wX3N0cl9sb2Mga21wX3N0cl9sb2NfdDsKK2ttcF9zdHJfbG9jX3QgX19rbXBfc3RyX2xvY19pbml0KCBjaGFyIGNvbnN0ICogcHNvdXJjZSwgaW50IGluaXRfZm5hbWUgKTsKK3ZvaWQgX19rbXBfc3RyX2xvY19mcmVlKCBrbXBfc3RyX2xvY190ICogbG9jICk7CisKK2ludCAgICBfX2ttcF9zdHJfZXFmKCBjaGFyIGNvbnN0ICogbGhzLCBjaGFyIGNvbnN0ICogcmhzICk7CitjaGFyICogX19rbXBfc3RyX2Zvcm1hdCggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7Cit2b2lkICAgX19rbXBfc3RyX2ZyZWUoIGNoYXIgY29uc3QgKiAqIHN0ciApOworaW50ICAgIF9fa21wX3N0cl9tYXRjaCggY2hhciBjb25zdCAqIHRhcmdldCwgaW50IGxlbiwgY2hhciBjb25zdCAqIGRhdGEgKTsKK2ludCAgICBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGNoYXIgY29uc3QgKiBkYXRhICk7CitpbnQgICAgX19rbXBfc3RyX21hdGNoX3RydWUoIGNoYXIgY29uc3QgKiBkYXRhICk7Cit2b2lkICAgX19rbXBfc3RyX3JlcGxhY2UoIGNoYXIgKiBzdHIsIGNoYXIgc2VhcmNoX2ZvciwgY2hhciByZXBsYWNlX3dpdGggKTsKK3ZvaWQgICBfX2ttcF9zdHJfc3BsaXQoIGNoYXIgKiBzdHIsIGNoYXIgZGVsaW0sIGNoYXIgKiogaGVhZCwgY2hhciAqKiB0YWlsICk7CitjaGFyICogX19rbXBfc3RyX3Rva2VuKCBjaGFyICogc3RyLCBjaGFyIGNvbnN0ICogZGVsaW0sIGNoYXIgKiogYnVmICk7CitpbnQgICAgX19rbXBfc3RyX3RvX2ludCggY2hhciBjb25zdCAqIHN0ciwgY2hhciBzZW50aW5lbCApOworCit2b2lkIF9fa21wX3N0cl90b19zaXplKCBjaGFyIGNvbnN0ICogc3RyLCBzaXplX3QgKiBvdXQsIHNpemVfdCBkZmFjdG9yLCBjaGFyIGNvbnN0ICogKiBlcnJvciApOwordm9pZCBfX2ttcF9zdHJfdG9fdWludCggY2hhciBjb25zdCAqIHN0ciwga21wX3VpbnQ2NCAqIG91dCwgY2hhciBjb25zdCAqICogZXJyb3IgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9TVFJfSAorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA5NTNhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0dWIuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIGttcF9zdHViLmMgLS0gc3R1YiB2ZXJzaW9ucyBvZiB1c2VyLWNhbGxhYmxlIE9wZW5NUCBSVCBmdW5jdGlvbnMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAib21wLmgiICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHJlbmFtaW5ncy4KKyNpbmNsdWRlICJrbXAuaCIgICAgICAgICAgICAgICAgLy8gS01QX0RFRkFVTFRfU1RLU0laRQorI2luY2x1ZGUgImttcF9zdHViLmgiCisKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorICAgICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKy8vIE1vdmVkIGZyb20gb21wLmgKKyNkZWZpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscworI2RlZmluZSBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgICAgIG9tcGNfc2V0X3NjaGVkdWxlCisjZGVmaW5lIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorI2RlZmluZSBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgIG9tcGNfZ2V0X3RlYW1fc2l6ZQorCisjZGVmaW5lIG9tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgb21wY19zZXRfbnVtX3RocmVhZHMKKyNkZWZpbmUgb21wX3NldF9keW5hbWljICAgICAgICAgICAgICBvbXBjX3NldF9keW5hbWljCisjZGVmaW5lIG9tcF9zZXRfbmVzdGVkICAgICAgICAgICAgICAgb21wY19zZXRfbmVzdGVkCisjZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplCisjZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplX3MKKyNkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyNkZWZpbmUga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICBrbXBjX3NldF9saWJyYXJ5CisjZGVmaW5lIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAga21wY19zZXRfZGVmYXVsdHMKKyNkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX21hbGxvYworI2RlZmluZSBrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfY2FsbG9jCisjZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAga21wY19yZWFsbG9jCisjZGVmaW5lIGttcF9mcmVlICAgICAgICAgICAgICAgICAgICAga21wY19mcmVlCisKK3N0YXRpYyBkb3VibGUgZnJlcXVlbmN5ID0gMC4wOworCisvLyBIZWxwZXIgZnVuY3Rpb25zLgorc3RhdGljIHNpemVfdCBfX2ttcHNfaW5pdCgpIHsKKyAgICBzdGF0aWMgaW50ICAgIGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgc2l6ZV90IGR1bW15ID0gMDsKKyAgICBpZiAoICEgaW5pdGlhbGl6ZWQgKSB7CisKKyAgICAgICAgLy8gVE9ETzogQW5hbHl6ZSBLTVBfVkVSU0lPTiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgcHJpbnQgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHQgYW5kCisgICAgICAgIC8vIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZS4KKyAgICAgICAgLy8gV0FSTklORzogRG8gbm90IHVzZSAiZnByaW50Ziggc3RkZXJyLCAuLi4gKSIgYmVjYXVzZSBpdCB3aWxsIGNhdXNlIHVucmVzb2x2ZWQgIl9faW9iIgorICAgICAgICAvLyBzeW1ib2wgKHNlZSBDNzAwODApLiBXZSBuZWVkIHRvIGV4dHJhY3QgX19rbXBfcHJpbnRmKCkgc3R1ZmYgZnJvbSBrbXBfcnVudGltZS5jIGFuZCB1c2UKKyAgICAgICAgLy8gaXQuCisKKyAgICAgICAgLy8gVHJpY2sgd2l0aCBkdW1teSB2YXJpYWJsZSBmb3JjZXMgbGlua2VyIHRvIGtlZXAgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHQgYW5kCisgICAgICAgIC8vIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZSBzdHJpbmdzIGluIGV4ZWN1dGFibGUgZmlsZSAoaW4gY2FzZSBvZiBzdGF0aWMgbGlua2FnZSkuCisgICAgICAgIC8vIFdoZW4gS01QX1ZFUlNJT04gYW5hbHl6ZSBpcyBpbXBsZW1lbnRlZCwgZHVtbXkgdmFyaWFibGUgc2hvdWxkIGJlIGRlbGV0ZWQsIGZ1bmN0aW9uCisgICAgICAgIC8vIHNob3VsZCByZXR1cm4gdm9pZC4KKyAgICAgICAgZHVtbXkgPSBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCAtIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZTsKKworICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgZnJlcTsKKyAgICAgICAgICAgIEJPT0wgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSggJiBmcmVxICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBkb3VibGUoIGZyZXEuUXVhZFBhcnQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICNlbmRpZgorCisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBkdW1teTsKK307IC8vIF9fa21wc19pbml0CisKKyNkZWZpbmUgaSBfX2ttcHNfaW5pdCgpOworCisvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLwordm9pZCBvbXBfc2V0X251bV90aHJlYWRzKCBvbXBfaW50X3QgbnVtX3RocmVhZHMgKSB7IGk7IH0KK3ZvaWQgb21wX3NldF9keW5hbWljKCBvbXBfaW50X3QgZHluYW1pYyApICAgICAgICAgeyBpOyBfX2ttcHNfc2V0X2R5bmFtaWMoIGR5bmFtaWMgKTsgfQordm9pZCBvbXBfc2V0X25lc3RlZCggb21wX2ludF90IG5lc3RlZCApICAgICAgICAgICB7IGk7IF9fa21wc19zZXRfbmVzdGVkKCBuZXN0ZWQgKTsgICB9Cit2b2lkIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIG9tcF9pbnRfdCBtYXhfYWN0aXZlX2xldmVscyApIHsgaTsgfQordm9pZCBvbXBfc2V0X3NjaGVkdWxlKCBvbXBfc2NoZWRfdCBraW5kLCBvbXBfaW50X3QgbW9kaWZpZXIgKSB7IGk7IF9fa21wc19zZXRfc2NoZWR1bGUoIChrbXBfc2NoZWRfdClraW5kLCBtb2RpZmllciApOyB9CitpbnQgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBvbXBfaW50X3QgbGV2ZWwgKSB7IGk7IHJldHVybiAoIGxldmVsICkgPyAoIC0xICkgOiAoIDAgKTsgfQoraW50IG9tcF9nZXRfdGVhbV9zaXplKCBvbXBfaW50X3QgbGV2ZWwgKSB7IGk7IHJldHVybiAoIGxldmVsICkgPyAoIC0xICkgOiAoIDEgKTsgfQoraW50IGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkgeyBpOyByZXR1cm4gLTE7IH0KK2ludCBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkgeyBpOyByZXR1cm4gLTE7IH0KK2ludCBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApIHsgaTsgcmV0dXJuIC0xOyB9CisKKy8qIGttcCBBUEkgZnVuY3Rpb25zICovCit2b2lkIGttcF9zZXRfc3RhY2tzaXplKCBvbXBfaW50X3QgYXJnICkgICB7IGk7IF9fa21wc19zZXRfc3RhY2tzaXplKCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zKCBzaXplX3QgYXJnICkgICAgeyBpOyBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggYXJnICk7IH0KK3ZvaWQga21wX3NldF9ibG9ja3RpbWUoIG9tcF9pbnRfdCBhcmcgKSAgIHsgaTsgX19rbXBzX3NldF9ibG9ja3RpbWUoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfbGlicmFyeSggb21wX2ludF90IGFyZyApICAgICB7IGk7IF9fa21wc19zZXRfbGlicmFyeSggYXJnICk7IH0KK3ZvaWQga21wX3NldF9kZWZhdWx0cyggY2hhciBjb25zdCAqIHN0ciApIHsgaTsgfQorCisvKiBLTVAgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLiAqLwordm9pZCAqIGttcF9tYWxsb2MoIHNpemVfdCBzaXplICkgICAgICAgICAgICAgICAgIHsgaTsgcmV0dXJuIG1hbGxvYyggc2l6ZSApOyB9Cit2b2lkICoga21wX2NhbGxvYyggc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplICkgeyBpOyByZXR1cm4gY2FsbG9jKCBuZWxlbSwgZWxzaXplICk7IH0KK3ZvaWQgKiBrbXBfcmVhbGxvYyggdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSApICAgICB7IGk7IHJldHVybiByZWFsbG9jKCBwdHIsIHNpemUgKTsgfQordm9pZCAgIGttcF9mcmVlKCB2b2lkICogcHRyICkgICAgICAgICAgICAgICAgICAgIHsgaTsgZnJlZSggcHRyICk7IH0KKworc3RhdGljIGludCBfX2ttcHNfYmxvY2t0aW1lID0gSU5UX01BWDsKKwordm9pZCBfX2ttcHNfc2V0X2Jsb2NrdGltZSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19ibG9ja3RpbWUgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfYmxvY2t0aW1lCisKK2ludCBfX2ttcHNfZ2V0X2Jsb2NrdGltZSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfYmxvY2t0aW1lOworfSAvLyBfX2ttcHNfZ2V0X2Jsb2NrdGltZQorCitzdGF0aWMgaW50IF9fa21wc19keW5hbWljID0gMDsKKwordm9pZCBfX2ttcHNfc2V0X2R5bmFtaWMoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfZHluYW1pYyA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9keW5hbWljCisKK2ludCBfX2ttcHNfZ2V0X2R5bmFtaWMoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX2R5bmFtaWM7Cit9IC8vIF9fa21wc19nZXRfZHluYW1pYworCitzdGF0aWMgaW50IF9fa21wc19saWJyYXJ5ID0gMTAwMDsKKwordm9pZCBfX2ttcHNfc2V0X2xpYnJhcnkoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfbGlicmFyeSA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9saWJyYXJ5CisKK2ludCBfX2ttcHNfZ2V0X2xpYnJhcnkoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX2xpYnJhcnk7Cit9IC8vIF9fa21wc19nZXRfbGlicmFyeQorCitzdGF0aWMgaW50IF9fa21wc19uZXN0ZWQgPSAwOworCit2b2lkIF9fa21wc19zZXRfbmVzdGVkKCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX25lc3RlZCA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9uZXN0ZWQKKworaW50IF9fa21wc19nZXRfbmVzdGVkKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19uZXN0ZWQ7Cit9IC8vIF9fa21wc19nZXRfbmVzdGVkCisKK3N0YXRpYyBzaXplX3QgX19rbXBzX3N0YWNrc2l6ZSA9IEtNUF9ERUZBVUxUX1NUS1NJWkU7CisKK3ZvaWQgX19rbXBzX3NldF9zdGFja3NpemUoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfc3RhY2tzaXplID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X3N0YWNrc2l6ZQorCitpbnQgX19rbXBzX2dldF9zdGFja3NpemUoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX3N0YWNrc2l6ZTsKK30gLy8gX19rbXBzX2dldF9zdGFja3NpemUKKworc3RhdGljIGttcF9zY2hlZF90IF9fa21wc19zY2hlZF9raW5kICAgICA9IGttcF9zY2hlZF9kZWZhdWx0Oworc3RhdGljIGludCAgICAgICAgIF9fa21wc19zY2hlZF9tb2RpZmllciA9IDA7CisKKyAgICB2b2lkIF9fa21wc19zZXRfc2NoZWR1bGUoIGttcF9zY2hlZF90IGtpbmQsIGludCBtb2RpZmllciApIHsKKyAgICAgICAgaTsKKyAgICAgICAgX19rbXBzX3NjaGVkX2tpbmQgICAgID0ga2luZDsKKyAgICAgICAgX19rbXBzX3NjaGVkX21vZGlmaWVyID0gbW9kaWZpZXI7CisgICAgfSAvLyBfX2ttcHNfc2V0X3NjaGVkdWxlCisKKyAgICB2b2lkIF9fa21wc19nZXRfc2NoZWR1bGUoIGttcF9zY2hlZF90ICpraW5kLCBpbnQgKm1vZGlmaWVyICkgeworICAgICAgICBpOworICAgICAgICAqa2luZCAgICAgPSBfX2ttcHNfc2NoZWRfa2luZDsKKyAgICAgICAgKm1vZGlmaWVyID0gX19rbXBzX3NjaGVkX21vZGlmaWVyOworICAgIH0gLy8gX19rbXBzX2dldF9zY2hlZHVsZQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworc3RhdGljIGttcF9wcm9jX2JpbmRfdCBfX2ttcHNfcHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworCit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKCBrbXBfcHJvY19iaW5kX3QgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX3Byb2NfYmluZCA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9wcm9jX2JpbmQKKwora21wX3Byb2NfYmluZF90IF9fa21wc19nZXRfcHJvY19iaW5kKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19wcm9jX2JpbmQ7Cit9IC8vIF9fa21wc19nZXRfcHJvY19iaW5kCisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCitkb3VibGUgX19rbXBzX2dldF93dGltZSggdm9pZCApIHsKKyAgICAvLyBFbGFwc2VkIHdhbGwgY2xvY2sgdGltZSAoaW4gc2Vjb25kKSBmcm9tICJzb21ldGltZSBpbiB0aGUgcGFzdCIuCisgICAgZG91YmxlIHd0aW1lID0gMC4wOworICAgIGk7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGlmICggZnJlcXVlbmN5ID4gMC4wICkgeworICAgICAgICAgICAgTEFSR0VfSU5URUdFUiBub3c7CisgICAgICAgICAgICBCT09MIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIG5vdyApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgd3RpbWUgPSBkb3VibGUoIG5vdy5RdWFkUGFydCApIC8gZnJlcXVlbmN5OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAvLyBnZXR0aW1lb2ZkYXkoKSByZXR1cm5zIHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2guCisgICAgICAgIHN0cnVjdCB0aW1ldmFsICB0dmFsOworICAgICAgICBpbnQgICAgICAgICAgICAgcmM7CisgICAgICAgIHJjID0gZ2V0dGltZW9mZGF5KCAmIHR2YWwsIE5VTEwgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgd3RpbWUgPSAoZG91YmxlKSggdHZhbC50dl9zZWMgKSArIDEuMEUtMDYgKiAoZG91YmxlKSggdHZhbC50dl91c2VjICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBBc3NlcnQgb3IgYWJvcnQgaGVyZS4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gd3RpbWU7Cit9OyAvLyBfX2ttcHNfZ2V0X3d0aW1lCisKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aWNrKCB2b2lkICkgeworICAgIC8vIE51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc3VjY2Vzc2l2ZSBjbG9jayB0aWNrcy4KKyAgICBkb3VibGUgd3RpY2sgPSAwLjA7CisgICAgaTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgeworICAgICAgICAgICAgRFdPUkQgaW5jcmVtZW50OworICAgICAgICAgICAgRFdPUkQgYWRqdXN0bWVudDsKKyAgICAgICAgICAgIEJPT0wgIGRpc2FibGVkOworICAgICAgICAgICAgQk9PTCAgcmM7CisgICAgICAgICAgICByYyA9IEdldFN5c3RlbVRpbWVBZGp1c3RtZW50KCAmIGFkanVzdG1lbnQsICYgaW5jcmVtZW50LCAmIGRpc2FibGVkICk7CisgICAgICAgICAgICBpZiAoIHJjICkgeworICAgICAgICAgICAgICAgIHd0aWNrID0gMS4wRS0wNyAqIChkb3VibGUpKCBkaXNhYmxlZCA/IGluY3JlbWVudCA6IGFkanVzdG1lbnQgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogQXNzZXJ0IG9yIGFib3J0IGhlcmUuCisgICAgICAgICAgICAgICAgd3RpY2sgPSAxLjBFLTAzOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorICAgICNlbHNlCisgICAgICAgIC8vIFRPRE86IGdldHRpbWVvZmRheSgpIHJldHVybnMgaW4gbWljcm9zZWNvbmRzLCBidXQgd2hhdCB0aGUgcHJlY2lzaW9uPworICAgICAgICB3dGljayA9IDEuMEUtMDY7CisgICAgI2VuZGlmCisgICAgcmV0dXJuIHd0aWNrOworfTsgLy8gX19rbXBzX2dldF93dGljaworCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGNmZmEzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0dWIuaApAQCAtMCwwICsxLDYxIEBACisvKgorICoga21wX3N0dWIuaAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TVFVCX0gKKyNkZWZpbmUgS01QX1NUVUJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCit2b2lkIF9fa21wc19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfYmxvY2t0aW1lKCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfZHluYW1pYyggaW50IGFyZyApOworaW50ICBfX2ttcHNfZ2V0X2R5bmFtaWMoIHZvaWQgKTsKK3ZvaWQgX19rbXBzX3NldF9saWJyYXJ5KCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfbGlicmFyeSggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X25lc3RlZCggaW50IGFyZyApOworaW50ICBfX2ttcHNfZ2V0X25lc3RlZCggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApOworaW50ICBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworCisjaWZuZGVmIEtNUF9TQ0hFRF9UWVBFX0RFRklORUQKKyNkZWZpbmUgS01QX1NDSEVEX1RZUEVfREVGSU5FRAordHlwZWRlZiBlbnVtIGttcF9zY2hlZCB7CisgICAga21wX3NjaGVkX3N0YXRpYyAgICAgICAgICAgID0gMSwgLy8gbWFwcGVkIHRvIGttcF9zY2hfc3RhdGljX2NodW5rZWQgICAgICAgICAgICgzMykKKyAgICBrbXBfc2NoZWRfZHluYW1pYyAgICAgICAgICAgPSAyLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9keW5hbWljX2NodW5rZWQgICAgICAgICAgKDM1KQorICAgIGttcF9zY2hlZF9ndWlkZWQgICAgICAgICAgICA9IDMsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAoMzYpCisgICAga21wX3NjaGVkX2F1dG8gICAgICAgICAgICAgID0gNCwgLy8gbWFwcGVkIHRvIGttcF9zY2hfYXV0byAgICAgICAgICAgICAgICAgICAgICgzOCkKKyAgICBrbXBfc2NoZWRfZGVmYXVsdCA9IGttcF9zY2hlZF9zdGF0aWMgICAvLyBkZWZhdWx0IHNjaGVkdWxpbmcKK30ga21wX3NjaGVkX3Q7CisjZW5kaWYKK3ZvaWQgX19rbXBzX3NldF9zY2hlZHVsZSgga21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICk7Cit2b2lkIF9fa21wc19nZXRfc2NoZWR1bGUoIGttcF9zY2hlZF90ICpraW5kLCBpbnQgKm1vZGlmaWVyICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZCBfX2ttcHNfc2V0X3Byb2NfYmluZCgga21wX3Byb2NfYmluZF90IGFyZyApOwora21wX3Byb2NfYmluZF90IF9fa21wc19nZXRfcHJvY19iaW5kKCB2b2lkICk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworZG91YmxlIF9fa21wc19nZXRfd3RpbWUoKTsKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aWNrKCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBLTVBfU1RVQl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tkZXBzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA4NWNlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tkZXBzLmNwcApAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqIGttcF90YXNrZGVwcy5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8jZGVmaW5lIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVCAxCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvL1RPRE86IEltcHJvdmUgbWVtb3J5IGFsbG9jYXRpb24/IGtlZXAgYSBsaXN0IG9mIHByZS1hbGxvY2F0ZWQgc3RydWN0dXJlcz8gYWxsb2NhdGUgaW4gYmxvY2tzPyByZS11c2UgbGlzdCBmaW5pc2hlZCBsaXN0IGVudHJpZXM/CisvL1RPRE86IGRvbid0IHVzZSBhdG9taWMgcmVmIGNvdW50ZXJzIGZvciBzdGFjay1hbGxvY2F0ZWQgbm9kZXMuCisvL1RPRE86IGZpbmQgYW4gYWx0ZXJuYXRlIHRvIGF0b21pYyByZWZzIGZvciBoZWFwLWFsbG9jYXRlZCBub2Rlcz8KKy8vVE9ETzogRmluaXNoIGdyYXBoIG91dHB1dCBzdXBwb3J0CisvL1RPRE86IGttcF9sb2NrX3Qgc2VlbXMgYSB0YWQgdG8gYmlnIChhbmQgaGVhdnkgd2VpZ2h0KSBmb3IgdGhpcy4gQ2hlY2sgb3RoZXIgcnVudGltZSBsb2NrcworLy9UT0RPOiBBbnkgSVRUIHN1cHBvcnQgbmVlZGVkPworCisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCitzdGF0aWMga21wX2ludDMyIGttcF9ub2RlX2lkX3NlZWQgPSAwOworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25vZGUgKCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBub2RlLT5kbi50YXNrID0gTlVMTDsgLy8gc2V0IHRvIG51bGwgaW5pdGlhbGx5LCBpdCB3aWxsIHBvaW50IHRvIHRoZSByaWdodCB0YXNrIG9uY2UgZGVwZW5kZW5jZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZAorICAgIG5vZGUtPmRuLnN1Y2Nlc3NvcnMgPSBOVUxMOworICAgIF9fa21wX2luaXRfbG9jaygmbm9kZS0+ZG4ubG9jayk7CisgICAgbm9kZS0+ZG4ubnJlZnMgPSAxOyAvLyBpbml0IGNyZWF0ZXMgdGhlIGZpcnN0IHJlZmVyZW5jZSB0byB0aGUgbm9kZQorI2lmZGVmIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVAorICAgIG5vZGUtPmRuLmlkID0gS01QX1RFU1RfVEhFTl9JTkMzMigma21wX25vZGVfaWRfc2VlZCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBrbXBfZGVwbm9kZV90ICoKK19fa21wX25vZGVfcmVmICgga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAgS01QX1RFU1RfVEhFTl9JTkMzMigmbm9kZS0+ZG4ubnJlZnMpOworICAgIHJldHVybiBub2RlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX25vZGVfZGVyZWYgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBub2RlX3QgKm5vZGUgKQoreworICAgIGlmICghbm9kZSkgcmV0dXJuOworCisgICAga21wX2ludDMyIG4gPSBLTVBfVEVTVF9USEVOX0RFQzMyKCZub2RlLT5kbi5ucmVmcykgLSAxOworICAgIGlmICggbiA9PSAwICkgeworICAgICAgICBLTVBfQVNTRVJUKG5vZGUtPmRuLm5yZWZzID09IDApOworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLG5vZGUpOworI2Vsc2UKKyAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLG5vZGUpOworI2VuZGlmCisgICAgfQorfQorCisjZGVmaW5lIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxuKSBfX2ttcF9hY3F1aXJlX2xvY2soJihuKS0+ZG4ubG9jaywoZ3RpZCkpCisjZGVmaW5lIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCxuKSBfX2ttcF9yZWxlYXNlX2xvY2soJihuKS0+ZG4ubG9jaywoZ3RpZCkpCisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdCAqbGlzdCApOworCitzdGF0aWMgY29uc3Qga21wX2ludDMyIGttcF9kZXBoYXNoX2xvZzIgPSA2Oworc3RhdGljIGNvbnN0IGttcF9pbnQzMiBrbXBfZGVwaGFzaF9zaXplID0gKDEgPDwga21wX2RlcGhhc2hfbG9nMik7CisKK3N0YXRpYyBpbmxpbmUga21wX2ludDMyCitfX2ttcF9kZXBoYXNoX2hhc2ggKCBrbXBfaW50cHRyX3QgYWRkciApCit7CisgICAgLy9UT0RPIGFsdGVybmF0ZSB0byB0cnk6IHNldCA9ICgoKEFkZHI2NCkoYWRkclVzZWZ1bEJpdHMgKiA5LjYxOCkpICUgbV9udW1fc2V0cyApOworICAgIHJldHVybiAoKGFkZHIgPj4ga21wX2RlcGhhc2hfbG9nMikgXiBhZGRyKSAlIGttcF9kZXBoYXNoX3NpemU7Cit9CisKK3N0YXRpYyBrbXBfZGVwaGFzaF90ICoKK19fa21wX2RlcGhhc2hfY3JlYXRlICgga21wX2luZm9fdCAqdGhyZWFkICkKK3sKKyAgICBrbXBfZGVwaGFzaF90ICpoOworCisgICAga21wX2ludDMyIHNpemUgPSBrbXBfZGVwaGFzaF9zaXplICogc2l6ZW9mKGttcF9kZXBoYXNoX2VudHJ5X3QpICsgc2l6ZW9mKGttcF9kZXBoYXNoX3QpOworCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgaCA9IChrbXBfZGVwaGFzaF90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRocmVhZCwgc2l6ZSApOworI2Vsc2UKKyAgICBoID0gKGttcF9kZXBoYXNoX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaXplICk7CisjZW5kaWYKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGgtPm5lbGVtZW50cyA9IDA7CisjZW5kaWYKKyAgICBoLT5idWNrZXRzID0gKGttcF9kZXBoYXNoX2VudHJ5ICoqKShoKzEpOworCisgICAgZm9yICgga21wX2ludDMyIGkgPSAwOyBpIDwga21wX2RlcGhhc2hfc2l6ZTsgaSsrICkKKyAgICAgICAgaC0+YnVja2V0c1tpXSA9IDA7CisKKyAgICByZXR1cm4gaDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2RlcGhhc2hfZnJlZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcGhhc2hfdCAqaCApCit7CisgICAgZm9yICgga21wX2ludDMyIGk9MDsgaSA8IGttcF9kZXBoYXNoX3NpemU7IGkrKyApIHsKKyAgICAgICAgaWYgKCBoLT5idWNrZXRzW2ldICkgeworICAgICAgICAgICAga21wX2RlcGhhc2hfZW50cnlfdCAqbmV4dDsKKyAgICAgICAgICAgIGZvciAoIGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5ID0gaC0+YnVja2V0c1tpXTsgZW50cnk7IGVudHJ5ID0gbmV4dCApIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gZW50cnktPm5leHRfaW5fYnVja2V0OworICAgICAgICAgICAgICAgIF9fa21wX2RlcG5vZGVfbGlzdF9mcmVlKHRocmVhZCxlbnRyeS0+bGFzdF9pbnMpOworICAgICAgICAgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLGVudHJ5LT5sYXN0X291dCk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgICAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxlbnRyeSk7CisjZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxlbnRyeSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLGgpOworI2Vsc2UKKyAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsaCk7CisjZW5kaWYKK30KKworc3RhdGljIGttcF9kZXBoYXNoX2VudHJ5ICoKK19fa21wX2RlcGhhc2hfZmluZCAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcGhhc2hfdCAqaCwga21wX2ludHB0cl90IGFkZHIgKQoreworICAgIGttcF9pbnQzMiBidWNrZXQgPSBfX2ttcF9kZXBoYXNoX2hhc2goYWRkcik7CisKKyAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICplbnRyeTsKKyAgICBmb3IgKCBlbnRyeSA9IGgtPmJ1Y2tldHNbYnVja2V0XTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHRfaW5fYnVja2V0ICkKKyAgICAgICAgaWYgKCBlbnRyeS0+YWRkciA9PSBhZGRyICkgYnJlYWs7CisKKyAgICBpZiAoIGVudHJ5ID09IE5VTEwgKSB7CisgICAgICAgIC8vIGNyZWF0ZSBlbnRyeS4gVGhpcyBpcyBvbmx5IGRvbmUgYnkgb25lIHRocmVhZCBzbyBubyBsb2NraW5nIHJlcXVpcmVkCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIGVudHJ5ID0gKGttcF9kZXBoYXNoX2VudHJ5X3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCkgKTsKKyNlbHNlCisgICAgICAgIGVudHJ5ID0gKGttcF9kZXBoYXNoX2VudHJ5X3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCkgKTsKKyNlbmRpZgorICAgICAgICBlbnRyeS0+YWRkciA9IGFkZHI7CisgICAgICAgIGVudHJ5LT5sYXN0X291dCA9IE5VTEw7CisgICAgICAgIGVudHJ5LT5sYXN0X2lucyA9IE5VTEw7CisgICAgICAgIGVudHJ5LT5uZXh0X2luX2J1Y2tldCA9IGgtPmJ1Y2tldHNbYnVja2V0XTsKKyAgICAgICAgaC0+YnVja2V0c1tidWNrZXRdID0gZW50cnk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGgtPm5lbGVtZW50cysrOworICAgICAgICBpZiAoIGVudHJ5LT5uZXh0X2luX2J1Y2tldCApIGgtPm5jb25mbGljdHMrKzsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBrbXBfZGVwbm9kZV9saXN0X3QgKgorX19rbXBfYWRkX25vZGUgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBub2RlX2xpc3RfdCAqbGlzdCwga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAga21wX2RlcG5vZGVfbGlzdF90ICpuZXdfaGVhZDsKKworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIG5ld19oZWFkID0gKGttcF9kZXBub2RlX2xpc3RfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKHRocmVhZCxzaXplb2Yoa21wX2RlcG5vZGVfbGlzdF90KSk7CisjZWxzZQorICAgIG5ld19oZWFkID0gKGttcF9kZXBub2RlX2xpc3RfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKHRocmVhZCxzaXplb2Yoa21wX2RlcG5vZGVfbGlzdF90KSk7CisjZW5kaWYKKworICAgIG5ld19oZWFkLT5ub2RlID0gX19rbXBfbm9kZV9yZWYobm9kZSk7CisgICAgbmV3X2hlYWQtPm5leHQgPSBsaXN0OworCisgICAgcmV0dXJuIG5ld19oZWFkOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBub2RlX2xpc3QgKmxpc3QgKQoreworICAgIGttcF9kZXBub2RlX2xpc3QgKm5leHQ7CisKKyAgICBmb3IgKCA7IGxpc3QgOyBsaXN0ID0gbmV4dCApIHsKKyAgICAgICAgbmV4dCA9IGxpc3QtPm5leHQ7CisKKyAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsbGlzdC0+bm9kZSk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsbGlzdCk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsbGlzdCk7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfdHJhY2tfZGVwZW5kZW5jZSAoIGttcF9kZXBub2RlX3QgKnNvdXJjZSwga21wX2RlcG5vZGVfdCAqc2luayApCit7CisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrX3NvdXJjZSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNvdXJjZS0+ZG4udGFzayk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrX3NpbmsgPSBLTVBfVEFTS19UT19UQVNLREFUQShzaW5rLT5kbi50YXNrKTsgICAgLy8gdGhpcyBjYW4gYmUgTlVMTCB3aGVuIGlmKDApIC4uLgorCisgICAgX19rbXBfcHJpbnRmKCIlZCglcykgLT4gJWQoJXMpXG4iLCBzb3VyY2UtPmRuLmlkLCB0YXNrX3NvdXJjZS0+dGRfaWRlbnQtPnBzb3VyY2UsIHNpbmstPmRuLmlkLCB0YXNrX3NpbmstPnRkX2lkZW50LT5wc291cmNlKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTwgYm9vbCBmaWx0ZXIgPgorc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX3Byb2Nlc3NfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfZGVwbm9kZV90ICpub2RlLCBrbXBfZGVwaGFzaF90ICpoYXNoLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXBfYmFycmllcixrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCkKK3sKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9wcm9jZXNzX2RlcHM8JWQ+OiBUIyVkIHByb2Nlc3NpbmcgJWQgZGVwZW5jaWVzIDogZGVwX2JhcnJpZXIgPSAlZFxuIiwgZmlsdGVyLCBndGlkLCBuZGVwcywgZGVwX2JhcnJpZXIgKSApOworICAgIAorICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfaW50MzIgbnByZWRlY2Vzc29ycz0wOworICAgIGZvciAoIGttcF9pbnQzMiBpID0gMDsgaSA8IG5kZXBzIDsgaSsrICkgeworICAgICAgICBjb25zdCBrbXBfZGVwZW5kX2luZm9fdCAqIGRlcCA9ICZkZXBfbGlzdFtpXTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGRlcC0+ZmxhZ3MuaW4pOworCisgICAgICAgIGlmICggZmlsdGVyICYmIGRlcC0+YmFzZV9hZGRyID09IDAgKSBjb250aW51ZTsgLy8gc2tpcCBmaWx0ZXJlZCBlbnRyaWVzCisKKyAgICAgICAga21wX2RlcGhhc2hfZW50cnlfdCAqaW5mbyA9IF9fa21wX2RlcGhhc2hfZmluZCh0aHJlYWQsaGFzaCxkZXAtPmJhc2VfYWRkcik7CisgICAgICAgIGttcF9kZXBub2RlX3QgKmxhc3Rfb3V0ID0gaW5mby0+bGFzdF9vdXQ7CisKKyAgICAgICAgaWYgKCBkZXAtPmZsYWdzLm91dCAmJiBpbmZvLT5sYXN0X2lucyApIHsKKyAgICAgICAgICAgIGZvciAoIGttcF9kZXBub2RlX2xpc3RfdCAqIHAgPSBpbmZvLT5sYXN0X2luczsgcDsgcCA9IHAtPm5leHQgKSB7CisgICAgICAgICAgICAgICAga21wX2RlcG5vZGVfdCAqIGluZGVwID0gcC0+bm9kZTsKKyAgICAgICAgICAgICAgICBpZiAoIGluZGVwLT5kbi50YXNrICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsaW5kZXApOworICAgICAgICAgICAgICAgICAgICBpZiAoIGluZGVwLT5kbi50YXNrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdHJhY2tfZGVwZW5kZW5jZShpbmRlcCxub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVwLT5kbi5zdWNjZXNzb3JzID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBpbmRlcC0+ZG4uc3VjY2Vzc29ycywgbm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSg0MCwoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgYWRkaW5nIGRlcGVuZGVuY2UgZnJvbSAlcCB0byAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcixndGlkLCBLTVBfVEFTS19UT19UQVNLREFUQShpbmRlcC0+ZG4udGFzayksIEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5vZGUtPmRuLnRhc2spKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBucHJlZGVjZXNzb3JzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLGluZGVwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2RlcG5vZGVfbGlzdF9mcmVlKHRocmVhZCxpbmZvLT5sYXN0X2lucyk7CisgICAgICAgICAgICBpbmZvLT5sYXN0X2lucyA9IE5VTEw7CisKKyAgICAgICAgfSBlbHNlIGlmICggbGFzdF9vdXQgJiYgbGFzdF9vdXQtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsbGFzdF9vdXQpOworICAgICAgICAgICAgaWYgKCBsYXN0X291dC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90cmFja19kZXBlbmRlbmNlKGxhc3Rfb3V0LG5vZGUpOworICAgICAgICAgICAgICAgIGxhc3Rfb3V0LT5kbi5zdWNjZXNzb3JzID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBsYXN0X291dC0+ZG4uc3VjY2Vzc29ycywgbm9kZSk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoNDAsKCJfX2ttcF9wcm9jZXNzX2RlcHM8JWQ+OiBUIyVkIGFkZGluZyBkZXBlbmRlbmNlIGZyb20gJXAgdG8gJXBcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsZ3RpZCwgS01QX1RBU0tfVE9fVEFTS0RBVEEobGFzdF9vdXQtPmRuLnRhc2spLCBLTVBfVEFTS19UT19UQVNLREFUQShub2RlLT5kbi50YXNrKSkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG5wcmVkZWNlc3NvcnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCxsYXN0X291dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRlcF9iYXJyaWVyICkgeworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHN5bmMgcG9pbnQgaW4gdGhlIHNlcmlhbCBzZXF1ZW5jZSwgdGhlbiB0aGUgcHJldmlvdXMgb3V0cHV0cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZWQgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHRoZSBleGVjdXRpb24gb2YgdGhpcyB0YXNrIHNvIHRoZSBwcmV2aW91cyBvdXRwdXQgbm9kZXMgY2FuIGJlIGNsZWFyZWQuCisgICAgICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsYXN0X291dCk7CisgICAgICAgICAgICBpbmZvLT5sYXN0X291dCA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIGRlcC0+ZmxhZ3Mub3V0ICkgeworICAgICAgICAgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLGxhc3Rfb3V0KTsKKyAgICAgICAgICAgICAgICBpbmZvLT5sYXN0X291dCA9IF9fa21wX25vZGVfcmVmKG5vZGUpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9pbnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGluZm8tPmxhc3RfaW5zLCBub2RlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfcHJvY2Vzc19kZXBzPCVkPjogVCMlZCBmb3VuZCAlZCBwcmVkZWNlc3NvcnNcbiIsIGZpbHRlciwgZ3RpZCwgbnByZWRlY2Vzc29ycyApICk7CisKKyAgICByZXR1cm4gbnByZWRlY2Vzc29yczsKK30KKworI2RlZmluZSBOT19ERVBfQkFSUklFUiAoZmFsc2UpCisjZGVmaW5lIERFUF9CQVJSSUVSICh0cnVlKQorCisvLyByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaGFzIGFueSBvdXRzdGFuZGluZyBkZXBlbmRlbmNlCitzdGF0aWMgYm9vbAorX19rbXBfY2hlY2tfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfZGVwbm9kZV90ICpub2RlLCBrbXBfdGFza190ICp0YXNrLCBrbXBfZGVwaGFzaF90ICpoYXNoLCBib29sIGRlcF9iYXJyaWVyLAorICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApCit7CisgICAgaW50IGk7CisKKyNpZiBLTVBfREVCVUcKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisjZW5kaWYKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jaGVja19kZXBzOiBUIyVkIGNoZWNraW5nIGRlcGVuZGVuY2llcyBmb3IgdGFzayAlcCA6ICVkIHBvc3NpYmx5IGFsaWFzZWQgZGVwZW5kZW5jaWVzLCAlZCBub24tYWxpYXNlZCBkZXBlZGVuY2llcyA6IGRlcF9iYXJyaWVyPSVkIC5cbiIsIGd0aWQsIHRhc2tkYXRhLCBuZGVwcywgbmRlcHNfbm9hbGlhcywgZGVwX2JhcnJpZXIgKSApOworCisgICAgLy8gRmlsdGVyIGRlcHMgaW4gZGVwX2xpc3QKKyAgICAvLyBUT0RPOiBEaWZmZXJlbnQgYWxnb3JpdGhtIGZvciBsYXJnZSBkZXBfbGlzdCAoID4gMTAgPyApCisgICAgZm9yICggaSA9IDA7IGkgPCBuZGVwczsgaSArKyApIHsKKyAgICAgICAgaWYgKCBkZXBfbGlzdFtpXS5iYXNlX2FkZHIgIT0gMCApCisgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IGkrMTsgaiA8IG5kZXBzOyBqKysgKQorICAgICAgICAgICAgICAgIGlmICggZGVwX2xpc3RbaV0uYmFzZV9hZGRyID09IGRlcF9saXN0W2pdLmJhc2VfYWRkciApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3RbaV0uZmxhZ3MuaW4gfD0gZGVwX2xpc3Rbal0uZmxhZ3MuaW47CisgICAgICAgICAgICAgICAgICAgIGRlcF9saXN0W2ldLmZsYWdzLm91dCB8PSBkZXBfbGlzdFtqXS5mbGFncy5vdXQ7CisgICAgICAgICAgICAgICAgICAgIGRlcF9saXN0W2pdLmJhc2VfYWRkciA9IDA7IC8vIE1hcmsgaiBlbGVtZW50IGFzIHZvaWQKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIGF0b21pYyBhcyBubyBvdGhlciB0aHJlYWQgaXMgZ29pbmcgdG8gYmUgYWNjZXNzaW5nIHRoaXMgbm9kZSBqdXN0IHlldAorICAgIC8vIG5wcmVkZWNlc3NvcnMgaXMgc2V0IC0xIHRvIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHJlbGVhc2luZyB0YXNrcyBxdWV1ZXMgdGhpcyB0YXNrIGJlZm9yZSB3ZSBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgYWxsIHRoZSBkZXBlbmRlbmNpZXMKKyAgICBub2RlLT5kbi5ucHJlZGVjZXNzb3JzID0gLTE7CisKKyAgICAvLyB1c2VkIHRvIHBhY2sgYWxsIG5wcmVkZWNlc3NvcnMgYWRkaXRpb25zIGludG8gYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvbiBhdCB0aGUgZW5kCisgICAgaW50IG5wcmVkZWNlc3NvcnM7CisKKyAgICBucHJlZGVjZXNzb3JzID0gX19rbXBfcHJvY2Vzc19kZXBzPHRydWU+KGd0aWQsIG5vZGUsIGhhc2gsIGRlcF9iYXJyaWVyLCBuZGVwcywgZGVwX2xpc3QpOworICAgIG5wcmVkZWNlc3NvcnMgKz0gX19rbXBfcHJvY2Vzc19kZXBzPGZhbHNlPihndGlkLCBub2RlLCBoYXNoLCBkZXBfYmFycmllciwgbmRlcHNfbm9hbGlhcywgbm9hbGlhc19kZXBfbGlzdCk7CisKKyAgICBub2RlLT5kbi50YXNrID0gdGFzazsKKyAgICBLTVBfTUIoKTsKKworICAgIC8vIEFjY291bnQgZm9yIG91ciBpbml0aWFsIGZha2UgdmFsdWUKKyAgICBucHJlZGVjZXNzb3JzKys7CisKKyAgICAvLyBVcGRhdGUgcHJlZGVjZXNzb3JzIGFuZCBvYnRhaW4gY3VycmVudCB2YWx1ZSB0byBjaGVjayBpZiB0aGVyZSBhcmUgc3RpbGwgYW55IG91dHN0YW5kaWcgZGVwZW5kZW5jZXMgKHNvbWUgdGFza3MgbWF5IGhhdmUgZmluaXNoZWQgd2hpbGUgd2UgcHJvY2Vzc2VkIHRoZSBkZXBlbmRlbmNlcykKKyAgICBucHJlZGVjZXNzb3JzID0gS01QX1RFU1RfVEhFTl9BREQzMigmbm9kZS0+ZG4ubnByZWRlY2Vzc29ycywgbnByZWRlY2Vzc29ycykgKyBucHJlZGVjZXNzb3JzOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2hlY2tfZGVwczogVCMlZCBmb3VuZCAlZCBwcmVkZWNlc3NvcnMgZm9yIHRhc2sgJXAgXG4iLCBndGlkLCBucHJlZGVjZXNzb3JzLCB0YXNrZGF0YSApICk7CisKKyAgICAvLyBiZXlvbmQgdGhpcyBwb2ludCB0aGUgdGFzayBjb3VsZCBiZSBxdWV1ZWQgKGFuZCBleGVjdXRlZCkgYnkgYSByZWxlYXNpbmcgdGFzay4uLgorICAgIHJldHVybiBucHJlZGVjZXNzb3JzID4gMCA/IHRydWUgOiBmYWxzZTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9kZXBzICgga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICp0YXNrICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX2RlcG5vZGVfdCAqbm9kZSA9IHRhc2stPnRkX2RlcG5vZGU7CisKKyAgICBpZiAoIHRhc2stPnRkX2RlcGhhc2ggKSB7CisgICAgICAgIEtBX1RSQUNFKDQwLCAoIl9fa21wX3JlYWxlYXNlX2RlcHM6IFQjJWQgZnJlZWluZyBkZXBlbmRlbmNpZXMgaGFzaCBvZiB0YXNrICVwLlxuIiwgZ3RpZCwgdGFzayApICk7CisgICAgICAgIF9fa21wX2RlcGhhc2hfZnJlZSh0aHJlYWQsdGFzay0+dGRfZGVwaGFzaCk7CisgICAgfQorCisgICAgaWYgKCAhbm9kZSApIHJldHVybjsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3JlYWxlYXNlX2RlcHM6IFQjJWQgbm90aWZ5aW5nIHN1Y2Nlc29ycyBvZiB0YXNrICVwLlxuIiwgZ3RpZCwgdGFzayApICk7CisgICAgCisgICAgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLG5vZGUpOworICAgIG5vZGUtPmRuLnRhc2sgPSBOVUxMOyAvLyBtYXJrIHRoaXMgdGFzayBhcyBmaW5pc2hlZCwgc28gbm8gbmV3IGRlcGVuZGVuY2llcyBhcmUgZ2VuZXJhdGVkCisgICAgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLG5vZGUpOworCisgICAga21wX2RlcG5vZGVfbGlzdF90ICpuZXh0OworICAgIGZvciAoIGttcF9kZXBub2RlX2xpc3RfdCAqcCA9IG5vZGUtPmRuLnN1Y2Nlc3NvcnM7IHA7IHAgPSBuZXh0ICkgeworICAgICAgICBrbXBfZGVwbm9kZV90ICpzdWNjZXNzb3IgPSBwLT5ub2RlOworICAgICAgICBrbXBfaW50MzIgbnByZWRlY2Vzc29ycyA9IEtNUF9URVNUX1RIRU5fREVDMzIoJnN1Y2Nlc3Nvci0+ZG4ubnByZWRlY2Vzc29ycykgLSAxOworCisgICAgICAgIC8vIHN1Y2Nlc3NvciB0YXNrIGNhbiBiZSBOVUxMIGZvciB3YWl0X2RlcGVuZHMgb3IgYmVjYXVzZSBkZXBzIGFyZSBzdGlsbCBiZWluZyBwcm9jZXNzZWQKKyAgICAgICAgaWYgKCBucHJlZGVjZXNzb3JzID09IDAgKSB7CisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgIGlmICggc3VjY2Vzc29yLT5kbi50YXNrICkgeyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3JlYWxlYXNlX2RlcHM6IFQjJWQgc3VjY2Vzc29yICVwIG9mICVwIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLlxuIiwgZ3RpZCwgc3VjY2Vzc29yLT5kbi50YXNrLCB0YXNrICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9vbXBfdGFzayhndGlkLHN1Y2Nlc3Nvci0+ZG4udGFzayxmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuZXh0ID0gcC0+bmV4dDsKKyAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQscC0+bm9kZSk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQscCk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQscCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxub2RlKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3JlYWxlYXNlX2RlcHM6IFQjJWQgYWxsIHN1Y2Nlc3NvcnMgb2YgJXAgbm90aWZpZWQgb2YgY29tcGxldGF0aW9uXG4iLCBndGlkLCB0YXNrICkgKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIG5ld190YXNrIHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkgZm9yIHRoZSAnJ25ldyB0YXNrJycKK0BwYXJhbSBuZGVwcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBkZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gbmRlcHNfbm9hbGlhcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKK0BwYXJhbSBub2FsaWFzX2RlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKKworQHJldHVybiBSZXR1cm5zIGVpdGhlciBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCBpZiB0aGUgY3VycmVudCB0YXNrIHdhcyBub3Qgc3VzcGVuZGVuZCBhbmQgcXVldWVkLCBvciBUQVNLX0NVUlJFTlRfUVVFVUVEIGlmIGl0IHdhcyBzdXNwZW5kZWQgYW5kIHF1ZXVlZAorCitTY2hlZHVsZSBhIG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIHdpdGggZGVwZW5kZW5jZXMgZm9yIGV4ZWN1dGlvbgorKi8KK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKQoreworCisgICAga21wX3Rhc2tkYXRhX3QgKiBuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEgKSApOworCisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICBib29sIHNlcmlhbCA9IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsOworI2lmIE9NUF80MV9FTkFCTEVECisgICAgc2VyaWFsID0gc2VyaWFsICYmICEobmV3X3Rhc2tkYXRhLT50ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZKTsKKyNlbmRpZgorCisgICAgaWYgKCAhc2VyaWFsICYmICggbmRlcHMgPiAwIHx8IG5kZXBzX25vYWxpYXMgPiAwICkpIHsKKyAgICAgICAgLyogaWYgbm8gZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiB0cmFja2VkIHlldCwgY3JlYXRlIHRoZSBkZXBlbmRlbmNlIGhhc2ggKi8KKyAgICAgICAgaWYgKCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2ggPT0gTlVMTCApCisgICAgICAgICAgICBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2ggPSBfX2ttcF9kZXBoYXNoX2NyZWF0ZSh0aHJlYWQpOworCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIGttcF9kZXBub2RlX3QgKm5vZGUgPSAoa21wX2RlcG5vZGVfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKHRocmVhZCxzaXplb2Yoa21wX2RlcG5vZGVfdCkpOworI2Vsc2UKKyAgICAgICAga21wX2RlcG5vZGVfdCAqbm9kZSA9IChrbXBfZGVwbm9kZV90ICopIF9fa21wX3RocmVhZF9tYWxsb2ModGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV90KSk7CisjZW5kaWYKKworICAgICAgICBfX2ttcF9pbml0X25vZGUobm9kZSk7CisgICAgICAgIG5ld190YXNrZGF0YS0+dGRfZGVwbm9kZSA9IG5vZGU7CisKKyAgICAgICAgaWYgKCBfX2ttcF9jaGVja19kZXBzKCBndGlkLCBub2RlLCBuZXdfdGFzaywgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoLCBOT19ERVBfQkFSUklFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZGVwcywgZGVwX2xpc3QsIG5kZXBzX25vYWxpYXMsbm9hbGlhc19kZXBfbGlzdCApICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhleGl0KTogVCMlZCB0YXNrIGhhZCBibG9ja2luZyBkZXBlbmRlbmNpZXM6ICIKKyAgICAgICAgICAgICAgICAgICJsb2M9JXAgdGFzaz0lcCwgcmV0dXJuOiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwgZ3RpZCwgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YSApICk7CisgICAgICAgICAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworI2lmIE9NUF80MV9FTkFCTEVECisgICAgICAgIGttcF90YXNrX3RlYW1fdCAqIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICAgICAgICBpZiAoIHRhc2tfdGVhbSAmJiB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzICkKKyAgICAgICAgICAgX19rbXBjX29tcF93YWl0X2RlcHMgKCBsb2NfcmVmLCBndGlkLCBuZGVwcywgZGVwX2xpc3QsIG5kZXBzX25vYWxpYXMsIG5vYWxpYXNfZGVwX2xpc3QgKTsKKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza193aXRoX2RlcHMoZXhpdCk6IFQjJWQgaWdub3JlZCBkZXBlbmRlbmNpZXMgZm9yIHRhc2sgKHNlcmlhbGl6ZWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwXG4iLCBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEgKSApOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza193aXRoX2RlcHMoZXhpdCk6IFQjJWQgdGFzayBoYWQgbm8gYmxvY2tpbmcgZGVwZW5kZW5jaWVzIDogIgorICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwLCB0cmFuc2ZlcnJpbmcgdG8gX19rbXBjX29tcF90YXNrXG4iLCBndGlkLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIHJldHVybiBfX2ttcGNfb21wX3Rhc2sobG9jX3JlZixndGlkLG5ld190YXNrKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIG5kZXBzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIGRlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBuZGVwc19ub2FsaWFzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworQHBhcmFtIG5vYWxpYXNfZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworCitCbG9ja3MgdGhlIGN1cnJlbnQgdGFzayB1bnRpbCBhbGwgc3BlY2lmaWVzIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gZnVsZmlsbGVkLgorKi8KK3ZvaWQKK19fa21wY19vbXBfd2FpdF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKQoreworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfd2FpdF9kZXBzKGVudGVyKTogVCMlZCBsb2M9JXBcbiIsIGd0aWQsIGxvY19yZWYpICk7CisKKyAgICBpZiAoIG5kZXBzID09IDAgJiYgbmRlcHNfbm9hbGlhcyA9PSAwICkgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBoYXMgbm8gZGVwZW5kZW5jaWVzIHRvIHdhaXQgdXBvbiA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworCisgICAgLy8gV2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSBhczoKKyAgICAvLyAgIC0gZGVwZW5kZW5jZXMgYXJlIG5vdCBjb21wdXRlZCBpbiBzZXJpYWwgdGVhbXMgKGV4Y2VwdCBpZiB3ZSBoYXZlIHByb3h5IHRhc2tzKQorICAgIC8vICAgLSBpZiB0aGUgZGVwaGFzaCBpcyBub3QgeWV0IGNyZWF0ZWQgaXQgbWVhbnMgd2UgaGF2ZSBub3RoaW5nIHRvIHdhaXQgZm9yCisgICAgYm9vbCBpZ25vcmUgPSBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy5maW5hbDsKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIGlnbm9yZSA9IGlnbm9yZSAmJiB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgPT0gRkFMU0U7CisjZW5kaWYKKyAgICBpZ25vcmUgPSBpZ25vcmUgfHwgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoID09IE5VTEw7CisKKyAgICBpZiAoIGlnbm9yZSApIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGJsb2NraW5nIGRlcGVuZGVuY2llcyA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF9kZXBub2RlX3Qgbm9kZTsKKyAgICBfX2ttcF9pbml0X25vZGUoJm5vZGUpOworCisgICAgaWYgKCFfX2ttcF9jaGVja19kZXBzKCBndGlkLCAmbm9kZSwgTlVMTCwgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoLCBERVBfQkFSUklFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kZXBzLCBkZXBfbGlzdCwgbmRlcHNfbm9hbGlhcywgbm9hbGlhc19kZXBfbGlzdCApKSB7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfd2FpdF9kZXBzKGV4aXQpOiBUIyVkIGhhcyBubyBibG9ja2luZyBkZXBlbmRlbmNpZXMgOiBsb2M9JXBcbiIsIGd0aWQsIGxvY19yZWYpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisgICAga21wX2ZsYWdfMzIgZmxhZygodm9sYXRpbGUga21wX3VpbnQzMiAqKSYobm9kZS5kbi5ucHJlZGVjZXNzb3JzKSwgMFUpOworICAgIHdoaWxlICggbm9kZS5kbi5ucHJlZGVjZXNzb3JzID4gMCApIHsKKyAgICAgICAgZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgZmluaXNoZWQgd2FpdGluZyA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjJhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jCkBAIC0wLDAgKzEsMjg1OSBAQAorLyoKKyAqIGttcF90YXNraW5nLmMgLS0gT3Blbk1QIDMuMCB0YXNraW5nIHN1cHBvcnQuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyB2b2lkIF9fa21wX2VuYWJsZV90YXNraW5nKCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSwga21wX2luZm9fdCAqdGhpc190aHIgKTsKK3N0YXRpYyB2b2lkIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICk7CitzdGF0aWMgaW50ICBfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICk7CisKKyNpZmRlZiBPTVBfNDFfRU5BQkxFRAorc3RhdGljIHZvaWQgX19rbXBfYm90dG9tX2hhbGZfZmluaXNoX3Byb3h5KCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHB0YXNrICk7CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoaW50IGd0aWQsIHZvbGF0aWxlIHZvaWQgKmZsYWcpIHsKKyAgICBpZiAoIWZsYWcpIHJldHVybjsKKyAgICAvLyBBdHRlbXB0IHRvIHdha2UgdXAgYSB0aHJlYWQ6IGV4YW1pbmUgaXRzIHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgdGVtcGxhdGUKKyAgICBzd2l0Y2ggKCgoa21wX2ZsYWdfNjQgKilmbGFnKS0+Z2V0X3R5cGUoKSkgeworICAgIGNhc2UgZmxhZzMyOiBfX2ttcF9yZXN1bWVfMzIoZ3RpZCwgTlVMTCk7IGJyZWFrOworICAgIGNhc2UgZmxhZzY0OiBfX2ttcF9yZXN1bWVfNjQoZ3RpZCwgTlVMTCk7IGJyZWFrOworICAgIGNhc2UgZmxhZ19vbmNvcmU6IF9fa21wX3Jlc3VtZV9vbmNvcmUoZ3RpZCwgTlVMTCk7IGJyZWFrOworICAgIH0KK30KKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX3RyYWNlX3Rhc2tfc3RhY2s6IHByaW50IHRoZSB0aWVkIHRhc2tzIGZyb20gdGhlIHRhc2sgc3RhY2sgaW4gb3JkZXIKKy8vICAgICBmcm9tIHRvcCBkbyBib3R0b20KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciB0aHJlYWQgY29udGFpbmluZyBzdGFjaworLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgZGF0YSBmb3IgdGFzayB0ZWFtIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGhyZXNob2xkOiB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgdHJhY2Ugc3RhdGVtZW50IHRyaWdnZXJzCisvLyAgbG9jYXRpb246IHN0cmluZyBpZGVudGlmeWluZyBjYWxsIHNpdGUgb2YgdGhpcyBmdW5jdGlvbiAoZm9yIHRyYWNlKQorCitzdGF0aWMgdm9pZAorX19rbXBfdHJhY2VfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSwgaW50IHRocmVzaG9sZCwgY2hhciAqbG9jYXRpb24gKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3Rhc2tkYXRhX3QgKipzdGFja190b3AgPSB0YXNrX3N0YWNrIC0+IHRzX3RvcDsKKyAgICBrbXBfaW50MzIgZW50cmllcyA9IHRhc2tfc3RhY2sgLT4gdHNfZW50cmllczsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGllZF90YXNrOworCisgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soc3RhcnQpOiBsb2NhdGlvbiA9ICVzLCBndGlkID0gJWQsIGVudHJpZXMgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdF9ibG9jayA9ICVwLCBzdGFja190b3AgPSAlcCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGd0aWQsIGVudHJpZXMsIHRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLCBzdGFja190b3AgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhY2tfdG9wICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBlbnRyaWVzID4gMCApOworCisgICAgd2hpbGUgKCBlbnRyaWVzICE9IDAgKQorICAgIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhY2tfdG9wICE9ICYgdGFza19zdGFjay0+dHNfZmlyc3RfYmxvY2suc2JfYmxvY2tbMF0gKTsKKyAgICAgICAgLy8gZml4IHVwIHRzX3RvcCBpZiB3ZSBuZWVkIHRvIHBvcCBmcm9tIHByZXZpb3VzIGJsb2NrCisgICAgICAgIGlmICggZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gKGttcF9zdGFja19ibG9ja190ICopIChzdGFja190b3ApIDsKKworICAgICAgICAgICAgc3RhY2tfYmxvY2sgPSBzdGFja19ibG9jayAtPiBzYl9wcmV2OworICAgICAgICAgICAgc3RhY2tfdG9wID0gJiBzdGFja19ibG9jayAtPiBzYl9ibG9ja1tUQVNLX1NUQUNLX0JMT0NLX1NJWkVdOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluaXNoIGJvb2trZWVwaW5nCisgICAgICAgIHN0YWNrX3RvcC0tOworICAgICAgICBlbnRyaWVzLS07CisKKyAgICAgICAgdGllZF90YXNrID0gKiBzdGFja190b3A7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrICE9IE5VTEwgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfVElFRCApOworCisgICAgICAgIEtBX1RSQUNFKHRocmVzaG9sZCwgKCJfX2ttcF90cmFjZV90YXNrX3N0YWNrKCVzKTogICAgICAgICAgICAgZ3RpZD0lZCwgZW50cnk9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YWNrX3RvcD0lcCwgdGllZF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCwgZW50cmllcywgc3RhY2tfdG9wLCB0aWVkX3Rhc2sgKSApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgPT0gJiB0YXNrX3N0YWNrLT50c19maXJzdF9ibG9jay5zYl9ibG9ja1swXSApOworCisgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soZXhpdCk6IGxvY2F0aW9uID0gJXMsIGd0aWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCApICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfaW5pdF90YXNrX3N0YWNrOiBpbml0aWFsaXplIHRoZSB0YXNrIHN0YWNrIGZvciB0aGUgZmlyc3QgdGltZQorLy8gICAgYWZ0ZXIgYSB0aHJlYWRfZGF0YSBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4KKy8vICAgIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIHRoaXMgYWdhaW4gKGFzc3VtaW5nIHRoZSBzdGFjayB3b3JrcykuCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBvZiBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgZGF0YSBmb3IgdGFzayB0ZWFtIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgKmZpcnN0X2Jsb2NrOworCisgICAgLy8gc2V0IHVwIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgc3RhY2sKKyAgICBmaXJzdF9ibG9jayA9ICYgdGFza19zdGFjayAtPiB0c19maXJzdF9ibG9jazsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9IChrbXBfdGFza2RhdGFfdCAqKikgZmlyc3RfYmxvY2s7CisgICAgbWVtc2V0KCAodm9pZCAqKSBmaXJzdF9ibG9jaywgJ1wwJywgVEFTS19TVEFDS19CTE9DS19TSVpFICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKKworICAgIC8vIGluaXRpYWxpemUgdGhlIHN0YWNrIHRvIGJlIGVtcHR5CisgICAgdGFza19zdGFjayAgLT4gdHNfZW50cmllcyA9IFRBU0tfU1RBQ0tfRU1QVFk7CisgICAgZmlyc3RfYmxvY2sgLT4gc2JfbmV4dCA9IE5VTEw7CisgICAgZmlyc3RfYmxvY2sgLT4gc2JfcHJldiA9IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9mcmVlX3Rhc2tfc3RhY2s6IGZyZWUgdGhlIHRhc2sgc3RhY2sgd2hlbiB0aHJlYWRfZGF0YSBpcyBkZXN0cm95ZWQuCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWRfZGF0YTogdGhyZWFkIGluZm8gZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c19lbnRyaWVzID09IFRBU0tfU1RBQ0tfRU1QVFkgKTsKKyAgICAvLyBmcmVlIGZyb20gdGhlIHNlY29uZCBibG9jayBvZiB0aGUgc3RhY2sKKyAgICB3aGlsZSAoIHN0YWNrX2Jsb2NrICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpuZXh0X2Jsb2NrID0gKHN0YWNrX2Jsb2NrKSA/IHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgOiBOVUxMOworCisgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgPSBOVUxMOworICAgICAgICBzdGFja19ibG9jayAtPiBzYl9wcmV2ID0gTlVMTDsKKyAgICAgICAgaWYgKHN0YWNrX2Jsb2NrICE9ICYgdGFza19zdGFjayAtPiB0c19maXJzdF9ibG9jaykgeworICAgICAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUoIHRocmVhZCwgc3RhY2tfYmxvY2sgKTsgIC8vIGZyZWUgdGhlIGJsb2NrLCBpZiBub3QgdGhlIGZpcnN0CisgICAgICAgIH0KKyAgICAgICAgc3RhY2tfYmxvY2sgPSBuZXh0X2Jsb2NrOworICAgIH0KKyAgICAvLyBpbml0aWFsaXplIHRoZSBzdGFjayB0byBiZSBlbXB0eQorICAgIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyA9IDA7CisgICAgdGFza19zdGFjayAtPiB0c190b3AgPSBOVUxMOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfcHVzaF90YXNrX3N0YWNrOiBQdXNoIHRoZSB0aWVkIHRhc2sgb250byB0aGUgdGFzayBzdGFjay4KKy8vICAgICBHcm93IHRoZSBzdGFjayBpZiBuZWNlc3NhcnkgYnkgYWxsb2NhdGluZyBhbm90aGVyIGJsb2NrLgorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkOiB0aHJlYWQgaW5mbyBmb3IgdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aWVkX3Rhc2s6IHRoZSB0YXNrIHRvIHB1c2ggb24gdGhlIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wdXNoX3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrZGF0YV90ICogdGllZF90YXNrICkKK3sKKyAgICAvLyBHRUggLSBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgdG8gZG8gaWYgdHRfdGhyZWFkc19kYXRhIG5vdCBhbGxvY2F0ZWQgeWV0CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiB0aHJlYWQgLT4gdGgudGhfdGFza190ZWFtIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHQudHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzIDsKKworICAgIGlmICggdGllZF90YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0aWVkX3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgeworICAgICAgICByZXR1cm47ICAvLyBEb24ndCBwdXNoIGFueXRoaW5nIG9uIHN0YWNrIGlmIHRlYW0gb3IgdGVhbSB0YXNrcyBhcmUgc2VyaWFsaXplZAorICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX1RJRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX3RvcCAhPSBOVUxMICk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soZW50ZXIpOiBHVElEOiAlZDsgVEhSRUFEOiAlcDsgVEFTSzogJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWQsIHRpZWRfdGFzayApICk7CisgICAgLy8gU3RvcmUgZW50cnkKKyAgICAqICh0YXNrX3N0YWNrIC0+IHRzX3RvcCkgPSB0aWVkX3Rhc2s7CisKKyAgICAvLyBEbyBib29ra2VlcGluZyBmb3IgbmV4dCBwdXNoCisgICAgdGFza19zdGFjayAtPiB0c190b3ArKzsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMrKzsKKworICAgIGlmICggdGFza19zdGFjayAtPiB0c19lbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgIHsKKyAgICAgICAgLy8gRmluZCBiZWdpbm5pbmcgb2YgdGhpcyB0YXNrIGJsb2NrCisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpzdGFja19ibG9jayA9CisgICAgICAgICAgICAgKGttcF9zdGFja19ibG9ja190ICopICh0YXNrX3N0YWNrIC0+IHRzX3RvcCAtIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgYmxvY2sKKyAgICAgICAgaWYgKCBzdGFja19ibG9jayAtPiBzYl9uZXh0ICE9IE5VTEwgKQorICAgICAgICB7ICAgIC8vIHJlc2V0IHRzX3RvcCB0byBiZWdpbm5pbmcgb2YgbmV4dCBibG9jaworICAgICAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgLT4gc2JfYmxvY2tbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgLy8gQWxsb2MgbmV3IGJsb2NrIGFuZCBsaW5rIGl0IHVwCisgICAgICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqbmV3X2Jsb2NrID0gKGttcF9zdGFja19ibG9ja190ICopCisgICAgICAgICAgICAgIF9fa21wX3RocmVhZF9jYWxsb2ModGhyZWFkLCBzaXplb2Yoa21wX3N0YWNrX2Jsb2NrX3QpKTsKKworICAgICAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgID0gJiBuZXdfYmxvY2sgLT4gc2JfYmxvY2tbMF07CisgICAgICAgICAgICBzdGFja19ibG9jayAtPiBzYl9uZXh0ID0gbmV3X2Jsb2NrOworICAgICAgICAgICAgbmV3X2Jsb2NrICAtPiBzYl9wcmV2ID0gc3RhY2tfYmxvY2s7CisgICAgICAgICAgICBuZXdfYmxvY2sgIC0+IHNiX25leHQgPSBOVUxMOworCisgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soKTogR1RJRDogJWQ7IFRBU0s6ICVwOyBBbGxvYyBuZXcgYmxvY2s6ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aWVkX3Rhc2ssIG5ld19ibG9jayApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcHVzaF90YXNrX3N0YWNrKGV4aXQpOiBHVElEOiAlZDsgVEFTSzogJXBcbiIsIGd0aWQsIHRpZWRfdGFzayApICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfcG9wX3Rhc2tfc3RhY2s6IFBvcCB0aGUgdGllZCB0YXNrIGZyb20gdGhlIHRhc2sgc3RhY2suICBEb24ndCByZXR1cm4KKy8vICAgICB0aGUgdGFzaywganVzdCBjaGVjayB0byBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB0aGUgZW5kaW5nIHRhc2sgcGFzc2VkIGluLgorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRoZSBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZDogdGhyZWFkIGluZm8gc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aWVkX3Rhc2s6IHRoZSB0YXNrIHBvcHBlZCBvZmYgdGhlIHN0YWNrCisvLyAgZW5kaW5nX3Rhc2s6IHRoZSB0YXNrIHRoYXQgaXMgZW5kaW5nIChzaG91bGQgbWF0Y2ggcG9wcGVkIHRhc2spCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wb3BfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tkYXRhX3QgKmVuZGluZ190YXNrICkKK3sKKyAgICAvLyBHRUggLSBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgdG8gZG8gaWYgdHRfdGhyZWFkc19kYXRhIG5vdCBhbGxvY2F0ZWQgeWV0CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiB0aHJlYWQgLT4gdGgudGhfdGFza190ZWFtIC0+IHR0X3RocmVhZHNfZGF0YVsgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApIF07CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrcyA7CisgICAga21wX3Rhc2tkYXRhX3QgKnRpZWRfdGFzazsKKworICAgIGlmICggZW5kaW5nX3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IGVuZGluZ190YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciApIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gRG9uJ3QgcG9wIGFueXRoaW5nIGZyb20gc3RhY2sgaWYgdGVhbSBvciB0ZWFtIHRhc2tzIGFyZSBzZXJpYWxpemVkCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c190b3AgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyA+IDAgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3BvcF90YXNrX3N0YWNrKGVudGVyKTogR1RJRDogJWQ7IFRIUkVBRDogJXBcbiIsIGd0aWQsIHRocmVhZCApICk7CisKKyAgICAvLyBmaXggdXAgdHNfdG9wIGlmIHdlIG5lZWQgdG8gcG9wIGZyb20gcHJldmlvdXMgYmxvY2sKKyAgICBpZiAoIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwICkKKyAgICB7CisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpzdGFja19ibG9jayA9CisgICAgICAgICAgIChrbXBfc3RhY2tfYmxvY2tfdCAqKSAodGFza19zdGFjayAtPiB0c190b3ApIDsKKworICAgICAgICBzdGFja19ibG9jayA9IHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXY7CisgICAgICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wID0gJiBzdGFja19ibG9jayAtPiBzYl9ibG9ja1tUQVNLX1NUQUNLX0JMT0NLX1NJWkVdOworICAgIH0KKworICAgIC8vIGZpbmlzaCBib29ra2VlcGluZworICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wLS07CisgICAgdGFza19zdGFjayAtPiB0c19lbnRyaWVzLS07CisKKyAgICB0aWVkX3Rhc2sgPSAqICh0YXNrX3N0YWNrIC0+IHRzX3RvcCApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19USUVEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrID09IGVuZGluZ190YXNrICk7ICAvLyBJZiB3ZSBidWlsdCB0aGUgc3RhY2sgY29ycmVjdGx5CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wb3BfdGFza19zdGFjayhleGl0KTogR1RJRDogJWQ7IFRBU0s6ICVwXG4iLCBndGlkLCB0aWVkX3Rhc2sgKSApOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wdXNoX3Rhc2s6IEFkZCBhIHRhc2sgdG8gdGhlIHRocmVhZCdzIGRlcXVlCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX3B1c2hfdGFzayhrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF9pbmZvX3QgKiAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICogICAgdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfdGFza190ZWFtX3QgKiAgIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICAgIGttcF9pbnQzMiAgICAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF90aHJlYWRfZGF0YV90ICogdGhyZWFkX2RhdGE7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgdHJ5aW5nIHRvIHB1c2ggdGFzayAlcC5cbiIsIGd0aWQsIHRhc2tkYXRhICkgKTsKKworICAgIC8vIFRoZSBmaXJzdCBjaGVjayBhdm9pZHMgYnVpbGRpbmcgdGFza190ZWFtIHRocmVhZCBkYXRhIGlmIHNlcmlhbGl6ZWQKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCB0ZWFtIHNlcmlhbGl6ZWQ7IHJldHVybmluZyBUQVNLX05PVF9QVVNIRUQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKyAgICAgICAgcmV0dXJuIFRBU0tfTk9UX1BVU0hFRDsKKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCBzZXJpYWxpemVkIHRhc2tzIGhhdmUgcmV0dXJuZWQsIHdlIGNhbiBhc3N1bWUgdGhhdCB3ZSBhcmUgbm90IGluIGltbWVkaWF0ZSBleGVjIG1vZGUKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIGlmICggISBLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkgKSB7CisgICAgICAgICBfX2ttcF9lbmFibGVfdGFza2luZyggdGFza190ZWFtLCB0aHJlYWQgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzKSA9PSBUUlVFICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSX1BUUih0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhKSAhPSBOVUxMICk7CisKKyAgICAvLyBGaW5kIHRhc2tpbmcgZGVxdWUgc3BlY2lmaWMgdG8gZW5jb3VudGVyaW5nIHRocmVhZAorICAgIHRocmVhZF9kYXRhID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhWyB0aWQgXTsKKworICAgIC8vIE5vIGxvY2sgbmVlZGVkIHNpbmNlIG9ubHkgb3duZXIgY2FuIGFsbG9jYXRlCisgICAgaWYgKHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIHRocmVhZCwgdGhyZWFkX2RhdGEgKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBkZXF1ZSBpcyBmdWxsCisgICAgaWYgKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID49IFRBU0tfREVRVUVfU0laRSApCisgICAgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfcHVzaF90YXNrOiBUIyVkIGRlcXVlIGlzIGZ1bGw7IHJldHVybmluZyBUQVNLX05PVF9QVVNIRUQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKyAgICAgICAgcmV0dXJuIFRBU0tfTk9UX1BVU0hFRDsKKyAgICB9CisKKyAgICAvLyBMb2NrIHRoZSBkZXF1ZSBmb3IgdGhlIHRhc2sgcHVzaCBvcGVyYXRpb24KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworI2lmIE9NUF80MV9FTkFCTEVECisgICAgLy8gTmVlZCB0byByZWNoZWNrIGFzIHdlIGNhbiBnZXQgYSBwcm94eSB0YXNrIGZyb20gYSB0aHJlYWQgb3V0c2lkZSBvZiBPcGVuTVAKKyAgICBpZiAoIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPj0gVEFTS19ERVFVRV9TSVpFICkKKyAgICB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfcHVzaF90YXNrOiBUIyVkIGRlcXVlIGlzIGZ1bGwgb24gMm5kIGNoZWNrOyByZXR1cm5pbmcgVEFTS19OT1RfUFVTSEVEIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSApICk7CisgICAgICAgIHJldHVybiBUQVNLX05PVF9QVVNIRUQ7CisgICAgfQorI2Vsc2UKKyAgICAvLyBNdXN0IGhhdmUgcm9vbSBzaW5jZSBubyB0aHJlYWQgY2FuIGFkZCB0YXNrcyBidXQgY2FsbGluZyB0aHJlYWQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpIDwgVEFTS19ERVFVRV9TSVpFICk7CisjZW5kaWYKKworICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlWyB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsIF0gPSB0YXNrZGF0YTsgIC8vIFB1c2ggdGFza2RhdGEKKyAgICAvLyBXcmFwIGluZGV4LgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgKyAxICkgJiBUQVNLX0RFUVVFX01BU0s7CisgICAgVENXXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpICsgMSk7ICAgICAgICAgICAgIC8vIEFkanVzdCB0YXNrIGNvdW50CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCByZXR1cm5pbmcgVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEOiAiCisgICAgICAgICAgICAgICAgICAidGFzaz0lcCBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQpICk7CisKKyAgICByZXR1cm4gVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQ6IHNldCB1cCBjdXJyZW50IHRhc2sgZnJvbSBjYWxsZWQgdGhyZWFkIHdoZW4gdGVhbSBlbmRzCisvLyB0aGlzX3RocjogdGhyZWFkIHN0cnVjdHVyZSB0byBzZXQgY3VycmVudF90YXNrIGluLgorCit2b2lkCitfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoZW50ZXIpOiBUIyVkIHRoaXNfdGhyZWFkPSVwLCBjdXJ0YXNrPSVwLCAiCisgICAgICAgICAgICAgICAgICAgImN1cnRhc2tfcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgIDAsIHRoaXNfdGhyLCB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudCApICk7CisKKyAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgPSB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfcGFyZW50OworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoZXhpdCk6IFQjJWQgdGhpc190aHJlYWQ9JXAsIGN1cnRhc2s9JXAsICIKKyAgICAgICAgICAgICAgICAgICAiY3VydGFza19wYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgMCwgdGhpc190aHIsIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfcGFyZW50ICkgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkOiBzZXQgdXAgY3VycmVudCB0YXNrIGluIGNhbGxlZCB0aHJlYWQgZm9yIGEgbmV3IHRlYW0KKy8vIHRoaXNfdGhyOiB0aHJlYWQgc3RydWN0dXJlIHRvIHNldCB1cAorLy8gdGVhbTogdGVhbSBmb3IgaW1wbGljaXQgdGFzayBkYXRhCisvLyB0aWQ6IHRocmVhZCB3aXRoaW4gdGVhbSB0byBzZXQgdXAKKwordm9pZAorX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCApCit7CisgICAgLy8gY3VycmVudCB0YXNrIG9mIHRoZSB0aHJlYWQgaXMgYSBwYXJlbnQgb2YgdGhlIG5ldyBqdXN0IGNyZWF0ZWQgaW1wbGljaXQgdGFza3Mgb2YgbmV3IHRlYW0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZChlbnRlcik6IFQjJWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcCAiCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAodGhpc190aHIgIT0gTlVMTCk7CisKKyAgICBpZiggdGlkID09IDAgKSB7CisgICAgICAgIGlmKCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICE9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdICkgeworICAgICAgICAgICAgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdLnRkX3BhcmVudCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrID0gJiB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyAwIF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyB0aWQgXS50ZF9wYXJlbnQgPSB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyAwIF0udGRfcGFyZW50OworICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrID0gJiB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyB0aWQgXTsKKyAgICB9CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZChleGl0KTogVCMlZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwICIKKyAgICAgICAgICAgICAgICAgICAgInBhcmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX3BhcmVudCApICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3N0YXJ0OiBib29ra2VlcGluZyBmb3IgYSB0YXNrIHN0YXJ0aW5nIGV4ZWN1dGlvbgorLy8gR1RJRDogZ2xvYmFsIHRocmVhZCBpZCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFzazogdGFzayBzdGFydGluZyBleGVjdXRpb24KKy8vIGN1cnJlbnRfdGFzazogdGFzayBzdXNwZW5kaW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrX3N0YXJ0KCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2ssIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX2luZm9fdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfc3RhcnQoZW50ZXIpOiBUIyVkIHN0YXJ0aW5nIHRhc2sgJXA6IGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisKKyAgICAvLyBtYXJrIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayBhcyBzdXNwZW5kZWQKKyAgICAvLyBUT0RPOiBHRUggLSBtYWtlIHN1cmUgcm9vdCB0ZWFtIGltcGxpY2l0IHRhc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgICAgLy8gS01QX0RFQlVHX0FTU0VSVCggY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyAgICAvLyBBZGQgdGFzayB0byBzdGFjayBpZiB0aWVkCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgaWYgKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1RJRUQgKQorICAgIHsKKyAgICAgICAgX19rbXBfcHVzaF90YXNrX3N0YWNrKCBndGlkLCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisgICAgLy8gbWFyayBzdGFydGluZyB0YXNrIGFzIGV4ZWN1dGluZyBhbmQgYXMgY3VycmVudCB0YXNrCisgICAgdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayA9IHRhc2tkYXRhOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3Muc3RhcnRlZCA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5zdGFydGVkID0gMTsKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPSAxOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5mcmVlZCA9PSAwICk7CisKKyAgICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIHBhc3Mgc29tZSBzb3J0IG9mIGxvY2F0aW9uIGlkZW50aWZpZXIgaGVyZT8KKyAgICAvLyBBUFQ6IHllcywgd2Ugd2lsbCBwYXNzIGxvY2F0aW9uIGhlcmUuCisgICAgLy8gbmVlZCB0byBzdG9yZSBjdXJyZW50IHRocmVhZCBzdGF0ZSAoaW4gYSB0aHJlYWQgb3IgdGFza2RhdGEgc3RydWN0dXJlKQorICAgIC8vIGJlZm9yZSBzZXR0aW5nIHdvcmtfc3RhdGUsIG90aGVyd2lzZSB3cm9uZyBzdGF0ZSBpcyBzZXQgYWZ0ZXIgZW5kIG9mIHRhc2sKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfc3RhcnQoZXhpdCk6IFQjJWQgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgIGttcF90YXNrZGF0YV90ICpwYXJlbnQgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19iZWdpbikoCisgICAgICAgICAgICBwYXJlbnQgPyBwYXJlbnQtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQgOiBvbXB0X3Rhc2tfaWRfbm9uZSwKKyAgICAgICAgICAgIHBhcmVudCA/ICYocGFyZW50LT5vbXB0X3Rhc2tfaW5mby5mcmFtZSkgOiBOVUxMLAorICAgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQsCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnVuY3Rpb24pOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMDogcmVwb3J0IHRoYXQgYSBnaXZlbiBzZXJpYWxpemVkIHRhc2sgaGFzIHN0YXJ0ZWQgZXhlY3V0aW9uCisvLyBsb2NfcmVmOiBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb247IHBvaW50cyB0byBiZWdpbm5pbmcgb2YgdGFzayBibG9jay4KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorLy8gdGFzazogdGFzayB0aHVuayBmb3IgdGhlIHN0YXJ0ZWQgdGFzay4KKwordm9pZAorX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfY3VycmVudF90YXNrOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMChlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXAgY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgdGFza2RhdGEsIGN1cnJlbnRfdGFzayApICk7CisKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7ICAvLyBFeGVjdXRlIHRoaXMgdGFzayBpbW1lZGlhdGVseSwgbm90IGRlZmVycmVkLgorICAgIF9fa21wX3Rhc2tfc3RhcnQoIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMChleGl0KTogVCMlZCBsb2M9JXAgdGFzaz0lcCxcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCB0YXNrZGF0YSApICk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBUQVNLX1VOVVNFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfYmVnaW46IHJlcG9ydCB0aGF0IGEgZ2l2ZW4gdGFzayBoYXMgc3RhcnRlZCBleGVjdXRpb24KKy8vIE5FVkVSIEdFTkVSQVRFRCBCWSBDT01QSUxFUiwgREVQUkVDQVRFRCEhIQorCit2b2lkCitfX2ttcGNfb21wX3Rhc2tfYmVnaW4oIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfY3VycmVudF90YXNrOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2JlZ2luKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcCBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSwgY3VycmVudF90YXNrICkgKTsKKworICAgIF9fa21wX3Rhc2tfc3RhcnQoIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2JlZ2luKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwLFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBUQVNLX1VOVVNFRAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrOiBmcmVlIHRoZSBjdXJyZW50IHRhc2sgc3BhY2UgYW5kIHRoZSBzcGFjZSBmb3Igc2hhcmVkcworLy8gZ3RpZDogR2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFza2RhdGE6IHRhc2sgdG8gZnJlZQorLy8gdGhyZWFkOiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgb2YgY2FsbGVyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhLCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9mcmVlX3Rhc2s6IFQjJWQgZnJlZWluZyBkYXRhIGZyb20gdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBmbGFncyBhbmQgY291bnRlcnMgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5jb21wbGV0ZSA9PSAxICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0YXNrZGF0YS0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSA9PSAwICB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPT0gMSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpID09IDAgKTsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCA9IDE7CisgICAgLy8gZGVhbGxvY2F0ZSB0aGUgdGFza2RhdGEgYW5kIHNoYXJlZCB2YXJpYWJsZSBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFzaworICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgI2Vsc2UgLyogISBVU0VfRkFTVF9NRU1PUlkgKi8KKyAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUoIHRocmVhZCwgdGFza2RhdGEgKTsKKyAgICAjZW5kaWYKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZyZWVfdGFzazogVCMlZCBmcmVlZCB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEpICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnM6IGZyZWUgdGhlIGN1cnJlbnQgdGFzayBhbmQgYW5jZXN0b3JzIHdpdGhvdXQgY2hpbGRyZW4KKy8vCisvLyBndGlkOiBHbG9iYWwgdGhyZWFkIElEIG9mIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrZGF0YTogdGFzayB0byBmcmVlCisvLyB0aHJlYWQ6IHRocmVhZCBkYXRhIHN0cnVjdHVyZSBvZiBjYWxsZXIKKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSwga21wX2luZm9fdCAqIHRocmVhZCApCit7CisgICAga21wX2ludDMyIGNoaWxkcmVuID0gMDsKKyAgICBrbXBfaW50MzIgdGVhbV9vcl90YXNraW5nX3NlcmlhbGl6ZWQgPSB0YXNrZGF0YSAtPiB0ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNraW5nX3NlcjsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKworICAgIGlmICggIXRlYW1fb3JfdGFza2luZ19zZXJpYWxpemVkICkgeworICAgICAgICBjaGlsZHJlbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YSAtPiB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpICkgLSAxOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjaGlsZHJlbiA+PSAwICk7CisgICAgfQorCisgICAgLy8gTm93LCBnbyB1cCB0aGUgYW5jZXN0b3IgdHJlZSB0byBzZWUgaWYgYW55IGFuY2VzdG9ycyBjYW4gbm93IGJlIGZyZWVkLgorICAgIHdoaWxlICggY2hpbGRyZW4gPT0gMCApCisgICAgeworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudF90YXNrZGF0YSA9IHRhc2tkYXRhIC0+IHRkX3BhcmVudDsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhlbnRlcik6IFQjJWQgdGFzayAlcCBjb21wbGV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgImFuZCBmcmVlaW5nIGl0c2VsZlxuIiwgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICAgICAgLy8gLS0tIERlYWxsb2NhdGUgbXkgYW5jZXN0b3IgdGFzayAtLS0KKyAgICAgICAgX19rbXBfZnJlZV90YXNrKCBndGlkLCB0YXNrZGF0YSwgdGhyZWFkICk7CisKKyAgICAgICAgdGFza2RhdGEgPSBwYXJlbnRfdGFza2RhdGE7CisKKyAgICAgICAgLy8gU3RvcCBjaGVja2luZyBhbmNlc3RvcnMgYXQgaW1wbGljaXQgdGFzayBvciBpZiB0YXNraW5nIHNlcmlhbGl6ZWQKKyAgICAgICAgLy8gaW5zdGVhZCBvZiB3YWxraW5nIHVwIGFuY2VzdG9yIHRyZWUgdG8gYXZvaWQgcHJlbWF0dXJlIGRlYWxsb2NhdGlvbiBvZiBhbmNlc3RvcnMuCisgICAgICAgIGlmICggdGVhbV9vcl90YXNraW5nX3NlcmlhbGl6ZWQgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19JTVBMSUNJVCApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCAhdGVhbV9vcl90YXNraW5nX3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICAvLyBQcmVkZWNyZW1lbnQgc2ltdWxhdGVkIGJ5ICItIDEiIGNhbGN1bGF0aW9uCisgICAgICAgICAgICBjaGlsZHJlbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YSAtPiB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpICkgLSAxOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2hpbGRyZW4gPj0gMCApOworICAgICAgICB9CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZXhpdCk6IFQjJWQgdGFzayAlcCBoYXMgJWQgY2hpbGRyZW47ICIKKyAgICAgICAgICAgICAgICAgICJub3QgZnJlZWluZyBpdCB5ZXRcbiIsIGd0aWQsIHRhc2tkYXRhLCBjaGlsZHJlbikgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfZmluaXNoOiBib29ra2VlcGluZyB0byBkbyB3aGVuIGEgdGFzayBmaW5pc2hlcyBleGVjdXRpb24KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgSUQgZm9yIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrOiB0YXNrIHRvIGJlIGZpbmlzaGVkCisvLyByZXN1bWVkX3Rhc2s6IHRhc2sgdG8gYmUgcmVzdW1lZC4gIChtYXkgYmUgTlVMTCBpZiB0YXNrIGlzIHNlcmlhbGl6ZWQpCisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrX2ZpbmlzaCgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2ssIGttcF90YXNrZGF0YV90ICpyZXN1bWVkX3Rhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF9pbnQzMiBjaGlsZHJlbiA9IDA7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2VuZCkpIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2VuZCkoCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgfQorI2VuZGlmCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX2ZpbmlzaChlbnRlcik6IFQjJWQgZmluaXNoaW5nIHRhc2sgJXAgYW5kIHJlc3VtaW5nIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgcmVzdW1lZF90YXNrKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworCisgICAgLy8gUG9wIHRhc2sgZnJvbSBzdGFjayBpZiB0aWVkCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgaWYgKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1RJRUQgKQorICAgIHsKKyAgICAgICAgX19rbXBfcG9wX3Rhc2tfc3RhY2soIGd0aWQsIHRocmVhZCwgdGFza2RhdGEgKTsKKyAgICB9CisjZW5kaWYgLyogQlVJTERfVElFRF9UQVNLX1NUQUNLICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9PSAwICk7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPSAxOyAgIC8vIG1hcmsgdGhlIHRhc2sgYXMgY29tcGxldGVkCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3Muc3RhcnRlZCA9PSAxICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZnJlZWQgPT0gMCApOworCisgICAgLy8gT25seSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgY291bnQgaWYgdGVhbSBwYXJhbGxlbCBhbmQgdGFza2luZyBub3Qgc2VyaWFsaXplZAorICAgIGlmICggISggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza2luZ19zZXIgKSApIHsKKyAgICAgICAgLy8gUHJlZGVjcmVtZW50IHNpbXVsYXRlZCBieSAiLSAxIiBjYWxjdWxhdGlvbgorICAgICAgICBjaGlsZHJlbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YSAtPiB0ZF9wYXJlbnQgLT4gdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgKSAtIDE7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAgKQorICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAtPmNvdW50KSApOworICAgICAgICBfX2ttcF9yZWxlYXNlX2RlcHMoZ3RpZCx0YXNrZGF0YSk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyB0ZF9mbGFncy5leGVjdXRpbmcgIG11c3QgYmUgbWFya2VkIGFzIDAgYWZ0ZXIgX19rbXBfcmVsZWFzZV9kZXBzIGhhcyBiZWVuIGNhbGxlZAorICAgIC8vIE90aGVydHdpc2UsIGlmIGEgdGFzayBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBmcm9tIHRoZSByZWxlYXNlX2RlcHMgY29kZQorICAgIC8vIHRoZSBmbGFnIHdpbGwgYmUgcmVzZXQgdG8gMSBhZ2FpbiBieSB0aGlzIHNhbWUgZnVuY3Rpb24KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7ICAvLyBzdXNwZW5kIHRoZSBmaW5pc2hpbmcgdGFzaworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza19maW5pc2g6IFQjJWQgZmluaXNoZWQgdGFzayAlcCwgJWQgaW5jb21wbGV0ZSBjaGlsZHJlblxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjaGlsZHJlbikgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLyogSWYgdGhlIHRhc2tzJyBkZXN0cnVjdG9yIHRodW5rIGZsYWcgaGFzIGJlZW4gc2V0LCB3ZSBuZWVkIHRvIGludm9rZSB0aGUKKyAgICAgICBkZXN0cnVjdG9yIHRodW5rIHRoYXQgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4KKyAgICAgICBUaGUgY29kZSBpcyBwbGFjZWQgaGVyZSwgc2luY2UgYXQgdGhpcyBwb2ludCBvdGhlciB0YXNrcyBtaWdodCBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgICAgICBoZW5jZSBvdmVybGFwcGluZyB0aGUgZGVzdHJ1Y3RvciBpbnZva2F0aW9ucyB3aXRoIHNvbWUgb3RoZXIgd29yayBpbiB0aGUKKyAgICAgICByZWxlYXNlZCB0YXNrcy4gIFRoZSBPcGVuTVAgc3BlYyBpcyBub3Qgc3BlY2lmaWMgb24gd2hlbiB0aGUgZGVzdHJ1Y3RvcnMgYXJlCisgICAgICAgaW52b2tlZCwgc28gd2Ugc2hvdWxkIGJlIGZyZWUgdG8gY2hvb3NlLgorICAgICAqLworICAgIGlmICh0YXNrZGF0YS0+dGRfZmxhZ3MuZGVzdHJ1Y3RvcnNfdGh1bmspIHsKKyAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCBkZXN0cl90aHVuayA9IHRhc2stPmRlc3RydWN0b3JzOworICAgICAgICBLTVBfQVNTRVJUKGRlc3RyX3RodW5rKTsKKyAgICAgICAgZGVzdHJfdGh1bmsoZ3RpZCwgdGFzayk7CisgICAgfQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyAgICAvLyBib29ra2VlcGluZyBmb3IgcmVzdW1pbmcgdGFzazoKKyAgICAvLyBHRUggLSBub3RlIHRhc2tpbmdfc2VyID0+IHRhc2tfc2VyaWFsCisgICAgS01QX0RFQlVHX0FTU0VSVCggKHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwpID09CisgICAgICAgICAgICAgICAgICAgICAgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCk7CisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgKQorICAgIHsKKyAgICAgICAgaWYgKHJlc3VtZWRfdGFzayA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bWVkX3Rhc2sgPSB0YXNrZGF0YS0+dGRfcGFyZW50OyAgLy8gSW4gYSBzZXJpYWxpemVkIHRhc2ssIHRoZSByZXN1bWVkIHRhc2sgaXMgdGhlIHBhcmVudAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gdmVyaWZ5IHJlc3VtZWQgdGFzayBwYXNzZWQgaW4gcG9pbnRzIHRvIHBhcmVudAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrID09IHRhc2tkYXRhLT50ZF9wYXJlbnQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrICE9IE5VTEwgKTsgICAgICAgIC8vIHZlcmlmeSB0aGF0IHJlc3VtZWQgdGFzayBpcyBwYXNzZWQgYXMgYXJndWVtbnQKKyAgICB9CisKKyAgICAvLyBGcmVlIHRoaXMgdGFzayBhbmQgdGhlbiBhbmNlc3RvciB0YXNrcyBpZiB0aGV5IGhhdmUgbm8gY2hpbGRyZW4uCisgICAgLy8gUmVzdG9yZSB0aF9jdXJyZW50X3Rhc2sgZmlyc3QgYXMgc3VnZ2VzdGVkIGJ5IEpvaG46CisgICAgLy8gam9obm1jOiBpZiBhbiBhc3luY2hyb25vdXMgaW5xdWlyeSBwZWVycyBpbnRvIHRoZSBydW50aW1lIHN5c3RlbQorICAgIC8vIGl0IGRvZXNuJ3Qgc2VlIHRoZSBmcmVlZCB0YXNrIGFzIHRoZSBjdXJyZW50IHRhc2suCisgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgPSByZXN1bWVkX3Rhc2s7CisgICAgX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZ3RpZCwgdGFza2RhdGEsIHRocmVhZCk7CisKKyAgICAvLyBUT0RPOiBHRUggLSBtYWtlIHN1cmUgcm9vdCB0ZWFtIGltcGxpY2l0IHRhc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgICAgLy8gS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgIHJlc3VtZWRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsgIC8vIHJlc3VtZSBwcmV2aW91cyB0YXNrCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX2ZpbmlzaChleGl0KTogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjA6IHJlcG9ydCB0aGF0IGEgdGFzayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbgorLy8gbG9jX3JlZjogc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uOyBwb2ludHMgdG8gZW5kIG9mIHRhc2sgYmxvY2suCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIG51bWJlci4KKy8vIHRhc2s6IHRhc2sgdGh1bmsgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKwordm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2sgKQoreworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgX19rbXBfdGFza19maW5pc2goIGd0aWQsIHRhc2ssIE5VTEwgKTsgIC8vIHRoaXMgcm91dGluZSB3aWxsIHByb3ZpZGUgdGFzayB0byByZXN1bWUKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBUQVNLX1VOVVNFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19jb21wbGV0ZTogcmVwb3J0IHRoYXQgYSB0YXNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uCisvLyBORVZFUiBHRU5FUkFURUQgQlkgQ09NUElMRVIsIERFUFJFQ0FURUQhISEKKwordm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApCit7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBOVUxMICk7ICAvLyBOb3Qgc3VyZSBob3cgdG8gZmluZCB0YXNrIHRvIHJlc3VtZQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBUQVNLX1VOVVNFRAorCisKKyNpZiBPTVBUX1NVUFBPUlQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19pbml0X29tcHQ6CisvLyAgIEluaXRpYWxpemUgT01QVCBmaWVsZHMgbWFpbnRhaW5lZCBieSBhIHRhc2suIFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlcgorLy8gICBvbXB0X3Rvb2wsIHNvIHdlIGFscmVhZHkga25vdyB3aGV0aGVyIG9tcHQgaXMgZW5hYmxlZCBvciBub3QuCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfdGFza19pbml0X29tcHQoIGttcF90YXNrZGF0YV90ICogdGFzaywgaW50IHRpZCwgdm9pZCAqIGZ1bmN0aW9uICkKK3sKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHRhc2stPm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcodGlkKTsKKyAgICAgICAgdGFzay0+b21wdF90YXNrX2luZm8uZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgICAgICAgdGFzay0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgdGFzay0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICB9Cit9CisjZW5kaWYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2luaXRfaW1wbGljaXRfdGFzazogSW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBpbXBsaWNpdCB0YXNrIGZvciBhIGdpdmVuIHRocmVhZAorLy8KKy8vIGxvY19yZWY6ICByZWZlcmVuY2UgdG8gc291cmNlIGxvY2F0aW9uIG9mIHBhcmFsbGVsIHJlZ2lvbgorLy8gdGhpc190aHI6ICB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBpbXBsaWNpdCB0YXNrCisvLyB0ZWFtOiB0ZWFtIGZvciB0aGlzX3RocgorLy8gdGlkOiB0aHJlYWQgaWQgb2YgZ2l2ZW4gdGhyZWFkIHdpdGhpbiB0ZWFtCisvLyBzZXRfY3Vycl90YXNrOiBUUlVFIGlmIG5lZWQgdG8gcHVzaCBjdXJyZW50IHRhc2sgdG8gdGhyZWFkCisvLyBOT1RFOiBSb3V0aW5lIGRvZXMgbm90IHNldCB1cCB0aGUgaW1wbGljaXQgdGFzayBJQ1ZTLiAgVGhpcyBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIGRvbmUgZWxzZXdoZXJlLgorLy8gVE9ETzogR2V0IGJldHRlciBsb2NfcmVmLiAgVmFsdWUgcGFzc2VkIGluIG1heSBiZSBOVUxMCisKK3ZvaWQKK19fa21wX2luaXRfaW1wbGljaXRfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQsIGludCBzZXRfY3Vycl90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2sgICA9ICYgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIHRpZCBdOworCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGVudGVyKTogVCM6JWQgdGVhbT0lcCB0YXNrPSVwLCByZWluaXQ9JXNcbiIsCisgICAgICAgICAgICAgICAgICB0aWQsIHRlYW0sIHRhc2ssIHNldF9jdXJyX3Rhc2sgPyAiVFJVRSIgOiAiRkFMU0UiICkgKTsKKworICAgIHRhc2stPnRkX3Rhc2tfaWQgID0gS01QX0dFTl9UQVNLX0lEKCk7CisgICAgdGFzay0+dGRfdGVhbSAgICAgPSB0ZWFtOworLy8gICAgdGFzay0+dGRfcGFyZW50ICAgPSBOVUxMOyAgLy8gZml4IGZvciBDUTIzMDEwMSAoYnJva2VuIHBhcmVudCB0YXNrIGluZm8gaW4gZGVidWdnZXIpCisgICAgdGFzay0+dGRfaWRlbnQgICAgPSBsb2NfcmVmOworICAgIHRhc2stPnRkX3Rhc2t3YWl0X2lkZW50ICAgPSBOVUxMOworICAgIHRhc2stPnRkX3Rhc2t3YWl0X2NvdW50ZXIgPSAwOworICAgIHRhc2stPnRkX3Rhc2t3YWl0X3RocmVhZCAgPSAwOworCisgICAgdGFzay0+dGRfZmxhZ3MudGllZG5lc3MgICAgPSBUQVNLX1RJRUQ7CisgICAgdGFzay0+dGRfZmxhZ3MudGFza3R5cGUgICAgPSBUQVNLX0lNUExJQ0lUOworI2lmIE9NUF80MV9FTkFCTEVECisgICAgdGFzay0+dGRfZmxhZ3MucHJveHkgICAgICAgPSBUQVNLX0ZVTEw7CisjZW5kaWYKKworICAgIC8vIEFsbCBpbXBsaWNpdCB0YXNrcyBhcmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHksIG5vdCBkZWZlcnJlZAorICAgIHRhc2stPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsKKyAgICB0YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciA9ICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICB0YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCA9ICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSA/IDEgOiAwOworCisgICAgdGFzay0+dGRfZmxhZ3Muc3RhcnRlZCAgICAgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyAgID0gMTsKKyAgICB0YXNrLT50ZF9mbGFncy5jb21wbGV0ZSAgICA9IDA7CisgICAgdGFzay0+dGRfZmxhZ3MuZnJlZWQgICAgICAgPSAwOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgICB0YXNrLT50ZF9kZXBub2RlID0gTlVMTDsKKyNlbmRpZgorCisgICAgaWYgKHNldF9jdXJyX3Rhc2spIHsgIC8vIG9ubHkgZG8gdGhpcyBpbml0aWFsaXphdGlvbiB0aGUgZmlyc3QgdGltZSBhIHRocmVhZCBpcyBjcmVhdGVkCisgICAgICAgIHRhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MgPSAwOworICAgICAgICB0YXNrLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MgID0gMDsgLy8gTm90IHVzZWQgYmVjYXVzZSBkbyBub3QgbmVlZCB0byBkZWFsbG9jYXRlIGltcGxpY2l0IHRhc2sKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB0YXNrLT50ZF90YXNrZ3JvdXAgPSBOVUxMOyAgICAgICAgICAgLy8gQW4gaW1wbGljaXQgdGFzayBkb2VzIG5vdCBoYXZlIHRhc2tncm91cAorI2VuZGlmCisgICAgICAgIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCggdGhpc190aHIsIHRlYW0sIHRpZCApOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9PSAwKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MgID09IDApOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fa21wX3Rhc2tfaW5pdF9vbXB0KHRhc2ssIHRpZCwgTlVMTCk7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2luaXRfaW1wbGljaXRfdGFzayhleGl0KTogVCM6JWQgdGVhbT0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgdGlkLCB0ZWFtLCB0YXNrICkgKTsKK30KKworLy8gUm91bmQgdXAgYSBzaXplIHRvIGEgcG93ZXIgb2YgdHdvIHNwZWNpZmllZCBieSB2YWwKKy8vIFVzZWQgdG8gaW5zZXJ0IHBhZGRpbmcgYmV0d2VlbiBzdHJ1Y3R1cmVzIGNvLWFsbG9jYXRlZCB1c2luZyBhIHNpbmdsZSBtYWxsb2MoKSBjYWxsCitzdGF0aWMgc2l6ZV90CitfX2ttcF9yb3VuZF91cF90b192YWwoIHNpemVfdCBzaXplLCBzaXplX3QgdmFsICkgeworICAgIGlmICggc2l6ZSAmICggdmFsIC0gMSApICkgeworICAgICAgICBzaXplICY9IH4gKCB2YWwgLSAxICk7CisgICAgICAgIGlmICggc2l6ZSA8PSBLTVBfU0laRV9UX01BWCAtIHZhbCApIHsKKyAgICAgICAgICAgIHNpemUgKz0gdmFsOyAgICAvLyBSb3VuZCB1cCBpZiB0aGVyZSBpcyBubyBvdmVyZmxvdy4KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBzaXplOworfSAvLyBfX2ttcF9yb3VuZF91cF90b192YQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX2FsbG9jOiBBbGxvY2F0ZSB0aGUgdGFza2RhdGEgYW5kIHRhc2sgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIHRhc2sKKy8vCisvLyBsb2NfcmVmOiBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorLy8gZmxhZ3M6IGluY2x1ZGUgdGllZG5lc3MgJiB0YXNrIHR5cGUgKGV4cGxpY2l0IHZzLiBpbXBsaWNpdCkgb2YgdGhlICcnbmV3JycgdGFzayBlbmNvdW50ZXJlZC4KKy8vICAgICAgICBDb252ZXJ0ZWQgZnJvbSBrbXBfaW50MzIgdG8ga21wX3Rhc2tpbmdfZmxhZ3NfdCBpbiByb3V0aW5lLgorLy8gc2l6ZW9mX2ttcF90YXNrX3Q6ICBTaXplIGluIGJ5dGVzIG9mIGttcF90YXNrX3QgZGF0YSBzdHJ1Y3R1cmUgaW5jbHVkaW5nIHByaXZhdGUgdmFycyBhY2Nlc3NlZCBpbiB0YXNrLgorLy8gc2l6ZW9mX3NoYXJlZHM6ICBTaXplIGluIGJ5dGVzIG9mIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzIGFjY2Vzc2VkIGluIHRhc2suCisvLyB0YXNrX2VudHJ5OiBQb2ludGVyIHRvIHRhc2sgY29kZSBlbnRyeSBwb2ludCBnZW5lcmF0ZWQgYnkgY29tcGlsZXIuCisvLyByZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBrbXBfdGFza190IHN0cnVjdHVyZSAodGFzaykuCisKK2ttcF90YXNrX3QgKgorX19rbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNraW5nX2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKQoreworICAgIGttcF90YXNrX3QgKnRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyZWFkLT50aC50aF90ZWFtOworICAgIGttcF90YXNrZGF0YV90ICpwYXJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIHNpemVfdCBzaGFyZWRzX29mZnNldDsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfYWxsb2MoZW50ZXIpOiBUIyVkIGxvYz0lcCwgZmxhZ3M9KDB4JXgpICIKKyAgICAgICAgICAgICAgICAgICJzaXplb2ZfdGFzaz0lbGQgc2l6ZW9mX3NoYXJlZD0lbGQgZW50cnk9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCAqKChrbXBfaW50MzIgKilmbGFncyksIHNpemVvZl9rbXBfdGFza190LAorICAgICAgICAgICAgICAgICAgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpICk7CisKKyAgICBpZiAoIHBhcmVudF90YXNrLT50ZF9mbGFncy5maW5hbCApIHsKKyAgICAgICAgaWYgKGZsYWdzLT5tZXJnZWRfaWYwKSB7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MtPmZpbmFsID0gMTsKKyAgICB9CisKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIGlmICggZmxhZ3MtPnByb3h5ID09IFRBU0tfUFJPWFkgKSB7CisgICAgICAgIGZsYWdzLT50aWVkbmVzcyA9IFRBU0tfVU5USUVEOworICAgICAgICBmbGFncy0+bWVyZ2VkX2lmMCA9IDE7CisKKyAgICAgICAgLyogYXJlIHdlIHJ1bm5pbmcgaW4gYSBzZXF1ZW50aWFsIHBhcmFsbGVsIG9yIHRza21faW1tZWRpYXRlX2V4ZWMuLi4gd2UgbmVlZCB0YXNraW5nIHN1cHBvcnQgZW5hYmxlZCAqLworICAgICAgICBpZiAoICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSB0ZWFtIGlzIHNlcmlhbGl6ZWQKKyAgICAgICAgICAgICAgICBzZXR1cCBhIHRhc2sgdGVhbSBhbmQgcHJvcGFnYXRlIGl0IHRvIHRoZSB0aHJlYWQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9zZXJpYWxpemVkKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDMwLCgiVCMlZCBjcmVhdGluZyB0YXNrIHRlYW0gaW4gX19rbXBfdGFza19hbGxvYyBmb3IgcHJveHkgdGFza1xuIiwgZ3RpZCkpOworICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3NldHVwKHRocmVhZCx0ZWFtLDEpOyAvLyAxIGluZGljYXRlcyBzZXR1cCB0aGUgY3VycmVudCB0ZWFtIHJlZ2FyZGxlc3Mgb2YgbnRocmVhZHMKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVdOworICAgICAgICB9CisgICAgICAgIGttcF90YXNrX3RlYW1fdCAqIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworCisgICAgICAgIC8qIHRhc2tpbmcgbXVzdCBiZSBlbmFibGVkIG5vdyBhcyB0aGUgdGFzayBtaWdodCBub3QgYmUgcHVzaGVkICovCisgICAgICAgIGlmICggIUtNUF9UQVNLSU5HX0VOQUJMRUQoIHRhc2tfdGVhbSApICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMzAsKCJUIyVkIGVuYWJsaW5nIHRhc2tpbmcgaW4gX19rbXBfdGFza19hbGxvYyBmb3IgcHJveHkgdGFza1xuIiwgZ3RpZCkpOworICAgICAgICAgICAgX19rbXBfZW5hYmxlX3Rhc2tpbmcoIHRhc2tfdGVhbSwgdGhyZWFkICk7CisgICAgICAgICAgICBrbXBfaW50MzIgdGlkID0gdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKyAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICogdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIHRpZCBdOworICAgICAgICAgICAgLy8gTm8gbG9jayBuZWVkZWQgc2luY2Ugb25seSBvd25lciBjYW4gYWxsb2NhdGUKKyAgICAgICAgICAgIGlmICh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIHRocmVhZCwgdGhyZWFkX2RhdGEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyA9PSBGQUxTRSApCisgICAgICAgICAgVENXXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzLCBUUlVFKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIENhbGN1bGF0ZSBzaGFyZWQgc3RydWN0dXJlIG9mZnNldCBpbmNsdWRpbmcgcGFkZGluZyBhZnRlciBrbXBfdGFza190IHN0cnVjdAorICAgIC8vIHRvIGFsaWduIHBvaW50ZXJzIGluIHNoYXJlZCBzdHJ1Y3QKKyAgICBzaGFyZWRzX29mZnNldCA9IHNpemVvZigga21wX3Rhc2tkYXRhX3QgKSArIHNpemVvZl9rbXBfdGFza190OworICAgIHNoYXJlZHNfb2Zmc2V0ID0gX19rbXBfcm91bmRfdXBfdG9fdmFsKCBzaGFyZWRzX29mZnNldCwgc2l6ZW9mKCB2b2lkICogKSk7CisKKyAgICAvLyBBbGxvY2F0ZSBhIGttcF90YXNrZGF0YV90IGJsb2NrIGFuZCBhIGttcF90YXNrX3QgYmxvY2suCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBGaXJzdCBtYWxsb2Mgc2l6ZTogJWxkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgc2hhcmVkc19vZmZzZXQpICk7CisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBTZWNvbmQgbWFsbG9jIHNpemU6ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHNpemVvZl9zaGFyZWRzKSApOworCisgICAgLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRocmVhZCwgc2hhcmVkc19vZmZzZXQgKyBzaXplb2Zfc2hhcmVkcyApOworICAgICNlbHNlIC8qICEgVVNFX0ZBU1RfTUVNT1JZICovCisgICAgdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaGFyZWRzX29mZnNldCArIHNpemVvZl9zaGFyZWRzICk7CisgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworCisgICAgdGFzayAgICAgICAgICAgICAgICAgICAgICA9IEtNUF9UQVNLREFUQV9UT19UQVNLKHRhc2tkYXRhKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0YXNrICYgdGFza2RhdGEgYXJlIGFsaWduZWQgYXBwcm9wcmlhdGVseQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9QUEM2NCB8fCAhS01QX0hBVkVfUVVBRAorICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2tkYXRhKSAmIChzaXplb2YoZG91YmxlKS0xKSApID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrKSAmIChzaXplb2YoZG91YmxlKS0xKSApID09IDAgKTsKKyNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFza2RhdGEpICYgKHNpemVvZihfUXVhZCktMSkgKSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFzaykgJiAoc2l6ZW9mKF9RdWFkKS0xKSApID09IDAgKTsKKyNlbmRpZgorICAgIGlmIChzaXplb2Zfc2hhcmVkcyA+IDApIHsKKyAgICAgICAgLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisgICAgICAgIHRhc2stPnNoYXJlZHMgICAgICAgICA9ICYgKChjaGFyICopIHRhc2tkYXRhKVsgc2hhcmVkc19vZmZzZXQgXTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHNoYXJlZHMgc3RydWN0IGlzIGFsaWduZWQgdG8gcG9pbnRlciBzaXplCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2stPnNoYXJlZHMpICYgKHNpemVvZih2b2lkICopLTEpICkgPT0gMCApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRhc2stPnNoYXJlZHMgICAgICAgICA9IE5VTEw7CisgICAgfQorICAgIHRhc2stPnJvdXRpbmUgICAgICAgICAgICAgPSB0YXNrX2VudHJ5OworICAgIHRhc2stPnBhcnRfaWQgICAgICAgICAgICAgPSAwOyAgICAgIC8vIEFDOiBBbHdheXMgc3RhcnQgd2l0aCAwIHBhcnQgaWQKKworICAgIHRhc2tkYXRhLT50ZF90YXNrX2lkICAgICAgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICB0YXNrZGF0YS0+dGRfdGVhbSAgICAgICAgID0gdGVhbTsKKyAgICB0YXNrZGF0YS0+dGRfYWxsb2NfdGhyZWFkID0gdGhyZWFkOworICAgIHRhc2tkYXRhLT50ZF9wYXJlbnQgICAgICAgPSBwYXJlbnRfdGFzazsKKyAgICB0YXNrZGF0YS0+dGRfbGV2ZWwgICAgICAgID0gcGFyZW50X3Rhc2stPnRkX2xldmVsICsgMTsgLy8gaW5jcmVtZW50IG5lc3RpbmcgbGV2ZWwKKyAgICB0YXNrZGF0YS0+dGRfaWRlbnQgICAgICAgID0gbG9jX3JlZjsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQgICA9IE5VTEw7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgPSAwOworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgID0gMDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfcGFyZW50ICE9IE5VTEwgKTsKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIC8vIGF2b2lkIGNvcHlpbmcgaWN2cyBmb3IgcHJveHkgdGFza3MKKyAgICBpZiAoIGZsYWdzLT5wcm94eSA9PSBUQVNLX0ZVTEwgKQorI2VuZGlmCisgICAgICAgY29weV9pY3ZzKCAmdGFza2RhdGEtPnRkX2ljdnMsICZ0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9pY3ZzICk7CisKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgICAgPSBmbGFncy0+dGllZG5lc3M7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZpbmFsICAgICAgID0gZmxhZ3MtPmZpbmFsOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5tZXJnZWRfaWYwICA9IGZsYWdzLT5tZXJnZWRfaWYwOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmRlc3RydWN0b3JzX3RodW5rID0gZmxhZ3MtPmRlc3RydWN0b3JzX3RodW5rOworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgICAgICAgICAgID0gZmxhZ3MtPnByb3h5OworI2VuZGlmCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2t0eXBlICAgID0gVEFTS19FWFBMSUNJVDsKKworICAgIC8vIEdFSCAtIFRPRE86IGZpeCB0aGlzIHRvIGNvcHkgcGFyZW50IHRhc2sncyB2YWx1ZSBvZiB0YXNraW5nX3NlciBmbGFnCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyID0gKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgLy8gR0VIIC0gVE9ETzogZml4IHRoaXMgdG8gY29weSBwYXJlbnQgdGFzaydzIHZhbHVlIG9mIHRlYW1fc2VyaWFsIGZsYWcKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgPSAoIHRlYW0tPnQudF9zZXJpYWxpemVkICkgPyAxIDogMDsKKworICAgIC8vIEdFSCAtIE5vdGUgd2Ugc2VyaWFsaXplIHRoZSB0YXNrIGlmIHRoZSB0ZWFtIGlzIHNlcmlhbGl6ZWQgdG8gbWFrZSBzdXJlIGltcGxpY2l0IHBhcmFsbGVsIHJlZ2lvbgorICAgIC8vICAgICAgIHRhc2tzIGFyZSBub3QgbGVmdCB1bnRpbCBwcm9ncmFtIHRlcm1pbmF0aW9uIHRvIGV4ZWN1dGUuICBBbHNvLCBpdCBoZWxwcyBsb2NhbGl0eSB0byBleGVjdXRlCisgICAgLy8gICAgICAgaW1tZWRpYXRlbHkuCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gKCBwYXJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWwKKyAgICAgIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIgKTsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5zdGFydGVkICAgICA9IDA7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyAgID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuY29tcGxldGUgICAgPSAwOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCAgICAgICA9IDA7CisKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MubmF0aXZlICAgICAgPSBmbGFncy0+bmF0aXZlOworCisgICAgdGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MgPSAwOworICAgIHRhc2tkYXRhLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MgID0gMTsgLy8gc3RhcnQgYXQgb25lIGJlY2F1c2UgY291bnRzIGN1cnJlbnQgdGFzayBhbmQgY2hpbGRyZW4KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAgPSBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwOyAvLyB0YXNrIGluaGVyaXRzIHRoZSB0YXNrZ3JvdXAgZnJvbSB0aGUgcGFyZW50IHRhc2sKKyAgICB0YXNrZGF0YS0+dGRfZGVwaGFzaCA9IE5VTEw7CisgICAgdGFza2RhdGEtPnRkX2RlcG5vZGUgPSBOVUxMOworI2VuZGlmCisKKyAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjaGlsZCB0YXNrIGNvdW50cyBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nIG5vdCBzZXJpYWxpemVkIG9yIGlmIGl0IGlzIGEgcHJveHkgdGFzaworI2lmIE9NUF80MV9FTkFCTEVECisgICAgaWYgKCBmbGFncy0+cHJveHkgPT0gVEFTS19QUk9YWSB8fCAhKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNraW5nX3NlciApICkgCisjZWxzZQorICAgIGlmICggISggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza2luZ19zZXIgKSApIAorI2VuZGlmCisgICAgeworICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgcGFyZW50X3Rhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwICkKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwLT5jb3VudCkgKTsKKyNlbmRpZgorICAgICAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBhbGxvY2F0ZWQgY2hpbGQgdGFza3MgZm9yIGV4cGxpY2l0IHRhc2tzIHNpbmNlIGltcGxpY2l0IG5vdCBkZWFsbG9jYXRlZAorICAgICAgICBpZiAoIHRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKSB7CisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSApOworICAgICAgICB9CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza19hbGxvYyhleGl0KTogVCMlZCBjcmVhdGVkIHRhc2sgJXAgcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHRhc2tkYXRhLT50ZF9wYXJlbnQpICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBfX2ttcF90YXNrX2luaXRfb21wdCh0YXNrZGF0YSwgZ3RpZCwgKHZvaWQqKSB0YXNrX2VudHJ5KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHRhc2s7Cit9CisKKwora21wX3Rhc2tfdCAqCitfX2ttcGNfb21wX3Rhc2tfYWxsb2MoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKQoreworICAgIGttcF90YXNrX3QgKnJldHZhbDsKKyAgICBrbXBfdGFza2luZ19mbGFnc190ICppbnB1dF9mbGFncyA9IChrbXBfdGFza2luZ19mbGFnc190ICopICYgZmxhZ3M7CisKKyAgICBpbnB1dF9mbGFncy0+bmF0aXZlID0gRkFMU0U7CisgICAgLy8gX19rbXBfdGFza19hbGxvYygpIHNldHMgdXAgYWxsIG90aGVyIHJ1bnRpbWUgZmxhZ3MKKworI2lmIE9NUF80MV9FTkFCTEVECisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGVudGVyKTogVCMlZCBsb2M9JXAsIGZsYWdzPSglcyAlcykgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGlucHV0X2ZsYWdzLT50aWVkbmVzcyA/ICJ0aWVkICAiIDogInVudGllZCIsCisgICAgICAgICAgICAgICAgICBpbnB1dF9mbGFncy0+cHJveHkgPyAicHJveHkiIDogIiIsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpICk7CisjZWxzZQorICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19hbGxvYyhlbnRlcik6IFQjJWQgbG9jPSVwLCBmbGFncz0oJXMpICIKKyAgICAgICAgICAgICAgICAgICJzaXplb2ZfdGFzaz0lbGQgc2l6ZW9mX3NoYXJlZD0lbGQgZW50cnk9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBpbnB1dF9mbGFncy0+dGllZG5lc3MgPyAidGllZCAgIiA6ICJ1bnRpZWQiLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVvZl9zaGFyZWRzLCB0YXNrX2VudHJ5KSApOworI2VuZGlmCisKKyAgICByZXR2YWwgPSBfX2ttcF90YXNrX2FsbG9jKCBsb2NfcmVmLCBndGlkLCBpbnB1dF9mbGFncywgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19vbXBfdGFza19hbGxvYyhleGl0KTogVCMlZCByZXR2YWwgJXBcbiIsIGd0aWQsIHJldHZhbCkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9pbnZva2VfdGFzazogaW52b2tlIHRoZSBzcGVjaWZpZWQgdGFzaworLy8KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGVyCisvLyB0YXNrOiB0aGUgdGFzayB0byBpbnZva2UKKy8vIGN1cnJlbnRfdGFzazogdGhlIHRhc2sgdG8gcmVzdW1lIGFmdGVyIHRhc2sgaW52b2thdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfaW52b2tlX3Rhc2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrLCBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaW50IGRpc2NhcmQgPSAwIC8qIGZhbHNlICovOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfaW52b2tlX3Rhc2soZW50ZXIpOiBUIyVkIGludm9raW5nIHRhc2sgJXAsIGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrKTsKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIGlmICggdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkgJiYKKyAgICAgICAgIHRhc2tkYXRhLT50ZF9mbGFncy5jb21wbGV0ZSA9PSAxKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHByb3h5IHRhc2sgdGhhdCB3YXMgYWxyZWFkeSBjb21wbGV0ZWQgYnV0IGl0IG5lZWRzIHRvIHJ1bgorICAgICAgICAgICAgLy8gaXRzIGJvdHRvbS1oYWxmIGZpbmlzaAorICAgICAgICAgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfaW52b2tlX3Rhc2s6IFQjJWQgcnVubmluZyBib3R0b20gZmluaXNoIGZvciBwcm94eSB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICAgICAgICAgIF9fa21wX2JvdHRvbV9oYWxmX2ZpbmlzaF9wcm94eShndGlkLHRhc2spOworCisgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnZva2VfdGFzayhleGl0KTogVCMlZCBjb21wbGV0ZWQgYm90dG9tIGZpbmlzaCBmb3IgcHJveHkgdGFzayAlcCwgcmVzdW1pbmcgdGFzayAlcFxuIiwgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykgKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIC8vIFByb3h5IHRhc2tzIGFyZSBub3QgaGFuZGxlZCBieSB0aGUgcnVudGltZQorICAgIGlmICggdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ICE9IFRBU0tfUFJPWFkgKQorI2VuZGlmCisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3RocmVhZF9pbmZvX3Qgb2xkSW5mbzsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkOworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLy8gU3RvcmUgdGhlIHRocmVhZHMgc3RhdGVzIGFuZCByZXN0b3JlIHRoZW0gYWZ0ZXIgdGhlIHRhc2sKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICBvbGRJbmZvID0gdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvOworICAgICAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLyBUT0RPOiBjYW5jZWwgdGFza3MgaWYgdGhlIHBhcmFsbGVsIHJlZ2lvbiBoYXMgYWxzbyBiZWVuIGNhbmNlbGxlZAorICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoaXMgc2VxdWVuY2UgY2FuIGJlIGhvaXN0ZWQgYWJvdmUgX19rbXBfdGFza19zdGFydAorICAgIC8vIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiBlbmFibGVkIGZvciB0aGlzIHJ1biAuLi4KKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHMgWyBndGlkIF07CisgICAgICAgIGttcF90ZWFtX3QgKiB0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAga21wX3Rhc2tncm91cF90ICogdGFza2dyb3VwID0gdGFza2RhdGEtPnRkX3Rhc2tncm91cDsKKyAgICAgICAgaWYgKCh0YXNrZ3JvdXAgJiYgdGFza2dyb3VwLT5jYW5jZWxfcmVxdWVzdCkgfHwgKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID09IGNhbmNlbF9wYXJhbGxlbCkpIHsKKyAgICAgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhUQVNLX2NhbmNlbGxlZCk7CisgICAgICAgICAgICAvLyB0aGlzIHRhc2sgYmVsb25ncyB0byBhIHRhc2sgZ3JvdXAgYW5kIHdlIG5lZWQgdG8gY2FuY2VsIGl0CisgICAgICAgICAgICBkaXNjYXJkID0gMSAvKiB0cnVlICovOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJbnZva2UgdGhlIHRhc2sgcm91dGluZSBhbmQgcGFzcyBpbiByZWxldmFudCBkYXRhLgorICAgIC8vIFRodW5rcyBnZW5lcmF0ZWQgYnkgZ2NjIHRha2UgYSBkaWZmZXJlbnQgYXJndW1lbnQgbGlzdC4KKyAgICAvLworICAgIGlmICghZGlzY2FyZCkgeworICAgICAgICBLTVBfQ09VTlRfQkxPQ0soVEFTS19leGVjdXRlZCk7CisgICAgICAgIEtNUF9USU1FX0JMT0NLIChUQVNLX2V4ZWN1dGlvbik7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIC8qIGxldCBPTVBUIGtub3cgdGhhdCB3ZSdyZSBhYm91dCB0byBydW4gdGhpcyB0YXNrICovCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19zd2l0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoKSgKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy5uYXRpdmUpIHsKKyAgICAgICAgICAgICgodm9pZCAoKikodm9pZCAqKSkoKih0YXNrLT5yb3V0aW5lKSkpKHRhc2stPnNoYXJlZHMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKCoodGFzay0+cm91dGluZSkpKGd0aWQsIHRhc2spOworICAgICAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICAvKiBsZXQgT01QVCBrbm93IHRoYXQgd2UncmUgcmV0dXJuaW5nIHRvIHRoZSBjYWxsZWUgdGFzayAqLworICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoKSkKKyAgICAgICAgeworICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX3N3aXRjaCkoCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8gPSBvbGRJbmZvOworICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MV9FTkFCTEVECisgICAgLy8gUHJveHkgdGFza3MgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBydW50aW1lCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgIT0gVEFTS19QUk9YWSApCisjZW5kaWYKKyAgICAgICBfX2ttcF90YXNrX2ZpbmlzaCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnZva2VfdGFzayhleGl0KTogVCMlZCBjb21wbGV0ZWQgdGFzayAlcCwgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisgICAgcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfcGFydHM6IFNjaGVkdWxlIGEgdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmb3IgZXhlY3V0aW9uCisvLworLy8gbG9jX3JlZjogbG9jYXRpb24gb2Ygb3JpZ2luYWwgdGFzayBwcmFnbWEgKGlnbm9yZWQpCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpIGZvciB0aGUgJyduZXcgdGFzaycnCisvLyBSZXR1cm5zOgorLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisvLyAgICBUQVNLX0NVUlJFTlRfUVVFVUVEICgxKSBpZiBzdXNwZW5kZWQgYW5kIHF1ZXVlZCB0aGUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrX3BhcnRzKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrKQoreworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3BhcnRzKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICAvKiBTaG91bGQgd2UgZXhlY3V0ZSB0aGUgbmV3IHRhc2sgb3IgcXVldWUgaXQ/ICAgRm9yIG5vdywgbGV0J3MganVzdCBhbHdheXMgdHJ5IHRvCisgICAgICAgcXVldWUgaXQuICBJZiB0aGUgcXVldWUgZmlsbHMgdXAsIHRoZW4gd2UnbGwgZXhlY3V0ZSBpdC4gICovCisKKyAgICBpZiAoIF9fa21wX3B1c2hfdGFzayggZ3RpZCwgbmV3X3Rhc2sgKSA9PSBUQVNLX05PVF9QVVNIRUQgKSAvLyBpZiBjYW5ub3QgZGVmZXIKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoaXMgdGFzayBpbW1lZGlhdGVseQorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIG5ld190YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzayApOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19wYXJ0cyhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6ICIKKyAgICAgICAgICAgICAgICAgICJsb2M9JXAgdGFzaz0lcCwgcmV0dXJuOiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwgZ3RpZCwgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YSApICk7CisKKyAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9vbXBfdGFzazogU2NoZWR1bGUgYSBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmb3IgZXhlY3V0aW9uCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKQorLy8gc2VyaWFsaXplX2ltbWVkaWF0ZTogaWYgVFJVRSB0aGVuIGlmIHRoZSB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGl0cyBleGVjdXRpb24gd2lsbCBiZSBzZXJpYWxpemVkCisvLyByZXR1cm5zOgorLy8KKy8vICAgIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEICgwKSBpZiBkaWQgbm90IHN1c3BlbmQgYW5kIHF1ZXVlIGN1cnJlbnQgdGFzayB0byBiZSByZXN1bWVkIGxhdGVyLgorLy8gICAgVEFTS19DVVJSRU5UX1FVRVVFRCAoMSkgaWYgc3VzcGVuZGVkIGFuZCBxdWV1ZWQgdGhlIGN1cnJlbnQgdGFzayB0byBiZSByZXN1bWVkIGxhdGVyLgora21wX2ludDMyCitfX2ttcF9vbXBfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywgYm9vbCBzZXJpYWxpemVfaW1tZWRpYXRlICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIG5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPQorICAgICAgICAgICAgX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBTaG91bGQgd2UgZXhlY3V0ZSB0aGUgbmV3IHRhc2sgb3IgcXVldWUgaXQ/ICAgRm9yIG5vdywgbGV0J3MganVzdCBhbHdheXMgdHJ5IHRvCisgICAgICAgcXVldWUgaXQuICBJZiB0aGUgcXVldWUgZmlsbHMgdXAsIHRoZW4gd2UnbGwgZXhlY3V0ZSBpdC4gICovCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICBpZiAoIG5ld190YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSB8fCBfX2ttcF9wdXNoX3Rhc2soIGd0aWQsIG5ld190YXNrICkgPT0gVEFTS19OT1RfUFVTSEVEICkgLy8gaWYgY2Fubm90IGRlZmVyCisjZWxzZQorICAgIGlmICggX19rbXBfcHVzaF90YXNrKCBndGlkLCBuZXdfdGFzayApID09IFRBU0tfTk9UX1BVU0hFRCApIC8vIGlmIGNhbm5vdCBkZWZlcgorI2VuZGlmCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGlzIHRhc2sgaW1tZWRpYXRlbHkKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfY3VycmVudF90YXNrOworICAgICAgICBpZiAoIHNlcmlhbGl6ZV9pbW1lZGlhdGUgKQorICAgICAgICAgIG5ld190YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7CisgICAgICAgIF9fa21wX2ludm9rZV90YXNrKCBndGlkLCBuZXdfdGFzaywgY3VycmVudF90YXNrICk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2s6IFdyYXBwZXIgYXJvdW5kIF9fa21wX29tcF90YXNrIHRvIHNjaGVkdWxlIGEgbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgZnJvbQorLy8gdGhlIHBhcmVudCB0aHJlYWQgb25seSEKKy8vIGxvY19yZWY6IGxvY2F0aW9uIG9mIG9yaWdpbmFsIHRhc2sgcHJhZ21hIChpZ25vcmVkKQorLy8gZ3RpZDogR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisvLyBuZXdfdGFzazogbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkKKy8vIHJldHVybnM6CisvLworLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisvLyAgICBUQVNLX0NVUlJFTlRfUVVFVUVEICgxKSBpZiBzdXNwZW5kZWQgYW5kIHF1ZXVlZCB0aGUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrKQoreworICAgIGttcF9pbnQzMiByZXM7CisKKyNpZiBLTVBfREVCVUcKKyAgICBrbXBfdGFza2RhdGFfdCAqIG5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKyNlbmRpZgorICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFzayhlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEgKSApOworCisgICAgcmVzID0gIF9fa21wX29tcF90YXNrKGd0aWQsbmV3X3Rhc2ssdHJ1ZSk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2soZXhpdCk6IFQjJWQgcmV0dXJuaW5nIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOiBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2t3YWl0OiBXYWl0IHVudGlsIGFsbCB0YXNrcyBnZW5lcmF0ZWQgYnkgdGhlIGN1cnJlbnQgdGFzayBhcmUgY29tcGxldGUKKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t3YWl0KCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkOworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3dhaXQoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgYmVnaW4gd2FpdD8KKworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBteV9wYXJhbGxlbF9pZDsKKyAgICAgICAgCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgICAgICAgICAgICBteV90YXNrX2lkID0gdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCA9IHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW4pKSB7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gTm90ZTogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IElUVCBldmVudHMgYXMgd2VsbC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICs9IDE7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgICA9IGd0aWQgKyAxOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdCggZ3RpZCApOworICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAgICAgaWYgKCAhIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCAodGhyZWFkLT50aC50aF90YXNrX3RlYW0gIT0gTlVMTCAmJiB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MpICkgCisjZWxzZQorICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsICkgCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgLy8gR0VIOiBpZiB0ZWFtIHNlcmlhbGl6ZWQsIGF2b2lkIHJlYWRpbmcgdGhlIHZvbGF0aWxlIHZhcmlhYmxlIGJlbG93LgorICAgICAgICAgICAga21wX2ZsYWdfMzIgZmxhZygmKHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSwgMFUpOworICAgICAgICAgICAgd2hpbGUgKCBUQ1JfNCh0YXNrZGF0YSAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSAhPSAwICkgeworICAgICAgICAgICAgICAgIGZsYWcuZXhlY3V0ZV90YXNrcyh0aHJlYWQsIGd0aWQsIEZBTFNFLCAmdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgZW5kIG9mIHdhaXQ/CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgPSAtIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQ7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrd2FpdChleGl0KTogVCMlZCB0YXNrICVwIGZpbmlzaGVkIHdhaXRpbmcsICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNreWllbGQ6IHN3aXRjaCB0byBhIGRpZmZlcmVudCB0YXNrCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNreWllbGQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBpbnQgZW5kX3BhcnQgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX1RBU0tZSUVMRCk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t5aWVsZChlbnRlcik6IFQjJWQgbG9jPSVwIGVuZF9wYXJ0ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBlbmRfcGFydCkgKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgJiYgX19rbXBfaW5pdF9wYXJhbGxlbCApIHsKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBiZWdpbiB3YWl0PworCisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgdGFza2RhdGEgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgICAgICAvLyBTaG91bGQgd2UgbW9kZWwgdGhpcyBhcyBhIHRhc2sgd2FpdCBvciBub3Q/CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBOb3RlOiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgSVRUIGV2ZW50cyBhcyB3ZWxsLgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgKz0gMTsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ICAgID0gbG9jX3JlZjsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCAgID0gZ3RpZCArIDE7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBndGlkICk7CisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKSB7CisgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKiB0YXNrX3RlYW0gPSB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbTsKKyAgICAgICAgICAgIGlmICh0YXNrX3RlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrc18zMiggdGhyZWFkLCBndGlkLCBOVUxMLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBlbmQgb2Ygd2FpdD8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCA9IC0gdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZDsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t5aWVsZChleGl0KTogVCMlZCB0YXNrICVwIHJlc3VtaW5nLCAiCisgICAgICAgICAgICAgICAgICAicmV0dXJuaW5nIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEXG4iLCBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX3Rhc2tncm91cDogU3RhcnQgYSBuZXcgdGFza2dyb3VwCisKK3ZvaWQKK19fa21wY190YXNrZ3JvdXAoIGlkZW50X3QqIGxvYywgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICAgICAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAgKiB0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIGttcF90YXNrZ3JvdXBfdCAqIHRnX25ldyA9CisgICAgICAgIChrbXBfdGFza2dyb3VwX3QgKilfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemVvZigga21wX3Rhc2tncm91cF90ICkgKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza2dyb3VwOiBUIyVkIGxvYz0lcCBncm91cD0lcFxuIiwgZ3RpZCwgbG9jLCB0Z19uZXcpICk7CisgICAgdGdfbmV3LT5jb3VudCA9IDA7CisgICAgdGdfbmV3LT5jYW5jZWxfcmVxdWVzdCA9IGNhbmNlbF9ub3JlcTsKKyAgICB0Z19uZXctPnBhcmVudCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHRnX25ldzsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19lbmRfdGFza2dyb3VwOiBXYWl0IHVudGlsIGFsbCB0YXNrcyBnZW5lcmF0ZWQgYnkgdGhlIGN1cnJlbnQgdGFzaworLy8gICAgICAgICAgICAgICAgICAgICAgIGFuZCBpdHMgZGVzY2VuZGFudHMgYXJlIGNvbXBsZXRlCisKK3ZvaWQKK19fa21wY19lbmRfdGFza2dyb3VwKCBpZGVudF90KiBsb2MsIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICAgICAgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgICogdGFza2RhdGEgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBrbXBfdGFza2dyb3VwX3QgKiB0YXNrZ3JvdXAgPSB0YXNrZGF0YS0+dGRfdGFza2dyb3VwOworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19lbmRfdGFza2dyb3VwKGVudGVyKTogVCMlZCBsb2M9JXBcbiIsIGd0aWQsIGxvYykgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZ3JvdXAgIT0gTlVMTCApOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIEZvciBJVFQgdGhlIHRhc2tncm91cCB3YWl0IGlzIHNpbWlsYXIgdG8gdGFza3dhaXQgdW50aWwgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVtCisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBndGlkICk7CisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8ICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICYmIHRocmVhZC0+dGgudGhfdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcykgKSAKKyNlbHNlCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKSAKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBrbXBfZmxhZ18zMiBmbGFnKCYodGFza2dyb3VwLT5jb3VudCksIDBVKTsKKyAgICAgICAgICAgIHdoaWxlICggVENSXzQodGFza2dyb3VwLT5jb3VudCkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBmbGFnLmV4ZWN1dGVfdGFza3ModGhyZWFkLCBndGlkLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZ3JvdXAtPmNvdW50ID09IDAgKTsKKworICAgIC8vIFJlc3RvcmUgcGFyZW50IHRhc2tncm91cCBmb3IgdGhlIGN1cnJlbnQgdGFzaworICAgIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAgPSB0YXNrZ3JvdXAtPnBhcmVudDsKKyAgICBfX2ttcF90aHJlYWRfZnJlZSggdGhyZWFkLCB0YXNrZ3JvdXAgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19lbmRfdGFza2dyb3VwKGV4aXQpOiBUIyVkIHRhc2sgJXAgZmluaXNoZWQgd2FpdGluZ1xuIiwgZ3RpZCwgdGFza2RhdGEpICk7Cit9CisjZW5kaWYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcmVtb3ZlX215X3Rhc2s6IHJlbW92ZSBhIHRhc2sgZnJvbSBteSBvd24gZGVxdWUKKworc3RhdGljIGttcF90YXNrX3QgKgorX19rbXBfcmVtb3ZlX215X3Rhc2soIGttcF9pbmZvX3QgKiB0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQgKQoreworICAgIGttcF90YXNrX3QgKiB0YXNrOworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGE7CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhOworICAgIGttcF91aW50MzIgdGFpbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSAhPSBOVUxMICk7IC8vIENhbGxlciBzaG91bGQgY2hlY2sgdGhpcyBjb25kaXRpb24KKworICAgICAgICB0aHJlYWRfZGF0YSA9ICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVsgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApIF07CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhlbnRlcik6IFQjJWQgbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisKKyAgICBpZiAoVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwKSB7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzEpOiBUIyVkIE5vIHRhc2tzIHRvIHJlbW92ZTogbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBpZiAoVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMyKTogVCMlZCBObyB0YXNrcyB0byByZW1vdmU6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHRhaWwgPSAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgLSAxICkgJiBUQVNLX0RFUVVFX01BU0s7ICAvLyBXcmFwIGluZGV4LgorICAgIHRhc2tkYXRhID0gdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVbIHRhaWwgXTsKKworICAgIGlmIChpc19jb25zdHJhaW5lZCkgeworICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBjYW5kaWRhdGUgb2JleXMgdGFzayBzY2hlZHVsaW5nIGNvbnN0cmFpbnQ6CisgICAgICAgIC8vIG9ubHkgY2hpbGQgb2YgY3VycmVudCB0YXNrIGNhbiBiZSBzY2hlZHVsZWQKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50ID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIGttcF9pbnQzMiAgICAgICAgbGV2ZWwgPSBjdXJyZW50LT50ZF9sZXZlbDsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnQgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICB3aGlsZSAoIHBhcmVudCAhPSBjdXJyZW50ICYmIHBhcmVudC0+dGRfbGV2ZWwgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC0+dGRfcGFyZW50OyAgLy8gY2hlY2sgZ2VuZXJhdGlvbiB1cCB0byB0aGUgbGV2ZWwgb2YgdGhlIGN1cnJlbnQgdGFzaworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChwYXJlbnQgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwYXJlbnQgIT0gY3VycmVudCApIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSB0YWlsIHRhc2sgaXMgbm90IGEgY2hpbGQsIHRoZW4gbm8gb3RoZXIgY2hpbGRzIGNhbiBhcHBlYXIgaW4gdGhlIGRlcXVlLgorICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMyKTogVCMlZCBObyB0YXNrcyB0byByZW1vdmU6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9IHRhaWw7CisgICAgVENXXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MgLSAxKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIHRhc2sgJXAgcmVtb3ZlZDogbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgdGFzayA9IEtNUF9UQVNLREFUQV9UT19UQVNLKCB0YXNrZGF0YSApOworICAgIHJldHVybiB0YXNrOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3N0ZWFsX3Rhc2s6IHJlbW92ZSBhIHRhc2sgZnJvbSBhbm90aGVyIHRocmVhZCdzIGRlcXVlCisvLyBBc3N1bWUgdGhhdCBjYWxsaW5nIHRocmVhZCBoYXMgYWxyZWFkeSBjaGVja2VkIGV4aXN0ZW5jZSBvZgorLy8gdGFza190ZWFtIHRocmVhZF9kYXRhIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKworc3RhdGljIGttcF90YXNrX3QgKgorX19rbXBfc3RlYWxfdGFzaygga21wX2luZm9fdCAqdmljdGltLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBrbXBfdWludDMyICp1bmZpbmlzaGVkX3RocmVhZHMsIGludCAqdGhyZWFkX2ZpbmlzaGVkLAorICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkICkKK3sKKyAgICBrbXBfdGFza190ICogdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF90aHJlYWRfZGF0YV90ICp2aWN0aW1fdGQsICp0aHJlYWRzX2RhdGE7CisgICAga21wX2ludDMyIHZpY3RpbV90aWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgdGhyZWFkc19kYXRhID0gdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRzX2RhdGEgIT0gTlVMTCApOyAgLy8gQ2FsbGVyIHNob3VsZCBjaGVjayB0aGlzIGNvbmRpdGlvbgorCisgICAgdmljdGltX3RpZCA9IHZpY3RpbS0+dGgudGhfaW5mby5kcy5kc190aWQ7CisgICAgdmljdGltX3RkID0gJiB0aHJlYWRzX2RhdGFbIHZpY3RpbV90aWQgXTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZW50ZXIpOiBUIyVkIHRyeSB0byBzdGVhbCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCBudGFza3M9JWQgIgorICAgICAgICAgICAgICAgICAgImhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHZpY3RpbSApLCB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisKKyAgICBpZiAoIChUQ1JfNCh2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwKSB8fCAvLyBDYWxsZXIgc2hvdWxkIG5vdCBjaGVjayB0aGlzIGNvbmRpdGlvbgorICAgICAgICAgKFRDUl9QVFIodmljdGltLT50aC50aF90YXNrX3RlYW0pICE9IHRhc2tfdGVhbSkpIC8vIEdFSDogd2h5IHdvdWxkIHRoaXMgaGFwcGVuPworICAgIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhleGl0ICMxKTogVCMlZCBjb3VsZCBub3Qgc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHZpY3RpbSApLCB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICAvLyBDaGVjayBhZ2FpbiBhZnRlciB3ZSBhY3F1aXJlIHRoZSBsb2NrCisgICAgaWYgKCAoVENSXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgfHwKKyAgICAgICAgIChUQ1JfUFRSKHZpY3RpbS0+dGgudGhfdGFza190ZWFtKSAhPSB0YXNrX3RlYW0pKSAvLyBHRUg6IHdoeSB3b3VsZCB0aGlzIGhhcHBlbj8KKyAgICB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhleGl0ICMyKTogVCMlZCBjb3VsZCBub3Qgc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHZpY3RpbSApLCB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWUgIT0gTlVMTCApOworCisgICAgaWYgKCAhaXNfY29uc3RyYWluZWQgKSB7CisgICAgICAgIHRhc2tkYXRhID0gdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlWyB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfaGVhZCBdOworICAgICAgICAvLyBCdW1wIGhlYWQgcG9pbnRlciBhbmQgV3JhcC4KKyAgICAgICAgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2hlYWQgPSAoIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9oZWFkICsgMSApICYgVEFTS19ERVFVRV9NQVNLOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdoaWxlIHdlIGhhdmUgcG9zdHBvbmVkIHRhc2tzIGxldCdzIHN0ZWFsIGZyb20gdGFpbCBvZiB0aGUgZGVxdWUgKHNtYWxsZXIgdGFza3MpCisgICAgICAgIGttcF9pbnQzMiB0YWlsID0gKCB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfdGFpbCAtIDEgKSAmIFRBU0tfREVRVUVfTUFTSzsgIC8vIFdyYXAgaW5kZXguCisgICAgICAgIHRhc2tkYXRhID0gdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlWyB0YWlsIF07CisgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBvYmV5cyB0YXNrIHNjaGVkdWxpbmcgY29uc3RyYWludDoKKyAgICAgICAgLy8gb25seSBjaGlsZCBvZiBjdXJyZW50IHRhc2sgY2FuIGJlIHNjaGVkdWxlZAorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAga21wX2ludDMyICAgICAgICBsZXZlbCA9IGN1cnJlbnQtPnRkX2xldmVsOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgIHdoaWxlICggcGFyZW50ICE9IGN1cnJlbnQgJiYgcGFyZW50LT50ZF9sZXZlbCA+IGxldmVsICkgeworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT50ZF9wYXJlbnQ7ICAvLyBjaGVjayBnZW5lcmF0aW9uIHVwIHRvIHRoZSBsZXZlbCBvZiB0aGUgY3VycmVudCB0YXNrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHBhcmVudCAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHBhcmVudCAhPSBjdXJyZW50ICkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHRhaWwgdGFzayBpcyBub3QgYSBjaGlsZCwgdGhlbiBubyBvdGhlciBjaGlsZHMgY2FuIGFwcGVhciBpbiB0aGUgZGVxdWUgKD8pLgorICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhleGl0ICMyKTogVCMlZCBjb3VsZCBub3Qgc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkc19kYXRhW3ZpY3RpbV90aWRdLnRkLnRkX3RociApLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV90YWlsID0gdGFpbDsKKyAgICB9CisgICAgaWYgKCp0aHJlYWRfZmluaXNoZWQpIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byB1bi1tYXJrIHRoaXMgdmljdGltIGFzIGEgZmluaXNoZWQgdmljdGltLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCisgICAgICAgIC8vIHJlbGVhc2luZyB0aGUgbG9jaywgb3IgZWxzZSBvdGhlciB0aHJlYWRzIChzdGFydGluZyB3aXRoIHRoZSBtYXN0ZXIgdmljdGltKQorICAgICAgICAvLyBtaWdodCBiZSBwcmVtYXR1cmVseSByZWxlYXNlZCBmcm9tIHRoZSBiYXJyaWVyISEhCisgICAgICAgIGttcF91aW50MzIgY291bnQ7CisKKyAgICAgICAgY291bnQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopdW5maW5pc2hlZF90aHJlYWRzICk7CisKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfc3RlYWxfdGFzazogVCMlZCBpbmMgdW5maW5pc2hlZF90aHJlYWRzIHRvICVkOiB0YXNrX3RlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgY291bnQgKyAxLCB0YXNrX3RlYW0pICk7CisKKyAgICAgICAgKnRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworICAgIH0KKyAgICBUQ1dfNCh2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCBUQ1JfNCh2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSAtIDEpOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgS01QX0NPVU5UX0JMT0NLKFRBU0tfc3RvbGVuKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzMpOiBUIyVkIHN0b2xlIHRhc2sgJXAgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdmljdGltICksIHRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisKKyAgICB0YXNrID0gS01QX1RBU0tEQVRBX1RPX1RBU0soIHRhc2tkYXRhICk7CisgICAgcmV0dXJuIHRhc2s7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogQ2hvb3NlIGFuZCBleGVjdXRlIHRhc2tzIHVudGlsIGVpdGhlciB0aGUgY29uZGl0aW9uCisvLyBpcyBzdGF0aXNmaWVkIChyZXR1cm4gdHJ1ZSkgb3IgdGhlcmUgYXJlIG5vbmUgbGVmdCAocmV0dXJuIGZhbHNlKS4KKy8vIGZpbmFsX3NwaW4gaXMgVFJVRSBpZiB0aGlzIGlzIHRoZSBzcGluIGF0IHRoZSByZWxlYXNlIGJhcnJpZXIuCisvLyB0aHJlYWRfZmluaXNoZWQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRocmVhZCBpcyBmaW5pc2hlZCBleGVjdXRpbmcgYWxsCisvLyB0aGUgdGFza3MgaXQgaGFzIG9uIGl0cyBkZXF1ZSwgYW5kIGlzIGF0IHRoZSByZWxlYXNlIGJhcnJpZXIuCisvLyBzcGlubmVyIGlzIHRoZSBsb2NhdGlvbiBvbiB3aGljaCB0byBzcGluLgorLy8gc3Bpbm5lciA9PSBOVUxMIG1lYW5zIG9ubHkgZXhlY3V0ZSBhIHNpbmdsZSB0YXNrIGFuZCByZXR1cm4uCisvLyBjaGVja2VyIGlzIHRoZSB2YWx1ZSB0byBjaGVjayB0byB0ZXJtaW5hdGUgdGhlIHNwaW4uCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgaW50IF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwgQyAqZmxhZywgaW50IGZpbmFsX3NwaW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKQoreworICAgIGttcF90YXNrX3RlYW1fdCAqICAgICB0YXNrX3RlYW07CisgICAga21wX3RocmVhZF9kYXRhX3QgKiAgIHRocmVhZHNfZGF0YTsKKyAgICBrbXBfdGFza190ICogICAgICAgICAgdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgY3VycmVudF90YXNrID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICogdW5maW5pc2hlZF90aHJlYWRzOworICAgIGttcF9pbnQzMiAgICAgICAgICAgICBudGhyZWFkcywgbGFzdF9zdG9sZW4sIGssIHRpZDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkID09IF9fa21wX3RocmVhZHNbIGd0aWQgXSApOworCisgICAgdGFza190ZWFtID0gdGhyZWFkIC0+IHRoLnRoX3Rhc2tfdGVhbTsKKyAgICBpZiAodGFza190ZWFtID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZW50ZXIpOiBUIyVkIGZpbmFsX3NwaW49JWQgKnRocmVhZF9maW5pc2hlZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGZpbmFsX3NwaW4sICp0aHJlYWRfZmluaXNoZWQpICk7CisKKyAgICB0aHJlYWRzX2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKilUQ1JfUFRSKHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZHNfZGF0YSAhPSBOVUxMICk7CisKKyAgICBudGhyZWFkcyA9IHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYzsKKyAgICB1bmZpbmlzaGVkX3RocmVhZHMgPSAmKHRhc2tfdGVhbSAtPiB0dC50dF91bmZpbmlzaGVkX3RocmVhZHMpOworI2lmIE9NUF80MV9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggbnRocmVhZHMgPiAxIHx8IHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MpOworI2Vsc2UKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGhyZWFkcyA+IDEgKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KChpbnQpKnVuZmluaXNoZWRfdGhyZWFkcykgPj0gMCApOworCisgICAgLy8gQ2hvb3NlIHRhc2tzIGZyb20gb3VyIG93biB3b3JrIHF1ZXVlLgorICAgIHN0YXJ0OgorICAgIHdoaWxlICgoIHRhc2sgPSBfX2ttcF9yZW1vdmVfbXlfdGFzayggdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIGlzX2NvbnN0cmFpbmVkICkpICE9IE5VTEwgKSB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19maW5pc2hlZCggaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIG9ubHkgcGFydHdheSB0aHJvdWdoIHRoZSBiYXJyaWVyIGFuZCB0aGUgY29uZGl0aW9uCisgICAgICAgIC8vIGlzIG1ldCwgdGhlbiByZXR1cm4gbm93LCBzbyB0aGF0IHRoZSBiYXJyaWVyIGdhdGhlci9yZWxlYXNlIHBhdHRlcm4gY2FuIHByb2NlZWQuCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIGluIHRoZSBsYXN0IHNwaW4gbG9vcCBpbiB0aGUgYmFycmllciwgd2FpdGluZyB0byBiZQorICAgICAgICAvLyByZWxlYXNlZCwgd2Uga25vdyB0aGF0IHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gd2lsbCBub3QgYmUgc2F0aXNpZmllZCwKKyAgICAgICAgLy8gc28gZG9uJ3Qgd2FzdGUgYW55IGN5Y2xlcyBjaGVja2luZyBpdC4KKyAgICAgICAgaWYgKGZsYWcgPT0gTlVMTCB8fCAoIWZpbmFsX3NwaW4gJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShleGl0ICMxKTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsIGd0aWQpICk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhyZWFkLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCkgYnJlYWs7CisgICAgICAgIEtNUF9ZSUVMRCggX19rbXBfbGlicmFyeSA9PSBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsgICAvLyBZaWVsZCBiZWZvcmUgZXhlY3V0aW5nIG5leHQgdGFzaworICAgIH0KKworICAgIC8vIFRoaXMgdGhyZWFkJ3Mgd29yayBxdWV1ZSBpcyBlbXB0eS4gIElmIHdlIGFyZSBpbiB0aGUgZmluYWwgc3BpbiBsb29wCisgICAgLy8gb2YgdGhlIGJhcnJpZXIsIGNoZWNrIGFuZCBzZWUgaWYgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAvLyBUaGUgd29yayBxdWV1ZSBtYXkgYmUgZW1wdHkgYnV0IHRoZXJlIG1pZ2h0IGJlIHByb3h5IHRhc2tzIHN0aWxsIGV4ZWN1dGluZworICAgIGlmIChmaW5hbF9zcGluICYmIFRDUl80KGN1cnJlbnRfdGFzayAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSA9PSAwKSAKKyNlbHNlCisgICAgaWYgKGZpbmFsX3NwaW4pIAorI2VuZGlmCisgICAgeworICAgICAgICAvLyBGaXJzdCwgZGVjcmVtZW50IHRoZSAjdW5maW5pc2hlZCB0aHJlYWRzLCBpZiB0aGF0IGhhcyBub3QgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIGRvbmUuICBUaGlzIGRlY3JlbWVudCBtaWdodCBiZSB0byB0aGUgc3BpbiBsb2NhdGlvbiwgYW5kCisgICAgICAgIC8vIHJlc3VsdCBpbiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGJlaW5nIHNhdGlzZmllZC4KKyAgICAgICAgaWYgKCEgKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAgICAga21wX3VpbnQzMiBjb3VudDsKKworICAgICAgICAgICAgY291bnQgPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopdW5maW5pc2hlZF90aHJlYWRzICkgLSAxOworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShkZWMgIzEpOiBUIyVkIGRlYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQgdGFza190ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudCwgdGFza190ZWFtKSApOworICAgICAgICAgICAgKnRocmVhZF9maW5pc2hlZCA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJdCBpcyBub3cgdW5zYWZlIHRvIHJlZmVyZW5jZSB0aHJlYWQtPnRoLnRoX3RlYW0gISEhCisgICAgICAgIC8vIERlY3JlbWVudGluZyB0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyBjYW4gYWxsb3cgdGhlIG1hc3RlcgorICAgICAgICAvLyB0aHJlYWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBiYXJyaWVyLCB3aGVyZSBpdCBtaWdodCByZXNldCBlYWNoIHRocmVhZCdzCisgICAgICAgIC8vIHRoLnRoX3RlYW0gZmllbGQgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAgICAgLy8gSWYgd2UgY2FuIHN0ZWFsIG1vcmUgd29yaywgd2Uga25vdyB0aGF0IHRoaXMgaGFzIG5vdCBoYXBwZW5lZCB5ZXQuCisgICAgICAgIGlmIChmbGFnICE9IE5VTEwgJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGV4aXQgIzIpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRocmVhZC0+dGgudGhfdGFza190ZWFtID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciB0aHJlYWRzIHRvIHN0ZWFsIGZyb20sIG90aGVyd2lzZSBnbyBiYWNrCisgICAgaWYgKCBudGhyZWFkcyAgPT0gMSApCisgICAgICAgIGdvdG8gc3RhcnQ7CisjZW5kaWYKKworICAgIC8vIFRyeSB0byBzdGVhbCBmcm9tIHRoZSBsYXN0IHBsYWNlIEkgc3RvbGUgZnJvbSBzdWNjZXNzZnVsbHkuCisgICAgdGlkID0gdGhyZWFkIC0+IHRoLnRoX2luZm8uZHMuZHNfdGlkOy8vX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGxhc3Rfc3RvbGVuID0gdGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbjsKKworICAgIGlmIChsYXN0X3N0b2xlbiAhPSAtMSkgeworICAgICAgICBrbXBfaW5mb190ICpvdGhlcl90aHJlYWQgPSB0aHJlYWRzX2RhdGFbbGFzdF9zdG9sZW5dLnRkLnRkX3RocjsKKworICAgICAgICB3aGlsZSAoKHRhc2sgPSBfX2ttcF9zdGVhbF90YXNrKCBvdGhlcl90aHJlYWQsIGd0aWQsIHRhc2tfdGVhbSwgdW5maW5pc2hlZF90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfZmluaXNoZWQsIGlzX2NvbnN0cmFpbmVkICkpICE9IE5VTEwpCisgICAgICAgIHsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBhdCBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIGl0dF9zeW5jX29iaiApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgICAgIF9fa21wX2ludm9rZV90YXNrKCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19maW5pc2hlZCggaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyB0aHJlYWQgY2FuIHByb2NlZWQuCisgICAgICAgICAgICBpZiAoZmxhZyA9PSBOVUxMIHx8ICghZmluYWxfc3BpbiAmJiBmbGFnLT5kb25lX2NoZWNrKCkpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShleGl0ICMzKTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhyZWFkLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCkgYnJlYWs7CisgICAgICAgICAgICBLTVBfWUlFTEQoIF9fa21wX2xpYnJhcnkgPT0gbGlicmFyeV90aHJvdWdocHV0ICk7ICAgLy8gWWllbGQgYmVmb3JlIGV4ZWN1dGluZyBuZXh0IHRhc2sKKyAgICAgICAgICAgIC8vIElmIHRoZSBleGVjdXRpb24gb2YgdGhlIHN0b2xlbiB0YXNrIHJlc3VsdGVkIGluIG1vcmUgdGFza3MgYmVpbmcKKyAgICAgICAgICAgIC8vIHBsYWNlZCBvbiBvdXIgcnVuIHF1ZXVlLCB0aGVuIHJlc3RhcnQgdGhlIHdob2xlIHByb2Nlc3MuCisgICAgICAgICAgICBpZiAoVENSXzQodGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9udGFza3MpICE9IDApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBUIyVkIHN0b2xlbiB0YXNrIHNwYXduZWQgb3RoZXIgdGFza3MsIHJlc3RhcnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIGdvdG8gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBnaXZlIHByaW9yaXR5IHRvIHN0ZWFsaW5nIGZyb20gdGhpcyB0aHJlYWQgYW55bW9yZS4KKyAgICAgICAgdGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IC0xOworCisgICAgICAgIC8vIFRoZSB2aWN0aW1zJ3Mgd29yayBxdWV1ZSBpcyBlbXB0eS4gIElmIHdlIGFyZSBpbiB0aGUgZmluYWwgc3BpbiBsb29wCisgICAgICAgIC8vIG9mIHRoZSBiYXJyaWVyLCBjaGVjayBhbmQgc2VlIGlmIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLgorI2lmIE9NUF80MV9FTkFCTEVECisgICAgICAgIC8vIFRoZSB3b3JrIHF1ZXVlIG1heSBiZSBlbXB0eSBidXQgdGhlcmUgbWlnaHQgYmUgcHJveHkgdGFza3Mgc3RpbGwgZXhlY3V0aW5nCisgICAgICAgIGlmIChmaW5hbF9zcGluICYmIFRDUl80KGN1cnJlbnRfdGFzayAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSA9PSAwKSAKKyNlbHNlCisgICAgICAgIGlmIChmaW5hbF9zcGluKSAKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAvLyBGaXJzdCwgZGVjcmVtZW50IHRoZSAjdW5maW5pc2hlZCB0aHJlYWRzLCBpZiB0aGF0IGhhcyBub3QgYWxyZWFkeQorICAgICAgICAgICAgLy8gYmVlbiBkb25lLiAgVGhpcyBkZWNyZW1lbnQgbWlnaHQgYmUgdG8gdGhlIHNwaW4gbG9jYXRpb24sIGFuZAorICAgICAgICAgICAgLy8gcmVzdWx0IGluIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gYmVpbmcgc2F0aXNmaWVkLgorICAgICAgICAgICAgaWYgKCEgKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAgICAgICAgIGttcF91aW50MzIgY291bnQ7CisKKyAgICAgICAgICAgICAgICBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKSAtIDE7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShkZWMgIzIpOiBUIyVkIGRlYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhc2tfdGVhbT0lcFxuIiwgZ3RpZCwgY291bnQsIHRhc2tfdGVhbSkgKTsKKyAgICAgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMKKyAgICAgICAgICAgIC8vIHRoZW4gaXQgaXMgbm93IHVuc2FmZSB0byByZWZlcmVuY2UgdGhyZWFkLT50aC50aF90ZWFtICEhIQorICAgICAgICAgICAgLy8gRGVjcmVtZW50aW5nIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzIGNhbiBhbGxvdyB0aGUgbWFzdGVyCisgICAgICAgICAgICAvLyB0aHJlYWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBiYXJyaWVyLCB3aGVyZSBpdCBtaWdodCByZXNldCBlYWNoIHRocmVhZCdzCisgICAgICAgICAgICAvLyB0aC50aF90ZWFtIGZpZWxkIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisgICAgICAgICAgICAvLyBJZiB3ZSBjYW4gc3RlYWwgbW9yZSB3b3JrLCB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm90IGhhcHBlbmVkIHlldC4KKyAgICAgICAgICAgIGlmIChmbGFnICE9IE5VTEwgJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShleGl0ICM0KTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gRmluZCBhIGRpZmZlcmVudCB0aHJlYWQgdG8gc3RlYWwgd29yayBmcm9tLiAgUGljayBhIHJhbmRvbSB0aHJlYWQuCisgICAgLy8gTXkgaW5pdGlhbCBwbGFuIHdhcyB0byBjeWNsZSB0aHJvdWdoIGFsbCB0aGUgdGhyZWFkcywgYW5kIG9ubHkgcmV0dXJuCisgICAgLy8gaWYgd2UgdHJpZWQgdG8gc3RlYWwgZnJvbSBldmVyeSB0aHJlYWQsIGFuZCBmYWlsZWQuICBBcmNoIHNheXMgdGhhdCdzCisgICAgLy8gbm90IHN1Y2ggYSBncmVhdCBpZGVhLgorICAgIC8vIEdFSCAtIG5lZWQgeWllbGQgY29kZSBpbiB0aGlzIGxvb3AgZm9yIHRocm91Z2hwdXQgbGlicmFyeSBtb2RlPworICAgIG5ld192aWN0aW06CisgICAgayA9IF9fa21wX2dldF9yYW5kb20oIHRocmVhZCApICUgKG50aHJlYWRzIC0gMSk7CisgICAgaWYgKCBrID49IHRocmVhZCAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZCApIHsKKyAgICAgICAgKytrOyAgICAgICAgICAgICAgIC8vIEFkanVzdHMgcmFuZG9tIGRpc3RyaWJ1dGlvbiB0byBleGNsdWRlIHNlbGYKKyAgICB9CisgICAgeworICAgICAgICBrbXBfaW5mb190ICpvdGhlcl90aHJlYWQgPSB0aHJlYWRzX2RhdGFba10udGQudGRfdGhyOworICAgICAgICBpbnQgZmlyc3Q7CisKKyAgICAgICAgLy8gVGhlcmUgaXMgYSBzbGlnaHQgY2hhbmNlIHRoYXQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoKSBkaWQgbm90IHdha2UgdXAKKyAgICAgICAgLy8gYWxsIHRocmVhZHMgd2FpdGluZyBhdCB0aGUgYmFycmllci4gIElmIHRoaXMgdGhyZWFkIGlzIHNsZWVwaW5nLCB0aGVuCisgICAgICAgIC8vIHdha2UgaXQgdXAuICBTaW5jZSB3ZSB3ZXJlIGdvaW5nIHRvIHBheSB0aGUgY2FjaGUgbWlzcyBwZW5hbHR5CisgICAgICAgIC8vIGZvciByZWZlcmVuY2luZyBhbm90aGVyIHRocmVhZCdzIGttcF9pbmZvX3Qgc3RydWN0IGFueXdheSwgdGhlIGNoZWNrCisgICAgICAgIC8vIHNob3VsZG4ndCBjb3N0IHRvbyBtdWNoIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuCisgICAgICAgIC8vIEluIGV4dHJhIGJhcnJpZXIgbW9kZSwgdGFza3MgZG8gbm90IHNsZWVwIGF0IHRoZSBzZXBhcmF0ZSB0YXNraW5nCisgICAgICAgIC8vIGJhcnJpZXIsIHNvIHRoaXMgaXNuJ3QgYSBwcm9ibGVtLgorICAgICAgICBpZiAoICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21fdGFza190ZWFtcyApICYmCisgICAgICAgICAgICAgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSAmJgorICAgICAgICAgICAgIChUQ1JfUFRSKG90aGVyX3RocmVhZC0+dGgudGhfc2xlZXBfbG9jKSAhPSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKG90aGVyX3RocmVhZCksIG90aGVyX3RocmVhZC0+dGgudGhfc2xlZXBfbG9jKTsKKyAgICAgICAgICAgIC8vIEEgc2xlZXBpbmcgdGhyZWFkIHNob3VsZCBub3QgaGF2ZSBhbnkgdGFza3Mgb24gaXQncyBxdWV1ZS4KKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgc2xpZ2h0IHBvc3NpYmlsaXR5IHRoYXQgaXQgcmVzdW1lcywgc3RlYWxzIGEgdGFzayBmcm9tCisgICAgICAgICAgICAvLyBhbm90aGVyIHRocmVhZCwgd2hpY2ggc3Bhd25zIG1vcmUgdGFza3MsIGFsbCBpbiB0aGUgdGltZSB0aGF0IGl0IHRha2VzCisgICAgICAgICAgICAvLyB0aGlzIHRocmVhZCB0byBjaGVjayA9PiBkb24ndCB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCB0aGUgdmljdGltJ3MKKyAgICAgICAgICAgIC8vIHF1ZXVlIGlzIGVtcHR5LiAgVHJ5IHN0ZWFsaW5nIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkLgorICAgICAgICAgICAgZ290byBuZXdfdmljdGltOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHRyeSB0byBzdGVhbCB3b3JrIGZyb20gdGhlIHNlbGVjdGVkIHRocmVhZAorICAgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICAgIHdoaWxlICgodGFzayA9IF9fa21wX3N0ZWFsX3Rhc2soIG90aGVyX3RocmVhZCwgZ3RpZCwgdGFza190ZWFtLCB1bmZpbmlzaGVkX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9maW5pc2hlZCwgaXNfY29uc3RyYWluZWQgKSkgIT0gTlVMTCkKKyAgICAgICAgeworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGF0IGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkKKyAgICAgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyggaXR0X3N5bmNfb2JqICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgICAgIC8vIFRyeSBzdGVhbGluZyBmcm9tIHRoaXMgdmljdGltIGFnYWluLCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgdGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IGs7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdGhyZWFkIGNhbiBwcm9jZWVkLgorICAgICAgICAgICAgaWYgKGZsYWcgPT0gTlVMTCB8fCAoIWZpbmFsX3NwaW4gJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZXhpdCAjNSk6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgICAgIEtNUF9ZSUVMRCggX19rbXBfbGlicmFyeSA9PSBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsgICAvLyBZaWVsZCBiZWZvcmUgZXhlY3V0aW5nIG5leHQgdGFzaworCisgICAgICAgICAgICAvLyBJZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzdG9sZW4gdGFzayByZXN1bHRlZCBpbiBtb3JlIHRhc2tzIGJlaW5nCisgICAgICAgICAgICAvLyBwbGFjZWQgb24gb3VyIHJ1biBxdWV1ZSwgdGhlbiByZXN0YXJ0IHRoZSB3aG9sZSBwcm9jZXNzLgorICAgICAgICAgICAgaWYgKFRDUl80KHRocmVhZHNfZGF0YVsgdGlkIF0udGQudGRfZGVxdWVfbnRhc2tzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBzdG9sZW4gdGFzayBzcGF3bmVkIG90aGVyIHRhc2tzLCByZXN0YXJ0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICBnb3RvIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIHZpY3RpbXMncyB3b3JrIHF1ZXVlIGlzIGVtcHR5LiAgSWYgd2UgYXJlIGluIHRoZSBmaW5hbCBzcGluIGxvb3AKKyAgICAgICAgLy8gb2YgdGhlIGJhcnJpZXIsIGNoZWNrIGFuZCBzZWUgaWYgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisgICAgICAgIC8vIEdvaW5nIG9uIGFuZCBmaW5kaW5nIGEgbmV3IHZpY3RpbSB0byBzdGVhbCBmcm9tIGlzIGV4cGVuc2l2ZSwgYXMgaXQKKyAgICAgICAgLy8gaW52b2x2ZXMgYSBsb3Qgb2YgY2FjaGUgbWlzc2VzLCBzbyB3ZSBkZWZpbml0ZWx5IHdhbnQgdG8gcmUtY2hlY2sgdGhlCisgICAgICAgIC8vIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBiZWZvcmUgZG9pbmcgdGhhdC4KKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgICAgICAvLyBUaGUgd29yayBxdWV1ZSBtYXkgYmUgZW1wdHkgYnV0IHRoZXJlIG1pZ2h0IGJlIHByb3h5IHRhc2tzIHN0aWxsIGV4ZWN1dGluZworICAgICAgICBpZiAoZmluYWxfc3BpbiAmJiBUQ1JfNChjdXJyZW50X3Rhc2sgLT4gdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgPT0gMCkgCisjZWxzZQorICAgICAgICBpZiAoZmluYWxfc3BpbikgCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRmlyc3QsIGRlY3JlbWVudCB0aGUgI3VuZmluaXNoZWQgdGhyZWFkcywgaWYgdGhhdCBoYXMgbm90IGFscmVhZHkKKyAgICAgICAgICAgIC8vIGJlZW4gZG9uZS4gIFRoaXMgZGVjcmVtZW50IG1pZ2h0IGJlIHRvIHRoZSBzcGluIGxvY2F0aW9uLCBhbmQKKyAgICAgICAgICAgIC8vIHJlc3VsdCBpbiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGJlaW5nIHNhdGlzZmllZC4KKyAgICAgICAgICAgIGlmICghICp0aHJlYWRfZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGNvdW50OworCisgICAgICAgICAgICAgICAgY291bnQgPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopdW5maW5pc2hlZF90aHJlYWRzICkgLSAxOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZGVjICMzKTogVCMlZCBkZWMgdW5maW5pc2hlZF90aHJlYWRzIHRvICVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgY291bnQsIHRhc2tfdGVhbSkgKTsKKyAgICAgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMsCisgICAgICAgICAgICAvLyB0aGVuIGl0IGlzIG5vdyB1bnNhZmUgdG8gcmVmZXJlbmNlIHRocmVhZC0+dGgudGhfdGVhbSAhISEKKyAgICAgICAgICAgIC8vIERlY3JlbWVudGluZyB0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyBjYW4gYWxsb3cgdGhlIG1hc3RlcgorICAgICAgICAgICAgLy8gdGhyZWFkIHRvIHBhc3MgdGhyb3VnaCB0aGUgYmFycmllciwgd2hlcmUgaXQgbWlnaHQgcmVzZXQgZWFjaCB0aHJlYWQncworICAgICAgICAgICAgLy8gdGgudGhfdGVhbSBmaWVsZCBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAgICAgLy8gSWYgd2UgY2FuIHN0ZWFsIG1vcmUgd29yaywgd2Uga25vdyB0aGF0IHRoaXMgaGFzIG5vdCBoYXBwZW5lZCB5ZXQuCisgICAgICAgICAgICBpZiAoZmxhZyAhPSBOVUxMICYmIGZsYWctPmRvbmVfY2hlY2soKSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZXhpdCAjNik6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLCBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShleGl0ICM3KTogVCMlZCBjYW4ndCBmaW5kIHdvcmtcbiIsIGd0aWQpICk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc18zMihrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ18zMiAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkKK3sKKyAgICByZXR1cm4gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZSh0aHJlYWQsIGd0aWQsIGZsYWcsIGZpbmFsX3NwaW4sIHRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKK30KKworaW50IF9fa21wX2V4ZWN1dGVfdGFza3NfNjQoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcsIGludCBmaW5hbF9zcGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpCit7CisgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUodGhyZWFkLCBndGlkLCBmbGFnLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7Cit9CisKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzX29uY29yZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcsIGludCBmaW5hbF9zcGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkKK3sKKyAgICByZXR1cm4gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZSh0aHJlYWQsIGd0aWQsIGZsYWcsIGZpbmFsX3NwaW4sIHRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKK30KKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2VuYWJsZV90YXNraW5nOiBBbGxvY2F0ZSB0YXNrIHRlYW0gYW5kIHJlc3VtZSB0aHJlYWRzIHNsZWVwaW5nIGF0IHRoZQorLy8gbmV4dCBiYXJyaWVyIHNvIHRoZXkgY2FuIGFzc2lzdCBpbiBleGVjdXRpbmcgZW5xdWV1ZWQgdGFza3MuCisvLyBGaXJzdCB0aHJlYWQgaW4gYWxsb2NhdGVzIHRoZSB0YXNrIHRlYW0gYXRvbWljYWxseS4KKworc3RhdGljIHZvaWQKK19fa21wX2VuYWJsZV90YXNraW5nKCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSwga21wX2luZm9fdCAqdGhpc190aHIgKQoreworICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRzX2RhdGE7CisgICAgaW50IG50aHJlYWRzLCBpLCBpc19pbml0X3RocmVhZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmcoZW50ZXIpOiBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGFza190ZWFtICE9IE5VTEwpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3RlYW0gIT0gTlVMTCk7CisKKyAgICBudGhyZWFkcyA9IHRhc2tfdGVhbS0+dHQudHRfbnByb2M7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGhyZWFkcyA+IDApOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRocmVhZHMgPT0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9ucHJvYyk7CisKKyAgICAvLyBBbGxvY2F0ZSBvciBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgaXNfaW5pdF90aHJlYWQgPSBfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKCB0aGlzX3RociwgdGFza190ZWFtICk7CisKKyAgICBpZiAoIWlzX2luaXRfdGhyZWFkKSB7CisgICAgICAgIC8vIFNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgc2V0IHVwIHRoZSBhcnJheS4KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhleGl0KTogVCMlZDogdGhyZWFkcyBhcnJheSBhbHJlYWR5IHNldCB1cC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0aHJlYWRzX2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKilUQ1JfUFRSKHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZHNfZGF0YSAhPSBOVUxMICk7CisKKyAgICBpZiAoICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21fdGFza190ZWFtcyApICYmCisgICAgICAgICAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgKQorICAgIHsKKyAgICAgICAgLy8gUmVsZWFzZSBhbnkgdGhyZWFkcyBzbGVlcGluZyBhdCB0aGUgYmFycmllciwgc28gdGhhdCB0aGV5IGNhbiBzdGVhbAorICAgICAgICAvLyB0YXNrcyBhbmQgZXhlY3V0ZSB0aGVtLiAgSW4gZXh0cmEgYmFycmllciBtb2RlLCB0YXNrcyBkbyBub3Qgc2xlZXAKKyAgICAgICAgLy8gYXQgdGhlIHNlcGFyYXRlIHRhc2tpbmcgYmFycmllciwgc28gdGhpcyBpc24ndCBhIHByb2JsZW0uCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICB2b2xhdGlsZSB2b2lkICpzbGVlcF9sb2M7CisgICAgICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQgPSB0aHJlYWRzX2RhdGFbaV0udGQudGRfdGhyOworCisgICAgICAgICAgICBpZiAoaSA9PSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmVuJ3QgbG9ja2VkIHRoZSB0aHJlYWQncyBzdXNwZW5kIG11dGV4IGxvY2sgYXQgdGhpcworICAgICAgICAgICAgLy8gcG9pbnQsIHRoZXJlIGlzIGEgc21hbGwgd2luZG93IHdoZXJlIGEgdGhyZWFkIG1pZ2h0IGJlIHB1dHRpbmcKKyAgICAgICAgICAgIC8vIGl0c2VsZiB0byBzbGVlcCwgYnV0IGhhc24ndCBzZXQgdGhlIHRoX3NsZWVwX2xvYyBmaWVsZCB5ZXQuCisgICAgICAgICAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKCkgcGVyaW9kaWNhbGx5IGNoZWNrcworICAgICAgICAgICAgLy8gc2VlIGlmIG90aGVyIHRocmVhZHMgYXJlIHNsZWVwaW5nICh1c2luZyB0aGUgc2FtZSByYW5kb20KKyAgICAgICAgICAgIC8vIG1lY2hhbmlzbSB0aGF0IGlzIHVzZWQgZm9yIHRhc2sgc3RlYWxpbmcpIGFuZCBhd2FrZW5zIHRoZW0gaWYKKyAgICAgICAgICAgIC8vIHRoZXkgYXJlLgorICAgICAgICAgICAgaWYgKCAoIHNsZWVwX2xvYyA9IFRDUl9QVFIoIHRocmVhZCAtPiB0aC50aF9zbGVlcF9sb2MpICkgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZzogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpLCBzbGVlcF9sb2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZzogVCMlZCBkb24ndCB3YWtlIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmcoZXhpdCk6IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLy8gVE9ETzogQ2hlY2sgdGhlIGNvbW1lbnQgY29uc2lzdGVuY3kKKyAqIFV0aWxpdHkgcm91dGluZXMgZm9yICJ0YXNrIHRlYW1zIi4gIEEgdGFzayB0ZWFtIChrbXBfdGFza190KSBpcyBraW5kIG9mCisgKiBsaWtlIGEgc2hhZG93IG9mIHRoZSBrbXBfdGVhbV90IGRhdGEgc3RydWN0LCB3aXRoIGEgZGlmZmVyZW50IGxpZmV0aW1lLgorICogQWZ0ZXIgYSBjaGlsZCAqIHRocmVhZCBjaGVja3MgaW50byBhIGJhcnJpZXIgYW5kIGNhbGxzIF9fa21wX3JlbGVhc2UoKSBmcm9tCisgKiB0aGUgcGFydGljdWxhciB2YXJpYW50IG9mIF9fa21wXzxiYXJyaWVyX2tpbmQ+X2JhcnJpZXJfZ2F0aGVyKCksIGl0IGNhbiBubworICogbG9uZ2VyIGFzc3VtZSB0aGF0IHRoZSBrbXBfdGVhbV90IHN0cnVjdHVyZSBpcyBpbnRhY3QgKGF0IGFueSBtb21lbnQsIHRoZQorICogbWFzdGVyIHRocmVhZCBtYXkgZXhpdCB0aGUgYmFycmllciBjb2RlIGFuZCBmcmVlIHRoZSB0ZWFtIGRhdGEgc3RydWN0dXJlLAorICogYW5kIHJldHVybiB0aGUgdGhyZWFkcyB0byB0aGUgdGhyZWFkIHBvb2wpLgorICoKKyAqIFRoaXMgZG9lcyBub3Qgd29yayB3aXRoIHRoZSB0aGUgdGFza2luZyBjb2RlLCBhcyB0aGUgdGhyZWFkIGlzIHN0aWxsCisgKiBleHBlY3RlZCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZXhlY3V0aW9uIG9mIGFueSB0YXNrcyB0aGF0IG1heSBoYXZlIGJlZW4KKyAqIHNwYXduZWQgbXkgYSBtZW1iZXIgb2YgdGhlIHRlYW0sIGFuZCB0aGUgdGhyZWFkIHN0aWxsIG5lZWRzIGFjY2VzcyB0byBhbGwKKyAqIHRvIGVhY2ggdGhyZWFkIGluIHRoZSB0ZWFtLCBzbyB0aGF0IGl0IGNhbiBzdGVhbCB3b3JrIGZyb20gaXQuCisgKgorICogRW50ZXIgdGhlIGV4aXN0ZW5jZSBvZiB0aGUga21wX3Rhc2tfdGVhbV90IHN0cnVjdC4gIEl0IGVtcGxveXMgYSByZWZlcmVuY2UKKyAqIGNvdW50aW5nIG1lY2hhbmltcywgYW5kIGlzIGFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBiZWZvcmUgY2FsbGluZworICogX19rbXBfPGJhcnJpZXJfa2luZD5fcmVsZWFzZSwgYW5kIHRoZW4gaXMgcmVsZWFzZSBieSB0aGUgbGFzdCB0aHJlYWQgdG8KKyAqIGV4aXQgX19rbXBfPGJhcnJpZXJfa2luZD5fcmVsZWFzZSBhdCB0aGUgbmV4dCBiYXJyaWVyLiAgSS5lLiB0aGUgbGlmZXRpbWVzCisgKiBvZiB0aGUga21wX3Rhc2tfdGVhbV90IHN0cnVjdHMgZm9yIGNvbnNlY3V0aXZlIGJhcnJpZXJzIGNhbiBvdmVybGFwCisgKiAoYW5kIHdpbGwsIHVubGVzcyB0aGUgbWFzdGVyIHRocmVhZCBpcyB0aGUgbGFzdCB0aHJlYWQgdG8gZXhpdCB0aGUgYmFycmllcgorICogcmVsZWFzZSBwaGFzZSwgd2hpY2ggaXMgbm90IHR5cGljYWwpLgorICoKKyAqIFRoZSBleGlzdGVuY2Ugb2Ygc3VjaCBhIHN0cnVjdCBpcyB1c2VmdWwgb3V0c2lkZSB0aGUgY29udGV4dCBvZiB0YXNraW5nLAorICogYnV0IGZvciBub3csIEknbSB0cnlpbmcgdG8ga2VlcCBpdCBzcGVjaWZpYyB0byB0aGUgT01QXzMwX0VOQUJMRUQgbWFjcm8sCisgKiBzbyB0aGF0IGFueSBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlcyBzaG93IHVwIHdoZW4gY29tcGFyaW5nIHRoZSAyLjUgdnMuIDMuMAorICogbGlicmFyaWVzLgorICoKKyAqIFdlIGN1cnJlbnRseSB1c2UgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdGhyZWFkcyBhcnJheSBhcyBhbiBpbmRpY2F0b3IgdGhhdAorICogdGFza3Mgd2VyZSBzcGF3bmVkIHNpbmNlIHRoZSBsYXN0IGJhcnJpZXIuICBJZiB0aGUgc3RydWN0dXJlIGlzIHRvIGJlCisgKiB1c2VmdWwgb3V0c2lkZSB0aGUgY29udGV4dCBvZiB0YXNraW5nLCB0aGVuIHRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSwgYnV0CisgKiBub3Qgc2V0dHRpbmcgdGhlIGZpZWxkIG1pbmltaXplcyB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0IG9mIHRhc2tpbmcgb24KKyAqIGJhcnJpZXJzLCB3aGVuIG5vIGV4cGxpY2l0IHRhc2tzIHdlcmUgc3Bhd25lZCAocHVzaGVkLCBhY3R1YWxseSkuCisgKi8KKworCitzdGF0aWMga21wX3Rhc2tfdGVhbV90ICpfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgPSBOVUxMOyAgICAgICAgICAgLy8gRnJlZSBsaXN0IGZvciB0YXNrX3RlYW0gZGF0YSBzdHJ1Y3R1cmVzCisvLyBMb2NrIGZvciB0YXNrIHRlYW0gZGF0YSBzdHJ1Y3R1cmVzCitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdGFza190ZWFtX2xvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIF9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWU6CisvLyBBbGxvY2F0ZXMgYSB0YXNrIGRlcXVlIGZvciBhIHBhcnRpY3VsYXIgdGhyZWFkLCBhbmQgaW5pdGlhbGl6ZSB0aGUgbmVjZXNzYXJ5CisvLyBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcgdG8gdGhlIGRlcXVlLiAgVGhpcyBvbmx5IGhhcHBlbnMgb25jZSBwZXIgdGhyZWFkCisvLyBwZXIgdGFzayB0ZWFtIHNpbmNlIHRhc2sgdGVhbXMgYXJlIHJlY3ljbGVkLgorLy8gTm8gbG9jayBpcyBuZWVkZWQgZHVyaW5nIGFsbG9jYXRpb24gc2luY2UgZWFjaCB0aHJlYWQgYWxsb2NhdGVzIGl0cyBvd24KKy8vIGRlcXVlLgorCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NfdGFza19kZXF1ZSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKTsKKworICAgIC8vIEluaXRpYWxpemUgbGFzdCBzdG9sZW4gdGFzayBmaWVsZCB0byAibm9uZSIKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IC0xOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfaGVhZCA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9PSAwICk7CisKKyAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX2FsbG9jX3Rhc2tfZGVxdWU6IFQjJWQgYWxsb2NhdGluZyBkZXF1ZVslZF0gZm9yIHRocmVhZF9kYXRhICVwXG4iLAorICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCBUQVNLX0RFUVVFX1NJWkUsIHRocmVhZF9kYXRhICkgKTsKKyAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGFzayBkZXF1ZSwgYW5kIHplcm8gdGhlIGRlcXVlCisgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfY2FsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID0gKGttcF90YXNrZGF0YV90ICoqKQorICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoIFRBU0tfREVRVUVfU0laRSAqIHNpemVvZihrbXBfdGFza2RhdGFfdCAqKSk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza19kZXF1ZToKKy8vIERlYWxsb2NhdGVzIGEgdGFzayBkZXF1ZSBmb3IgYSBwYXJ0aWN1bGFyIHRocmVhZC4KKy8vIEhhcHBlbnMgYXQgbGlicmFyeSBkZWFsbG9jYXRpb24gc28gZG9uJ3QgbmVlZCB0byByZXNldCBhbGwgdGhyZWFkIGRhdGEgZmllbGRzLgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX2RlcXVlKCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgaWYgKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSAhPSBOVUxMICkgeworICAgICAgICBUQ1dfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIDApOworICAgICAgICAgX19rbXBfZnJlZSggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgKTsKKyAgICAgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIC8vIEdFSDogRmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUgZm9yIHRkX3N1c3BfdGllZF90YXNrcworICAgIGlmICggdGhyZWFkX2RhdGEgLT4gdGQudGRfc3VzcF90aWVkX3Rhc2tzLnRzX2VudHJpZXMgIT0gVEFTS19TVEFDS19FTVBUWSApIHsKKyAgICAgICAgX19rbXBfZnJlZV90YXNrX3N0YWNrKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICksIHRocmVhZF9kYXRhICk7CisgICAgfQorI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhOgorLy8gQWxsb2NhdGVzIGEgdGhyZWFkc19kYXRhIGFycmF5IGZvciBhIHRhc2sgdGVhbSwgZWl0aGVyIGJ5IGFsbG9jYXRpbmcgYW4gaW5pdGlhbAorLy8gYXJyYXkgb3IgZW5sYXJnaW5nIGFuIGV4aXN0aW5nIGFycmF5LiAgT25seSB0aGUgZmlyc3QgdGhyZWFkIHRvIGdldCB0aGUgbG9jaworLy8gYWxsb2NzIG9yIGVubGFyZ2VzIHRoZSBhcnJheSBhbmQgcmUtaW5pdGlhbGl6ZXMgdGhlIGFycmF5IGVsZWVtbnRzLgorLy8gVGhhdCB0aHJlYWQgcmV0dXJucyAiVFJVRSIsIHRoZSByZXN0IHJldHVybiAiRkFMU0UiLgorLy8gQXNzdW1lcyB0aGF0IHRoZSBuZXcgYXJyYXkgc2l6ZSBpcyBnaXZlbiBieSB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2MuCisvLyBUaGUgY3VycmVudCBzaXplIGlzIGdpdmVuIGJ5IHRhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkcy4KKworc3RhdGljIGludAorX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSApCit7CisgICAga21wX3RocmVhZF9kYXRhX3QgKiogdGhyZWFkc19kYXRhX3A7CisgICAga21wX2ludDMyICAgICAgICAgICAgbnRocmVhZHMsIG1heHRocmVhZHM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgaXNfaW5pdF90aHJlYWQgPSBGQUxTRTsKKworICAgIGlmICggVENSXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzKSApIHsKKyAgICAgICAgLy8gQWxyZWFkeSByZWFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICB0aHJlYWRzX2RhdGFfcCA9ICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YTsKKyAgICBudGhyZWFkcyAgID0gdGFza190ZWFtIC0+IHR0LnR0X25wcm9jOworICAgIG1heHRocmVhZHMgPSB0YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHM7CisKKyAgICAvLyBBbGwgdGhyZWFkcyBtdXN0IGxvY2sgd2hlbiB0aGV5IGVuY291bnRlciB0aGUgZmlyc3QgdGFzayBvZiB0aGUgaW1wbGljaXQgdGFzaworICAgIC8vIHJlZ2lvbiB0byBtYWtlIHN1cmUgdGhyZWFkc19kYXRhIGZpZWxkcyBhcmUgKHJlKWluaXRpYWxpemVkIGJlZm9yZSB1c2VkLgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworCisgICAgaWYgKCAhIFRDUl80KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcykgKSB7CisgICAgICAgIC8vIGZpcnN0IHRocmVhZCB0byBlbmFibGUgdGFza2luZworICAgICAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyZWFkIC0+IHRoLnRoX3RlYW07CisgICAgICAgIGludCBpOworCisgICAgICAgIGlzX2luaXRfdGhyZWFkID0gVFJVRTsKKyAgICAgICAgaWYgKCBtYXh0aHJlYWRzIDwgbnRocmVhZHMgKSB7CisKKyAgICAgICAgICAgIGlmICggKnRocmVhZHNfZGF0YV9wICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKm9sZF9kYXRhID0gKnRocmVhZHNfZGF0YV9wOworICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICpuZXdfZGF0YSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6IFQjJWQgcmVhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkcyBkYXRhIGZvciB0YXNrX3RlYW0gJXAsIG5ld19zaXplID0gJWQsIG9sZF9zaXplID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGhyZWFkcywgbWF4dGhyZWFkcyApICk7CisgICAgICAgICAgICAgICAgLy8gUmVhbGxvY2F0ZSB0aHJlYWRzX2RhdGEgdG8gaGF2ZSBtb3JlIGVsZW1lbnRzIHRoYW4gY3VycmVudCBhcnJheQorICAgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX3JlYWxsb2MoKSBiZWNhdXNlIHRocmVhZHMgbm90IGFyb3VuZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuICBOb3RlIGFsbCBuZXcgYXJyYXkgZW50cmllcyBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICAvLyB0byB6ZXJvIGJ5IF9fa21wX2FsbG9jYXRlKCkuCisgICAgICAgICAgICAgICAgbmV3X2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpICk7CisgICAgICAgICAgICAgICAgLy8gY29weSBvbGQgZGF0YSB0byBuZXcgZGF0YQorICAgICAgICAgICAgICAgIEtNUF9NRU1DUFlfUyggKHZvaWQgKikgbmV3X2RhdGEsIG50aHJlYWRzICogc2l6ZW9mKGttcF90aHJlYWRfZGF0YV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIG9sZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4dGhyZWFkcyAqIHNpemVvZihrbXBfdGFza2RhdGFfdCAqKSApOworCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICAgICAgLy8gR0VIOiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgZm9yIChpID0gbWF4dGhyZWFkczsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiAoKnRocmVhZHNfZGF0YV9wKVtpXTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF90YXNrX3N0YWNrKCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGhyZWFkX2RhdGEgKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgbmV3IGRhdGEgYW5kIGZyZWUgdGhlIG9sZCBkYXRhCisgICAgICAgICAgICAgICAgKCp0aHJlYWRzX2RhdGFfcCkgPSBuZXdfZGF0YTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKCBvbGRfZGF0YSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhOiBUIyVkIGFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzIGRhdGEgZm9yIHRhc2tfdGVhbSAlcCwgc2l6ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0YXNrX3RlYW0sIG50aHJlYWRzICkgKTsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHRoZSBpbml0aWFsIGFsbG9jYXRlIGZvciB0aHJlYWRzX2RhdGEgYXJyYXksIGFuZCB6ZXJvIGVudHJpZXMKKyAgICAgICAgICAgICAgICAvLyBDYW5ub3QgdXNlIF9fa21wX3RocmVhZF9jYWxsb2MoKSBiZWNhdXNlIHRocmVhZHMgbm90IGFyb3VuZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuCisgICAgICAgICAgICAgICAgKnRocmVhZHNfZGF0YV9wID0gKGttcF90aHJlYWRfZGF0YV90ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoIG50aHJlYWRzICogc2l6ZW9mKGttcF90aHJlYWRfZGF0YV90KSApOworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAgICAgICAgIC8vIEdFSDogRmlndXJlIG91dCBpZiB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdGFza19zdGFjayggX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRocmVhZF9kYXRhICk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzID0gbnRocmVhZHM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBJZiBhcnJheSBoYXMgKG1vcmUgdGhhbikgZW5vdWdoIGVsZW1lbnRzLCBnbyBhaGVhZCBhbmQgdXNlIGl0CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAqdGhyZWFkc19kYXRhX3AgIT0gTlVMTCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aHJlYWRzX2RhdGEgcG9pbnRlcnMgYmFjayB0byB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmVzCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmICgqdGhyZWFkc19kYXRhX3ApW2ldOworICAgICAgICAgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfdGhyID0gdGVhbSAtPiB0LnRfdGhyZWFkc1tpXTsKKworICAgICAgICAgICAgaWYgKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA+PSBudGhyZWFkcykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBsYXN0IHN0b2xlbiBmaWVsZCBzdXJ2aXZlcyBhY3Jvc3MgdGVhbXMgLyBiYXJyaWVyLCBhbmQgdGhlIG51bWJlcgorICAgICAgICAgICAgICAgIC8vIG9mIHRocmVhZHMgbWF5IGhhdmUgY2hhbmdlZC4gIEl0J3MgcG9zc2libGUgKGxpa2VseT8pIHRoYXQgYSBuZXcKKyAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCByZWdpb24gd2lsbCBleGhpYml0IHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSBwcmV2aW91cyByZWdpb24uCisgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEtNUF9NQigpOworICAgICAgICBUQ1dfU1lOQ180KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcywgVFJVRSk7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisgICAgcmV0dXJuIGlzX2luaXRfdGhyZWFkOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfdGhyZWFkc19kYXRhOgorLy8gRGVhbGxvY2F0ZXMgYSB0aHJlYWRzX2RhdGEgYXJyYXkgZm9yIGEgdGFzayB0ZWFtLCBpbmNsdWRpbmcgYW55IGF0dGFjaGVkCisvLyB0YXNraW5nIGRlcXVlcy4gIE9ubHkgb2NjdXJzIGF0IGxpYnJhcnkgc2h1dGRvd24uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfdGhyZWFkc19kYXRhKCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSApCit7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisgICAgaWYgKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICE9IE5VTEwgKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFza190ZWFtLT50dC50dF9tYXhfdGhyZWFkczsgaSsrICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrX2RlcXVlKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbaV0gKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9mcmVlKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICk7CisgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOgorLy8gQWxsb2NhdGVzIGEgdGFzayB0ZWFtIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHRlYW0sIHRha2luZyBpdCBmcm9tCisvLyB0aGUgZ2xvYmFsIHRhc2sgdGVhbSBmcmVlIGxpc3QgaWYgcG9zc2libGUuICBBbHNvIGluaXRpYWxpemVzIGRhdGEgc3RydWN0dXJlcy4KKworc3RhdGljIGttcF90YXNrX3RlYW1fdCAqCitfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW0oIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSBOVUxMOworICAgIGludCBudGhyZWFkczsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOiBUIyVkIGVudGVyaW5nOyB0ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICh0aHJlYWQgPyBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSA6IC0xKSwgdGVhbSApICk7CisKKyAgICBpZiAoVENSX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMpICE9IE5VTEwpIHsKKyAgICAgICAgLy8gVGFrZSBhIHRhc2sgdGVhbSBmcm9tIHRoZSB0YXNrIHRlYW0gcG9vbAorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICAgICAgaWYgKF9fa21wX2ZyZWVfdGFza190ZWFtcyAhPSBOVUxMKSB7CisgICAgICAgICAgICB0YXNrX3RlYW0gPSBfX2ttcF9mcmVlX3Rhc2tfdGVhbXM7CisgICAgICAgICAgICBUQ1dfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcywgdGFza190ZWFtIC0+IHR0LnR0X25leHQpOworICAgICAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgIH0KKworICAgIGlmICh0YXNrX3RlYW0gPT0gTlVMTCkgeworICAgICAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbTogVCMlZCBhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRhc2sgdGVhbSBmb3IgdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRlYW0gKSApOworICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyB0YXNrIHRlYW0gaWYgb25lIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX21hbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuCisgICAgICAgIHRhc2tfdGVhbSA9IChrbXBfdGFza190ZWFtX3QgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfdGFza190ZWFtX3QpICk7CisgICAgICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworICAgICAgICAvL3Rhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgPSBOVUxMOyAgIC8vIEFDOiBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgcmV0dXJuZWQgbWVtb3J5CisgICAgICAgIC8vdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzID0gMDsKKyAgICAgICAgLy90YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IE5VTEw7CisgICAgfQorCisgICAgVENXXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzLCBGQUxTRSk7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICBUQ1dfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfcHJveHlfdGFza3MsIEZBTFNFKTsKKyNlbmRpZgorICAgIHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYyA9IG50aHJlYWRzID0gdGVhbS0+dC50X25wcm9jOworCisgICAgVENXXzQoIHRhc2tfdGVhbSAtPiB0dC50dF91bmZpbmlzaGVkX3RocmVhZHMsIG50aHJlYWRzICk7CisgICAgVENXXzQoIHRhc2tfdGVhbSAtPiB0dC50dF9hY3RpdmUsIFRSVUUgKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOiBUIyVkIGV4aXRpbmc7IHRhc2tfdGVhbSA9ICVwIHVuZmluaXNoZWRfdGhyZWFkcyBpbml0J2QgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICh0aHJlYWQgPyBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSA6IC0xKSwgdGFza190ZWFtLCB0YXNrX3RlYW0gLT4gdHQudHRfdW5maW5pc2hlZF90aHJlYWRzKSApOworICAgIHJldHVybiB0YXNrX3RlYW07Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza190ZWFtOgorLy8gRnJlZXMgdGhlIHRhc2sgdGVhbSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyB0aHJlYWQsIGFuZCBhZGRzIGl0CisvLyB0byB0aGUgZ2xvYmFsIHRhc2sgdGVhbSBmcmVlIGxpc3QuCisKK3ZvaWQKK19fa21wX2ZyZWVfdGFza190ZWFtKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2ZyZWVfdGFza190ZWFtOiBUIyVkIHRhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPyBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSA6IC0xLCB0YXNrX3RlYW0gKSApOworCisgICAgLy8gUHV0IHRhc2sgdGVhbSBiYWNrIG9uIGZyZWUgbGlzdAorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID09IE5VTEwgKTsKKyAgICB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IF9fa21wX2ZyZWVfdGFza190ZWFtczsKKyAgICBUQ1dfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcywgdGFza190ZWFtKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfdGFza190ZWFtX2xvY2sgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcmVhcF90YXNrX3RlYW1zOgorLy8gRnJlZSBhbGwgdGhlIHRhc2sgdGVhbXMgb24gdGhlIHRhc2sgdGVhbSBmcmVlIGxpc3QuCisvLyBTaG91bGQgb25seSBiZSBkb25lIGR1cmluZyBsaWJyYXJ5IHNodXRkb3duLgorLy8gQ2Fubm90IGRvIGFueXRoaW5nIHRoYXQgbmVlZHMgYSB0aHJlYWQgc3RydWN0dXJlIG9yIGd0aWQgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBnb25lLgorCit2b2lkCitfX2ttcF9yZWFwX3Rhc2tfdGVhbXMoIHZvaWQgKQoreworICAgIGttcF90YXNrX3RlYW1fdCAgICp0YXNrX3RlYW07CisKKyAgICBpZiAoIFRDUl9QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zKSAhPSBOVUxMICkgeworICAgICAgICAvLyBGcmVlIGFsbCB0YXNrX3RlYW1zIG9uIHRoZSBmcmVlIGxpc3QKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgICAgIHdoaWxlICggKCB0YXNrX3RlYW0gPSBfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgKSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrX3RlYW1zID0gdGFza190ZWFtIC0+IHR0LnR0X25leHQ7CisgICAgICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IE5VTEw7CisKKyAgICAgICAgICAgIC8vIEZyZWUgdGhyZWFkc19kYXRhIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgaWYgKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrX3RocmVhZHNfZGF0YSggdGFza190ZWFtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlKCB0YXNrX3RlYW0gKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbXM6CisvLyBTb21lIHRocmVhZHMgY291bGQgc3RpbGwgYmUgaW4gdGhlIGZvcmsgYmFycmllciByZWxlYXNlIGNvZGUsIHBvc3NpYmx5CisvLyB0cnlpbmcgdG8gc3RlYWwgdGFza3MuICBXYWl0IGZvciBlYWNoIHRocmVhZCB0byB1bnJlZmVyZW5jZSBpdHMgdGFzayB0ZWFtLgorLy8KK3ZvaWQKK19fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtcyh2b2lkKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICBrbXBfdWludDMyIHNwaW5zOworICAgIGludCBkb25lOworCisgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7CisKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZG9uZSA9IFRSVUU7CisKKyAgICAgICAgLy8gVE9ETzogR0VIIC0gdGhpcyBtYXkgYmUgaXMgd3JvbmcgYmVjYXVzZSBzb21lIHN5bmMgd291bGQgYmUgbmVjZXNzYXJ5CisgICAgICAgIC8vICAgICAgICAgICAgIGluIGNhc2UgdGhyZWFkcyBhcmUgYWRkZWQgdG8gdGhlIHBvb2wgZHVyaW5nIHRoZSB0cmF2ZXJzYWwuCisgICAgICAgIC8vICAgICAgICAgICAgIE5lZWQgdG8gdmVyaWZ5IHRoYXQgbG9jayBmb3IgdGhyZWFkIHBvb2wgaXMgaGVsZCB3aGVuIGNhbGxpbmcKKyAgICAgICAgLy8gICAgICAgICAgICAgdGhpcyByb3V0aW5lLgorICAgICAgICBmb3IgKHRocmVhZCA9IChrbXBfaW5mb190ICopX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgICAgICAgICAgdGhyZWFkICE9IE5VTEw7CisgICAgICAgICAgICAgdGhyZWFkID0gdGhyZWFkLT50aC50aF9uZXh0X3Bvb2wpCisgICAgICAgIHsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgRFdPUkQgZXhpdF92YWw7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggVENSX1BUUih0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID09IE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAvLyBUT0RPOiBHRUggLSBhZGQgdGhpcyBjaGVjayBmb3IgTGludXgqIE9TIC8gT1MgWCogYXMgd2VsbD8KKyAgICAgICAgICAgIGlmICghX19rbXBfaXNfdGhyZWFkX2FsaXZlKHRocmVhZCwgJmV4aXRfdmFsKSkgeworICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBkb25lID0gRkFMU0U7ICAvLyBCZWNhdXNlIHRoX3Rhc2tfdGVhbSBwb2ludGVyIGlzIG5vdCBOVUxMIGZvciB0aGlzIHRocmVhZAorCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFdhaXRpbmcgZm9yIFQjJWQgdG8gdW5yZWZlcmVuY2UgdGFza190ZWFtXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgICAgIHZvbGF0aWxlIHZvaWQgKnNsZWVwX2xvYzsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGhyZWFkIGlzIHNsZWVwaW5nLCBhd2FrZW4gaXQuCisgICAgICAgICAgICAgICAgaWYgKCAoIHNsZWVwX2xvYyA9IFRDUl9QVFIoIHRocmVhZC0+dGgudGhfc2xlZXBfbG9jKSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgd2FraW5nIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCksIHNsZWVwX2xvYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBsaWJyYXJ5IG1vZGUgaXMgdGhyb3VnaHB1dCksIHlpZWxkLgorICAgICAgICAvLyBQYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAvLyBZaWVsZHMgb25seSBpZiBLTVBfTElCUkFSWT10aHJvdWdocHV0CisgICAgfQorCisKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza190ZWFtX3NldHVwOiAgQ3JlYXRlIGEgdGFza190ZWFtIGZvciB0aGUgY3VycmVudCB0ZWFtLCBidXQgdXNlCisvLyBhbiBhbHJlYWR5IGNyZWF0ZWQsIHVudXNlZCBvbmUgaWYgaXQgYWxyZWFkeSBleGlzdHMuCit2b2lkCitfX2ttcF90YXNrX3RlYW1fc2V0dXAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgYWx3YXlzICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgLy8gSWYgdGhpcyB0YXNrX3RlYW0gaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQsIGFsbG9jYXRlIGl0LiBJdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJlZ2lvbiBhZnRlciB0aGUgbmV4dC4KKyAgICAvLyBJZiBpdCBleGlzdHMsIGl0IGlzIHRoZSBjdXJyZW50IHRhc2sgdGVhbSBhbmQgc2hvdWxkbid0IGJlIHRvdWNoZWQgeWV0IGFzIGl0IG1heSBzdGlsbCBiZSBpbiB1c2UuCisgICAgaWYgKHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdID09IE5VTEwgJiYgKGFsd2F5cyB8fCB0ZWFtLT50LnRfbnByb2MgPiAxKSApIHsgCisgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdID0gX19rbXBfYWxsb2NhdGVfdGFza190ZWFtKCB0aGlzX3RociwgdGVhbSApOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fc2V0dXA6IE1hc3RlciBUIyVkIGNyZWF0ZWQgbmV3IHRhc2tfdGVhbSAlcCBmb3IgdGVhbSAlZCBhdCBwYXJpdHk9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdLAorICAgICAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSwgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGUpKTsKKyAgICB9CisKKyAgICAvLyBBZnRlciB0aHJlYWRzIGV4aXQgdGhlIHJlbGVhc2UsIHRoZXkgd2lsbCBjYWxsIHN5bmMsIGFuZCB0aGVuIHBvaW50IHRvIHRoaXMgb3RoZXIgdGFza190ZWFtOyBtYWtlIHN1cmUgaXQgaXMgCisgICAgLy8gYWxsb2NhdGVkIGFuZCBwcm9wZXJseSBpbml0aWFsaXplZC4gQXMgdGhyZWFkcyBzcGluIGluIHRoZSBiYXJyaWVyIHJlbGVhc2UgcGhhc2UsIHRoZXkgd2lsbCBjb250aW51ZSB0byB1c2UgdGhlCisgICAgLy8gcHJldmlvdXMgdGFza190ZWFtIHN0cnVjdChhYm92ZSksIHVudGlsIHRoZXkgcmVjZWl2ZSB0aGUgc2lnbmFsIHRvIHN0b3AgY2hlY2tpbmcgZm9yIHRhc2tzICh0aGV5IGNhbid0IHNhZmVseQorICAgIC8vIHJlZmVyZW5jZSB0aGUga21wX3RlYW1fdCBzdHJ1Y3QsIHdoaWNoIGNvdWxkIGJlIHJlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkKS4gTm8gdGFzayB0ZWFtcyBhcmUgZm9ybWVkIGZvciAKKyAgICAvLyBzZXJpYWxpemVkIHRlYW1zLgorICAgIGlmICh0ZWFtLT50LnRfbnByb2MgPiAxKSB7CisgICAgICAgIGludCBvdGhlcl90ZWFtID0gMSAtIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlOworICAgICAgICBpZiAodGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXSA9PSBOVUxMKSB7IC8vIHNldHVwIG90aGVyIHRlYW0gYXMgd2VsbAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bb3RoZXJfdGVhbV0gPSBfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW0oIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3NldHVwOiBNYXN0ZXIgVCMlZCBjcmVhdGVkIHNlY29uZCBuZXcgdGFza190ZWFtICVwIGZvciB0ZWFtICVkIGF0IHBhcml0eT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgdGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSwgb3RoZXJfdGVhbSApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gTGVhdmUgdGhlIG9sZCB0YXNrIHRlYW0gc3RydWN0IGluIHBsYWNlIGZvciB0aGUgdXBjb21pbmcgcmVnaW9uOyBhZGp1c3QgYXMgbmVlZGVkCisgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW1bb3RoZXJfdGVhbV07CisgICAgICAgICAgICBpZiAoIXRhc2tfdGVhbS0+dHQudHRfYWN0aXZlIHx8IHRlYW0tPnQudF9ucHJvYyAhPSB0YXNrX3RlYW0tPnR0LnR0X25wcm9jKSB7CisgICAgICAgICAgICAgICAgVENXXzQodGFza190ZWFtLT50dC50dF9ucHJvYywgdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Rhc2tzLCBGQUxTRSk7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzLCBGQUxTRSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcywgdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgICAgICAgICAgVENXXzQodGFza190ZWFtLT50dC50dF9hY3RpdmUsIFRSVUUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIHRlYW0gc2l6ZSBoYXMgY2hhbmdlZCwgdGhlIGZpcnN0IHRocmVhZCB0byBlbmFibGUgdGFza2luZyB3aWxsIHJlYWxsb2MgdGhyZWFkc19kYXRhIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3NldHVwOiBNYXN0ZXIgVCMlZCByZXNldCBuZXh0IHRhc2tfdGVhbSAlcCBmb3IgdGVhbSAlZCBhdCBwYXJpdHk9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIHRlYW0tPnQudF90YXNrX3RlYW1bb3RoZXJfdGVhbV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSwgb3RoZXJfdGVhbSApKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza190ZWFtX3N5bmM6IFByb3BhZ2F0aW9uIG9mIHRhc2sgdGVhbSBkYXRhIGZyb20gdGVhbSB0byB0aHJlYWRzCisvLyB3aGljaCBoYXBwZW5zIGp1c3QgYWZ0ZXIgdGhlIHJlbGVhc2UgcGhhc2Ugb2YgYSB0ZWFtIGJhcnJpZXIuICBUaGlzIG1heSBiZQorLy8gY2FsbGVkIGJ5IGFueSB0aHJlYWQsIGJ1dCBvbmx5IGZvciB0ZWFtcyB3aXRoICMgdGhyZWFkcyA+IDEuCisKK3ZvaWQKK19fa21wX3Rhc2tfdGVhbV9zeW5jKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKworICAgIC8vIFRvZ2dsZSB0aGUgdGhfdGFza19zdGF0ZSBmaWVsZCwgdG8gc3dpdGNoIHdoaWNoIHRhc2tfdGVhbSB0aGlzIHRocmVhZCByZWZlcnMgdG8KKyAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSA9IDEgLSB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAvLyBJdCBpcyBub3cgc2FmZSB0byBwcm9wYWdhdGUgdGhlIHRhc2sgdGVhbSBwb2ludGVyIGZyb20gdGhlIHRlYW0gc3RydWN0IHRvIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fc3luYzogVGhyZWFkIFQjJWQgdGFzayB0ZWFtIHN3aXRjaGVkIHRvIHRhc2tfdGVhbSAlcCBmcm9tIFRlYW0gIyVkIChwYXJpdHk9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSwgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGUpKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3RlYW1fd2FpdDogTWFzdGVyIHRocmVhZCB3YWl0cyBmb3Igb3V0c3RhbmRpbmcgdGFza3MgYWZ0ZXIgdGhlIGJhcnJpZXIgZ2F0aGVyCisvLyBwaGFzZS4gIE9ubHkgY2FsbGVkIGJ5IG1hc3RlciB0aHJlYWQgaWYgI3RocmVhZHMgaW4gdGVhbSA+IDEgb3IgaWYgcHJveHkgdGFza3Mgd2VyZSBjcmVhdGVkLgorLy8gd2FpdCBpcyBhIGZsYWcgdGhhdCBkZWZhdWx0cyB0byAxIChzZWUga21wLmgpLCBidXQgd2FpdGluZyBjYW4gYmUgdHVybmVkIG9mZiBieSBwYXNzaW5nIGluIDAKKy8vIG9wdGlvbmFsbHkgYXMgdGhlIGxhc3QgYXJndW1lbnQuIFdoZW4gd2FpdCBpcyB6ZXJvLCBtYXN0ZXIgdGhyZWFkIGRvZXMgbm90IHdhaXQgZm9yCisvLyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gcmVhY2ggMC4KK3ZvaWQKK19fa21wX3Rhc2tfdGVhbV93YWl0KCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopCisgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgd2FpdCkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gPT0gdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSApOworCisgICAgaWYgKCAoIHRhc2tfdGVhbSAhPSBOVUxMICkgJiYgS01QX1RBU0tJTkdfRU5BQkxFRCh0YXNrX3RlYW0pICkgeworICAgICAgICBpZiAod2FpdCkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3dhaXQ6IE1hc3RlciBUIyVkIHdhaXRpbmcgZm9yIGFsbCB0YXNrcyAoZm9yIHVuZmluaXNoZWRfdGhyZWFkcyB0byByZWFjaCAwKSBvbiB0YXNrX3RlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHRhc2tfdGVhbSkpOworICAgICAgICAgICAgLy8gV29ya2VyIHRocmVhZHMgbWF5IGhhdmUgZHJvcHBlZCB0aHJvdWdoIHRvIHJlbGVhc2UgcGhhc2UsIGJ1dCBjb3VsZCBzdGlsbCBiZSBleGVjdXRpbmcgdGFza3MuIFdhaXQKKyAgICAgICAgICAgIC8vIGhlcmUgZm9yIHRhc2tzIHRvIGNvbXBsZXRlLiBUbyBhdm9pZCBtZW1vcnkgY29udGVudGlvbiwgb25seSBtYXN0ZXIgdGhyZWFkIGNoZWNrcyB0ZXJtaW5hdGlvbiBjb25kaXRpb24uCisgICAgICAgICAgICBrbXBfZmxhZ18zMiBmbGFnKCZ0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcywgMFUpOworICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVhY3RpdmF0ZSB0aGUgb2xkIHRhc2sgdGVhbSwgc28gdGhhdCB0aGUgd29ya2VyIHRocmVhZHMgd2lsbCBzdG9wIHJlZmVyZW5jaW5nIGl0IHdoaWxlIHNwaW5uaW5nLgorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fd2FpdDogTWFzdGVyIFQjJWQgZGVhY3RpdmF0aW5nIHRhc2tfdGVhbSAlcDogIgorICAgICAgICAgICAgICAgICAgICAgICJzZXR0aW5nIGFjdGl2ZSB0byBmYWxzZSwgc2V0dGluZyBsb2NhbCBhbmQgdGVhbSdzIHBvaW50ZXIgdG8gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgdGFza190ZWFtKSk7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtLT50dC50dF9ucHJvYyA+IDEgfHwgdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyA9PSBUUlVFICk7CisgICAgICAgIFRDV19TWU5DXzQoIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MsIEZBTFNFICk7CisjZWxzZQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0tPnR0LnR0X25wcm9jID4gMSApOworI2VuZGlmCisgICAgICAgIFRDV19TWU5DXzQoIHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlLCBGQUxTRSApOworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIE5VTEwpOworICAgIH0KK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza2luZ19iYXJyaWVyOgorLy8gVGhpcyByb3V0aW5lIG1heSBvbmx5IGNhbGxlZCB3aGVuIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIuCisvLyBJbnRlcm5hbCBmdW5jdGlvbiB0byBleGVjdXRlIGFsbCB0YXNrcyBwcmlvciB0byBhIHJlZ3VsYXIgYmFycmllciBvciBhCisvLyBqb2luIGJhcnJpZXIuICBJdCBpcyBhIGZ1bGwgYmFycmllciBpdHNlbGYsIHdoaWNoIHVuZm9ydHVuYXRlbHkgdHVybnMKKy8vIHJlZ3VsYXIgYmFycmllcnMgaW50byBkb3VibGUgYmFycmllcnMgYW5kIGpvaW4gYmFycmllcnMgaW50byAxIDEvMgorLy8gYmFycmllcnMuCit2b2lkCitfX2ttcF90YXNraW5nX2JhcnJpZXIoIGttcF90ZWFtX3QgKnRlYW0sIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IGd0aWQgKQoreworICAgIHZvbGF0aWxlIGttcF91aW50MzIgKnNwaW4gPSAmdGVhbS0+dC50X3Rhc2tfdGVhbVt0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVdLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHM7CisgICAgaW50IGZsYWcgPSBGQUxTRTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9leHRyYV9iYXJyaWVyICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggc3BpbiwgKGttcF91aW50MzIqKSBOVUxMICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGttcF9mbGFnXzMyIHNwaW5fZmxhZyhzcGluLCAwVSk7CisgICAgd2hpbGUgKCEgc3Bpbl9mbGFnLmV4ZWN1dGVfdGFza3ModGhyZWFkLCBndGlkLCBUUlVFLCAmZmxhZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpLCAwICkgKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBUT0RPOiBXaGF0IGFib3V0IGl0dF9zeW5jX29iaj8/CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIHNwaW4gKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisgICAgICAgICAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApCisgICAgICAgICAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgIC8vIEdIOiBXZSBhbHdheXMgeWllbGQgaGVyZQorICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoICh2b2lkKikgc3BpbiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30KKworCisjaWYgT01QXzQxX0VOQUJMRUQKKworLyogX19rbXBfZ2l2ZV90YXNrIHB1dHMgYSB0YXNrIGludG8gYSBnaXZlbiB0aHJlYWQgcXVldWUgaWY6CisgICAgLSB0aGUgcXVldWUgZm9yIHRoYXQgdGhyZWFkIGl0IHdhcyBjcmVhdGVkCisgICAgLSB0aGVyZSdzIHNwYWNlIGluIHRoYXQgcXVldWUKKworICAgIEJlY2F1c2Ugb2YgdGhpcywgX19rbXBfcHVzaF90YXNrIG5lZWRzIHRvIGNoZWNrIGlmIHRoZXJlJ3Mgc3BhY2UgYWZ0ZXIgZ2V0dGluZyB0aGUgbG9jaworICovCitzdGF0aWMgYm9vbCBfX2ttcF9naXZlX3Rhc2sgKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiB0aWQsIGttcF90YXNrX3QgKiB0YXNrICkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgKiAgIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICAgIGttcF90aHJlYWRfZGF0YV90ICogdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIHRpZCBdOworICAgIGttcF90YXNrZGF0YV90ICogICAgdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZ2l2ZV90YXNrOiB0cnlpbmcgdG8gZ2l2ZSB0YXNrICVwIHRvIHRocmVhZCAlZC5cbiIsIHRhc2tkYXRhLCB0aWQgKSApOworCisgICAgLy8gYXNzZXJ0IHRhc2tpbmcgaXMgZW5hYmxlZD8gd2hhdCBpZiBub3Q/CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtICE9IE5VTEwgKTsKKworICAgIGlmICh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9PSBOVUxMICkgeworICAgICAgICAvLyBUaGVyZSdzIG5vIHF1ZXVlIGluIHRoaXMgdGhyZWFkLCBnbyBmaW5kIGFub3RoZXIgb25lCisgICAgICAgIC8vIFdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBhdCBsZWFzdCBvbmUgdGhyZWFkIGhhcyBhIHF1ZXVlCisgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dpdmVfdGFzazogdGhyZWFkICVkIGhhcyBubyBxdWV1ZSB3aGlsZSBnaXZpbmcgdGFzayAlcC5cbiIsIHRpZCwgdGFza2RhdGEgKSApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmICggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA+PSBUQVNLX0RFUVVFX1NJWkUgKQorICAgIHsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2l2ZV90YXNrOiBxdWV1ZSBpcyBmdWxsIHdoaWxlIGdpdmluZyB0YXNrICVwIHRvIHRocmVhZCAlZC5cbiIsIHRhc2tkYXRhLCB0aWQgKSApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBpZiAoIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPj0gVEFTS19ERVFVRV9TSVpFICkKKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dpdmVfdGFzazogcXVldWUgaXMgZnVsbCB3aGlsZSBnaXZpbmcgdGFzayAlcCB0byB0aHJlYWQgJWQuXG4iLCB0YXNrZGF0YSwgdGlkICkgKTsKKyAgICAgICAgZ290byByZWxlYXNlX2FuZF9leGl0OworICAgIH0KKworICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlWyB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsIF0gPSB0YXNrZGF0YTsKKyAgICAvLyBXcmFwIGluZGV4LgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgKyAxICkgJiBUQVNLX0RFUVVFX01BU0s7CisgICAgVENXXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpICsgMSk7CisKKyAgICByZXN1bHQgPSB0cnVlOworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dpdmVfdGFzazogc3VjY2Vzc2Z1bGx5IGdhdmUgdGFzayAlcCB0byB0aHJlYWQgJWQuXG4iLCB0YXNrZGF0YSwgdGlkICkgKTsKKworcmVsZWFzZV9hbmRfZXhpdDoKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogVGhlIGZpbmlzaCBvZiB0aGUgYSBwcm94eSB0YXNrcyBpcyBkaXZpZGVkIGluIHR3byBwaWVjZXM6CisgICAgLSB0aGUgdG9wIGhhbGYgaXMgdGhlIG9uZSB0aGF0IGNhbiBiZSBkb25lIGZyb20gYSB0aHJlYWQgb3V0c2lkZSB0aGUgdGVhbQorICAgIC0gdGhlIGJvdHRvbSBoYWxmIG11c3QgYmUgcnVuIGZyb20gYSB0aGVtIHdpdGhpbiB0aGUgdGVhbQorCisgICAgSW4gb3JkZXIgdG8gcnVuIHRoZSBib3R0b20gaGFsZiB0aGUgdGFzayBnZXRzIHF1ZXVlZCBiYWNrIGludG8gb25lIG9mIHRoZSB0aHJlYWRzIG9mIHRoZSB0ZWFtLgorICAgIE9uY2UgdGhlIHRkX2luY29tcGxldGVfY2hpbGRfdGFzayBjb3VudGVyIG9mIHRoZSBwYXJlbnQgaXMgZGVjcmVtZW50ZWQgdGhlIHRocmVhZHMgY2FuIGxlYXZlIHRoZSBiYXJyaWVycy4KKyAgICBTbywgdGhlIGJvdHRvbSBoYWxmIG5lZWRzIHRvIGJlIHF1ZXVlZCBiZWZvcmUgdGhlIGNvdW50ZXIgaXMgZGVjcmVtZW50ZWQuIFRoZSB0b3AgaGFsZiBpcyB0aGVyZWZvcmUgZGl2aWRlZCBpbiB0d28gcGFydHM6CisgICAgLSB0aGluZ3MgdGhhdCBjYW4gYmUgcnVuIGJlZm9yZSBxdWV1aW5nIHRoZSBib3R0b20gaGFsZgorICAgIC0gdGhpbmdzIHRoYXQgbXVzdCBiZSBydW4gYWZ0ZXIgcXVldWluZyB0aGUgYm90dG9tIGhhbGYKKworICAgIFRoaXMgY3JlYXRlcyBhIHNlY29uZCByYWNlIGFzIHRoZSBib3R0b20gaGFsZiBjYW4gZnJlZSB0aGUgdGFzayBiZWZvcmUgdGhlIHNlY29uZCB0b3AgaGFsZiBpcyBleGVjdXRlZC4gVG8gYXZvaWQgdGhpcworICAgIHdlIHVzZSB0aGUgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrIG9mIHRoZSBwcm94eSB0YXNrIHRvIHN5bmNocm9uaXplIHRoZSB0b3AgYW5kIGJvdHRvbSBoYWxmLgorKi8KKworc3RhdGljIHZvaWQgX19rbXBfZmlyc3RfdG9wX2hhbGZfZmluaXNoX3Byb3h5KCBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5mcmVlZCA9PSAwICk7CisKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9IDE7ICAgLy8gbWFyayB0aGUgdGFzayBhcyBjb21wbGV0ZWQKKworICAgIGlmICggdGFza2RhdGEtPnRkX3Rhc2tncm91cCApCisgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAtPmNvdW50KSApOworCisgICAgLy8gQ3JlYXRlIGFuIGltYWdpbmFyeSBjaGlsZHJlbiBmb3IgdGhpcyB0YXNrIHNvIHRoZSBib3R0b20gaGFsZiBjYW5ub3QgcmVsZWFzZSB0aGUgdGFzayBiZWZvcmUgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlIHNlY29uZCB0b3AgaGFsZgorICAgIFRDUl80KHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKyspOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zZWNvbmRfdG9wX2hhbGZfZmluaXNoX3Byb3h5KCBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhICkKK3sKKyAgICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworCisgICAgLy8gUHJlZGVjcmVtZW50IHNpbXVsYXRlZCBieSAiLSAxIiBjYWxjdWxhdGlvbgorICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX3BhcmVudCAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBjaGlsZHJlbiA+PSAwICk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGltYWdpbmFyeSBjaGlsZHJlbgorICAgIFRDUl80KHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzLS0pOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9ib3R0b21faGFsZl9maW5pc2hfcHJveHkoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogcHRhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShwdGFzayk7CisgICAga21wX2luZm9fdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9PSAxICk7IC8vIHRvcCBoYWxmIG11c3QgcnVuIGJlZm9yZSBib3R0b20gaGFsZgorCisgICAgLy8gV2UgbmVlZCB0byB3YWl0IHRvIG1ha2Ugc3VyZSB0aGUgdG9wIGhhbGYgaXMgZmluaXNoZWQKKyAgICAvLyBTcGlubmluZyBoZXJlIHNob3VsZCBiZSBvayBhcyB0aGlzIHNob3VsZCBoYXBwZW4gcXVpY2tseQorICAgIHdoaWxlICggVENSXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpID4gMCApIDsKKworICAgIF9fa21wX3JlbGVhc2VfZGVwcyhndGlkLHRhc2tkYXRhKTsKKyAgICBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhndGlkLCB0YXNrZGF0YSwgdGhyZWFkKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gZ3RpZCBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBwdGFzayBUYXNrIHdoaWNoIGV4ZWN1dGlvbiBpcyBjb21wbGV0ZWQKKworRXhlY3V0ZSB0aGUgY29tcGxldGF0aW9uIG9mIGEgcHJveHkgdGFzayBmcm9tIGEgdGhyZWFkIG9mIHRoYXQgaXMgcGFydCBvZiB0aGUgdGVhbS4gUnVuIGZpcnN0IGFuZCBib3R0b20gaGFsdmVzIGRpcmVjdGx5LgorKi8KK3ZvaWQgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqcHRhc2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIHB0YXNrICE9IE5VTEwgKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEocHRhc2spOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Byb3h5X3Rhc2tfY29tcGxldGVkKGVudGVyKTogVCMlZCBwcm94eSB0YXNrICVwIGNvbXBsZXRpbmdcbiIsIGd0aWQsIHRhc2tkYXRhICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZICk7CisKKyAgICBfX2ttcF9maXJzdF90b3BfaGFsZl9maW5pc2hfcHJveHkodGFza2RhdGEpOworICAgIF9fa21wX3NlY29uZF90b3BfaGFsZl9maW5pc2hfcHJveHkodGFza2RhdGEpOworICAgIF9fa21wX2JvdHRvbV9oYWxmX2ZpbmlzaF9wcm94eShndGlkLHB0YXNrKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Byb3h5X3Rhc2tfY29tcGxldGVkKGV4aXQpOiBUIyVkIHByb3h5IHRhc2sgJXAgY29tcGxldGluZ1xuIiwgZ3RpZCwgdGFza2RhdGEgKSApOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBwdGFzayBUYXNrIHdoaWNoIGV4ZWN1dGlvbiBpcyBjb21wbGV0ZWQKKworRXhlY3V0ZSB0aGUgY29tcGxldGF0aW9uIG9mIGEgcHJveHkgdGFzayBmcm9tIGEgdGhyZWFkIHRoYXQgY291bGQgbm90IGJlbG9uZyB0byB0aGUgdGVhbS4KKyovCit2b2lkIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZF9vb28gKCBrbXBfdGFza190ICpwdGFzayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcHRhc2sgIT0gTlVMTCApOworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShwdGFzayk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9wcm94eV90YXNrX2NvbXBsZXRlZF9vb28oZW50ZXIpOiBwcm94eSB0YXNrIGNvbXBsZXRpbmcgb29vICVwXG4iLCB0YXNrZGF0YSApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSApOworCisgICAgX19rbXBfZmlyc3RfdG9wX2hhbGZfZmluaXNoX3Byb3h5KHRhc2tkYXRhKTsKKworICAgIC8vIEVucXVldWUgdGFzayB0byBjb21wbGV0ZSBib3R0b20gaGFsZiBjb21wbGV0YXRpb24gZnJvbSBhIHRocmVhZCB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgdGVhbQorICAgIGttcF90ZWFtX3QgKiB0ZWFtID0gdGFza2RhdGEtPnRkX3RlYW07CisgICAga21wX2ludDMyIG50aHJlYWRzID0gdGVhbS0+dC50X25wcm9jOworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICBrbXBfaW50MzIgayA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIC8vVGhpcyBzaG91bGQgYmUgc2ltaWxhciB0byBrID0gX19rbXBfZ2V0X3JhbmRvbSggdGhyZWFkICkgJSBudGhyZWFkcyBidXQgd2UgY2Fubm90IHVzZSBfX2ttcF9nZXRfcmFuZG9tIGhlcmUKKyAgICAgICAgLy9Gb3Igbm93IHdlJ3JlIGp1c3QgbGluZWFybHkgdHJ5aW5nIHRvIGZpbmQgYSB0aHJlYWQKKyAgICAgICAgayA9IChrKzEpICUgbnRocmVhZHM7CisgICAgICAgIHRocmVhZCA9IHRlYW0tPnQudF90aHJlYWRzW2tdOworICAgIH0gd2hpbGUgKCAhX19rbXBfZ2l2ZV90YXNrKCB0aHJlYWQsIGssICBwdGFzayApICk7CisKKyAgICBfX2ttcF9zZWNvbmRfdG9wX2hhbGZfZmluaXNoX3Byb3h5KHRhc2tkYXRhKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyhleGl0KTogcHJveHkgdGFzayBjb21wbGV0aW5nIG9vbyAlcFxuIiwgdGFza2RhdGEgKSApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNrcS5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2txLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3OWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNrcS5jCkBAIC0wLDAgKzEsMjAzMiBAQAorLyoKKyAqIGttcF90YXNrcS5jIC0tIFRBU0tRIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisKKyNkZWZpbmUgTUFYX01FU1NBR0UgNTEyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUYXNrcSByb3V0aW5lcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcworICovCisKKyNkZWZpbmUgS01QX0RFQlVHX1JFRl9DVFMoeCkgICAgS0ZfVFJBQ0UoMSwgeCk7CisKKyNkZWZpbmUgVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUQorCitzdGF0aWMgaW50Citpbl9wYXJhbGxlbF9jb250ZXh0KCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICByZXR1cm4gISB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza3FfZW8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50ICAgICAgICAgICAgICAgIGd0aWQgPSAqZ3RpZF9yZWY7CisgICAgaW50ICAgICAgICAgICAgICAgIHRpZCAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3VpbnQzMiAgICAgICAgIG15X3Rva2VuOworICAgIGttcGNfdGFza19xdWV1ZV90ICp0YXNrcTsKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHEgICA9ICYgX19rbXBfdGhyZWFkc1tndGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fdGFza3EsIGxvY19yZWYsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl90YXNrcSwgbG9jX3JlZiwgTlVMTCApOworI2VuZGlmCisKKyAgICBpZiAoICEgX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogR0VIIC0gbmVlZCBjaGVjayBoZXJlIHVuZGVyIHN0YXRzIHRvIG1ha2Ugc3VyZSAgICovCisgICAgICAgIC8qICAgICAgIGluc2lkZSB0YXNrIChjdXJyX3RodW5rWyp0aWRfcmVmXSAhPSBOVUxMKSAqLworCisgICAgICAgIG15X3Rva2VuID10cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPiB0aF90YXNrbnVtOworCisgICAgICAgIHRhc2txID0gdHEtPnRxX2N1cnJfdGh1bmtbIHRpZCBdLT4gdGgudGhfc2hhcmVkcyAtPiBzdl9xdWV1ZTsKKworICAgICAgICBLTVBfV0FJVF9ZSUVMRCgmdGFza3EtPnRxX3Rhc2tudW1fc2VydmluZywgbXlfdG9rZW4sIEtNUF9FUSwgTlVMTCk7CisgICAgICAgIEtNUF9NQigpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2txX3hvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCAgICAgICAgICAgZ3RpZCA9ICpndGlkX3JlZjsKKyAgICBpbnQgICAgICAgICAgIHRpZCAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3VpbnQzMiAgICBteV90b2tlbjsKKyAgICBrbXBfdGFza3FfdCAgKnRxICAgPSAmIF9fa21wX3RocmVhZHNbZ3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3Rhc2txLCBsb2NfcmVmICk7CisKKyAgICBpZiAoICEgX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogR0VIIC0gbmVlZCBjaGVjayBoZXJlIHVuZGVyIHN0YXRzIHRvIG1ha2Ugc3VyZSAqLworICAgICAgICAvKiAgICAgICBpbnNpZGUgdGFzayAoY3Vycl90aHVua1t0aWRdICE9IE5VTEwpICAgICovCisKKyAgICAgICAgbXlfdG9rZW4gPSB0cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPnRoX3Rhc2tudW07CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbIHRpZCBdLT4gdGgudGhfc2hhcmVkcyAtPiBzdl9xdWV1ZSAtPiB0cV90YXNrbnVtX3NlcnZpbmcgPSBteV90b2tlbiArIDE7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza3FfY2hlY2tfb3JkZXJlZCgga21wX2ludDMyIGd0aWQsIGttcGNfdGh1bmtfdCAqdGh1bmsgKQoreworICAgIGttcF91aW50MzIgbXlfdG9rZW47CisgICAga21wY190YXNrX3F1ZXVlX3QgKnRhc2txOworCisgICAgLyogYXNzdW1lIHdlIGFyZSBhbHdheXMgY2FsbGVkIGZyb20gYW4gYWN0aXZlIHBhcmFsbGVsIGNvbnRleHQgKi8KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgbXlfdG9rZW4gPSAgdGh1bmsgLT4gdGhfdGFza251bTsKKworICAgIHRhc2txID0gIHRodW5rIC0+IHRoLnRoX3NoYXJlZHMgLT4gc3ZfcXVldWU7CisKKyAgICBpZih0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nIDw9IG15X3Rva2VuKSB7CisgICAgICAgIEtNUF9XQUlUX1lJRUxEKCZ0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nLCBteV90b2tlbiwgS01QX0dFLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcgPSBteV90b2tlbiArMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorfQorCisjaWZkZWYgS01QX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX1RRRihrbXBfaW50MzIgZmxhZ3MpCit7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX09SREVSRUQpCisgICAgICAgIF9fa21wX3ByaW50ZigiT1JERVJFRCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfTEFTVFBSSVZBVEUpCisgICAgICAgIF9fa21wX3ByaW50ZigiTEFTVF9QUklWICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JU19OT1dBSVQpCisgICAgICAgIF9fa21wX3ByaW50ZigiTk9XQUlUICIpOworICAgIGlmIChmbGFncyAmIFRRRl9IRVVSSVNUSUNTKQorICAgICAgICBfX2ttcF9wcmludGYoIkhFVVJJU1QgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDEpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWMSAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMikKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlYyICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQzKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjMgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDQpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWNCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLKQorICAgICAgICBfX2ttcF9wcmludGYoIkxBU1RfVEFTSyAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJUQVNLUV9UQVNLICIpOworICAgIGlmIChmbGFncyAmIFRRRl9SRUxFQVNFX1dPUktFUlMpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVMRUFTRSAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfQUxMX1RBU0tTX1FVRVVFRCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJBTExfUVVFVUVEICIpOworICAgIGlmIChmbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKQorICAgICAgICBfX2ttcF9wcmludGYoIlBBUkFMTEVMICIpOworICAgIGlmIChmbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJERUFMTE9DICIpOworICAgIGlmICghKGZsYWdzICYgKFRRRl9JTlRFUk5BTF9GTEFHU3xUUUZfSU5URVJGQUNFX0ZMQUdTKSkpCisgICAgICAgIF9fa21wX3ByaW50ZigiKE5PTkUpIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX3RodW5rKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGh1bmtfdCAqdGh1bmssIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbnByb2MgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jOworCisgICAgX19rbXBfcHJpbnRmKCJcdFRodW5rIGF0ICVwIG9uICglZCk6ICAiLCB0aHVuaywgZ2xvYmFsX3RpZCk7CisKKyAgICBpZiAodGh1bmsgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICAgICAgaWYoIHRxLT50cV9jdXJyX3RodW5rW2ldID09IHRodW5rICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiWyVpXSAiLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9wcmludGYoInRoX3NoYXJlZHM9JXAsICIsIHRodW5rLT50aC50aF9zaGFyZWRzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF90YXNrPSVwLCAiLCB0aHVuay0+dGhfdGFzayk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfZW5jbF90aHVuaz0lcCwgIiwgdGh1bmstPnRoX2VuY2xfdGh1bmspOworICAgICAgICBfX2ttcF9wcmludGYoInRoX3N0YXR1cz0lZCwgIiwgdGh1bmstPnRoX3N0YXR1cyk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfdGFza251bT0ldSwgIiwgdGh1bmstPnRoX3Rhc2tudW0pOworICAgICAgICBfX2ttcF9wcmludGYoInRoX2ZsYWdzPSIpOyBfX2ttcF9kdW1wX1RRRih0aHVuay0+dGhfZmxhZ3MpOworICAgIH0KKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGh1bmtfc3RhY2soa21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHRocmVhZF9udW0pCit7CisgICAga21wY190aHVua190ICp0aDsKKworICAgIF9fa21wX3ByaW50ZigiICAgIFRodW5rIHN0YWNrIGZvciBUIyVkOiAgIiwgdGhyZWFkX251bSk7CisKKyAgICBmb3IgKHRoID0gdGh1bms7IHRoICE9IE5VTEw7IHRoID0gdGgtPnRoX2VuY2xfdGh1bmsgKQorICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHRoKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGFza19xdWV1ZSgga21wX3Rhc2txX3QgKnRxLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICBxcywgY291bnQsIGk7CisgICAga21wY190aHVua190ICAgICAgICAqdGh1bms7CisgICAga21wY190YXNrX3F1ZXVlX3QgICAqdGFza3E7CisKKyAgICBfX2ttcF9wcmludGYoIlRhc2sgUXVldWUgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKTsKKworICAgIGlmIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICAgIGludCBpbl9wYXJhbGxlbCA9IHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2xvYyAgICAgICAgICAgICA6ICIpOworICAgIH0KKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisKKyAgICAgICAgICAgIC8vaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gMCkKKyAgICAgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcGFyZW50ICAgICAgICAgIDogJXBcbiIsIHF1ZXVlLT50cS50cV9wYXJlbnQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfZmlyc3RfY2hpbGQgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9maXJzdF9jaGlsZCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9uZXh0X2NoaWxkICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX25leHRfY2hpbGQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcHJldl9jaGlsZCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9wcmV2X2NoaWxkKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3JlZl9jb3VudCAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKworICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvL2lmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IDApCisgICAgICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3NoYXJlZHMgICAgICAgICA6ICIpOworICAgICAgICBmb3IgKGk9MDsgaTwoKHF1ZXVlID09IHRxLT50cV9yb290KSA/IHF1ZXVlLT50cV9ucHJvYyA6IDEpOyBpKyspCisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHF1ZXVlLT50cV9zaGFyZWRzW2ldLmFpX2RhdGEpOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YXNrbnVtX3F1ZXVpbmcgOiAldVxuIiwgcXVldWUtPnRxX3Rhc2tudW1fcXVldWluZyk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YXNrbnVtX3NlcnZpbmcgOiAldVxuIiwgcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9xdWV1ZSAgICAgICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3F1ZXVlKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGh1bmtfc3BhY2UgICAgIDogJXBcbiIsIHF1ZXVlLT50cV90aHVua19zcGFjZSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3Rhc2txX3Nsb3QgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfdGFza3Ffc2xvdCk7CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfZnJlZV90aHVua3MgICAgIDogIik7CisgICAgICAgIGZvciAodGh1bmsgPSBxdWV1ZS0+dHFfZnJlZV90aHVua3M7IHRodW5rICE9IE5VTEw7IHRodW5rID0gdGh1bmstPnRoLnRoX25leHRfZnJlZSApCisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHRodW5rKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX25zbG90cyAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfbnNsb3RzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfaGVhZCAgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9oZWFkKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFpbCAgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV90YWlsKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbmZ1bGwgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9uZnVsbCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2hpd2F0ICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfaGl3YXQpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9mbGFncyAgICAgICAgICAgOiAiKTsgX19rbXBfZHVtcF9UUUYocXVldWUtPnRxX2ZsYWdzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGhfdGh1bmtzICAgICAgIDogIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUtPnRxX25wcm9jOyBpKyspIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIiVkICIsIHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIFF1ZXVlIHNsb3RzOlxuIik7CisKKworICAgICAgICBxcyA9IHF1ZXVlLT50cV90YWlsOworICAgICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgcXVldWUtPnRxX25mdWxsOyArK2NvdW50ICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIoJWQpIiwgcXMpOworICAgICAgICAgICAgX19rbXBfZHVtcF90aHVuayggdHEsIHF1ZXVlLT50cV9xdWV1ZVtxc10ucXNfdGh1bmssIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgIHFzID0gKHFzKzEpICUgcXVldWUtPnRxX25zbG90czsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfdGFza3Ffc2xvdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgVGFza1Egc2xvdDpcbiIpOworICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfdGh1bmsoIHRxLCAoa21wY190aHVua190ICopIHF1ZXVlLT50cV90YXNrcV9zbG90LCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9wcmludGYoIiAgICBUYXNrcSBmcmVlbGlzdDogIik7CisKKyAgICAvL19fa21wX2FjcXVpcmVfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICBmb3IoIHRhc2txID0gdHEtPnRxX2ZyZWVsaXN0OyB0YXNrcSAhPSBOVUxMOyB0YXNrcSA9IHRhc2txLT50cS50cV9uZXh0X2ZyZWUgKQorICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHRhc2txKTsKKworICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG5cbiIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYXV4X2R1bXBfdGFza19xdWV1ZV90cmVlKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGFza19xdWV1ZV90ICpjdXJyX3F1ZXVlLCBrbXBfaW50MzIgbGV2ZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBpbnQgaSwgY291bnQsIHFzOworICAgIGludCBucHJvYyA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gY3Vycl9xdWV1ZTsKKworICAgIGlmIChjdXJyX3F1ZXVlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIF9fa21wX3ByaW50ZigiICAgICIpOworCisgICAgZm9yIChpPTA7IGk8bGV2ZWw7IGkrKykKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICIpOworCisgICAgX19rbXBfcHJpbnRmKCIlcCIsIGN1cnJfcXVldWUpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyBpKyspIHsKKyAgICAgICAgaWYoIHRxLT50cV9jdXJyX3RodW5rW2ldICYmIHRxLT50cV9jdXJyX3RodW5rW2ldLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSA9PSBjdXJyX3F1ZXVlICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgWyVpXSIsIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCI6Iik7CisKKyAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICBxcyA9IGN1cnJfcXVldWUtPnRxX3RhaWw7CisKKyAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgY3Vycl9xdWV1ZS0+dHFfbmZ1bGw7ICsrY291bnQgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgY3Vycl9xdWV1ZS0+dHFfcXVldWVbcXNdLnFzX3RodW5rKTsKKyAgICAgICAgIHFzID0gKHFzKzEpICUgY3Vycl9xdWV1ZS0+dHFfbnNsb3RzOworICAgIH0KKworICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCkgeworICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCkgeworICAgICAgICAgICAgZm9yKHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisgICAgICAgICAgICAgICAgcXVldWUgIT0gTlVMTDsKKyAgICAgICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYXV4X2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgcXVldWUsIGxldmVsKzEsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGFza19xdWV1ZV90ICp0cXJvb3QsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIF9fa21wX3ByaW50ZigiVGFza1EgVHJlZSBhdCByb290ICVwIG9uICglZCk6XG4iLCB0cXJvb3QsIGdsb2JhbF90aWQpOworCisgICAgX19rbXBfYXV4X2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHFyb290LCAwLCBnbG9iYWxfdGlkICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgICAgTmV3IHRhc2txIHN0b3JhZ2Ugcm91dGluZXMgdGhhdCB0cnkgdG8gbWluaW1pemUgb3ZlcmhlYWQgb2YgbWFsbG9jcyBidXQKKyAgICBzdGlsbCBwcm92aWRlIGNhY2hlIGxpbmUgYWxpZ25tZW50LgorKi8KKworCitzdGF0aWMgdm9pZCAqCitfX2ttcF90YXNrcV9hbGxvY2F0ZShzaXplX3Qgc2l6ZSwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgdm9pZCAqYWRkciwgKm9yaWdfYWRkcjsKKyAgICBzaXplX3QgYnl0ZXM7CisKKyAgICBLQl9UUkFDRSggNSwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogY2FsbGVkIHNpemU9JWQsIGd0aWQ9JWRcbiIsIChpbnQpIHNpemUsIGdsb2JhbF90aWQgKSApOworCisgICAgYnl0ZXMgPSBzaXplb2Yodm9pZCAqKSArIENBQ0hFX0xJTkUgKyBzaXplOworCisjaWZkZWYgVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUQorICAgIG9yaWdfYWRkciA9ICh2b2lkICopIF9fa21wX3RocmVhZF9tYWxsb2MoIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCksIGJ5dGVzICk7CisjZWxzZQorICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgTUFMTE9DKCAlZCApXG4iLCBieXRlcyApICk7CisgICAgb3JpZ19hZGRyID0gKHZvaWQgKikgS01QX0lOVEVSTkFMX01BTExPQyggYnl0ZXMgKTsKKyNlbmRpZiAvKiBUSFJFQURfQUxMT0NfRk9SX1RBU0tRICovCisKKyAgICBpZiAob3JpZ19hZGRyID09IDApCisgICAgICAgIEtNUF9GQVRBTCggT3V0T2ZIZWFwTWVtb3J5ICk7CisKKyAgICBhZGRyID0gb3JpZ19hZGRyOworCisgICAgaWYgKCgoa21wX3VpbnRwdHJfdCkgYWRkciAmICggQ0FDSEVfTElORSAtIDEgKSkgIT0gMCkgeworICAgICAgICBLQl9UUkFDRSggNTAsICgiX19rbXBfdGFza3FfYWxsb2NhdGU6ICBhZGp1c3QgZm9yIGNhY2hlIGFsaWdubWVudFxuIiApICk7CisgICAgICAgIGFkZHIgPSAodm9pZCAqKSAoKChrbXBfdWludHB0cl90KSBhZGRyICsgQ0FDSEVfTElORSkgJiB+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+dHFfbmV4dF9jaGlsZCA9IE5VTEw7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgd2FpdGluZyBmb3IgcmVmX2NvdW50IG9mICVkIHRvIHJlYWNoIDFcbiIsCisgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBxdWV1ZS0+dHFfcmVmX2NvdW50KSk7CisKKyAgICAgICAgLyogd2FpdCB1bnRpbCBhbGwgb3RoZXIgdGhyZWFkcyBoYXZlIHN0b3BwZWQgYWNjZXNzaW5nIHRoaXMgcXVldWUgKi8KKyAgICAgICAgd2hpbGUgKHF1ZXVlLT50cV9yZWZfY291bnQgPiAxKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9XQUlUX1lJRUxEKCh2b2xhdGlsZSBrbXBfdWludDMyKikmcXVldWUtPnRxX3JlZl9jb3VudCwgMSwgS01QX0xFLCBOVUxMKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBmcmVlaW5nIHF1ZXVlXG4iLAorICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlKSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA9PSAwKTsKKworICAgIGZvciAoaT0wOyBpPHF1ZXVlLT50cV9ucHJvYzsgaSsrKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhID09IDApOworICAgIH0KKworICAgIGkgPSAwOworICAgIGZvciAodGh1bms9cXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOyB0aHVuaz10aHVuay0+dGgudGhfbmV4dF9mcmVlKQorICAgICAgICArK2k7CisKKyAgICBLTVBfQVNTRVJUIChpID09IHF1ZXVlLT50cV9uc2xvdHMgKyAocXVldWUtPnRxX25wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkpOworI2VuZGlmCisKKyAgICAvKiAgcmVsZWFzZSBzdG9yYWdlIGZvciBxdWV1ZSBlbnRyeSAgKi8KKyAgICBfX2ttcF9mcmVlX3Rhc2txICggdHEsIHF1ZXVlLCBUUlVFLCBnbG9iYWxfdGlkICk7CisKKyAgICBLRl9UUkFDRSg1MCwgKCJBZnRlciBEZWxldGlvbiBvZiBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDUwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWVfdHJlZSggdHEsIHRxLT50cV9yb290LCBnbG9iYWxfdGlkICkpOworfQorCisvKgorICogU3RhcnRpbmcgZnJvbSBpbmRpY2F0ZWQgcXVldWUsIHByb2NlZWQgZG93bndhcmQgdGhyb3VnaCB0cmVlIGFuZAorICogcmVtb3ZlIGFsbCB0YXNrcXMgd2hpY2ggYXJlIGZpbmlzaGVkLCBidXQgb25seSBnbyBkb3duIHRvIHRhc2txcworICogd2hpY2ggaGF2ZSB0aGUgIm5vd2FpdCIgY2xhdXNlIHByZXNlbnQuICBBc3N1bWUgdGhpcyBpcyBvbmx5IGNhbGxlZAorICogd2hlbiBpbl9wYXJhbGxlbD1UUlVFLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9maW5kX2FuZF9yZW1vdmVfZmluaXNoZWRfY2hpbGRfdGFza3EoIGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpjdXJyX3F1ZXVlICkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSBjdXJyX3F1ZXVlOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisgICAgICAgIGlmIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgIHsKKyAgICAgICAgICAgIGttcGNfdGFza19xdWV1ZV90ICpuZXh0OworICAgICAgICAgICAgaW50IGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKworCisgICAgICAgICAgICAvKiBhbHRob3VnaCByZWZlcmVuY2UgY291bnQgc3RheXMgYWN0aXZlIGR1cmluZyBkZXNjZW5kYW50IHdhbGssICovCisgICAgICAgICAgICAvKiBzaG91bGRuJ3QgbWF0dGVyIHNpbmNlIGlmIGNoaWxkcmVuIHN0aWxsIGV4aXN0LCByZWZlcmVuY2UgICAgICovCisgICAgICAgICAgICAvKiBjb3VudHMgYXJlbid0IGJlaW5nIG1vbml0b3JlZCBhbnl3YXkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txICggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgICAgICBpZiAoKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSAmJiAocXVldWUtPnRxX25mdWxsID09IDApICYmCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSAmJiAhIF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVtb3ZlIHRoaXMgaWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBtYXJrZWQgaXQgZm9yIGRlYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2hvdWxkIHByZXZlbnQgbXVsdGlwbGUgdGhyZWFkcyBmcm9tIHRyeWluZyB0byBmcmVlIHRoaXMuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGVzdF9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBkbyBhbnkgbW9yZSBoZXJlIHNpbmNlIGNhbid0IGJlIHN1cmUgd2hlcmUgc2libGluZyBxdWV1ZSBpcyBzbyBqdXN0IGV4aXQgdGhpcyBsZXZlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwganVzdCBmYWxsIHRocm91Z2ggYW5kIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIG5leHQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKworICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICBxdWV1ZSA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorfQorCisvKgorICogU3RhcnRpbmcgZnJvbSBpbmRpY2F0ZWQgcXVldWUsIHByb2NlZWQgZG93bndhcmQgdGhyb3VnaCB0cmVlIGFuZAorICogcmVtb3ZlIGFsbCB0YXNrcSdzIGFzc3VtaW5nIGFsbCBhcmUgZmluaXNoZWQgYW5kCisgKiBhc3N1bWluZyBOTyBvdGhlciB0aHJlYWRzIGFyZSBleGVjdXRpbmcgYXQgdGhpcyBwb2ludC4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcSgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlICkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqbmV4dF9jaGlsZDsKKworICAgIHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIHF1ZXVlLT50cV9maXJzdF9jaGlsZDsKKworICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSAgeworICAgICAgICBfX2ttcF9yZW1vdmVfYWxsX2NoaWxkX3Rhc2txICggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgbmV4dF9jaGlsZCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICBfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlICggdHEsIGdsb2JhbF90aWQsIHF1ZXVlLCBGQUxTRSApOworICAgICAgICBxdWV1ZSA9IG5leHRfY2hpbGQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIGttcF90YXNrcV90ICp0cSwgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywgaW50IGluX3BhcmFsbGVsICkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAga21wX2ludDMyICAgICAgICAgIHRpZCAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIkFmdGVyIGRlcXVldWVpbmcgdGhpcyBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCB0aHVuaywgZ2xvYmFsX3RpZCApKTsKKyAgICBLRl9UUkFDRSgxMDAsICgiVGFzayBRdWV1ZTogJXAgbG9va3MgbGlrZSB0aGlzICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIC8qCisgICAgICogRm9yIHRoZSB0YXNrcSB0YXNrLCB0aGUgY3Vycl90aHVuayBwdXNoZXMgYW5kIHBvcCBwYWlycyBhcmUgc2V0IHVwIGFzIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiBoYXBwZW5zIGV4YWN0bHkgb25jZToKKyAgICAgKiAxKSBfX2ttcGNfdGFza3EgICAgICAgICAgICAgOiBwdXNoIChpZiByZXR1cm5pbmcgdGh1bmsgb25seSkKKyAgICAgKiA0KSBfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgICAgOiBwb3AKKyAgICAgKgorICAgICAqIG9wdGlvbmFsbHkgaGFwcGVucyAqZWFjaCogdGltZSB0YXNrcSB0YXNrIGlzIGRlcXVldWVkL2VucXVldWVkOgorICAgICAqIDIpIF9fa21wY190YXNrcV90YXNrICAgICAgICA6IHBvcAorICAgICAqIDMpIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlICA6IHB1c2gKKyAgICAgKgorICAgICAqIGV4ZWN1dGlvbiBvcmRlcmluZzogIDEsKDIsMykqLDQKKyAgICAgKi8KKworICAgIGlmICghKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSkgeworICAgICAgICBrbXBfaW50MzIgaW5kZXggPSAocXVldWUgPT0gdHEtPnRxX3Jvb3QpID8gdGlkIDogMDsKKyAgICAgICAgdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAoa21wY19zaGFyZWRfdmFyc190ICopIHF1ZXVlLT50cV9zaGFyZWRzW2luZGV4XS5haV9kYXRhOworCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgPyBjdF90YXNrX29yZGVyZWQgOiBjdF90YXNrLAorICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfbG9jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgcXVldWUtPnRxX2xvYyApOworICAgIH0KKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF07CisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuazsKKworICAgICAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisgICAgfQorCisgICAgS0ZfVFJBQ0UoIDUwLCAoIkJlZ2luIEV4ZWN1dGluZyBUaHVuayAlcCBmcm9tIHF1ZXVlICVwIG9uICglZClcbiIsIHRodW5rLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIHRodW5rLT50aF90YXNrIChnbG9iYWxfdGlkLCB0aHVuayk7CisgICAgS0ZfVFJBQ0UoIDUwLCAoIkVuZCBFeGVjdXRpbmcgVGh1bmsgJXAgZnJvbSBxdWV1ZSAlcCBvbiAoJWQpXG4iLCB0aHVuaywgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgIGlmICghKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSkgeworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpID8gY3RfdGFza19vcmRlcmVkIDogY3RfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9sb2MgKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICAgICAgICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKyAgICAgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodGh1bmstPnRoX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpICYmIGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBfX2ttcF90YXNrcV9jaGVja19vcmRlcmVkKGdsb2JhbF90aWQsIHRodW5rKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2ZyZWVfdGh1bmsgKHF1ZXVlLCB0aHVuaywgaW5fcGFyYWxsZWwsIGdsb2JhbF90aWQpOworCisgICAgICAgIEtGX1RSQUNFKDEwMCwgKCJUIyVkIEFmdGVyIGZyZWVpbmcgdGh1bms6ICVwLCBUYXNrUSBsb29rcyBsaWtlIHRoaXM6XG4iLCBnbG9iYWxfdGlkLCB0aHVuaykpOworICAgICAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBLTVBfTUIoKTsgICAvKiBuZWVkZWQgc28gdGh1bmsgcHV0IG9uIGZyZWUgbGlzdCBiZWZvcmUgb3V0c3RhbmRpbmcgdGh1bmsgY291bnQgaXMgZGVjcmVtZW50ZWQgKi8KKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSA+PSAxKTsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoIDIwMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZTogVCMlZCBoYXMgJWQgdGh1bmtzIGluIHF1ZXVlICVwXG4iLAorICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhLTEsIHF1ZXVlKSk7CisKKyAgICAgICAgICAgIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhLS07CisKKyAgICAgICAgICAgIC8qIEtNUF9NQigpOyAqLyAgICAgLyogaXMgTUIgcmVhbGx5IG5lY2Vzc2FyeSA/ICovCisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMICYmIGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzdGFydHMgYSB0YXNrcTsgY3JlYXRlcyBhbmQgcmV0dXJucyBhIHRodW5rIGZvciB0aGUgdGFza3FfdGFzayAgICAgICAgKi8KKy8qIGFsc28sIHJldHVybnMgcG9pbnRlciB0byBzaGFyZWQgdmFycyBmb3IgdGhpcyB0aHJlYWQgaW4gInNoYXJlZHMiIGFyZyAqLworCitrbXBjX3RodW5rX3QgKgorX19rbXBjX3Rhc2txKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfdCB0YXNrcV90YXNrLAorICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX3RodW5rLCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgIGttcF9pbnQzMiBmbGFncywga21wY19zaGFyZWRfdmFyc190ICoqc2hhcmVkcyApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAga21wX2ludDMyICAgICAgICAgICAgbnNsb3RzLCBudGh1bmtzLCBuc2hhcmVkcywgbnByb2M7CisgICAga21wY190YXNrX3F1ZXVlX3QgICAqbmV3X3F1ZXVlLCAqY3Vycl9xdWV1ZTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAgICpuZXdfdGFza3FfdGh1bms7CisgICAga21wX2luZm9fdCAgICAgICAgICAqdGg7CisgICAga21wX3RlYW1fdCAgICAgICAgICAqdGVhbTsKKyAgICBrbXBfdGFza3FfdCAgICAgICAgICp0cTsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICB0aWQ7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICB0ZWFtID0gdGggLT4gdGgudGhfdGVhbTsKKyAgICB0cSA9ICYgdGVhbSAtPiB0LnRfdGFza3E7CisgICAgbnByb2MgPSB0ZWFtIC0+IHQudF9ucHJvYzsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiBmaW5kIG91dCB3aGV0aGVyIHRoaXMgaXMgYSBwYXJhbGxlbCB0YXNrcSBvciBzZXJpYWxpemVkIG9uZS4gKi8KKyAgICBpbl9wYXJhbGxlbCA9IGluX3BhcmFsbGVsX2NvbnRleHQoIHRlYW0gKTsKKworICAgIGlmKCAhIHRxLT50cV9yb290ICkgeworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gX19rbXBfdGFza3FfZW87CisKKyAgICAgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gX19rbXBfdGFza3FfeG87CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGJlIGEgYmFycmllciByZWdpb24gYm91bmRhcnksIGl0IHdpbGwgY29uZnVzZSB0aGUgdXNlci4gKi8KKyAgICAgICAgICAgIC8qIE5lZWQgdGhlIGJvdW5kYXJ5IHRvIGJlIGF0IHRoZSBlbmQgdGFza3EgaW5zdGVhZC4gKi8KKyAgICAgICAgICAgIGlmICggX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgVFJVRSwgMCwgTlVMTCwgTlVMTCApKSB7CisgICAgICAgICAgICAgICAgLyogQ3JlYXRpbmcgdGhlIGFjdGl2ZSByb290IHF1ZXVlLCBhbmQgd2UgYXJlIG5vdCB0aGUgbWFzdGVyIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICAvKiBUaGUgbWFzdGVyIHRocmVhZCBiZWxvdyBjcmVhdGVkIHRoZSBxdWV1ZSBhbmQgdGFza3MgaGF2ZSBiZWVuICAgICAqLworICAgICAgICAgICAgICAgIC8qIGVucXVldWVkLCBhbmQgdGhlIG1hc3RlciB0aHJlYWQgcmVsZWFzZWQgdGhpcyBiYXJyaWVyLiAgVGhpcyAgICAgICovCisgICAgICAgICAgICAgICAgLyogd29ya2VyIHRocmVhZCBjYW4gbm93IHByb2NlZWQgYW5kIGV4ZWN1dGUgdGFza3MuICBTZWUgYWxzbyB0aGUgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBUUUZfUkVMRUFTRV9XT1JLRVJTIHdoaWNoIGlzIHVzZWQgdG8gaGFuZGxlIHRoaXMgY2FzZS4gICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgKnNoYXJlZHMgPSAoa21wY19zaGFyZWRfdmFyc190ICopIHRxLT50cV9yb290LT50cV9zaGFyZWRzW3RpZF0uYWlfZGF0YTsKKworICAgICAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3EgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogbWFzdGVyIHRocmVhZCBvbmx5IGV4ZWN1dGVzIHRoaXMgY29kZSAqLworCisgICAgICAgIGlmKCB0cS0+dHFfY3Vycl90aHVua19jYXBhY2l0eSA8IG5wcm9jICkgeworICAgICAgICAgICAgaWYodHEtPnRxX2N1cnJfdGh1bmspCisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSh0cS0+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+dGhfZmxhZ3MgICAgICA9IHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JTlRFUkZBQ0VfRkxBR1M7CisKKyAgICBuZXdfdGh1bmstPnRoX3N0YXR1cyAgICAgPSAwOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAoIShuZXdfdGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKTsKKworICAgIEtGX1RSQUNFKDEwMCwgKCJDcmVhdGluZyBSZWd1bGFyIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90aHVuayggdHEsIG5ld190aHVuaywgZ2xvYmFsX3RpZCApKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza19idWZmZXIgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHJldHVybiBuZXdfdGh1bms7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90aHJlYWRwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwMzE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90aHJlYWRwcml2YXRlLmMKQEAgLTAsMCArMSw3MzMgQEAKKy8qCisgKiBrbXBfdGhyZWFkcHJpdmF0ZS5jIC0tIE9wZW5NUCB0aHJlYWRwcml2YXRlIHN1cHBvcnQgbGlicmFyeQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVVNFX0NIRUNLU19DT01NT04KKworI2RlZmluZSBLTVBfSU5MSU5FX1NVQlIgICAgICAgICAxCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CisKK3N0cnVjdCBzaGFyZWRfdGFibGUgICAgIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljCisjaWZkZWYgS01QX0lOTElORV9TVUJSCitfX2ZvcmNlaW5saW5lCisjZW5kaWYKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oIHN0cnVjdCBjb21tb25fdGFibGUgKnRibCwgaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIgKQorCit7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uOiB0aHJlYWQjJWQsIGNhbGxlZCB3aXRoIGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworICAgIGR1bXBfbGlzdCgpOworI2VuZGlmCisKKyAgICBmb3IgKHRuID0gdGJsLT5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdOyB0bjsgdG4gPSB0bi0+bmV4dCkgeworICAgICAgICBpZiAodG4tPmdibF9hZGRyID09IHBjX2FkZHIpIHsKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uOiB0aHJlYWQjJWQsIGZvdW5kIG5vZGUgJXAgb24gbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHRuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMKKyNpZmRlZiBLTVBfSU5MSU5FX1NVQlIKK19fZm9yY2VpbmxpbmUKKyNlbmRpZgorc3RydWN0IHNoYXJlZF9jb21tb24gKgorX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oIHN0cnVjdCBzaGFyZWRfdGFibGUgKnRibCwgaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIgKQoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICp0bjsKKworICAgIGZvciAodG4gPSB0YmwtPmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF07IHRuOyB0biA9IHRuLT5uZXh0KSB7CisgICAgICAgIGlmICh0bi0+Z2JsX2FkZHIgPT0gcGNfYWRkcikgeworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbjogdGhyZWFkIyVkLCBmb3VuZCBub2RlICVwIG9uIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiB0bjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogICAgICBDcmVhdGUgYSB0ZW1wbGF0ZSBmb3IgdGhlIGRhdGEgaW5pdGlhbGl6ZWQgc3RvcmFnZS4KKyAqICAgICAgRWl0aGVyIHRoZSB0ZW1wbGF0ZSBpcyBOVUxMIGluZGljYXRpbmcgemVybyBmaWxsLAorICogICAgICBvciB0aGUgdGVtcGxhdGUgaXMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBkYXRhLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICoKK19fa21wX2luaXRfY29tbW9uX2RhdGEoIHZvaWQgKnBjX2FkZHIsIHNpemVfdCBwY19zaXplICkKK3sKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICpkOworICAgIHNpemVfdCAgICAgICBpOworICAgIGNoYXIgICAgICAgICpwOworCisgICAgZCA9IChzdHJ1Y3QgcHJpdmF0ZV9kYXRhICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBwcml2YXRlX2RhdGEgKSApOworLyoKKyAgICBkLT5kYXRhID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICBkLT5uZXh0ID0gMDsKKyovCisgICAgZC0+c2l6ZSA9IHBjX3NpemU7CisgICAgZC0+bW9yZSA9IDE7CisKKyAgICBwID0gKGNoYXIqKXBjX2FkZHI7CisKKyAgICBmb3IgKGkgPSBwY19zaXplOyAgaSA+IDA7IC0taSkgeworICAgICAgICBpZiAoKnArKyAhPSAnXDAnKSB7CisgICAgICAgICAgICBkLT5kYXRhID0gX19rbXBfYWxsb2NhdGUoIHBjX3NpemUgKTsKKyAgICAgICAgICAgIEtNUF9NRU1DUFkoIGQtPmRhdGEsIHBjX2FkZHIsIHBjX3NpemUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGQ7Cit9CisKKy8qCisgKiAgICAgIEluaXRpYWxpemUgdGhlIGRhdGEgYXJlYSBmcm9tIHRoZSB0ZW1wbGF0ZS4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfY29weV9jb21tb25fZGF0YSggdm9pZCAqcGNfYWRkciwgc3RydWN0IHByaXZhdGVfZGF0YSAqZCApCit7CisgICAgY2hhciAqYWRkciA9IChjaGFyICopIHBjX2FkZHI7CisgICAgaW50ICAgaSwgb2Zmc2V0OworCisgICAgZm9yIChvZmZzZXQgPSAwOyBkICE9IDA7IGQgPSBkLT5uZXh0KSB7CisgICAgICAgIGZvciAoaSA9IGQtPm1vcmU7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIGlmIChkLT5kYXRhID09IDApCisgICAgICAgICAgICAgICAgbWVtc2V0KCAmIGFkZHJbIG9mZnNldCBdLCAnXDAnLCBkLT5zaXplICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgS01QX01FTUNQWSggJiBhZGRyWyBvZmZzZXQgXSwgZC0+ZGF0YSwgZC0+c2l6ZSApOworICAgICAgICAgICAgb2Zmc2V0ICs9IGQtPnNpemU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHdlIGFyZSBjYWxsZWQgZnJvbSBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpIHdpdGggX19rbXBfaW5pdHpfbG9jayBoZWxkLiAqLwordm9pZAorX19rbXBfY29tbW9uX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGlmKCAhIFRDUl80KF9fa21wX2luaXRfY29tbW9uKSApIHsKKyAgICAgICAgaW50IHE7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGludCBndGlkOworI2VuZGlmCisKKyAgICAgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gTlVMTDsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAvKiB2ZXJpZnkgdGhlIHViZXIgbWFzdGVycyB3ZXJlIGluaXRpYWxpemVkICovCisgICAgICAgIGZvcihndGlkID0gMCA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBndGlkKysgKQorICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0gKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcm9vdFtndGlkXS0+ci5yX3ViZXJfdGhyZWFkICk7CisgICAgICAgICAgICAgICAgZm9yICggcSA9IDA7IHE8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggIV9fa21wX3Jvb3RbZ3RpZF0tPnIucl91YmVyX3RocmVhZC0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVtxXSApOworLyogICAgICAgICAgICAgICAgICAgIF9fa21wX3Jvb3RbIGdpdGQgXS0+IHIucl91YmVyX3RocmVhZCAtPiB0aC50aF9wcmlfY29tbW9uIC0+IGRhdGFbIHEgXSA9IDA7Ki8KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgICAgICBmb3IgKHEgPSAwOyBxIDwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKQorICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIHEgXSA9IDA7CisKKyAgICAgICAgVENXXzQoX19rbXBfaW5pdF9jb21tb24sIFRSVUUpOworICAgIH0KK30KKworLyogQ2FsbCBhbGwgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZHByaXZhdGUgZGF0YSBiZWxvbmdpbmcgdG8gYWxsIHRocmVhZHMuCisgICBDdXJyZW50bHkgdW51c2VkISAqLwordm9pZAorX19rbXBfY29tbW9uX2Rlc3Ryb3koIHZvaWQgKQoreworICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X2NvbW1vbikgKSB7CisgICAgICAgIGludCBxOworCisgICAgICAgIFRDV180KF9fa21wX2luaXRfY29tbW9uLCBGQUxTRSk7CisKKyAgICAgICAgZm9yIChxID0gMDsgcSA8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkgeworICAgICAgICAgICAgaW50IGd0aWQ7CisgICAgICAgICAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworICAgICAgICAgICAgc3RydWN0IHNoYXJlZF9jb21tb24gICpkX3RuOworCisgICAgICAgICAgICAvKiAgQysrIGRlc3RydWN0b3JzIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgcGVyIHRocmVhZCBiZWZvcmUgZXhpdGluZyAgKi8KKyAgICAgICAgICAgIC8qICBkb24ndCBjYWxsIGRlc3RydWN0b3JzIGZvciBtYXN0ZXIgdGhyZWFkIHRob3VnaCB1bmxlc3Mgd2UgdXNlZCBjb3B5IGNvbnN0cnVjdG9yICovCisKKyAgICAgICAgICAgIGZvciAoZF90biA9IF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBxIF07IGRfdG47IGRfdG4gPSBkX3RuLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvcnYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChndGlkID0gMDsgZ3RpZCA8IF9fa21wX2FsbF9udGg7ICsrZ3RpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF90aHJlYWRzW2d0aWRdICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKF9fa21wX2ZvcmVpZ25fdHApID8gKCEgS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghIEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgZF90bi0+Z2JsX2FkZHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcnYpICh0bi0+cGFyX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPm9ial9pbml0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3J2KSAoZF90bi0+b2JqX2luaXQsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmR0LmR0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChndGlkID0gMDsgZ3RpZCA8IF9fa21wX2FsbF9udGg7ICsrZ3RpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF90aHJlYWRzW2d0aWRdICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKF9fa21wX2ZvcmVpZ25fdHApID8gKCEgS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghIEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgZF90bi0+Z2JsX2FkZHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcikgKHRuLT5wYXJfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcikgKGRfdG4tPm9ial9pbml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBxIF0gPSAwOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDYWxsIGFsbCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhIGJlbG9uZ2luZyB0byB0aGlzIHRocmVhZCAqLwordm9pZAorX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZCggaW50IGd0aWQgKQoreworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKmRfdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZDogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoISBLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoISBLTVBfVUJFUl9HVElEIChndGlkKSkgKSB7CisKKyAgICAgICAgaWYoIFRDUl80KF9fa21wX2luaXRfY29tbW9uKSApIHsKKworICAgICAgICAgICAgLyogQ2Fubm90IGRvIHRoaXMgaGVyZSBzaW5jZSBub3QgYWxsIHRocmVhZHMgaGF2ZSBkZXN0cm95ZWQgdGhlaXIgZGF0YSAqLworICAgICAgICAgICAgLyogVENXXzQoX19rbXBfaW5pdF9jb21tb24sIEZBTFNFKTsgKi8KKworICAgICAgICAgICAgZm9yICh0biA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2hlYWQ7IHRuOyB0biA9IHRuLT5saW5rKSB7CisKKyAgICAgICAgICAgICAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0bi0+Z2JsX2FkZHIgKTsKKworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGRfdG4gKTsKKworICAgICAgICAgICAgICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmR0LmR0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmR0LmR0b3J2KSAodG4tPnBhcl9hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+ZHQuZHRvcnYpIChkX3RuLT5vYmpfaW5pdCwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5kdC5kdG9yKSAodG4tPnBhcl9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+ZHQuZHRvcikgKGRfdG4tPm9ial9pbml0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtDX1RSQUNFKCAzMCwgKCJfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkOiBUIyVkIHRocmVhZHByaXZhdGUgZGVzdHJ1Y3RvcnMgY29tcGxldGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworc3RhdGljIHZvaWQKK2R1bXBfbGlzdCggdm9pZCApCit7CisgICAgaW50IHAsIHE7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgX19rbXBfYWxsX250aDsgKytwKSB7CisgICAgICAgIGlmKCAhX19rbXBfdGhyZWFkc1twXSApIGNvbnRpbnVlOworICAgICAgICBmb3IgKHEgPSAwOyBxIDwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfdGhyZWFkc1sgcCBdLT50aC50aF9wcmlfY29tbW9uLT5kYXRhWyBxIF0pIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworCisgICAgICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJcdGR1bXBfbGlzdDogZ3RpZDolZCBhZGRyZXNzZXNcbiIsIHAgKSApOworCisgICAgICAgICAgICAgICAgZm9yICh0biA9IF9fa21wX3RocmVhZHNbIHAgXS0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVsgcSBdOyB0bjsgdG4gPSB0bi0+bmV4dCkgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJcdGR1bXBfbGlzdDogVEhSRUFEUFJJVkFURTogU2VyaWFsICVwIC0+IFBhcmFsbGVsICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG4tPmdibF9hZGRyLCB0bi0+cGFyX2FkZHIgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvKiBLTVBfVEFTS19DT01NT05fREVCVUcgKi8KKworCisvKgorICogTk9URTogdGhpcyByb3V0aW5lIGlzIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gdGhlIHNlcmlhbCBwYXJ0IG9mIHRoZSBwcm9ncmFtLgorICovCisKK3ZvaWQKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICkKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKmxua190biwgKmRfdG47CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdICYmCisgICAgICAgICAgICBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlID09IDAgKTsKKworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKTsKKworICAgIGlmIChkX3RuID09IDApIHsKKyAgICAgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiApICk7CisKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBwY19hZGRyOworICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IF9fa21wX2luaXRfY29tbW9uX2RhdGEoIGRhdGFfYWRkciwgcGNfc2l6ZSApOworLyoKKyAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICBkX3RuLT5jdC5jdG9yID0gMDsKKyAgICAgICAgZF90bi0+Y2N0LmNjdG9yID0gMDs7CisgICAgICAgIGRfdG4tPmR0LmR0b3IgPSAwOworICAgICAgICBkX3RuLT5pc192ZWMgPSBGQUxTRTsKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IDBMOworKi8KKyAgICAgICAgZF90bi0+Y21uX3NpemUgPSBwY19zaXplOworCisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayggJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICAgICAgbG5rX3RuID0gJihfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXSk7CisKKyAgICAgICAgZF90bi0+bmV4dCA9ICpsbmtfdG47CisgICAgICAgICpsbmtfdG4gPSBkX3RuOworCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisgICAgfQorfQorCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApCit7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0biwgKip0dDsKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAgKmRfdG47CisKKyAgICAvKiArKysrKysrKysgU1RBUlQgT0YgQ1JJVElDQUwgU0VDVElPTiArKysrKysrKysgKi8KKworICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgdG4gPSAoc3RydWN0IHByaXZhdGVfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YgKHN0cnVjdCBwcml2YXRlX2NvbW1vbikgKTsKKworICAgIHRuLT5nYmxfYWRkciA9IHBjX2FkZHI7CisKKyAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICk7ICAgICAvKiBPbmx5IHRoZSBNQVNURVIgZGF0YSB0YWJsZSBleGlzdHMuICovCisKKyAgICBpZiAoZF90biAhPSAwKSB7CisgICAgICAgIC8qIFRoaXMgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZSBoYXMgYWxyZWFkeSBiZWVuIHNlZW4uICovCisKKyAgICAgICAgaWYgKCBkX3RuLT5wb2RfaW5pdCA9PSAwICYmIGRfdG4tPm9ial9pbml0ID09IDAgKSB7CisgICAgICAgICAgICBkX3RuLT5jbW5fc2l6ZSA9IHBjX3NpemU7CisKKyAgICAgICAgICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZF90bi0+Y3QuY3RvcnYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBDb25zdHJ1Y3QgZnJvbSBzY3JhdGNoIHNvIG5vIHByb3RvdHlwZSBleGlzdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTm93IGRhdGEgaW5pdGlhbGl6ZSB0aGUgcHJvdG90eXBlIHNpbmNlIGl0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAodm9pZCAqKSBfX2ttcF9hbGxvY2F0ZSggZF90bi0+Y21uX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y2N0LmNjdG9ydikgKGRfdG4tPm9ial9pbml0LCBwY19hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YSggZGF0YV9hZGRyLCBkX3RuLT5jbW5fc2l6ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmN0LmN0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBDb25zdHJ1Y3QgZnJvbSBzY3JhdGNoIHNvIG5vIHByb3RvdHlwZSBleGlzdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBOb3cgZGF0YSBpbml0aWFsaXplIHRoZSBwcm90b3R5cGUgc2luY2UgaXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCAqLworICAgICAgICAgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9ICh2b2lkICopIF9fa21wX2FsbG9jYXRlKCBkX3RuLT5jbW5fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jY3QuY2N0b3IpIChkX3RuLT5vYmpfaW5pdCwgcGNfYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IF9fa21wX2luaXRfY29tbW9uX2RhdGEoIGRhdGFfYWRkciwgZF90bi0+Y21uX3NpemUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICoqbG5rX3RuOworCisgICAgICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHNoYXJlZF9jb21tb24gKSApOworICAgICAgICBkX3RuLT5nYmxfYWRkciA9IHBjX2FkZHI7CisgICAgICAgIGRfdG4tPmNtbl9zaXplID0gcGNfc2l6ZTsKKyAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCBkYXRhX2FkZHIsIHBjX3NpemUgKTsKKy8qCisgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgZF90bi0+Y3QuY3RvciA9IDA7CisgICAgICAgIGRfdG4tPmNjdC5jY3RvciA9IDA7CisgICAgICAgIGRfdG4tPmR0LmR0b3IgPSAwOworICAgICAgICBkX3RuLT5pc192ZWMgPSBGQUxTRTsKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IDBMOworKi8KKyAgICAgICAgbG5rX3RuID0gJihfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXSk7CisKKyAgICAgICAgZF90bi0+bmV4dCA9ICpsbmtfdG47CisgICAgICAgICpsbmtfdG4gPSBkX3RuOworICAgIH0KKworICAgIHRuLT5jbW5fc2l6ZSA9IGRfdG4tPmNtbl9zaXplOworCisgICAgaWYgKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDogKEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApIHsKKyAgICAgICAgdG4tPnBhcl9hZGRyID0gKHZvaWQgKikgcGNfYWRkcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRuLT5wYXJfYWRkciA9ICh2b2lkICopIF9fa21wX2FsbG9jYXRlKCB0bi0+Y21uX3NpemUgKTsKKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIC8qICsrKysrKysrKyBFTkQgT0YgQ1JJVElDQUwgU0VDVElPTiArKysrKysrKysgKi8KKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgICAgIGlmIChwY19zaXplID4gZF90bi0+Y21uX3NpemUpIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQ6IFRIUkVBRFBSSVZBVEU6ICVwICglIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9VSU5UUFRSX1NQRUMgIiAsJSIgS01QX1VJTlRQVFJfU1BFQyAiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY19hZGRyLCBwY19zaXplLCBkX3RuLT5jbW5fc2l6ZSApICk7CisgICAgICAgICAgICBLTVBfRkFUQUwoIFRQQ29tbW9uQmxvY2tzSW5jb25zaXN0ICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgICAgdHQgPSAmKF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXSk7CisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICBpZiAoKnR0ICE9IDApIHsKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2luc2VydDogV0FSTklORyEgdGhyZWFkIyVkOiBjb2xsaXNpb24gb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyAgICB9CisjZW5kaWYKKyAgICB0bi0+bmV4dCA9ICp0dDsKKyAgICAqdHQgPSB0bjsKKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQ6IHRocmVhZCMlZCwgaW5zZXJ0ZWQgbm9kZSAlcCBvbiBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyAgICBkdW1wX2xpc3QoICk7CisjZW5kaWYKKworICAgIC8qIExpbmsgdGhlIG5vZGUgaW50byBhIHNpbXBsZSBsaXN0ICovCisKKyAgICB0bi0+bGluayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2hlYWQ7CisgICAgX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfaGVhZCA9IHRuOworCisjaWZkZWYgQlVJTERfVFYKKyAgICBfX2ttcF90dl90aHJlYWRwcml2YXRlX3N0b3JlKCBfX2ttcF90aHJlYWRzWyBndGlkIF0sIHRuLT5nYmxfYWRkciwgdG4tPnBhcl9hZGRyICk7CisjZW5kaWYKKworICAgIGlmKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDogKEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApCisgICAgICAgIHJldHVybiB0bjsKKworICAgIC8qCisgICAgICogaWYgQysrIG9iamVjdCB3aXRoIGNvcHkgY29uc3RydWN0b3IsIHVzZSBpdDsKKyAgICAgKiBlbHNlIGlmIEMrKyBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvciwgdXNlIGl0IGZvciB0aGUgbm9uLW1hc3RlciBjb3BpZXMgb25seTsKKyAgICAgKiBlbHNlIHVzZSBwb2RfaW5pdCBhbmQgbWVtY3B5CisgICAgICoKKyAgICAgKiBDKysgY29uc3RydWN0b3JzIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggbm9uLW1hc3RlciB0aHJlYWQgb24gYWxsb2NhdGUKKyAgICAgKiBDKysgY29weSBjb25zdHJ1Y3RvcnMgbmVlZCB0byBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCB0aHJlYWQgb24gYWxsb2NhdGUKKyAgICAgKi8KKworICAgIC8qCisgICAgICogQysrIG9iamVjdCB3aXRoIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9yczsKKyAgICAgKiBkb24ndCBjYWxsIGNvbnN0cnVjdG9ycyBmb3IgbWFzdGVyIHRocmVhZCB0aG91Z2gKKyAgICAgKi8KKyAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgIGlmICggZF90bi0+Y3QuY3RvcnYgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y3QuY3RvcnYpICh0bi0+cGFyX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICB9IGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvcnYgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y2N0LmNjdG9ydikgKHRuLT5wYXJfYWRkciwgZF90bi0+b2JqX2luaXQsIGRfdG4tPnZlY19sZW4pOworICAgICAgICB9IGVsc2UgaWYgKHRuLT5wYXJfYWRkciAhPSB0bi0+Z2JsX2FkZHIpIHsKKyAgICAgICAgICAgIF9fa21wX2NvcHlfY29tbW9uX2RhdGEoIHRuLT5wYXJfYWRkciwgZF90bi0+cG9kX2luaXQgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggZF90bi0+Y3QuY3RvciAhPSAwICkgeworICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y3QuY3RvcikgKHRuLT5wYXJfYWRkcik7CisgICAgICAgIH0gZWxzZSBpZiAoZF90bi0+Y2N0LmNjdG9yICE9IDApIHsKKyAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmNjdC5jY3RvcikgKHRuLT5wYXJfYWRkciwgZF90bi0+b2JqX2luaXQpOworICAgICAgICB9IGVsc2UgaWYgKHRuLT5wYXJfYWRkciAhPSB0bi0+Z2JsX2FkZHIpIHsKKyAgICAgICAgICAgIF9fa21wX2NvcHlfY29tbW9uX2RhdGEoIHRuLT5wYXJfYWRkciwgZF90bi0+cG9kX2luaXQgKTsKKyAgICAgICAgfQorICAgIH0KKy8qICFCVUlMRF9PUEVOTVBfQworICAgIGlmICh0bi0+cGFyX2FkZHIgIT0gdG4tPmdibF9hZGRyKQorICAgICAgICBfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKCB0bi0+cGFyX2FkZHIsIGRfdG4tPnBvZF9pbml0ICk7ICovCisKKyAgICByZXR1cm4gdG47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogV2UgYXJlIGN1cnJlbnRseSBwYXJhbGxlbCwgYW5kIHdlIGtub3cgdGhlIHRocmVhZCBpZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorCisgQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSBiZWluZyBwcml2YXRpemVkIAorIEBwYXJhbSBjdG9yICBwb2ludGVyIHRvIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSBjY3RvciAgcG9pbnRlciB0byBjb3B5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSBkdG9yICBwb2ludGVyIHRvIGRlc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisKKyBSZWdpc3RlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0aHJlYWQgcHJpdmF0ZSBkYXRhLgorIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZXhlY3V0aW5nIGluIHBhcmFsbGVsLCB3aGVuIHdlIGtub3cgdGhlIHRocmVhZCBpZC4KKyovCit2b2lkCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlcihpZGVudF90ICpsb2MsIHZvaWQgKmRhdGEsIGttcGNfY3RvciBjdG9yLCBrbXBjX2NjdG9yIGNjdG9yLCBrbXBjX2R0b3IgZHRvcikKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90biwgKipsbmtfdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXI6IGNhbGxlZFxuIiApICk7CisKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgIC8qIGNvcHkgY29uc3RydWN0b3IgbXVzdCBiZSB6ZXJvIGZvciBjdXJyZW50IGNvZGUgZ2VuIChOb3YgMjAwMiAtIGpwaCkgKi8KKyAgICBLTVBfQVNTRVJUKCBjY3RvciA9PSAwKTsKKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgICAgLyogT25seSB0aGUgZ2xvYmFsIGRhdGEgdGFibGUgZXhpc3RzLiAqLworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwgLTEsIGRhdGEgKTsKKworICAgIGlmIChkX3RuID09IDApIHsKKyAgICAgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiApICk7CisgICAgICAgIGRfdG4tPmdibF9hZGRyID0gZGF0YTsKKworICAgICAgICBkX3RuLT5jdC5jdG9yID0gY3RvcjsKKyAgICAgICAgZF90bi0+Y2N0LmNjdG9yID0gY2N0b3I7CisgICAgICAgIGRfdG4tPmR0LmR0b3IgPSBkdG9yOworLyoKKyAgICAgICAgZF90bi0+aXNfdmVjID0gRkFMU0U7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPnZlY19sZW4gPSAwTDsKKyAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOworICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IDA7CisqLworICAgICAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBLTVBfSEFTSChkYXRhKSBdKTsKKworICAgICAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAgICAgKmxua190biA9IGRfdG47CisgICAgfQorfQorCit2b2lkICoKK19fa21wY190aHJlYWRwcml2YXRlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnJldDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGNhbGxlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgIGlmICghIF9fa21wX2luaXRfc2VyaWFsKQorICAgICAgICBLTVBfRkFUQUwoIFJUTE5vdEluaXRpYWxpemVkICk7CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICAgIGlmICggISBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZSAmJiAhIF9fa21wX2ZvcmVpZ25fdHAgKSB7CisgICAgICAgIC8qIFRoZSBwYXJhbGxlbCBhZGRyZXNzIHdpbGwgTkVWRVIgb3ZlcmxhcCB3aXRoIHRoZSBkYXRhX2FkZHJlc3MgKi8KKyAgICAgICAgLyogZGtwOiAzcmQgYXJnIHRvIGttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoKSBpcyB0aGUgZGF0YV9hZGRyZXNzOyB1c2UgZGF0YV9hZGRyZXNzID0gZGF0YSAqLworCisgICAgICAgIEtDX1RSQUNFKCAyMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBpbnNlcnRpbmcgcHJpdmF0ZSBkYXRhXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICAgICAga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggZ2xvYmFsX3RpZCwgZGF0YSwgZGF0YSwgc2l6ZSApOworCisgICAgICAgIHJldCA9IGRhdGE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLQ19UUkFDRSggNTAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgdHJ5IHRvIGZpbmQgcHJpdmF0ZSBkYXRhIGF0IGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIGRhdGEgKSApOworICAgICAgICB0biA9IF9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbiggX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdLT50aC50aF9wcmlfY29tbW9uLCBnbG9iYWxfdGlkLCBkYXRhICk7CisKKyAgICAgICAgaWYgKCB0biApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAyMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBmb3VuZCBkYXRhXG4iLCBnbG9iYWxfdGlkICkgKTsKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgICAgICAgICAgaWYgKChzaXplX3QpIHNpemUgPiB0bi0+Y21uX3NpemUpIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIlRIUkVBRFBSSVZBVEU6ICVwICglIiBLTVBfVUlOVFBUUl9TUEVDICIgLCUiIEtNUF9VSU5UUFRSX1NQRUMgIilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHNpemUsIHRuLT5jbW5fc2l6ZSApICk7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBUUENvbW1vbkJsb2Nrc0luY29uc2lzdCApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBUaGUgcGFyYWxsZWwgYWRkcmVzcyB3aWxsIE5FVkVSIG92ZXJsYXAgd2l0aCB0aGUgZGF0YV9hZGRyZXNzICovCisgICAgICAgICAgICAvKiBka3A6IDNyZCBhcmcgdG8ga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCkgaXMgdGhlIGRhdGFfYWRkcmVzczsgdXNlIGRhdGFfYWRkcmVzcyA9IGRhdGEgKi8KKyAgICAgICAgICAgIEtDX1RSQUNFKCAyMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBpbnNlcnRpbmcgZGF0YVxuIiwgZ2xvYmFsX3RpZCApICk7CisgICAgICAgICAgICB0biA9IGttcF90aHJlYWRwcml2YXRlX2luc2VydCggZ2xvYmFsX3RpZCwgZGF0YSwgZGF0YSwgc2l6ZSApOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gdG4tPnBhcl9hZGRyOworICAgIH0KKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgZXhpdGluZzsgcmV0dXJuIHZhbHVlID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcmV0ICkgKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIQorIEBpbmdyb3VwIFRIUkVBRFBSSVZBVEUKKyBAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiAKKyBAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSB0byBwcml2YXRpemUgCisgQHBhcmFtIHNpemUgIHNpemUgb2YgZGF0YSB0byBwcml2YXRpemUgCisgQHBhcmFtIGNhY2hlICBwb2ludGVyIHRvIGNhY2hlIAorIEByZXR1cm4gcG9pbnRlciB0byBwcml2YXRlIHN0b3JhZ2UgCisKKyBBbGxvY2F0ZSBwcml2YXRlIHN0b3JhZ2UgZm9yIHRocmVhZHByaXZhdGUgZGF0YS4gCisqLwordm9pZCAqCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQoCisgICAgaWRlbnRfdCAqICBsb2MsCisgICAga21wX2ludDMyICBnbG9iYWxfdGlkLCAgIC8vIGd0aWQuCisgICAgdm9pZCAqICAgICBkYXRhLCAgICAgICAgIC8vIFBvaW50ZXIgdG8gb3JpZ2luYWwgZ2xvYmFsIHZhcmlhYmxlLgorICAgIHNpemVfdCAgICAgc2l6ZSwgICAgICAgICAvLyBTaXplIG9mIG9yaWdpbmFsIGdsb2JhbCB2YXJpYWJsZS4KKyAgICB2b2lkICoqKiAgIGNhY2hlCispIHsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkOiBUIyVkIGNhbGxlZCB3aXRoIGNhY2hlOiAlcCwgYWRkcmVzczogJXAsIHNpemU6ICUiCisgICAgICAgICAgICAgICAgICAgS01QX1NJWkVfVF9TUEVDICJcbiIsCisgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgKmNhY2hlLCBkYXRhLCBzaXplICkgKTsKKworICAgIGlmICggVENSX1BUUigqY2FjaGUpID09IDApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgaWYgKCBUQ1JfUFRSKCpjYWNoZSkgPT0gMCkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgICAgICAgX19rbXBfdHBfY2FjaGVkID0gMTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIHZvaWQgKiogbXlfY2FjaGU7CisgICAgICAgICAgICBLTVBfSVRUX0lHTk9SRSgKKyAgICAgICAgICAgIG15X2NhY2hlID0gKHZvaWQqKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoIHZvaWQgKiApICogX19rbXBfdHBfY2FwYWNpdHkgKyBzaXplb2YgKCBrbXBfY2FjaGVkX2FkZHJfdCApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHplcm8gdGhlIGFsbG9jYXRlZCBtZW1vcnk7IF9fa21wX2FsbG9jYXRlIGRvZXMgdGhhdC4KKyAgICAgICAgICAgIEtDX1RSQUNFKCA1MCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQ6IFQjJWQgYWxsb2NhdGVkIGNhY2hlIGF0IGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBteV9jYWNoZSApICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFRPRE86IGZyZWUgYWxsIHRoaXMgbWVtb3J5IGluIF9fa21wX2NvbW1vbl9kZXN0cm95IHVzaW5nIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAqLworICAgICAgICAgICAgLyogQWRkIGFkZHJlc3Mgb2YgbXljYWNoZSB0byBsaW5rZWQgbGlzdCBmb3IgY2xlYW51cCBsYXRlciAgKi8KKyAgICAgICAgICAgIGttcF9jYWNoZWRfYWRkcl90ICp0cF9jYWNoZV9hZGRyOworCisgICAgICAgICAgICB0cF9jYWNoZV9hZGRyID0gKGttcF9jYWNoZWRfYWRkcl90ICopICYgbXlfY2FjaGVbX19rbXBfdHBfY2FwYWNpdHldOworICAgICAgICAgICAgdHBfY2FjaGVfYWRkciAtPiBhZGRyID0gbXlfY2FjaGU7CisgICAgICAgICAgICB0cF9jYWNoZV9hZGRyIC0+IG5leHQgPSBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3Q7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSB0cF9jYWNoZV9hZGRyOworCisgICAgICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAgICAgVENXX1BUUiggKmNhY2hlLCBteV9jYWNoZSk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBnbG9iYWxfdGlkICk7CisgICAgfQorCisgICAgdm9pZCAqcmV0OworICAgIGlmICgocmV0ID0gVENSX1BUUigoKmNhY2hlKVsgZ2xvYmFsX3RpZCBdKSkgPT0gMCkgeworICAgICAgICByZXQgPSBfX2ttcGNfdGhyZWFkcHJpdmF0ZSggbG9jLCBnbG9iYWxfdGlkLCBkYXRhLCAoc2l6ZV90KSBzaXplKTsKKworICAgICAgICBUQ1dfUFRSKCAoKmNhY2hlKVsgZ2xvYmFsX3RpZCBdLCByZXQpOworICAgIH0KKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkOiBUIyVkIGV4aXRpbmc7IHJldHVybiB2YWx1ZSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHJldCApICk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiEKKyBAaW5ncm91cCBUSFJFQURQUklWQVRFCisgQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSBiZWluZyBwcml2YXRpemVkIAorIEBwYXJhbSBjdG9yICBwb2ludGVyIHRvIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSBjY3RvciAgcG9pbnRlciB0byBjb3B5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSBkdG9yICBwb2ludGVyIHRvIGRlc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIHZlY3Rvcl9sZW5ndGggbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgKGJ5dGVzIG9yIGVsZW1lbnRzPykKKyBSZWdpc3RlciB2ZWN0b3IgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkIHByaXZhdGUgZGF0YS4KKyovCit2b2lkCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMoIGlkZW50X3QgKmxvYywgdm9pZCAqZGF0YSwga21wY19jdG9yX3ZlYyBjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX2NjdG9yX3ZlYyBjY3Rvciwga21wY19kdG9yX3ZlYyBkdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmVjdG9yX2xlbmd0aCApCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKmRfdG4sICoqbG5rX3RuOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYzogY2FsbGVkXG4iICkgKTsKKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgLyogY29weSBjb25zdHJ1Y3RvciBtdXN0IGJlIHplcm8gZm9yIGN1cnJlbnQgY29kZSBnZW4gKE5vdiAyMDAyIC0ganBoKSAqLworICAgIEtNUF9BU1NFUlQoIGNjdG9yID09IDApOworI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgZGF0YSApOyAgICAgICAgLyogT25seSB0aGUgZ2xvYmFsIGRhdGEgdGFibGUgZXhpc3RzLiAqLworCisgICAgaWYgKGRfdG4gPT0gMCkgeworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBkYXRhOworCisgICAgICAgIGRfdG4tPmN0LmN0b3J2ID0gY3RvcjsKKyAgICAgICAgZF90bi0+Y2N0LmNjdG9ydiA9IGNjdG9yOworICAgICAgICBkX3RuLT5kdC5kdG9ydiA9IGR0b3I7CisgICAgICAgIGRfdG4tPmlzX3ZlYyA9IFRSVUU7CisgICAgICAgIGRfdG4tPnZlY19sZW4gPSAoc2l6ZV90KSB2ZWN0b3JfbGVuZ3RoOworLyoKKyAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IDA7CisqLworICAgICAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBLTVBfSEFTSChkYXRhKSBdKTsKKworICAgICAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAgICAgKmxua190biA9IGRfdG47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3V0aWxpdHkuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5ZjA3YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBrbXBfdXRpbGl0eS5jIC0tIFV0aWxpdHkgcm91dGluZXMgZm9yIHRoZSBPcGVuTVAgc3VwcG9ydCBsaWJyYXJ5LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnVua25vd24gPSAidW5rbm93biI7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8qIE5PVEU6IElmIGNhbGxlZCBiZWZvcmUgc2VyaWFsX2luaXRpYWxpemUgKGkuZS4gZnJvbSBydW50aW1lX2luaXRpYWxpemUpLCB0aGVuICovCisvKiB0aGUgZGVidWdnaW5nIHBhY2thZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCwgYW5kIG9ubHkgIjAiIHdpbGwgcHJpbnQgICAqLworLyogZGVidWdnaW5nIG91dHB1dCBzaW5jZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGhhdmUgbm90IGJlZW4gcmVhZC4gICAgICAgICAgKi8KKworI2lmZGVmIEtNUF9ERUJVRworc3RhdGljIGludCB0cmFjZV9sZXZlbCA9IDU7CisjZW5kaWYKKworLyoKKyAqIExPR19JRF9CSVRTICA9ICggMSArIGZsb29yKCBsb2dfMiggbWF4KCBsb2dfcGVyX3BoeSAtIDEsIDEgKSkpKQorICogQVBJQ19JRCAgICAgID0gKFBIWV9JRCA8PCBMT0dfSURfQklUUykgfCBMT0dfSUQKKyAqIFBIWV9JRCAgICAgICA9IEFQSUNfSUQgPj4gTE9HX0lEX0JJVFMKKyAqLworaW50CitfX2ttcF9nZXRfcGh5c2ljYWxfaWQoIGludCBsb2dfcGVyX3BoeSwgaW50IGFwaWNfaWQgKQoreworICAgaW50IGluZGV4X2xzYiwgaW5kZXhfbXNiLCB0ZW1wOworCisgICBpZiAobG9nX3Blcl9waHkgPiAxKSB7CisJaW5kZXhfbHNiID0gMDsKKwlpbmRleF9tc2IgPSAzMTsKKworCXRlbXAgPSBsb2dfcGVyX3BoeTsKKyAgICAgICAgd2hpbGUgKCAodGVtcCAmIDEpID09IDAgKSB7CisJICAgIHRlbXAgID4+PSAxOworCSAgICBpbmRleF9sc2IrKzsKKwl9CisKKwl0ZW1wID0gbG9nX3Blcl9waHk7CisJd2hpbGUgKCAodGVtcCAmIDB4ODAwMDAwMDApPT0wICkgeworCSAgICB0ZW1wIDw8PSAxOworCSAgICBpbmRleF9tc2ItLTsKKwl9CisKKwkvKiBJZiA+MSBiaXRzIHdlcmUgc2V0IGluIGxvZ19wZXJfcGh5LCBjaG9vc2UgbmV4dCBoaWdoZXIgcG93ZXIgb2YgMiAqLworCWlmIChpbmRleF9sc2IgIT0gaW5kZXhfbXNiKSBpbmRleF9tc2IrKzsKKworCXJldHVybiAoIChpbnQpIChhcGljX2lkID4+IGluZGV4X21zYikgKTsKKyAgIH0KKworICAgcmV0dXJuIGFwaWNfaWQ7Cit9CisKKworLyoKKyAqIExPR19JRF9CSVRTICA9ICggMSArIGZsb29yKCBsb2dfMiggbWF4KCBsb2dfcGVyX3BoeSAtIDEsIDEgKSkpKQorICogQVBJQ19JRCAgICAgID0gKFBIWV9JRCA8PCBMT0dfSURfQklUUykgfCBMT0dfSUQKKyAqIExPR19JRCAgICAgICA9IEFQSUNfSUQgJiAoKCAxIDw8IExPR19JRF9CSVRTICkgLSAxICkKKyAqLworaW50CitfX2ttcF9nZXRfbG9naWNhbF9pZCggaW50IGxvZ19wZXJfcGh5LCBpbnQgYXBpY19pZCApCit7CisgICB1bnNpZ25lZCBjdXJyZW50X2JpdDsKKyAgIGludCBiaXRzX3NlZW47CisKKyAgIGlmIChsb2dfcGVyX3BoeSA8PSAxKSByZXR1cm4gKCAwICk7CisKKyAgIGJpdHNfc2VlbiA9IDA7CisKKyAgIGZvciAoY3VycmVudF9iaXQgPSAxOyBsb2dfcGVyX3BoeSAhPSAwOyBjdXJyZW50X2JpdCA8PD0gMSkgeworCWlmICggbG9nX3Blcl9waHkgJiBjdXJyZW50X2JpdCApIHsKKwkgICAgbG9nX3Blcl9waHkgJj0gfmN1cnJlbnRfYml0OworCSAgICBiaXRzX3NlZW4rKzsKKwl9CisgICB9CisKKyAgIC8qIElmIGV4YWN0bHkgMSBiaXQgd2FzIHNldCBpbiBsb2dfcGVyX3BoeSwgY2hvb3NlIG5leHQgbG93ZXIgcG93ZXIgb2YgMiAqLworICAgaWYgKGJpdHNfc2VlbiA9PSAxKSB7CisJY3VycmVudF9iaXQgPj49IDE7CisgICB9CisKKyAgIHJldHVybiAoIChpbnQpICgoY3VycmVudF9iaXQgLSAxKSAmIGFwaWNfaWQpICk7Cit9CisKKworc3RhdGljCitrbXBfdWludDY0CitfX2ttcF9wYXJzZV9mcmVxdWVuY3koICAgICAgICAvLyBSOiBGcmVxdWVuY3kgaW4gSHouCisgICAgY2hhciBjb25zdCAqIGZyZXF1ZW5jeSAgICAvLyBJOiBGbG9hdCBudW1iZXIgYW5kIHVuaXQ6IE1IeiwgR0h6LCBvciBUR3ouCispIHsKKworICAgIGRvdWJsZSAgICAgICB2YWx1ZSAgPSAwLjA7CisgICAgY2hhciBjb25zdCAqIHVuaXQgICA9IE5VTEw7CisgICAga21wX3VpbnQ2NCAgIHJlc3VsdCA9IH4gMDsKKworICAgIGlmICggZnJlcXVlbmN5ID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfTsgLy8gaWYKKyAgICB2YWx1ZSA9IHN0cnRvZCggZnJlcXVlbmN5LCAoY2hhciAqICopICYgdW5pdCApOyAvLyBzdHJ0b2QoKSBkb2VzIG5vdCBsaWtlICJjaGFyIGNvbnRzICoiLgorICAgIGlmICggMCA8IHZhbHVlICYmIHZhbHVlIDw9IERCTF9NQVggKSB7ICAgICAgICAgIC8vIEdvb2QgdmFsdWUgKG5vdCBvdmVyZmxvdywgdW5kZXJmbG93LCBldGMpLgorICAgICAgICBpZiAoIHN0cmNtcCggdW5pdCwgIk1IeiIgKSA9PSAwICkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEuMEUrNjsKKyAgICAgICAgfSBlbHNlIGlmICggc3RyY21wKCB1bml0LCAiR0h6IiApID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSs5OworICAgICAgICB9IGVsc2UgaWYgKCBzdHJjbXAoIHVuaXQsICJUSHoiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxLjBFKzEyOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvLyBXcm9uZyB1bml0LgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcmVzdWx0OworCit9OyAvLyBmdW5jIF9fa21wX3BhcnNlX2NwdV9mcmVxdWVuY3kKKwordm9pZAorX19rbXBfcXVlcnlfY3B1aWQoIGttcF9jcHVpbmZvX3QgKnAgKQoreworICAgIHN0cnVjdCBrbXBfY3B1aWQgYnVmOworICAgIGludCBtYXhfYXJnOworICAgIGludCBsb2dfcGVyX3BoeTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgY2ZsdXNoX3NpemU7CisjZW5kaWYKKworICAgIHAtPmluaXRpYWxpemVkID0gMTsKKworICAgIHAtPnNzZTIgPSAxOyAvLyBBc3N1bWUgU1NFMiBieSBkZWZhdWx0LgorCisgICAgX19rbXBfeDg2X2NwdWlkKCAwLCAwLCAmYnVmICk7CisKKyAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgIDAsIGJ1Zi5lYXgsIGJ1Zi5lYngsIGJ1Zi5lY3gsIGJ1Zi5lZHggKSApOworCisgICAgbWF4X2FyZyA9IGJ1Zi5lYXg7CisKKyAgICBwLT5hcGljX2lkID0gLTE7CisKKyAgICBpZiAobWF4X2FyZyA+PSAxKSB7CisgICAgICAgIGludCBpOworICAgICAgICBrbXBfdWludDMyIHQsIGRhdGFbIDQgXTsKKworICAgICAgICBfX2ttcF94ODZfY3B1aWQoIDEsIDAsICZidWYgKTsKKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIklORk86IENQVUlEICVkOiBFQVg9MHglMDhYIEVCWD0weCUwOFggRUNYPTB4JTA4WCBFRFg9MHglMDhYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBidWYuZWF4LCBidWYuZWJ4LCBidWYuZWN4LCBidWYuZWR4ICkgKTsKKworICAgICAgICB7CisjZGVmaW5lIGdldF92YWx1ZShyZWcsbG8sbWFzaykgKCAoICggcmVnICkgPj4gKCBsbyApICkgJiAoIG1hc2sgICkgKQorCisgICAgICAgICAgICBwLT5zaWduYXR1cmUgPSBidWYuZWF4OworICAgICAgICAgICAgcC0+ZmFtaWx5ICAgID0gICBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDIwLCAweGZmICkgICAgICAgICsgZ2V0X3ZhbHVlKCBidWYuZWF4LCA4LCAweDBmICk7CisgICAgICAgICAgICBwLT5tb2RlbCAgICAgPSAoIGdldF92YWx1ZSggYnVmLmVheCwgMTYsIDB4MGYgKSA8PCA0ICkgKyBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDQsIDB4MGYgKTsKKyAgICAgICAgICAgIHAtPnN0ZXBwaW5nICA9ICAgZ2V0X3ZhbHVlKCBidWYuZWF4LCAgMCwgMHgwZiApOworCisjdW5kZWYgZ2V0X3ZhbHVlCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgZmFtaWx5ID0gJWQsIG1vZGVsID0gJWQsIHN0ZXBwaW5nID0gJWRcbiIsIHAtPmZhbWlseSwgcC0+bW9kZWwsIHAtPnN0ZXBwaW5nICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIHQgPSBidWYuZWJ4LCBpID0gMDsgaSA8IDQ7IHQgPj49IDgsICsraSApIHsKKyAgICAgICAgICAgIGRhdGFbIGkgXSA9ICh0ICYgMHhmZik7CisgICAgICAgIH07IC8vIGZvcgorCisgICAgICAgIHAtPnNzZTIgPSAoIGJ1Zi5lZHggPj4gMjYgKSAmIDE7CisKKyNpZmRlZiBLTVBfREVCVUcKKworICAgICAgICBpZiAoIChidWYuZWR4ID4+IDQpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFRTQyAtIFRpbWVzdGFtcCBDb3VudGVyIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBUU0MiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDgpICYgMSApIHsKKyAgICAgICAgICAgIC8qIENYOCAtIENNUFhDSEc4QiBJbnN0cnVjdGlvbiBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQ1g4IiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiA5KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBBUElDIC0gTG9jYWwgQVBJQyBQcmVzZW50IChtdWx0aS1wcm9jZXNzb3Igb3BlcmF0aW9uIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQVBJQyIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMTUpICYgMSApIHsKKyAgICAgICAgICAgIC8qIENNT1YgLSBDb25kaXRpb25hbCBNT1ZlIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBDTU9WIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAxOCkgJiAxICkgeworICAgICAgICAgICAgLyogUFNOIC0gUHJvY2Vzc29yIFNlcmlhbCBOdW1iZXIgQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFBTTiIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMTkpICYgMSApIHsKKyAgICAgICAgICAgIC8qIENMRlVMU0ggLSBDYWNoZSBGbHVzaCBJbnN0cnVjdGlvbiBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIGNmbHVzaF9zaXplID0gZGF0YVsgMSBdICogODsgICAgLyogQml0cyAxNS0wODogQ0xGTFVTSCBsaW5lIHNpemUgPSA4ICg2NCBieXRlcykgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQ0xGTFVTSCglZGIpIiwgY2ZsdXNoX3NpemUgKSApOworCisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyMSkgJiAxICkgeworICAgICAgICAgICAgLyogRFRFUyAtIERlYnVnIFRyYWNlICYgRU1PTiBTdG9yZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBEVEVTIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyMikgJiAxICkgeworICAgICAgICAgICAgLyogQUNQSSAtIEFDUEkgU3VwcG9ydCBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQUNQSSIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjMpICYgMSApIHsKKyAgICAgICAgICAgIC8qIE1NWCAtIE11bHRpbWVkaWEgRXh0ZW5zaW9ucyAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBNTVgiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI1KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBTU0UgLSBTU0UgSW5zdHJ1Y3Rpb25zICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFNTRSIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjYpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFNTRTIgLSBTU0UyIEluc3RydWN0aW9ucyAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBTU0UyIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyNykgJiAxICkgeworICAgICAgICAgICAgLyogU0xGU05QIC0gU2VsZi1Tbm9vcGluZyBDYWNoZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBTTEZTTlAiICkgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjgpICYgMSApIHsKKyAgICAgICAgICAgIC8qIEJpdHMgMjMtMTY6IExvZ2ljYWwgUHJvY2Vzc29ycyBwZXIgUGh5c2ljYWwgUHJvY2Vzc29yICgxIGZvciBQNCkgKi8KKyAgICAgICAgICAgIGxvZ19wZXJfcGh5ID0gZGF0YVsgMiBdOworICAgICAgICAgICAgcC0+YXBpY19pZCAgICAgPSBkYXRhWyAzIF07IC8qIEJpdHMgMzEtMjQ6IFByb2Nlc3NvciBJbml0aWFsIEFQSUMgSUQgKFgpICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIEhUKCVkIFRQVXMpIiwgbG9nX3Blcl9waHkgKSApOworCisgICAgICAgICAgICBpZiggbG9nX3Blcl9waHkgPiAxICkgeworICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgdG8gMWsgRk9SIEpULWVuYWJsZWQgcHJvY2Vzc29ycyAoNGsgb24gT1MgWCopICovCisjaWYgS01QX09TX0RBUldJTgorICAgICAgICAgICAgICAgIHAtPmNwdV9zdGFja29mZnNldCA9IDQgKiAxMDI0OworI2Vsc2UKKyAgICAgICAgICAgICAgICBwLT5jcHVfc3RhY2tvZmZzZXQgPSAxICogMTAyNDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwLT5waHlzaWNhbF9pZCA9IF9fa21wX2dldF9waHlzaWNhbF9pZCggbG9nX3Blcl9waHksIHAtPmFwaWNfaWQgKTsKKyAgICAgICAgICAgIHAtPmxvZ2ljYWxfaWQgID0gX19rbXBfZ2V0X2xvZ2ljYWxfaWQoIGxvZ19wZXJfcGh5LCBwLT5hcGljX2lkICk7CisgICAgICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyOSkgJiAxICkgeworICAgICAgICAgICAgLyogQVRIUk9UTCAtIEF1dG9tYXRpYyBUaHJvdHRsZSBDb250cm9sICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIEFUSFJPVEwiICkgKTsKKyAgICAgICAgfQorICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIF1cbiIgKSApOworCisgICAgICAgIGZvciAoaSA9IDI7IGkgPD0gbWF4X2FyZzsgKytpKSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoIGksIDAsICZidWYgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAoICJJTkZPOiBDUFVJRCAlZDogRUFYPTB4JTA4WCBFQlg9MHglMDhYIEVDWD0weCUwOFggRURYPTB4JTA4WFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIGJ1Zi5lYXgsIGJ1Zi5lYngsIGJ1Zi5lY3gsIGJ1Zi5lZHggKSApOworICAgICAgICB9CisjZW5kaWYKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgIHAtPnJ0bSA9IDA7CisgICAgICAgIGlmIChtYXhfYXJnID4gNykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUlRNIGJpdCBDUFVJRC4wNzpFQlgsIGJpdCAxMSAqLworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKDcsIDAsICZidWYpOworICAgICAgICAgICAgcC0+cnRtID0gKGJ1Zi5lYnggPj4gMTEpICYgMTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgUlRNIiApICk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH07IC8vIGlmCisKKyAgICB7IC8vIFBhcnNlIENQVSBicmFuZCBzdHJpbmcgZm9yIGZyZXF1ZW5jeS4KKworICAgICAgICB1bmlvbiBrbXBfY3B1X2JyYW5kX3N0cmluZyB7CisgICAgICAgICAgICBzdHJ1Y3Qga21wX2NwdWlkIGJ1ZlsgMyBdOworICAgICAgICAgICAgY2hhciAgICAgICAgICAgICBzdHJpbmdbIHNpemVvZiggc3RydWN0IGttcF9jcHVpZCApICogMyArIDEgXTsKKyAgICAgICAgfTsgLy8gdW5pb24ga21wX2NwdV9icmFuZF9zdHJpbmcKKyAgICAgICAgdW5pb24ga21wX2NwdV9icmFuZF9zdHJpbmcgYnJhbmQ7CisgICAgICAgIGludCBpOworCisgICAgICAgIHAtPmZyZXF1ZW5jeSA9IDA7CisKKyAgICAgICAgLy8gR2V0IENQVSBicmFuZCBzdHJpbmcuCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgMzsgKysgaSApIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCggMHg4MDAwMDAwMiArIGksIDAsICZicmFuZC5idWZbIGkgXSApOworICAgICAgICB9OyAvLyBmb3IKKyAgICAgICAgYnJhbmQuc3RyaW5nWyBzaXplb2YoIGJyYW5kLnN0cmluZyApIC0gMSBdID0gMDsgLy8gSnVzdCBpbiBjYXNlLiA7LSkKKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoICJjcHUgYnJhbmQgc3RyaW5nOiBcIiVzXCJcbiIsIGJyYW5kLnN0cmluZyApICk7CisKKyAgICAgICAgLy8gUGFyc2UgZnJlcXVlbmN5LgorICAgICAgICBwLT5mcmVxdWVuY3kgPSBfX2ttcF9wYXJzZV9mcmVxdWVuY3koIHN0cnJjaHIoIGJyYW5kLnN0cmluZywgJyAnICkgKTsKKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoICJjcHUgZnJlcXVlbmN5IGZyb20gYnJhbmQgc3RyaW5nOiAlIiBLTVBfVUlOVDY0X1NQRUMgIlxuIiwgcC0+ZnJlcXVlbmN5ICkgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2V4cGFuZF9ob3N0X25hbWUoIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoc2l6ZSA+PSBzaXplb2YodW5rbm93bikpOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgeworCURXT1JECXMgPSBzaXplOworCisJaWYgKCEgR2V0Q29tcHV0ZXJOYW1lQSggYnVmZmVyLCAmIHMgKSkKKwkgICAgS01QX1NUUkNQWV9TKCBidWZmZXIsIHNpemUsIHVua25vd24gKTsKKyAgICB9CisjZWxzZQorICAgIGJ1ZmZlcltzaXplIC0gMl0gPSAwOworICAgIGlmIChnZXRob3N0bmFtZSggYnVmZmVyLCBzaXplICkgfHwgYnVmZmVyW3NpemUgLSAyXSAhPSAwKQorCUtNUF9TVFJDUFlfUyggYnVmZmVyLCBzaXplLCB1bmtub3duICk7CisjZW5kaWYKK30KKworLyogRXhwYW5kIHRoZSBtZXRhIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGVuYW1lOgorICoKKyAqIEN1cnJlbnRseSBkZWZpbmVkIGNoYXJhY3RlcnMgYXJlOgorICoKKyAqICVIIHRoZSBob3N0bmFtZQorICogJVAgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQuCisgKiAlSSB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcnVuLgorICovCisKK3ZvaWQKK19fa21wX2V4cGFuZF9maWxlX25hbWUoIGNoYXIgKnJlc3VsdCwgc2l6ZV90IHJsZW4sIGNoYXIgKnBhdHRlcm4gKQoreworICAgIGNoYXIJKnBvcyA9IHJlc3VsdCwgKmVuZCA9IHJlc3VsdCArIHJsZW4gLSAxOworICAgIGNoYXIJIGJ1ZmZlclsyNTZdOworICAgIGludAkJIGRlZmF1bHRfY3B1X3dpZHRoID0gMTsKKyAgICBpbnQgICAgICAgICAgc25wX3Jlc3VsdDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQocmxlbiA+IDApOworICAgICplbmQgPSAwOworICAgIHsKKwlpbnQgaTsKKwlmb3IoaSA9IF9fa21wX3hwcm9jOyBpID49IDEwOyBpIC89IDEwLCArK2RlZmF1bHRfY3B1X3dpZHRoKTsKKyAgICB9CisKKyAgICBpZiAocGF0dGVybiAhPSBOVUxMKSB7CisJd2hpbGUgKCpwYXR0ZXJuICE9ICdcMCcgJiYgcG9zIDwgZW5kKSB7CisJICAgIGlmICgqcGF0dGVybiAhPSAnJScpIHsKKwkJKnBvcysrID0gKnBhdHRlcm4rKzsKKwkgICAgfSBlbHNlIHsKKwkJY2hhciAqb2xkX3BhdHRlcm4gPSBwYXR0ZXJuOworCQlpbnQgd2lkdGggPSAxOworCQlpbnQgY3B1X3dpZHRoID0gZGVmYXVsdF9jcHVfd2lkdGg7CisKKwkJKytwYXR0ZXJuOworCisJCWlmICgqcGF0dGVybiA+PSAnMCcgJiYgKnBhdHRlcm4gPD0gJzknKSB7CisJCSAgICB3aWR0aCA9IDA7CisJCSAgICBkbyB7CisJCQl3aWR0aCA9ICh3aWR0aCAqIDEwKSArICpwYXR0ZXJuKysgLSAnMCc7CisJCSAgICB9IHdoaWxlICgqcGF0dGVybiA+PSAnMCcgJiYgKnBhdHRlcm4gPD0gJzknKTsKKwkJICAgIGlmICh3aWR0aCA8IDAgfHwgd2lkdGggPiAxMDI0KQorCQkJd2lkdGggPSAxOworCisJCSAgICBjcHVfd2lkdGggPSB3aWR0aDsKKwkJfQorCisJCXN3aXRjaCAoKnBhdHRlcm4pIHsKKwkJY2FzZSAnSCc6CisJCWNhc2UgJ2gnOgorCQkgICAgeworCQkJX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApICk7CisJCQlLTVBfU1RSTkNQWSggcG9zLCAgYnVmZmVyLCBlbmQgLSBwb3MgKyAxKTsKKwkJCWlmKCplbmQgPT0gMCkgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ1AnOgorCQljYXNlICdwJzoKKwkJICAgIHsKKwkJCXNucF9yZXN1bHQgPSBLTVBfU05QUklOVEYoIHBvcywgZW5kIC0gcG9zICsgMSwgIiUwKmQiLCBjcHVfd2lkdGgsIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKwkJCWlmKHNucF9yZXN1bHQgPj0gMCAmJiBzbnBfcmVzdWx0IDw9IGVuZCAtIHBvcykgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ0knOgorCQljYXNlICdpJzoKKwkJICAgIHsKKwkJCXBpZF90IGlkID0gZ2V0cGlkKCk7CisJCQlzbnBfcmVzdWx0ID0gS01QX1NOUFJJTlRGKCBwb3MsIGVuZCAtIHBvcyArIDEsICIlMCpkIiwgd2lkdGgsIGlkICk7CisJCQlpZihzbnBfcmVzdWx0ID49IDAgJiYgc25wX3Jlc3VsdCA8PSBlbmQgLSBwb3MpIHsKKwkJCSAgICB3aGlsZSAoICpwb3MgKQorCQkJCSsrcG9zOworCQkJICAgICsrcGF0dGVybjsKKwkJCX0gZWxzZQorCQkJICAgIHBvcyA9IGVuZDsKKwkJCWJyZWFrOworCQkgICAgfQorCQljYXNlICclJzoKKwkJICAgIHsKKwkJCSpwb3MrKyA9ICclJzsKKwkJCSsrcGF0dGVybjsKKwkJCWJyZWFrOworCQkgICAgfQorCQlkZWZhdWx0OgorCQkgICAgeworCQkJKnBvcysrID0gJyUnOworCQkJcGF0dGVybiA9IG9sZF9wYXR0ZXJuICsgMTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJLyogVE9ETzogSG93IGRvIHdlIGdldCByaWQgb2YgdGhpcz8gKi8KKwlpZigqcGF0dGVybiAhPSAnXDAnKQorCSAgICBLTVBfRkFUQUwoIEZpbGVOYW1lVG9vTG9uZyApOworICAgIH0KKworICAgICpwb3MgPSAnXDAnOworfQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjhhYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIGttcF92ZXJzaW9uLmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF92ZXJzaW9uLmgiCisKKy8vIFJlcGxhY2Ugd2l0aCBzbmFwc2hvdCBkYXRlIFlZWVlNTUREIGZvciBwcm9tb3Rpb24gYnVpbGQuCisjZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgIDIwMTQwOTI2CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gY29udmVydCB2YWx1ZSBvZiBtYWNybyB0byBzdHJpbmcgbGl0ZXJhbC4KKyNkZWZpbmUgX3N0cmluZ2VyKCB4ICkgI3gKKyNkZWZpbmUgc3RyaW5nZXIoIHggKSAgX3N0cmluZ2VyKCB4ICkKKworLy8gRGV0ZWN0IGNvbXBpbGVyLgorI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAjaWYgICBfX0lOVEVMX0NPTVBJTEVSID09IDEwMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMC4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTEwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDExLjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMTEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTEuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEyMDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMi4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTIxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEyLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMzAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTMuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEzMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMy4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTQwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE0LjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNDEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTQuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE1MDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxNS4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTYwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE2LjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSA5OTk5CisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgbWFpbmxpbmUiCisgICAgI2VuZGlmCisjZWxpZiBLTVBfQ09NUElMRVJfQ0xBTkcKKyAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiQ2xhbmcgIiBzdHJpbmdlciggX19jbGFuZ19tYWpvcl9fICkgIi4iIHN0cmluZ2VyKCBfX2NsYW5nX21pbm9yX18gKQorI2VsaWYgS01QX0NPTVBJTEVSX0dDQworICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJHQ0MgIiBzdHJpbmdlciggX19HTlVDX18gKSAiLiIgc3RyaW5nZXIoIF9fR05VQ19NSU5PUl9fICkKKyNlbGlmIEtNUF9DT01QSUxFUl9NU1ZDCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIk1TVkMgIiBzdHJpbmdlciggX01TQ19GVUxMX1ZFUiApCisjZW5kaWYKKyNpZm5kZWYgS01QX0NPTVBJTEVSCisgICAgI3dhcm5pbmcgIlVua25vd24gY29tcGlsZXIiCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgInVua25vd24gY29tcGlsZXIiCisjZW5kaWYKKworLy8gRGV0ZWN0IGxpYnJyYXkgdHlwZSAocGVyZiwgc3R1YikuCisjaWZkZWYgS01QX1NUVUIKKyAgICAjZGVmaW5lIEtNUF9MSUJfVFlQRSAic3R1YiIKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfTElCX1RZUEUgInBlcmZvcm1hbmNlIgorI2VuZGlmIC8vIEtNUF9MSUJfVFlQRQorCisvLyBEZXRlY3QgbGluayB0eXBlIChzdGF0aWMsIGR5bmFtaWMpLgorI2lmZGVmIEtNUF9EWU5BTUlDX0xJQgorICAgICNkZWZpbmUgS01QX0xJTktfVFlQRSAiZHluYW1pYyIKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfTElOS19UWVBFICJzdGF0aWMiCisjZW5kaWYgLy8gS01QX0xJTktfVFlQRQorCisvLyBGaW5hbGx5LCBkZWZpbmUgc3RyaW5ncy4KKyNkZWZpbmUgS01QX0xJQlJBUlkgICBLTVBfTElCX1RZUEUgIiBsaWJyYXJ5ICgiIEtNUF9MSU5LX1RZUEUgIikiCisjZGVmaW5lIEtNUF9DT1BZUklHSFQgIiIKKworaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fbWFqb3IgPSBLTVBfVkVSU0lPTl9NQUpPUjsKK2ludCBjb25zdCBfX2ttcF92ZXJzaW9uX21pbm9yID0gS01QX1ZFUlNJT05fTUlOT1I7CitpbnQgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZCA9IEtNUF9WRVJTSU9OX0JVSUxEOworaW50IGNvbnN0IF9fa21wX29wZW5tcF92ZXJzaW9uID0KKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgMjAxMzA3OworICAgICNlbHNlCisgICAgICAgIDIwMTEwNzsKKyAgICAjZW5kaWYKKworLyogRG8gTk9UIGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nISAgSW50ZWwoUikgVGhyZWFkIFByb2ZpbGVyIGNoZWNrcyBmb3IgYQorICAgc3BlY2lmaWMgZm9ybWF0IHNvbWUgY2hhbmdlcyBpbiB0aGUgcmVjb2duaXRpb24gcm91dGluZSB0aGVyZSBuZWVkIHRvCisgICBiZSBtYWRlIGJlZm9yZSB0aGlzIGlzIGNoYW5nZWQuCisqLworY2hhciBjb25zdCBfX2ttcF9jb3B5cmlnaHRbXSA9CisgICAgS01QX1ZFUlNJT05fUFJFRklYIEtNUF9MSUJSQVJZCisgICAgIiB2ZXIuICIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX01BSk9SICkgIi4iIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NSU5PUiApCisgICAgIi4iIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9CVUlMRCApICIgIgorICAgIEtNUF9DT1BZUklHSFQ7CisKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHRbXSAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYIEtNUF9DT1BZUklHSFQ7CitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3ZlcltdICAgICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCAidmVyc2lvbjogIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUFKT1IgKSAiLiIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX01JTk9SICkgIi4iIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9CVUlMRCApOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl90eXBlW10gICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImxpYnJhcnkgdHlwZTogIiBLTVBfTElCX1RZUEU7CitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGlua190eXBlW10gICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCAibGluayB0eXBlOiAiIEtNUF9MSU5LX1RZUEU7CitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZVtdICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiYnVpbGQgdGltZTogIiAibm9fdGltZXN0YW1wIjsKKyNpZiBLTVBfTUlDMgorICAgIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl90YXJnZXRfZW52W10gPSBLTVBfVkVSU0lPTl9QUkVGSVggInRhcmdldCBlbnZpcm9ubWVudDogTUlDMiI7CisjZW5kaWYKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF9jb21waWxlcltdID0gS01QX1ZFUlNJT05fUFJFRklYICJidWlsZCBjb21waWxlcjogIiBLTVBfQ09NUElMRVI7CisKKy8vCisvLyBDYWxsZWQgYXQgc2VyaWFsIGluaXRpYWxpemF0aW9uIHRpbWUuCisvLworc3RhdGljIGludCBfX2ttcF92ZXJzaW9uXzFfcHJpbnRlZCA9IEZBTFNFOworCit2b2lkCitfX2ttcF9wcmludF92ZXJzaW9uXzEoIHZvaWQgKQoreworICAgIGlmICggX19rbXBfdmVyc2lvbl8xX3ByaW50ZWQgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX3ZlcnNpb25fMV9wcmludGVkID0gVFJVRTsKKworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKyAgICAgICAgLy8gUHJpbnQgdmVyc2lvbiBzdHJpbmdzIHNraXBwaW5nIGluaXRpYWwgbWFnaWMuCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9saWJfdmVyWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fbGliX3R5cGVbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9saW5rX3R5cGVbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9idWlsZF90aW1lWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgI2lmIEtNUF9NSUMKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX3RhcmdldF9lbnZbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAjaWYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fYWx0X2NvbXBbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgICNlbmRpZiAvKiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkgKi8KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX29tcF9hcGlbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNkeW5hbWljIGVycm9yIGNoZWNraW5nOiAlc1xuIiwgS01QX1ZFUlNJT05fUFJFRl9TVFIsICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrID8gInllcyIgOiAibm8iICkgICk7CisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gYnNfcGxhaW5fYmFycmllcjsgaSA8IGJzX2xhc3RfYmFycmllcjsgKysgaSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgICAgICAgICAgICAgICAgICAmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIiVzJXMgYmFycmllciBicmFuY2ggYml0czogZ2F0aGVyPSV1LCByZWxlYXNlPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl90eXBlX25hbWVbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0KKyAgICAgICAgICAgICAgICApOyAvLyBfX2ttcF9zdHJfYnVmX3ByaW50CisgICAgICAgICAgICB9OyAvLyBmb3IgaQorICAgICAgICAgICAgZm9yICggaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBpICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAiJXMlcyBiYXJyaWVyIHBhdHRlcm46IGdhdGhlcj0lcywgcmVsZWFzZT0lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgS01QX1ZFUlNJT05fUFJFRl9TVFIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfdHlwZV9uYW1lWyBpIF0sCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lWyBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuWyBpIF0gXSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBpIF0gXQorICAgICAgICAgICAgICAgICk7IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fbG9ja1sgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAmIGJ1ZmZlciwKKyAgICAgICAgICAgICIlc3RocmVhZCBhZmZpbml0eSBzdXBwb3J0OiAlc1xuIiwKKyAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkKKyAgICAgICAgICAgICAgICAgICAgPworICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgdXNlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5ZXMiCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAibm8iCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAibm8iCisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJLTVBfVkVSU0lPTiBpcyB0cnVlXG4iICkgKTsKKyAgICAjZW5kaWYgLy8gS01QX1NUVUIKK30gLy8gX19rbXBfcHJpbnRfdmVyc2lvbl8xCisKKy8vCisvLyBDYWxsZWQgYXQgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMl9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQKK19fa21wX3ByaW50X3ZlcnNpb25fMiggdm9pZCApIHsKKyAgICBpZiAoIF9fa21wX3ZlcnNpb25fMl9wcmludGVkICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF92ZXJzaW9uXzJfcHJpbnRlZCA9IFRSVUU7CisKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgI2VuZGlmIC8vIEtNUF9TVFVCCit9IC8vIF9fa21wX3ByaW50X3ZlcnNpb25fMgorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyODUzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIGttcF92ZXJzaW9uLmggLS0gdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgcmVsZWFzZQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9WRVJTSU9OX0gKKyNkZWZpbmUgS01QX1ZFUlNJT05fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjaWZuZGVmIEtNUF9WRVJTSU9OX01BSk9SCisgICAgI2Vycm9yIEtNUF9WRVJTSU9OX01BSk9SIG1hY3JvIGlzIG5vdCBkZWZpbmVkLgorI2VuZGlmCisjZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgICAgIDAKKy8qCisgICAgVXNpbmcgIm1hZ2ljIiBwcmVmaXggaW4gYWxsIHRoZSB2ZXJzaW9uIHN0cmluZ3MgaXMgcmF0aGVyIGNvbnZlbmllbnQgdG8gZ2V0IHN0YXRpYyB2ZXJzaW9uIGluZm8KKyAgICBmcm9tIGJpbmFyaWVzIGJ5IHVzaW5nIHN0YW5kYXJkIHV0aWxpdGllcyAic3RyaW5ncyIgYW5kICJncmVwIiwgZS4gZy46CisgICAgICAgICQgc3RyaW5ncyBsaWJvbXAuc28gfCBncmVwICJAKCMpIgorICAgIGdpdmVzIGNsZWFuIGxpc3Qgb2YgYWxsIHZlcnNpb24gc3RyaW5ncyBpbiB0aGUgbGlicmFyeS4gTGVhZGluZyB6ZXJvIGhlbHBzIHRvIGtlZXAgdmVyc2lvbgorICAgIHN0cmluZyBzZXBhcmF0ZSBmcm9tIHByaW50YWJsZSBjaGFyYWN0ZXJzIHdoaWNoIG1heSBvY2N1cnMganVzdCBiZWZvcmUgdmVyc2lvbiBzdHJpbmcuCisqLworI2RlZmluZSBLTVBfVkVSU0lPTl9NQUdJQ19TVFIgICAiXHgwMEAoIykgIgorI2RlZmluZSBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gICA2ICAgICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBLTVBfVkVSU0lPTl9NQUdJQ19TVFIuCisjZGVmaW5lIEtNUF9WRVJTSU9OX1BSRUZfU1RSICAgICJJbnRlbChSKSBPTVAgIgorI2RlZmluZSBLTVBfVkVSU0lPTl9QUkVGSVggICAgICBLTVBfVkVSU0lPTl9NQUdJQ19TVFIgS01QX1ZFUlNJT05fUFJFRl9TVFIKKworLyogZGVjbGFyZSBhbGwgdGhlIHZlcnNpb24gc3RyaW5nIGNvbnN0YW50cyBmb3IgS01QX1ZFUlNJT04gZW52LiB2YXJpYWJsZSAqLworZXh0ZXJuIGludCAgY29uc3QgX19rbXBfdmVyc2lvbl9tYWpvcjsKK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX3ZlcnNpb25fbWlub3I7CitleHRlcm4gaW50ICBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkOworZXh0ZXJuIGludCAgY29uc3QgX19rbXBfb3Blbm1wX3ZlcnNpb247CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF9jb3B5cmlnaHRbXTsgICAgLy8gT2xkIHZhcmlhYmxlLCBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggSVRDIGFuZCBJVFAuCitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdmVyW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl90eXBlW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF90aW1lW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3RhcmdldF9lbnZbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGRfY29tcGlsZXJbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYWx0X2NvbXBbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fb21wX2FwaVtdOworLy8gPz8/IGV4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZGVidWdbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbG9ja1tdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9uZXN0ZWRfc3RhdHNfcmVwb3J0aW5nW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bnN0ZGNhbGxbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuY2RlY2xbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuZXh0cmFbXTsKKwordm9pZCBfX2ttcF9wcmludF92ZXJzaW9uXzEoIHZvaWQgKTsKK3ZvaWQgX19rbXBfcHJpbnRfdmVyc2lvbl8yKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjViZjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICoga21wX3dhaXRfcmVsZWFzZS5jcHAgLS0gV2FpdC9SZWxlYXNlIGltcGxlbWVudGF0aW9uCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAia21wX3dhaXRfcmVsZWFzZS5oIgorCit2b2lkIF9fa21wX3dhaXRfMzIoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9mbGFnXzMyICpmbGFnLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopICkKK3sKKyAgICBfX2ttcF93YWl0X3RlbXBsYXRlKHRoaXNfdGhyLCBmbGFnLCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7Cit9CisKK3ZvaWQgX19rbXBfd2FpdF82NChrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfNjQgKmZsYWcsIGludCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIF9fa21wX3dhaXRfdGVtcGxhdGUodGhpc190aHIsIGZsYWcsIGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKK30KKwordm9pZCBfX2ttcF93YWl0X29uY29yZShrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfb25jb3JlICpmbGFnLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgZmxhZywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworfQorCisKKwordm9pZCBfX2ttcF9yZWxlYXNlXzMyKGttcF9mbGFnXzMyICpmbGFnKSB7CisgICAgX19rbXBfcmVsZWFzZV90ZW1wbGF0ZShmbGFnKTsKK30KKwordm9pZCBfX2ttcF9yZWxlYXNlXzY0KGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfcmVsZWFzZV90ZW1wbGF0ZShmbGFnKTsKK30KKwordm9pZCBfX2ttcF9yZWxlYXNlX29uY29yZShrbXBfZmxhZ19vbmNvcmUgKmZsYWcpIHsKKyAgICBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKGZsYWcpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDI2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmgKQEAgLTAsMCArMSw1NjYgQEAKKy8qCisgKiBrbXBfd2FpdF9yZWxlYXNlLmggLS0gV2FpdC9SZWxlYXNlIGltcGxlbWVudGF0aW9uCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1dBSVRfUkVMRUFTRV9ICisjZGVmaW5lIEtNUF9XQUlUX1JFTEVBU0VfSAorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorCisvKiEKK0BkZWZncm91cCBXQUlUX1JFTEVBU0UgV2FpdC9SZWxlYXNlIG9wZXJhdGlvbnMKKworVGhlIGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbnMgaGVyZSBpbXBsZW1lbnQgdGhlIGxvd2VzdCBsZXZlbCB0aHJlYWQKK3N5bmNocm9uaXphdGlvbnMgb2Ygc3VzcGVuZGluZyBhIHRocmVhZCBhbmQgYXdha2luZyBpdC4gVGhleSBhcmUgdXNlZAordG8gYnVpbGQgaGlnaGVyIGxldmVsIG9wZXJhdGlvbnMgc3VjaCBhcyBiYXJyaWVycyBhbmQgZm9yay9qb2luLgorKi8KKworLyohCitAaW5ncm91cCBXQUlUX1JFTEVBU0UKK0B7CisqLworCisvKiEgCisgKiBUaGUgZmxhZ190eXBlIGRlc2NyaWJlcyB0aGUgc3RvcmFnZSB1c2VkIGZvciB0aGUgZmxhZy4KKyAqLworZW51bSBmbGFnX3R5cGUgeworICAgIGZsYWczMiwgICAgICAgIC8qKjwgMzIgYml0IGZsYWdzICovCisgICAgZmxhZzY0LCAgICAgICAgLyoqPCA2NCBiaXQgZmxhZ3MgKi8KKyAgICBmbGFnX29uY29yZSAgICAvKio8IHNwZWNpYWwgNjQtYml0IGZsYWcgZm9yIG9uLWNvcmUgYmFycmllciAoaGllcmFyY2hpY2FsKSAqLworfTsKKworLyohCisgKiBCYXNlIGNsYXNzIGZvciB3YWl0L3JlbGVhc2Ugdm9sYXRpbGUgZmxhZworICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUD4KK2NsYXNzIGttcF9mbGFnIHsKKyAgICB2b2xhdGlsZSBQICogbG9jOyAgLyoqPCBQb2ludGVyIHRvIHRoZSBmbGFnIHN0b3JhZ2UgdGhhdCBpcyBtb2RpZmllZCBieSBhbm90aGVyIHRocmVhZCAqLworICAgIGZsYWdfdHlwZSB0OyAgICAgICAvKio8ICJUeXBlIiBvZiB0aGUgZmxhZyBpbiBsb2MgKi8KKyBwdWJsaWM6CisgICAgdHlwZWRlZiBQIGZsYWdfdDsKKyAgICBrbXBfZmxhZyh2b2xhdGlsZSBQICpwLCBmbGFnX3R5cGUgZnQpIDogbG9jKHApLCB0KGZ0KSB7fQorICAgIC8qIQorICAgICAqIEByZXN1bHQgdGhlIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBmbGFnCisgICAgICovCisgICAgdm9sYXRpbGUgUCAqIGdldCgpIHsgcmV0dXJuIGxvYzsgfQorICAgIC8qIQorICAgICAqIEBwYXJhbSBuZXdfbG9jIGluICAgc2V0IGxvYyB0byBwb2ludCBhdCBuZXdfbG9jCisgICAgICovCisgICAgdm9pZCBzZXQodm9sYXRpbGUgUCAqbmV3X2xvYykgeyBsb2MgPSBuZXdfbG9jOyB9CisgICAgLyohCisgICAgICogQHJlc3VsdCB0aGUgZmxhZ190eXBlCisgICAgICovCisgICAgZmxhZ190eXBlIGdldF90eXBlKCkgeyByZXR1cm4gdDsgfQorICAgIC8vIERlcml2ZWQgY2xhc3NlcyBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZzoKKyAgICAvKgorICAgIGttcF9pbmZvX3QgKiBnZXRfd2FpdGVyKGttcF91aW50MzIgaSk7CisgICAga21wX3VpbnQzMiBnZXRfbnVtX3dhaXRlcnMoKTsKKyAgICBib29sIGRvbmVfY2hlY2soKTsKKyAgICBib29sIGRvbmVfY2hlY2tfdmFsKFAgb2xkX2xvYyk7CisgICAgYm9vbCBub3Rkb25lX2NoZWNrKCk7CisgICAgUCBpbnRlcm5hbF9yZWxlYXNlKCk7CisgICAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKTsKKyAgICB2b2lkIHJlc3VtZShpbnQgdGhfZ3RpZCk7CisgICAgUCBzZXRfc2xlZXBpbmcoKTsKKyAgICBQIHVuc2V0X3NsZWVwaW5nKCk7CisgICAgYm9vbCBpc19zbGVlcGluZygpOworICAgIGJvb2wgaXNfYW55X3NsZWVwaW5nKCk7CisgICAgYm9vbCBpc19zbGVlcGluZ192YWwoUCBvbGRfbG9jKTsKKyAgICBpbnQgZXhlY3V0ZV90YXNrcyhrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsIGludCBmaW5hbF9zcGluLCBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpOworICAgICovCit9OworCisvKiBTcGluIHdhaXQgbG9vcCB0aGF0IGZpcnN0IGRvZXMgcGF1c2UsIHRoZW4geWllbGQsIHRoZW4gc2xlZXAuIEEgdGhyZWFkIHRoYXQgY2FsbHMgX19rbXBfd2FpdF8qCisgICBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGFub3RoZXIgdGhyZWFkIGNhbGxzIF9fa21wX3JlbGVhc2UgdG8gd2FrZSBpdCBiYWNrIHVwIHRvIHByZXZlbnQgZGVhZGxvY2tzISAgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF93YWl0X3RlbXBsYXRlKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBDICpmbGFnLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgLy8gTk9URTogV2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQuCisgICAgdm9sYXRpbGUgdHlwZW5hbWUgQzo6ZmxhZ190ICpzcGluID0gZmxhZy0+Z2V0KCk7CisgICAga21wX3VpbnQzMiBzcGluczsKKyAgICBrbXBfdWludDMyIGhpYmVybmF0ZTsKKyAgICBpbnQgdGhfZ3RpZDsKKyAgICBpbnQgdGFza3NfY29tcGxldGVkID0gRkFMU0U7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKHNwaW4sIE5VTEwpOworICAgIGlmIChmbGFnLT5kb25lX2NoZWNrKCkpIHsKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoc3Bpbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGhfZ3RpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfd2FpdF9zbGVlcDogVCMlZCB3YWl0aW5nIGZvciBmbGFnKCVwKVxuIiwgdGhfZ3RpZCwgZmxhZykpOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBvbXB0X3N0YXRlX3Qgb21wdF9zdGF0ZSA9IHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlOworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9zdGF0ZSAhPSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgICAgICBpZiAob21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX2lkbGUpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaWRsZV9iZWdpbikpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaWRsZV9iZWdpbikodGhfZ3RpZCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4pKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2V4cGxpY2l0KTsKKworICAgICAgICAgICAgb21wdF9sd190YXNrdGVhbV90KiB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKyAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwSWQ7CisgICAgICAgICAgICBvbXB0X3Rhc2tfaWRfdCB0SWQ7CisgICAgICAgICAgICBpZiAodGVhbSl7CisgICAgICAgICAgICAgICAgcElkID0gdGVhbS0+b21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAgICAgdElkID0gdGVhbS0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcElkID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAgICAgdElkID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4pKHBJZCwgdElkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLy8gU2V0dXAgZm9yIHdhaXRpbmcKKyAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWRzIGNhbm5vdCByZWx5IG9uIHRoZSB0ZWFtIHN0cnVjdCBleGlzdGluZyBhdCB0aGlzIHBvaW50LgorICAgICAgICAvLyBVc2UgdGhlIGJ0IHZhbHVlcyBjYWNoZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3QgaW5zdGVhZC4KKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgICAgICBpZiAoX19rbXBfemVyb19idCAmJiAhdGhpc190aHItPnRoLnRoX3RlYW1fYnRfc2V0KQorICAgICAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHN1c3BlbmQgaWYgbm90IHNldCBieSB1c2VyIGFuZCBtb3JlIHRocmVhZHMgdGhhbiBhdmFpbGFibGUgcHJvY3MKKyAgICAgICAgICAgIGhpYmVybmF0ZSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhpYmVybmF0ZSA9IHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFsczsKKyNlbHNlCisgICAgICAgIGhpYmVybmF0ZSA9IHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFsczsKKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgICAgIC8qIElmIHRoZSBibG9ja3RpbWUgaXMgbm9uemVybywgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzcGluIHdhaXQgZm9yIHRoZSBlbnRpcmV0eQorICAgICAgICAgICBvZiB0aGUgc3BlY2lmaWVkICNpbnRlcnZhbHMsIHBsdXMgdXAgdG8gb25lIGludGVydmFsIG1vcmUuICBUaGlzIGluY3JlbWVudCBtYWtlCisgICAgICAgICAgIGNlcnRhaW4gdGhhdCB0aGlzIHRocmVhZCBkb2Vzbid0IGdvIHRvIHNsZWVwIHRvbyBzb29uLiAgKi8KKyAgICAgICAgaWYgKGhpYmVybmF0ZSAhPSAwKQorICAgICAgICAgICAgaGliZXJuYXRlKys7CisKKyAgICAgICAgLy8gQWRkIGluIHRoZSBjdXJyZW50IHRpbWUgdmFsdWUuCisgICAgICAgIGhpYmVybmF0ZSArPSBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSk7CisgICAgICAgIEtGX1RSQUNFKDIwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgbm93PSVkLCBoaWJlcm5hdGU9JWQsIGludGVydmFscz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgaGliZXJuYXRlLAorICAgICAgICAgICAgICAgICAgICAgIGhpYmVybmF0ZSAtIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlKSk7CisgICAgfQorCisgICAgS01QX01CKCk7CisKKyAgICAvLyBNYWluIHdhaXQgc3BpbiBsb29wCisgICAgd2hpbGUgKGZsYWctPm5vdGRvbmVfY2hlY2soKSkgeworICAgICAgICBpbnQgaW5fcG9vbDsKKworICAgICAgICAvKiBJZiB0aGUgdGFzayB0ZWFtIGlzIE5VTEwsIGl0IG1lYW5zIG9uZSBvZiB0aGluZ3M6CisgICAgICAgICAgIDEpIEEgbmV3bHktY3JlYXRlZCB0aHJlYWQgaXMgZmlyc3QgYmVpbmcgcmVsZWFzZWQgYnkgX19rbXBfZm9ya19iYXJyaWVyKCksIGFuZAorICAgICAgICAgICAgICBpdHMgdGFzayB0ZWFtIGhhcyBub3QgYmVlbiBzZXQgdXAgeWV0LgorICAgICAgICAgICAyKSBBbGwgdGFza3MgaGF2ZSBiZWVuIGV4ZWN1dGVkIHRvIGNvbXBsZXRpb24sIHRoaXMgdGhyZWFkIGhhcyBkZWNyZW1lbnRlZCB0aGUgdGFzaworICAgICAgICAgICAgICB0ZWFtJ3MgcmVmIGN0IGFuZCBwb3NzaWJseSBkZWFsbG9jYXRlZCBpdCwgYW5kIHNob3VsZCBubyBsb25nZXIgcmVmZXJlbmNlIGl0LgorICAgICAgICAgICAzKSBUYXNraW5nIGlzIG9mZiBmb3IgdGhpcyByZWdpb24uICBUaGlzIGNvdWxkIGJlIGJlY2F1c2Ugd2UgYXJlIGluIGEgc2VyaWFsaXplZCByZWdpb24KKyAgICAgICAgICAgICAgKHBlcmhhcHMgdGhlIG91dGVyIG9uZSksIG9yIGVsc2UgdGFza2luZyB3YXMgbWFudWFsbHkgZGlzYWJsZWQgKEtNUF9UQVNLSU5HPTApLiAgKi8KKyAgICAgICAga21wX3Rhc2tfdGVhbV90ICogdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICB0YXNrX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtOworICAgICAgICAgICAgaWYgKHRhc2tfdGVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFRDUl9TWU5DXzQodGFza190ZWFtLT50dC50dF9hY3RpdmUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLT5leGVjdXRlX3Rhc2tzKHRoaXNfdGhyLCB0aF9ndGlkLCBmaW5hbF9zcGluLCAmdGFza3NfY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghS01QX01BU1RFUl9USUQodGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBpZgorCisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoc3Bpbik7CisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLCBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQpLCB0aGVuIHlpZWxkCisgICAgICAgIEtNUF9ZSUVMRChUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIC8vIFRPRE86IFNob3VsZCBpdCBiZSBudW1iZXIgb2YgY29yZXMgaW5zdGVhZCBvZiB0aHJlYWQgY29udGV4dHM/IExpa2U6CisgICAgICAgIC8vIEtNUF9ZSUVMRChUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfbmNvcmVzKTsKKyAgICAgICAgLy8gTmVlZCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBkYXRhIHRvIG1ha2UgdGhlIGNoYW5nZS4uLgorICAgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0aHJlYWQgd2FzIHRyYW5zZmVycmVkIGZyb20gYSB0ZWFtCisgICAgICAgIC8vIHRvIHRoZSB0aHJlYWQgcG9vbCAob3IgdmljZS12ZXJzYSkgd2hpbGUgc3Bpbm5pbmcuCisgICAgICAgIGluX3Bvb2wgPSAhIVRDUl80KHRoaXNfdGhyLT50aC50aF9pbl9wb29sKTsKKyAgICAgICAgaWYgKGluX3Bvb2wgIT0gISF0aGlzX3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wpIHsKKyAgICAgICAgICAgIGlmIChpbl9wb29sKSB7IC8vIFJlY2VudGx5IHRyYW5zZmVycmVkIGZyb20gdGVhbSB0byBwb29sCisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigoa21wX2ludDMyICopJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgLyogSGVyZSwgd2UgY2Fubm90IGFzc2VydCB0aGF0OgorICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPD0gX19rbXBfdGhyZWFkX3Bvb2xfbnRoKTsKKyAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9udGggaXMgaW5jL2RlYydkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIHdoaWxlIHRoZSBmb3JrL2pvaW4KKyAgICAgICAgICAgICAgICAgICBsb2NrIGlzIGhlbGQsIHdoZXJlYXMgX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCBpcyBpbmMvZGVjJ2QgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgICAgICAgICBieSB0aGUgd29ya2Vycy4gIFRoZSB0d28gY2FuIGdldCBvdXQgb2Ygc3luYyBmb3IgYnJpZWYgcGVyaW9kcyBvZiB0aW1lLiAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeyAvLyBSZWNlbnRseSB0cmFuc2ZlcnJlZCBmcm9tIHBvb2wgdG8gdGVhbQorICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwKTsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERvbid0IHN1c3BlbmQgaWYgS01QX0JMT0NLVElNRSBpcyBzZXQgdG8gImluZmluaXRlIgorICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBEb24ndCBzdXNwZW5kIGlmIHRoZXJlIGlzIGEgbGlrZWxpaG9vZCBvZiBuZXcgdGFza3MgYmVpbmcgc3Bhd25lZC4KKyAgICAgICAgaWYgKCh0YXNrX3RlYW0gIT0gTlVMTCkgJiYgVENSXzQodGFza190ZWFtLT50dC50dF9mb3VuZF90YXNrcykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBJZiB3ZSBoYXZlIHdhaXRlZCBhIGJpdCBtb3JlLCBmYWxsIGFzbGVlcAorICAgICAgICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUpIDwgaGliZXJuYXRlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiX19rbXBfd2FpdF9zbGVlcDogVCMlZCBzdXNwZW5kIHRpbWUgcmVhY2hlZFxuIiwgdGhfZ3RpZCkpOworCisgICAgICAgIGZsYWctPnN1c3BlbmQodGhfZ3RpZCk7CisKKyAgICAgICAgaWYgKFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KQorICAgICAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogSWYgdGhyZWFkIGlzIGRvbmUgd2l0aCB3b3JrIGFuZCB0aW1lcyBvdXQsIGRpc2JhbmQvZnJlZQorICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X3N0YXRlICE9IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgIGlmIChvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfaWRsZSkgeworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pZGxlX2VuZCkpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaWRsZV9lbmQpKHRoX2d0aWQgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCkpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQob21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2ltcGxpY2l0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQpOworCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QqIHRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IHBJZDsKKyAgICAgICAgICAgIG9tcHRfdGFza19pZF90IHRJZDsKKyAgICAgICAgICAgIGlmICh0ZWFtKXsKKyAgICAgICAgICAgICAgICBwSWQgPSB0ZWFtLT5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICB0SWQgPSB0ZWFtLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwSWQgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICB0SWQgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmQpKHBJZCwgdElkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoc3Bpbik7Cit9CisKKy8qIFJlbGVhc2UgYW55IHRocmVhZHMgc3BlY2lmaWVkIGFzIHdhaXRpbmcgb24gdGhlIGZsYWcgYnkgcmVsZWFzaW5nIHRoZSBmbGFnIGFuZCByZXN1bWUgdGhlIHdhaXRpbmcgdGhyZWFkCisgICBpZiBpbmRpY2F0ZWQgYnkgdGhlIHNsZWVwIGJpdChzKS4gQSB0aHJlYWQgdGhhdCBjYWxscyBfX2ttcF93YWl0X3RlbXBsYXRlIG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHdha2UKKyAgIHVwIHRoZSBwb3RlbnRpYWxseSBzbGVlcGluZyB0aHJlYWQgYW5kIHByZXZlbnQgZGVhZGxvY2tzISAgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKEMgKmZsYWcpCit7CisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworI2VuZGlmCisgICAgS0ZfVFJBQ0UoMjAsICgiX19rbXBfcmVsZWFzZTogVCMlZCByZWxlYXNpbmcgZmxhZygleClcbiIsIGd0aWQsIGZsYWctPmdldCgpKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnLT5nZXQoKSk7CisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhmbGFnLT5nZXQoKSk7CisKKyAgICBmbGFnLT5pbnRlcm5hbF9yZWxlYXNlKCk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiX19rbXBfcmVsZWFzZTogVCMlZCBzZXQgbmV3IHNwaW49JWRcbiIsIGd0aWQsIGZsYWctPmdldCgpLCAqKGZsYWctPmdldCgpKSkpOworCisgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBjaGVjayBzbGVlcCBzdHVmZiBpZiBpbmZpbml0ZSBibG9jayB0aW1lIG5vdCBzZXQKKyAgICAgICAgaWYgKGZsYWctPmlzX2FueV9zbGVlcGluZygpKSB7IC8vIEFyZSAqYW55KiBvZiB0aGUgdGhyZWFkcyB0aGF0IHdhaXQgb24gdGhpcyBmbGFnIHNsZWVwaW5nPworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPGZsYWctPmdldF9udW1fd2FpdGVycygpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICogd2FpdGVyID0gZmxhZy0+Z2V0X3dhaXRlcihpKTsgLy8gaWYgYSBzbGVlcGluZyB3YWl0ZXIgZXhpc3RzIGF0IGksIHNldHMgY3VycmVudF93YWl0ZXIgdG8gaSBpbnNpZGUgdGhlIGZsYWcKKyAgICAgICAgICAgICAgICBpZiAod2FpdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB3YWl0X2d0aWQgPSB3YWl0ZXItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2FrZSB1cCB0aHJlYWQgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIl9fa21wX3JlbGVhc2U6IFQjJWQgd2FraW5nIHVwIHRocmVhZCBUIyVkIHNpbmNlIHNsZWVwIGZsYWcoJXApIHNldFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB3YWl0X2d0aWQsIGZsYWctPmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGZsYWctPnJlc3VtZSh3YWl0X2d0aWQpOyAvLyB1bnNldHMgZmxhZydzIGN1cnJlbnRfd2FpdGVyIHdoZW4gZG9uZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEZsYWdUeXBlPgorc3RydWN0IGZsYWdfdHJhaXRzIHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGZsYWdfdHJhaXRzPGttcF91aW50MzI+IHsKKyAgICB0eXBlZGVmIGttcF91aW50MzIgZmxhZ190OworICAgIHN0YXRpYyBjb25zdCBmbGFnX3R5cGUgdCA9IGZsYWczMjsKKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0Y3IoZmxhZ190IGYpIHsgcmV0dXJuIFRDUl80KGYpOyB9CisgICAgc3RhdGljIGlubGluZSBmbGFnX3QgdGVzdF90aGVuX2FkZDQodm9sYXRpbGUgZmxhZ190ICpmKSB7IHJldHVybiBLTVBfVEVTVF9USEVOX0FERDRfMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKWYpOyB9CisgICAgc3RhdGljIGlubGluZSBmbGFnX3QgdGVzdF90aGVuX29yKHZvbGF0aWxlIGZsYWdfdCAqZiwgZmxhZ190IHYpIHsgcmV0dXJuIEtNUF9URVNUX1RIRU5fT1IzMigodm9sYXRpbGUga21wX2ludDMyICopZiwgdik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fYW5kKHZvbGF0aWxlIGZsYWdfdCAqZiwgZmxhZ190IHYpIHsgcmV0dXJuIEtNUF9URVNUX1RIRU5fQU5EMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKWYsIHYpOyB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGZsYWdfdHJhaXRzPGttcF91aW50NjQ+IHsKKyAgICB0eXBlZGVmIGttcF91aW50NjQgZmxhZ190OworICAgIHN0YXRpYyBjb25zdCBmbGFnX3R5cGUgdCA9IGZsYWc2NDsKKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0Y3IoZmxhZ190IGYpIHsgcmV0dXJuIFRDUl84KGYpOyB9CisgICAgc3RhdGljIGlubGluZSBmbGFnX3QgdGVzdF90aGVuX2FkZDQodm9sYXRpbGUgZmxhZ190ICpmKSB7IHJldHVybiBLTVBfVEVTVF9USEVOX0FERDRfNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKWYpOyB9CisgICAgc3RhdGljIGlubGluZSBmbGFnX3QgdGVzdF90aGVuX29yKHZvbGF0aWxlIGZsYWdfdCAqZiwgZmxhZ190IHYpIHsgcmV0dXJuIEtNUF9URVNUX1RIRU5fT1I2NCgodm9sYXRpbGUga21wX2ludDY0ICopZiwgdik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fYW5kKHZvbGF0aWxlIGZsYWdfdCAqZiwgZmxhZ190IHYpIHsgcmV0dXJuIEtNUF9URVNUX1RIRU5fQU5ENjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKWYsIHYpOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmxhZ1R5cGU+CitjbGFzcyBrbXBfYmFzaWNfZmxhZyA6IHB1YmxpYyBrbXBfZmxhZzxGbGFnVHlwZT4geworICAgIHR5cGVkZWYgZmxhZ190cmFpdHM8RmxhZ1R5cGU+IHRyYWl0c190eXBlOworICAgIEZsYWdUeXBlIGNoZWNrZXI7ICAvKio8IFZhbHVlIHRvIGNvbXBhcmUgZmxhZyB0byB0byBjaGVjayBpZiBmbGFnIGhhcyBiZWVuIHJlbGVhc2VkLiAqLworICAgIGttcF9pbmZvX3QgKiB3YWl0aW5nX3RocmVhZHNbMV07ICAvKio8IEFycmF5IG9mIHRocmVhZHMgc2xlZXBpbmcgb24gdGhpcyB0aHJlYWQuICovCisgICAga21wX3VpbnQzMiBudW1fd2FpdGluZ190aHJlYWRzOyAgICAgICAvKio8IE51bWJlciBvZiB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoaXMgdGhyZWFkLiAqLworIHB1YmxpYzoKKyAgICBrbXBfYmFzaWNfZmxhZyh2b2xhdGlsZSBGbGFnVHlwZSAqcCkgOiBrbXBfZmxhZzxGbGFnVHlwZT4ocCwgdHJhaXRzX3R5cGU6OnQpLCBudW1fd2FpdGluZ190aHJlYWRzKDApIHt9CisgICAga21wX2Jhc2ljX2ZsYWcodm9sYXRpbGUgRmxhZ1R5cGUgKnAsIGttcF9pbmZvX3QgKnRocikgOiBrbXBfZmxhZzxGbGFnVHlwZT4ocCwgdHJhaXRzX3R5cGU6OnQpLCBudW1fd2FpdGluZ190aHJlYWRzKDEpIHsKKyAgICAgICAgd2FpdGluZ190aHJlYWRzWzBdID0gdGhyOyAKKyAgICB9CisgICAga21wX2Jhc2ljX2ZsYWcodm9sYXRpbGUgRmxhZ1R5cGUgKnAsIEZsYWdUeXBlIGMpIDoga21wX2ZsYWc8RmxhZ1R5cGU+KHAsIHRyYWl0c190eXBlOjp0KSwgY2hlY2tlcihjKSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSB7fQorICAgIC8qIQorICAgICAqIHBhcmFtIGkgaW4gICBpbmRleCBpbnRvIHdhaXRpbmdfdGhyZWFkcworICAgICAqIEByZXN1bHQgdGhlIHRocmVhZCB0aGF0IGlzIHdhaXRpbmcgYXQgaW5kZXggaQorICAgICAqLworICAgIGttcF9pbmZvX3QgKiBnZXRfd2FpdGVyKGttcF91aW50MzIgaSkgeyAKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpPG51bV93YWl0aW5nX3RocmVhZHMpOworICAgICAgICByZXR1cm4gd2FpdGluZ190aHJlYWRzW2ldOyAKKyAgICB9CisgICAgLyohCisgICAgICogQHJlc3VsdCBudW1fd2FpdGluZ190aHJlYWRzCisgICAgICovCisgICAga21wX3VpbnQzMiBnZXRfbnVtX3dhaXRlcnMoKSB7IHJldHVybiBudW1fd2FpdGluZ190aHJlYWRzOyB9CisgICAgLyohCisgICAgICogQHBhcmFtIHRociBpbiAgIHRoZSB0aHJlYWQgd2hpY2ggaXMgbm93IHdhaXRpbmcKKyAgICAgKgorICAgICAqIEluc2VydCBhIHdhaXRpbmcgdGhyZWFkIGF0IGluZGV4IDAuCisgICAgICovCisgICAgdm9pZCBzZXRfd2FpdGVyKGttcF9pbmZvX3QgKnRocikgeyAKKyAgICAgICAgd2FpdGluZ190aHJlYWRzWzBdID0gdGhyOyAKKyAgICAgICAgbnVtX3dhaXRpbmdfdGhyZWFkcyA9IDE7CisgICAgfQorICAgIC8qIQorICAgICAqIEByZXN1bHQgdHJ1ZSBpZiB0aGUgZmxhZyBvYmplY3QgaGFzIGJlZW4gcmVsZWFzZWQuCisgICAgICovCisgICAgYm9vbCBkb25lX2NoZWNrKCkgeyByZXR1cm4gdHJhaXRzX3R5cGU6OnRjcigqKHRoaXMtPmdldCgpKSkgPT0gY2hlY2tlcjsgfQorICAgIC8qIQorICAgICAqIEBwYXJhbSBvbGRfbG9jIGluICAgb2xkIHZhbHVlIG9mIGZsYWcKKyAgICAgKiBAcmVzdWx0IHRydWUgaWYgdGhlIGZsYWcncyBvbGQgdmFsdWUgaW5kaWNhdGVzIGl0IHdhcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBib29sIGRvbmVfY2hlY2tfdmFsKEZsYWdUeXBlIG9sZF9sb2MpIHsgcmV0dXJuIG9sZF9sb2MgPT0gY2hlY2tlcjsgfQorICAgIC8qIQorICAgICAqIEByZXN1bHQgdHJ1ZSBpZiB0aGUgZmxhZyBvYmplY3QgaXMgbm90IHlldCByZWxlYXNlZC4KKyAgICAgKiBVc2VkIGluIF9fa21wX3dhaXRfdGVtcGxhdGUgbGlrZToKKyAgICAgKiBAY29kZQorICAgICAqIHdoaWxlIChmbGFnLm5vdGRvbmVfY2hlY2soKSkgeyBwYXVzZSgpOyB9CisgICAgICogQGVuZGNvZGUKKyAgICAgKi8KKyAgICBib29sIG5vdGRvbmVfY2hlY2soKSB7IHJldHVybiB0cmFpdHNfdHlwZTo6dGNyKCoodGhpcy0+Z2V0KCkpKSAhPSBjaGVja2VyOyB9CisgICAgLyohCisgICAgICogQHJlc3VsdCBBY3R1YWwgZmxhZyB2YWx1ZSBiZWZvcmUgcmVsZWFzZSB3YXMgYXBwbGllZC4KKyAgICAgKiBUcmlnZ2VyIGFsbCB3YWl0aW5nIHRocmVhZHMgdG8gcnVuIGJ5IG1vZGlmeWluZyBmbGFnIHRvIHJlbGVhc2Ugc3RhdGUuCisgICAgICovCisgICAgdm9pZCBpbnRlcm5hbF9yZWxlYXNlKCkgeworICAgICAgICAodm9pZCkgdHJhaXRzX3R5cGU6OnRlc3RfdGhlbl9hZGQ0KCh2b2xhdGlsZSBGbGFnVHlwZSAqKXRoaXMtPmdldCgpKTsKKyAgICB9CisgICAgLyohCisgICAgICogQHJlc3VsdCBBY3R1YWwgZmxhZyB2YWx1ZSBiZWZvcmUgc2xlZXAgYml0KHMpIHNldC4KKyAgICAgKiBOb3RlcyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB0aHJlYWQgc2xlZXBpbmcgb24gdGhlIGZsYWcgYnkgc2V0dGluZyBzbGVlcCBiaXQocykuCisgICAgICovCisgICAgRmxhZ1R5cGUgc2V0X3NsZWVwaW5nKCkgeyAKKyAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0ZXN0X3RoZW5fb3IoKHZvbGF0aWxlIEZsYWdUeXBlICopdGhpcy0+Z2V0KCksIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFKTsKKyAgICB9CisgICAgLyohCisgICAgICogQHJlc3VsdCBBY3R1YWwgZmxhZyB2YWx1ZSBiZWZvcmUgc2xlZXAgYml0KHMpIGNsZWFyZWQuCisgICAgICogTm90ZXMgdGhhdCB0aGVyZSBhcmUgbm8gbG9uZ2VyIHRocmVhZHMgc2xlZXBpbmcgb24gdGhlIGZsYWcgYnkgY2xlYXJpbmcgc2xlZXAgYml0KHMpLgorICAgICAqLworICAgIEZsYWdUeXBlIHVuc2V0X3NsZWVwaW5nKCkgeyAKKyAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0ZXN0X3RoZW5fYW5kKCh2b2xhdGlsZSBGbGFnVHlwZSAqKXRoaXMtPmdldCgpLCB+S01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICAgIH0KKyAgICAvKiEgCisgICAgICogQHBhcmFtIG9sZF9sb2MgaW4gICBvbGQgdmFsdWUgb2YgZmxhZworICAgICAqIFRlc3Qgd2hldGhlciB0aGVyZSBhcmUgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGUgZmxhZydzIG9sZCB2YWx1ZSBpbiBvbGRfbG9jLgorICAgICAqLworICAgIGJvb2wgaXNfc2xlZXBpbmdfdmFsKEZsYWdUeXBlIG9sZF9sb2MpIHsgcmV0dXJuIG9sZF9sb2MgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURTsgfQorICAgIC8qISAKKyAgICAgKiBUZXN0IHdoZXRoZXIgdGhlcmUgYXJlIHRocmVhZHMgc2xlZXBpbmcgb24gdGhlIGZsYWcuCisgICAgICovCisgICAgYm9vbCBpc19zbGVlcGluZygpIHsgcmV0dXJuIGlzX3NsZWVwaW5nX3ZhbCgqKHRoaXMtPmdldCgpKSk7IH0KKyAgICBib29sIGlzX2FueV9zbGVlcGluZygpIHsgcmV0dXJuIGlzX3NsZWVwaW5nX3ZhbCgqKHRoaXMtPmdldCgpKSk7IH0KKyAgICBrbXBfdWludDggKmdldF9zdG9sZW4oKSB7IHJldHVybiBOVUxMOyB9CisgICAgZW51bSBiYXJyaWVyX3R5cGUgZ2V0X2J0KCkgeyByZXR1cm4gYnNfbGFzdF9iYXJyaWVyOyB9Cit9OworCitjbGFzcyBrbXBfZmxhZ18zMiA6IHB1YmxpYyBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDMyPiB7CisgcHVibGljOgorICAgIGttcF9mbGFnXzMyKHZvbGF0aWxlIGttcF91aW50MzIgKnApIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4ocCkge30KKyAgICBrbXBfZmxhZ18zMih2b2xhdGlsZSBrbXBfdWludDMyICpwLCBrbXBfaW5mb190ICp0aHIpIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4ocCwgdGhyKSB7fQorICAgIGttcF9mbGFnXzMyKHZvbGF0aWxlIGttcF91aW50MzIgKnAsIGttcF91aW50MzIgYykgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDMyPihwLCBjKSB7fQorICAgIHZvaWQgc3VzcGVuZChpbnQgdGhfZ3RpZCkgeyBfX2ttcF9zdXNwZW5kXzMyKHRoX2d0aWQsIHRoaXMpOyB9CisgICAgdm9pZCByZXN1bWUoaW50IHRoX2d0aWQpIHsgX19rbXBfcmVzdW1lXzMyKHRoX2d0aWQsIHRoaXMpOyB9CisgICAgaW50IGV4ZWN1dGVfdGFza3Moa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9pbnQzMiBndGlkLCBpbnQgZmluYWxfc3BpbiwgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgICAgICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKHRoaXNfdGhyLCBndGlkLCB0aGlzLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworICAgIH0KKyAgICB2b2lkIHdhaXQoa21wX2luZm9fdCAqdGhpc190aHIsIGludCBmaW5hbF9zcGluCisgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopKSB7CisgICAgICAgIF9fa21wX3dhaXRfdGVtcGxhdGUodGhpc190aHIsIHRoaXMsIGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICB9CisgICAgdm9pZCByZWxlYXNlKCkgeyBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKHRoaXMpOyB9CisgICAgZmxhZ190eXBlIGdldF9wdHJfdHlwZSgpIHsgcmV0dXJuIGZsYWczMjsgfQorfTsKKworY2xhc3Mga21wX2ZsYWdfNjQgOiBwdWJsaWMga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQ2ND4geworIHB1YmxpYzoKKyAgICBrbXBfZmxhZ182NCh2b2xhdGlsZSBrbXBfdWludDY0ICpwKSA6IGttcF9iYXNpY19mbGFnPGttcF91aW50NjQ+KHApIHt9CisgICAga21wX2ZsYWdfNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX2luZm9fdCAqdGhyKSA6IGttcF9iYXNpY19mbGFnPGttcF91aW50NjQ+KHAsIHRocikge30KKyAgICBrbXBfZmxhZ182NCh2b2xhdGlsZSBrbXBfdWludDY0ICpwLCBrbXBfdWludDY0IGMpIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQ2ND4ocCwgYykge30KKyAgICB2b2lkIHN1c3BlbmQoaW50IHRoX2d0aWQpIHsgX19rbXBfc3VzcGVuZF82NCh0aF9ndGlkLCB0aGlzKTsgfQorICAgIHZvaWQgcmVzdW1lKGludCB0aF9ndGlkKSB7IF9fa21wX3Jlc3VtZV82NCh0aF9ndGlkLCB0aGlzKTsgfQorICAgIGludCBleGVjdXRlX3Rhc2tzKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwgaW50IGZpbmFsX3NwaW4sIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkgeworICAgICAgICByZXR1cm4gX19rbXBfZXhlY3V0ZV90YXNrc182NCh0aGlzX3RociwgZ3RpZCwgdGhpcywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKKyAgICB9CisgICAgdm9pZCB3YWl0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSkgeworICAgICAgICBfX2ttcF93YWl0X3RlbXBsYXRlKHRoaXNfdGhyLCB0aGlzLCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgfQorICAgIHZvaWQgcmVsZWFzZSgpIHsgX19rbXBfcmVsZWFzZV90ZW1wbGF0ZSh0aGlzKTsgfQorICAgIGZsYWdfdHlwZSBnZXRfcHRyX3R5cGUoKSB7IHJldHVybiBmbGFnNjQ7IH0KK307CisKKy8vIEhpZXJhcmNoaWNhbCA2NC1iaXQgb24tY29yZSBiYXJyaWVyIGluc3RhbnRpYXRpb24KK2NsYXNzIGttcF9mbGFnX29uY29yZSA6IHB1YmxpYyBrbXBfZmxhZzxrbXBfdWludDY0PiB7CisgICAga21wX3VpbnQ2NCBjaGVja2VyOworICAgIGttcF9pbmZvX3QgKiB3YWl0aW5nX3RocmVhZHNbMV07CisgICAga21wX3VpbnQzMiBudW1fd2FpdGluZ190aHJlYWRzOworICAgIGttcF91aW50MzIgb2Zmc2V0OyAgICAgIC8qKjwgUG9ydGlvbiBvZiBmbGFnIHRoYXQgaXMgb2YgaW50ZXJlc3QgZm9yIGFuIG9wZXJhdGlvbi4gKi8KKyAgICBib29sIGZsYWdfc3dpdGNoOyAgICAgICAvKio8IEluZGljYXRlcyBhIHN3aXRjaCBpbiBmbGFnIGxvY2F0aW9uLiAqLworICAgIGVudW0gYmFycmllcl90eXBlIGJ0OyAgIC8qKjwgQmFycmllciB0eXBlLiAqLworICAgIGttcF9pbmZvX3QgKiB0aGlzX3RocjsgIC8qKjwgVGhyZWFkIHRoYXQgbWF5IGJlIHJlZGlyZWN0ZWQgdG8gZGlmZmVyZW50IGZsYWcgbG9jYXRpb24uICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKml0dF9zeW5jX29iajsgICAgIC8qKjwgSVRUIG9iamVjdCB0aGF0IG11c3QgYmUgcGFzc2VkIHRvIG5ldyBmbGFnIGxvY2F0aW9uLiAqLworI2VuZGlmCisgICAgdW5zaWduZWQgY2hhciYgYnl0ZXJlZih2b2xhdGlsZSBrbXBfdWludDY0KiBsb2MsIHNpemVfdCBvZmZzZXQpIHsgcmV0dXJuICgodW5zaWduZWQgY2hhciAqKWxvYylbb2Zmc2V0XTsgfQorcHVibGljOgorICAgIGttcF9mbGFnX29uY29yZSh2b2xhdGlsZSBrbXBfdWludDY0ICpwKQorICAgICAgICA6IGttcF9mbGFnPGttcF91aW50NjQ+KHAsIGZsYWdfb25jb3JlKSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSwgZmxhZ19zd2l0Y2goZmFsc2UpIHt9CisgICAga21wX2ZsYWdfb25jb3JlKHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF91aW50MzIgaWR4KQorICAgICAgICA6IGttcF9mbGFnPGttcF91aW50NjQ+KHAsIGZsYWdfb25jb3JlKSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSwgb2Zmc2V0KGlkeCksIGZsYWdfc3dpdGNoKGZhbHNlKSB7fQorICAgIGttcF9mbGFnX29uY29yZSh2b2xhdGlsZSBrbXBfdWludDY0ICpwLCBrbXBfdWludDY0IGMsIGttcF91aW50MzIgaWR4LCBlbnVtIGJhcnJpZXJfdHlwZSBiYXJfdCwKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqIHRocgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgLCB2b2lkICppdHQKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIDoga21wX2ZsYWc8a21wX3VpbnQ2ND4ocCwgZmxhZ19vbmNvcmUpLCBjaGVja2VyKGMpLCBudW1fd2FpdGluZ190aHJlYWRzKDApLCBvZmZzZXQoaWR4KSwKKyAgICAgICAgICBmbGFnX3N3aXRjaChmYWxzZSksIGJ0KGJhcl90KSwgdGhpc190aHIodGhyKQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLCBpdHRfc3luY19vYmooaXR0KQorI2VuZGlmCisgICAgICAgIHt9CisgICAga21wX2luZm9fdCAqIGdldF93YWl0ZXIoa21wX3VpbnQzMiBpKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaTxudW1fd2FpdGluZ190aHJlYWRzKTsKKyAgICAgICAgcmV0dXJuIHdhaXRpbmdfdGhyZWFkc1tpXTsKKyAgICB9CisgICAga21wX3VpbnQzMiBnZXRfbnVtX3dhaXRlcnMoKSB7IHJldHVybiBudW1fd2FpdGluZ190aHJlYWRzOyB9CisgICAgdm9pZCBzZXRfd2FpdGVyKGttcF9pbmZvX3QgKnRocikgeworICAgICAgICB3YWl0aW5nX3RocmVhZHNbMF0gPSB0aHI7CisgICAgICAgIG51bV93YWl0aW5nX3RocmVhZHMgPSAxOworICAgIH0KKyAgICBib29sIGRvbmVfY2hlY2tfdmFsKGttcF91aW50NjQgb2xkX2xvYykgeyByZXR1cm4gYnl0ZXJlZigmb2xkX2xvYyxvZmZzZXQpID09IGNoZWNrZXI7IH0KKyAgICBib29sIGRvbmVfY2hlY2soKSB7IHJldHVybiBkb25lX2NoZWNrX3ZhbCgqZ2V0KCkpOyB9CisgICAgYm9vbCBub3Rkb25lX2NoZWNrKCkgeworICAgICAgICAvLyBDYWxjdWxhdGUgZmxhZ19zd2l0Y2gKKyAgICAgICAgaWYgKHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiLndhaXRfZmxhZyA9PSBLTVBfQkFSUklFUl9TV0lUQ0hfVE9fT1dOX0ZMQUcpCisgICAgICAgICAgICBmbGFnX3N3aXRjaCA9IHRydWU7CisgICAgICAgIGlmIChieXRlcmVmKGdldCgpLG9mZnNldCkgIT0gMSAmJiAhZmxhZ19zd2l0Y2gpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ19zd2l0Y2gpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX1NXSVRDSElORzsKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiLmJfZ28sIChrbXBfdWludDY0KUtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICAgICAgX19rbXBfd2FpdF82NCh0aGlzX3RociwgJmZsYWcsIFRSVUUKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICwgaXR0X3N5bmNfb2JqCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZvaWQgaW50ZXJuYWxfcmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICAgICAgICBieXRlcmVmKGdldCgpLG9mZnNldCkgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAga21wX3VpbnQ2NCBtYXNrPTA7CisgICAgICAgICAgICBieXRlcmVmKCZtYXNrLG9mZnNldCkgPSAxOworICAgICAgICAgICAgKHZvaWQpIEtNUF9URVNUX1RIRU5fT1I2NCgodm9sYXRpbGUga21wX2ludDY0ICopZ2V0KCksIG1hc2spOworICAgICAgICB9CisgICAgfQorICAgIGttcF91aW50NjQgc2V0X3NsZWVwaW5nKCkgeworICAgICAgICByZXR1cm4gS01QX1RFU1RfVEhFTl9PUjY0KChrbXBfaW50NjQgdm9sYXRpbGUgKilnZXQoKSwgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICAgIH0KKyAgICBrbXBfdWludDY0IHVuc2V0X3NsZWVwaW5nKCkgeworICAgICAgICByZXR1cm4gS01QX1RFU1RfVEhFTl9BTkQ2NCgoa21wX2ludDY0IHZvbGF0aWxlICopZ2V0KCksIH5LTVBfQkFSUklFUl9TTEVFUF9TVEFURSk7CisgICAgfQorICAgIGJvb2wgaXNfc2xlZXBpbmdfdmFsKGttcF91aW50NjQgb2xkX2xvYykgeyByZXR1cm4gb2xkX2xvYyAmIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFOyB9CisgICAgYm9vbCBpc19zbGVlcGluZygpIHsgcmV0dXJuIGlzX3NsZWVwaW5nX3ZhbCgqZ2V0KCkpOyB9CisgICAgYm9vbCBpc19hbnlfc2xlZXBpbmcoKSB7IHJldHVybiBpc19zbGVlcGluZ192YWwoKmdldCgpKTsgfQorICAgIHZvaWQgd2FpdChrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGZpbmFsX3NwaW4pIHsKKyAgICAgICAgX19rbXBfd2FpdF90ZW1wbGF0ZTxrbXBfZmxhZ19vbmNvcmU+KHRoaXNfdGhyLCB0aGlzLCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgfQorICAgIHZvaWQgcmVsZWFzZSgpIHsgX19rbXBfcmVsZWFzZV90ZW1wbGF0ZSh0aGlzKTsgfQorICAgIHZvaWQgc3VzcGVuZChpbnQgdGhfZ3RpZCkgeyBfX2ttcF9zdXNwZW5kX29uY29yZSh0aF9ndGlkLCB0aGlzKTsgfQorICAgIHZvaWQgcmVzdW1lKGludCB0aF9ndGlkKSB7IF9fa21wX3Jlc3VtZV9vbmNvcmUodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICBpbnQgZXhlY3V0ZV90YXNrcyhrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsIGludCBmaW5hbF9zcGluLCBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpIHsKKyAgICAgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3Nfb25jb3JlKHRoaXNfdGhyLCBndGlkLCB0aGlzLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKKyAgICB9CisgICAga21wX3VpbnQ4ICpnZXRfc3RvbGVuKCkgeyByZXR1cm4gTlVMTDsgfQorICAgIGVudW0gYmFycmllcl90eXBlIGdldF9idCgpIHsgcmV0dXJuIGJ0OyB9CisgICAgZmxhZ190eXBlIGdldF9wdHJfdHlwZSgpIHsgcmV0dXJuIGZsYWdfb25jb3JlOyB9Cit9OworCisKKy8qIQorQH0KKyovCisKKyNlbmRpZiAvLyBLTVBfV0FJVF9SRUxFQVNFX0gKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX2dldHBpZC5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfZ2V0cGlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhMDQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX2dldHBpZC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBrbXBfd3JhcHBlcl9nZXRwaWQuaCAtLSBnZXRwaWQoKSBkZWNsYXJhdGlvbi4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfV1JBUFBFUl9HRVRQSURfSAorI2RlZmluZSBLTVBfV1JBUFBFUl9HRVRQSURfSAorCisjaWYgS01QX09TX1VOSVgKKworICAgIC8vIE9uIFVuaXgtbGlrZSBzeXN0ZW1zIChMaW51eCogT1MgYW5kIE9TIFgqKSBnZXRwaWQoKSBpcyBkZWNsYXJlZCBpbiBzdGFuZGFyZCBoZWFkZXJzLgorICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNlbGlmIEtNUF9PU19XSU5ET1dTCisKKyAgICAvLyBPbiBXaW5kb3dzKiBPUyBfZ2V0cGlkKCkgcmV0dXJucyBpbnQgKG5vdCBwaWRfdCkgYW5kIGlzIGRlY2xhcmVkIGluICJwcm9jZXNzLmgiLgorICAgICNpbmNsdWRlIDxwcm9jZXNzLmg+CisgICAgLy8gTGV0IHVzIHNpbXVsYXRlIFVuaXguCisgICAgdHlwZWRlZiBpbnQgcGlkX3Q7CisgICAgI2RlZmluZSBnZXRwaWQgX2dldHBpZAorCisjZWxzZQorCisgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisKKyNlbmRpZgorCisvKgorICAgIFRPRE86IEFsbCB0aGUgbGlib21wIHNvdXJjZSBjb2RlIHVzZXMgcGlkX3QgdHlwZSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IG9mIGdldHBpZCgpLCBpdCBpcyBnb29kLgorICAgIEJ1dCBvZnRlbiBpdCBwcmludGVkIGFzICIlZCIsIHRoYXQgaXMgbm90IGdvb2QsIGJlY2F1c2UgaXQgaWdub3JlcyBwaWRfdCBkZWZpbml0aW9uIChtYXkgcGlkX3QKKyAgICBiZSBsb25nZXIgdGhhdCBpbnQ/KS4gSXQgc2VlbXMgYWxsIHBpZCBwcmludHMgc2hvdWxkIGJlIHJld3JpdHRlbiBhcworCisgICAgICAgIHByaW50ZiggIiUiIEtNUF9VSU5UNjRfU1BFQywgKGttcF91aW50NjQpIHBpZCApOworCisgICAgb3IgKGF0IGxlYXN0KSBhcworCisgICAgICAgIHByaW50ZiggIiUiIEtNUF9VSU5UMzJfU1BFQywgKGttcF91aW50MzIpIHBpZCApOworCisgICAgKGttcF91aW50MzIsIGttcF91aW50NjQsIEtNUF9VSU5UNjRfU1BFQywgYW5kIEtNUF9VTklUMzJfU1BFQyBhcmUgZGVmaW5lZCBpbiAia21wX29zLmgiLikKKworKi8KKworI2VuZGlmIC8vIEtNUF9XUkFQUEVSX0dFVFBJRF9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9tYWxsb2MuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1M2QxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9tYWxsb2MuaApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIGttcF93cmFwcGVyX21hbGxvYy5oIC0tIFdyYXBwZXJzIGZvciBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcworICogICAgICAgICAgICAgICAgICAgICAgICAgKG1hbGxvYygpLCBmcmVlKCksIGFuZCBvdGhlcnMpLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9XUkFQUEVSX01BTExPQ19ICisjZGVmaW5lIEtNUF9XUkFQUEVSX01BTExPQ19ICisKKy8qCisgICAgVGhpcyBoZWFkZXIgc2VydmVzIGZvciAzIHB1cnBvc2VzOgorCisgICAgICAgIDEuIERlY2xhcmluZyBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiByb3VyaW5lcyBpbiBPUy1pbmRlcGVuZGVudCB3YXkuCisgICAgICAgIDIuIFBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycy4KKyAgICAgICAgMy4gRW5hYmxpbmcgbmF0aXZlIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLgorCisKKyAgICAxLiBEZWNsYXJpbmcgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gcm91cmluZXMgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBPbiBMaW51eCogT1MsIGFsbG9jYSgpIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIDxhbGxvY2EuaD4gaGVhZGVyLCB3aGlsZSBvbiBXaW5kb3dzKiBPUyB0aGVyZSBpcyBubworICAgIDxhbGxvY2EuaD4gaGVhZGVyLCBmdW5jdGlvbiBfYWxsb2NhKCkgKG5vdGUgdW5kZXJzY29yZSEpIGlzIGRlY2xhcmVkIGluIDxtYWxsb2MuaD4uIFRoaXMgaGVhZGVyCisgICAgZWxpbWluYXRlcyB0aGVzZSBkaWZmZXJlbmNlcywgc28gY2xpZW50IGNvZGUgaW5jbHVpZGluZyAia21wX3dyYXBwZXJfbWFsbG9jLmgiIGNhbiByZWx5IG9uCisgICAgZm9sbG93aW5nIHJvdXRpbmVzOgorCisgICAgICAgIG1hbGxvYworICAgICAgICBjYWxsb2MKKyAgICAgICAgcmVhbGxvYworICAgICAgICBmcmVlCisgICAgICAgIGFsbG9jYQorCisgICAgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LiBJdCBhbHNvIGVuYWJsZXMgbWVtb3J5IHRyYWNraW5nIGNhcGFiaWxpdGllcyBpbiBkZWJ1ZyBidWlsZC4gKEN1cnJlbnRseQorICAgIGl0IGlzIGF2YWlsYWJsZSBvbmx5IG9uIFdpbmRvd3MqIE9TLikKKworCisgICAgMi4gUGFzc2luZyBzb3VyY2UgbG9jYXRpb24gaW5mbyB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXJzLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFNvbWUgdG9vbHMgbWF5IGhlbHAgZGVidWdnaW5nIG1lbW9yeSBlcnJvcnMsIGZvciBleGFtcGxlLCByZXBvcnQgbWVtb3J5IGxlYWtzLiBIb3dldmVyLCBtZW1vcnkKKyAgICBhbGxvY2F0aW9uIHdyYXBwZXJzIG1heSBoaW5kZXIgc291cmNlIGxvY2F0aW9uLgorCisgICAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgdm9pZCAqIGFsaWduZWRfbWFsbG9jKCBpbnQgc2l6ZSApIHsKKyAgICAgICAgICAgIHZvaWQgKiBwdHIgPSBtYWxsb2MoIHNpemUgKTsgLy8gQWxsIHRoZSBtZW1vcnkgbGVha3Mgd2lsbCBiZSByZXBvcnRlZCBhdCB0aGlzIGxpbmUuCisgICAgICAgICAgICAvLyBzb21lIGFkanVzdG1lbnRzLi4uCisgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9OworCisgICAgICAgIHB0ciA9IGFsaWduZWRfbWFsbG9jKCBzaXplICk7ICAgIC8vIE1lbW9yeSBsZWFrIHdpbGwgKm5vdCogYmUgZGV0ZWN0ZWQgaGVyZS4gOi0oCisKKyAgICBUbyBvdmVyY29tZSB0aGUgcHJvYmxlbSwgaW5mb3JtYXRpb24gYWJvdXQgb3JpZ2luYWwgc291cmNlIGxvY2F0aW9uIHNob3VsZCBiZSBwYXNzZWQgdGhyb3VnaCBhbGwKKyAgICB0aGUgbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlcnMsIGZvciBleGFtcGxlOgorCisgICAgICAgIHZvaWQgKiBhbGlnbmVkX21hbGxvYyggaW50IHNpemUsIGNoYXIgY29uc3QgKiBmaWxlLCBpbnQgbGluZSApIHsKKyAgICAgICAgICAgIHZvaWQgKiBwdHIgPSBfbWFsbG9jX2RiZyggc2l6ZSwgZmlsZSwgbGluZSApOworICAgICAgICAgICAgLy8gc29tZSBhZGp1c3RtZW50cy4uLgorICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkICogcHRyID0gYWxpZ25lZF9tYWxsb2MoIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXyApOworCisgICAgVGhpcyBpcyBhIGdvb2QgaWRlYSBmb3IgZGVidWcsIGJ1dCBwYXNzaW5nIGFkZGl0aW9uYWwgYXJndW1lbnRzIGltcGFjdHMgcGVyZm9ybWFuY2UuIERpc2FibGluZworICAgIGV4dHJhIGFyZ3VtZW50cyBpbiByZWxlYXNlIHZlcnNpb24gb2YgdGhlIHNvZnR3YXJlIGludHJvZHVjZXMgdG9vIG1hbnkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24sCisgICAgd2hpY2ggbWFrZXMgY29kZSB1bnJlYWRhYmxlLiBUaGlzIGhlYWRlciBkZWZpbmVzIGZldyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBmYWNpbGl0YXRpbmcgaXQ6CisKKyAgICAgICAgdm9pZCAqIF9hbGlnbmVkX21hbGxvYyggaW50IHNpemUgS01QX1NSQ19MT0NfREVDTCApIHsKKyAgICAgICAgICAgIHZvaWQgKiBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgICAgICAgICAvLyBzb21lIGFkanVzdG1lbnRzLi4uCisgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9OworICAgICAgICAjZGVmaW5lIGFsaWduZWRfbWFsbG9jKCBzaXplICkgX2FsaWduZWRfbWFsbG9jKCAoc2l6ZSkgS01QX1NSQ19MT0NfQ1VSUiApCisgICAgICAgICAgICAvLyBVc2UgbWFjcm8gaW5zdGVhZCBvZiBkaXJlY3QgY2FsbCB0byBmdW5jdGlvbi4KKworICAgICAgICB2b2lkICogcHRyID0gYWxpZ25lZF9tYWxsb2MoIHNpemUgKTsgIC8vIEJpbmdvISBNZW1vcnkgbGVhayB3aWxsIGJlIHJlcG9ydGVkIGF0IHRoaXMgbGluZS4KKworCisgICAgMy4gRW5hYmxpbmcgbmF0aXZlIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFNvbWUgcGxhdGZvcm1zIG1heSBvZmZlciBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4gRm9yIGV4YW1wbGUsIGRlYnVnIHZlcnNpb24gb2YgTWljcm9zb2Z0CisgICAgUlRMIHRyYWNrcyBhbGwgbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBjYW4gcmVwb3J0IG1lbW9yeSBsZWFrcy4gVGhpcyBoZWFkZXIgZW5hYmxlcyB0aGlzLCBhbmQKKyAgICBtYWtlcyByZXBvcnQgbW9yZSB1c2VmdWwgKHNlZSAiUGFzc2luZyBzb3VyY2UgbG9jYXRpb24gaW5mbyB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uCisgICAgd3JhcHBlcnMiKS4KKworKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAia21wX29zLmgiCisKKy8vIEluY2x1ZGUgYWxsb2NhKCkgZGVjbGFyYXRpb24uCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAjaW5jbHVkZSA8bWFsbG9jLmg+ICAgICAgICAvLyBXaW5kb3dzKiBPUzogX2FsbG9jYSgpIGRlY2xhcmVkIGluICJtYWxsb2MuaCIuCisgICAgI2RlZmluZSBhbGxvY2EgX2FsbG9jYSAgICAgLy8gQWxsb3cgdG8gdXNlIGFsbG9jYSgpIHdpdGggbm8gdW5kZXJzY29yZS4KKyNlbGlmIEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICAvLyBEZWNsYXJlZCBpbiAic3RkbGliLmgiLgorI2VsaWYgS01QX09TX1VOSVgKKyAgICAjaW5jbHVkZSA8YWxsb2NhLmg+ICAgICAgICAvLyBMaW51eCogT1MgYW5kIE9TIFgqOiBhbGxvYygpIGRlY2xhcmVkIGluICJhbGxvY2EiLgorI2Vsc2UKKyAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyNlbmRpZgorCisvKgorICAgIEtNUF9TUkNfTE9DX0RFQ0wgLS0gRGVjbGFyaW5nIHNvdXJjZSBsb2NhdGlvbiBwYXJhbWVtdGVycywgdG8gYmUgdXNlZCBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgICBLTVBfU1JDX0xPQ19QQVJNIC0tIFNvdXJjZSBsb2NhdGlvbiBwYXJhbWVtdGVycywgdG8gYmUgdXNlZCB0byBwYXNzIHBhcmFtZXRlcnMgdG8gdW5kZXJseWluZworICAgICAgICBsZXZlbHMuCisgICAgS01QX1NSQ19MT0NfQ1VSUiAtLSBTb3VyY2UgbG9jYXRpb24gYXJndW1lbnRzIGRlc2NyaWJpbmcgY3VycmVudCBsb2NhdGlvbiwgdG8gYmUgdXNlZCBhdAorICAgICAgICB0b3AtbGV2ZWwuCisKKyAgICBUeXBpY2FsIHVzYWdlOgorCisgICAgICAgIHZvaWQgKiBfYWxpZ25lZF9tYWxsb2MoIGludCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKSB7CisgICAgICAgICAgICAvLyBOb3RlOiBDb21tYSBpcyBtaXNzZWQgYmVmb3JlIEtNUF9TUkNfTE9DX0RFQ0wuCisgICAgICAgICAgICBLRV9UUkFDRSggMjUsICggImNhbGxlZCBmcm9tICVzOiVkXG4iLCBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICAgICAgICAgIC4uLgorICAgICAgICB9CisgICAgICAgICNkZWZpbmUgYWxpZ25lZF9tYWxsb2MoIHNpemUgKSBfYWxpZ25lZF9tYWxsb2MoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyAgICAgICAgICAgIC8vIFVzZSBtYWNybyBpbnN0ZWFkIG9mIGRpcmVjdCBjYWxsIHRvIGZ1bmN0aW9uIC0tIG1hY3JvIHBhc3NlcyBpbmZvIGFib3V0IGN1cnJlbnQKKyAgICAgICAgICAgIC8vIHNvdXJjZSBsb2NhdGlvbiB0byB0aGUgZnVuYy4KKyovCisjaWYgS01QX0RFQlVHCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19ERUNMICAgICwgY2hhciBjb25zdCAqIF9maWxlXywgaW50IF9saW5lXworICAgICNkZWZpbmUgS01QX1NSQ19MT0NfUEFSTSAgICAsIF9maWxlXywgX2xpbmVfCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19DVVJSICAgICwgX19GSUxFX18sIF9fTElORV9fCisjZWxzZQorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfREVDTAorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfUEFSTQorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfQ1VSUgorI2VuZGlmIC8vIEtNUF9ERUJVRworCisvKgorICAgIG1hbGxvY19zcmNfbG9jKCkgYW5kIGZyZWVfc3JjX2xvYygpIGFyZSBwc2V1ZG8tZnVuY3Rpb25zIChyZWFsbHkgbWFjcm9zKSB3aXRoIGFjY2VwdHMgZXh0cmEKKyAgICBhcmd1bWVudHMgKHNvdXJjZSBsb2NhdGlvbiBpbmZvKSBpbiBkZWJ1ZyBtb2RlLiBUaGV5IHNob3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIG1hbGxvYygpIGFuZAorICAgIGZyZWUoKSwgdGhpcyBhbGxvd3MgZW5hYmxpbmcgbmF0aXZlIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzIChpZiBhbnkpLgorCisgICAgVHlwaWNhbCB1c2FnZToKKworICAgICAgICBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgICAgICAgICAvLyBJbnNpZGUgbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlciwgb3IKKyAgICAgICAgcHRyID0gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfQ1VSUiApOworICAgICAgICAgICAgLy8gT3V0c2lkZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLgorCisKKyovCisjZGVmaW5lIG1hbGxvY19zcmNfbG9jKCBhcmdzICkgICAgX21hbGxvY19zcmNfbG9jKCBhcmdzICkKKyNkZWZpbmUgZnJlZV9zcmNfbG9jKCAgIGFyZ3MgKSAgICBfZnJlZV9zcmNfbG9jKCAgIGFyZ3MgKQorICAgIC8qCisgICAgICAgIERlcGVuZGluZyBvbiBidWlsZCBtb2RlIChkZWJ1ZyBvciByZWxlYXNlKSwgbWFsbG9jX3NyY19sb2MgaXMgZGVjbGFyZWQgd2l0aCAxIG9yIDMKKyAgICAgICAgcGFyYW1ldGVycywgYnV0IGNhbGxzIHRvIG1hbGxvY19zcmNfbG9jKCkgYXJlIGFsd2F5cyB0aGUgc2FtZToKKworICAgICAgICAgICAgLi4uIG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsgLy8gb3IgS01QX1NSQ19MT0NfQ1VSUgorCisgICAgICAgIENvbXBpbGVyIGlzc3VlcyB3YXJuaW5nL2Vycm9yICJ0b28gZmV3IGFyZ3VtZW50cyBpbiBtYWNybyBpbnZvY2F0aW9uIi4gRGVjbGFyaW5nIHR3bworICAgICAgICBtYWNyb3NlcywgbWFsbG9jX3NyY19sb2MoKSBhbmQgX21hbGxvY19zcmNfbG9jKCkgb3ZlcmNvbWVzIHRoZSBwcm9ibGVtLgorICAgICovCisKKyNpZiBLTVBfREVCVUcKKworICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBfREVCVUcKKyAgICAgICAgLy8gS01QX0RFQlVHICE9IF9ERUJVRy4gTVMgZGVidWcgUlRMIGlzIGF2YWlsYWJsZSBvbmx5IGlmIF9ERUJVRyBpcyBkZWZpbmVkLgorCisgICAgICAgIC8vIFdpbmRvd3MqIE9TIGhhcyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuIEVuYWJsZSB0aGVtLgorCisgICAgICAgICNpbmNsdWRlIDxjcnRkYmcuaD4KKworICAgICAgICAjZGVmaW5lIEtNUF9NRU1fQkxPQ0sgICAgICAgICAgIF9DTElFTlRfQkxPQ0sKKyAgICAgICAgI2RlZmluZSBtYWxsb2MoIHNpemUgKSAgICAgICAgICBfbWFsbG9jX2RiZyggKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIGNhbGxvYyggbnVtLCBzaXplICkgICAgIF9jYWxsb2NfZGJnKCAobnVtKSwgKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIHJlYWxsb2MoIHB0ciwgc2l6ZSApICAgIF9yZWFsbG9jX2RiZyggKHB0ciksIChzaXplKSwgS01QX01FTV9CTE9DSywgX19GSUxFX18sIF9fTElORV9fICkKKyAgICAgICAgI2RlZmluZSBmcmVlKCBwdHIgKSAgICAgICAgICAgICBfZnJlZV9kYmcoIChwdHIpLCBLTVBfTUVNX0JMT0NLICkKKworICAgICAgICAjZGVmaW5lIF9tYWxsb2Nfc3JjX2xvYyggc2l6ZSwgZmlsZSwgbGluZSApICBfbWFsbG9jX2RiZyggKHNpemUpLCBLTVBfTUVNX0JMT0NLLCAoZmlsZSksIChsaW5lKSApCisgICAgICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggICAgcHRyLCBmaWxlLCBsaW5lICkgIF9mcmVlX2RiZyggICAocHRyKSwgIEtNUF9NRU1fQkxPQ0sgICAgICAgICAgICAgICAgICkKKworICAgICNlbHNlCisKKyAgICAgICAgLy8gTGludXgqIE9TLCBPUyBYKiwgb3Igbm9uLWRlYnVnIFdpbmRvd3MqIE9TLgorCisgICAgICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplLCBmaWxlLCBsaW5lICkgICAgbWFsbG9jKCAoc2l6ZSkgKQorICAgICAgICAjZGVmaW5lIF9mcmVlX3NyY19sb2MoIHB0ciwgZmlsZSwgbGluZSApICAgICAgIGZyZWUoIChwdHIpICkKKworICAgICNlbmRpZgorCisjZWxzZQorCisgICAgLy8gSW4gcmVsZWFzZSBidWlsZCBtYWxsb2Nfc3JjX2xvYygpIGFuZCBmcmVlX3NyY19sb2MoKSBkbyBub3QgaGF2ZSBleHRyYSBwYXJhbWV0ZXJzLgorICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplICkgICAgbWFsbG9jKCAoc2l6ZSkgKQorICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggcHRyICkgICAgICAgZnJlZSggKHB0cikgKQorCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyNlbmRpZiAvLyBLTVBfV1JBUFBFUl9NQUxMT0NfSAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvbGlib21wLnJjLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2xpYm9tcC5yYy52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2YTljOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2xpYm9tcC5yYy52YXIKQEAgLTAsMCArMSw3MCBAQAorLy8gbGlib21wLnJjLnZhcgorCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisjaW5jbHVkZSAid2lucmVzLmgiCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMKKyNwcmFnbWEgY29kZV9wYWdlKDEyNTIpCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworICAgIC8vIFBhcnRzIG9mIEZJTEVWRVJTSU9OIGFuZCBQUk9EVUNUVkVSU0lPTiBhcmUgMTYtYml0IGZpZWxkcywgZW50aXJlIGJ1aWxkIGRhdGUgeXl5eW1tZGQKKyAgICAvLyBkb2VzIG5vdCBmaXQgaW50byBvbmUgdmVyc2lvbiBwYXJ0LCBzbyB3ZSBuZWVkIHRvIHNwbGl0IGl0IGludG8geXl5eSBhbmQgbW1kZDoKKyAgICBGSUxFVkVSU0lPTiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JALEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAsQExJQk9NUF9WRVJTSU9OX0JVSUxEX1lFQVJALEBMSUJPTVBfVkVSU0lPTl9CVUlMRF9NT05USF9EQVlACisgICAgUFJPRFVDVFZFUlNJT04gQExJQk9NUF9WRVJTSU9OX01BSk9SQCxATElCT01QX1ZFUlNJT05fTUlOT1JALEBMSUJPTVBfVkVSU0lPTl9CVUlMRF9ZRUFSQCxATElCT01QX1ZFUlNJT05fQlVJTERfTU9OVEhfREFZQAorICAgIEZJTEVGTEFHU01BU0sgIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCisgICAgRklMRUZMQUdTICAgICAgMAorI2lmIEtNUF9ERUJVRworICAgICAgICB8IFZTX0ZGX0RFQlVHCisjZW5kaWYKKyNpZiBATElCT01QX1ZFUlNJT05fQlVJTERAID09IDAKKyAgICAgICAgfCBWU19GRl9QUklWQVRFQlVJTEQgfCBWU19GRl9QUkVSRUxFQVNFCisjZW5kaWYKKyAgICBGSUxFT1MgICAgICAgICAgVk9TX05UX1dJTkRPV1MzMiAgICAvLyBXaW5kb3dzKiBTZXJ2ZXIqIDIwMDMsIFhQKiwgMjAwMCwgb3IgTlQqCisgICAgRklMRVRZUEUgICAgICAgIFZGVF9ETEwKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBCTE9DSyAiMDQwOTA0YjAiICAgICAgICAgICAgLy8gVS5TLiBFbmdsaXNoLCBVbmljb2RlICgweDA0YjAgPT0gMTIwMCkKKyAgICAgICAgICAgIEJFR0lOCisKKyAgICAgICAgICAgICAgICAvLyBGaWxlRGVzY3JpcHRpb24gYW5kIExlZ2FsQ29weXJpZ2h0IHNob3VsZCBiZSBzaG9ydC4KKyAgICAgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeVwwIgorICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIHJlbGF0aXZlbHkgbG9uZy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJMTFZNXDAiCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsICAiXDAiICAvLyBOb3QgdXNlZCBmb3Igbm93LgorICAgICAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICAgICAgIkxMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5XDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICAiQExJQk9NUF9WRVJTSU9OX01BSk9SQC5ATElCT01QX1ZFUlNJT05fTUlOT1JAXDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICAiQExJQk9NUF9WRVJTSU9OX0JVSUxEQFwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAgICAgIkBMSUJPTVBfTElCX0ZJTEVAXDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiQExJQk9NUF9MSUJfRklMRUBcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAiTExWTSogT3Blbk1QKiBATElCT01QX0xFR0FMX1RZUEVAIExpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBATElCT01QX1ZFUlNJT05fTUFKT1JALkBMSUJPTVBfVkVSU0lPTl9NSU5PUkAuQExJQk9NUF9WRVJTSU9OX0JVSUxEQCAiCisgICAgICAgICAgICAgICAgICAgICJmb3IgQExJQk9NUF9MRUdBTF9BUkNIQCBhcmNoaXRlY3R1cmUgYnVpbHQgb24gQExJQk9NUF9CVUlMRF9EQVRFQC5cMCIKKyNpZiBATElCT01QX1ZFUlNJT05fQlVJTERAID09IDAKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhIGRldmVsb3BtZW50IGJ1aWxkLlwwIgorI2VuZGlmCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIlNwZWNpYWxCdWlsZCIsICAgICAiXDAiICAgIC8vIE5vdCB1c2VkIGZvciBub3cuCisKKyAgICAgICAgICAgIEVORAorICAgICAgICBFTkQKKyAgICAgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMTAzMywgMTIwMAorICAgICAgICAgICAgLy8gMTAzMyAtLSBVLlMuIEVuZ2xpc2gsIDEyMDAgLS0gVW5pY29kZQorICAgICAgICBFTkQKKyAgICBFTkQKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtZXZlbnQtc3BlY2lmaWMuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtZXZlbnQtc3BlY2lmaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGMxNTEyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oCkBAIC0wLDAgKzEsMTQ0IEBACisjaWZuZGVmICBfX09NUFRfRVZFTlRfU1BFQ0lGSUNfSF9fCisjZGVmaW5lICBfX09NUFRfRVZFTlRfU1BFQ0lGSUNfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpbGU6IG9tcHQtZXZlbnQtc3BlY2lmaWMuaAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqICAgc3BlY2lmeSB3aGljaCBvZiB0aGUgT01QVCBldmVudHMgYXJlIGltcGxlbWVudGVkIGJ5IHRoaXMgcnVudGltZSBzeXN0ZW0KKyAqICAgYW5kIHRoZSBsZXZlbCBvZiB0aGVpciBpbXBsZW1lbnRhdGlvbiBieSBhIHJ1bnRpbWUgc3lzdGVtLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9vbXB0X3Rva2VucGFzdGVfaGVscGVyKHgseSkgICAgICAgIHggIyMgeQorI2RlZmluZSBfb21wdF90b2tlbnBhc3RlKHgseSkgICAgICAgICAgICAgICBfb21wdF90b2tlbnBhc3RlX2hlbHBlcih4LHkpCisjZGVmaW5lIG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGUpIF9vbXB0X3Rva2VucGFzdGUoZSxfaW1wbGVtZW50ZWQpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBTcGVjaWZ5IHdoZXRoZXIgYW4gZXZlbnQgbWF5IG9jY3VyIG9yIG5vdCwgYW5kIHdoZXRoZXIgZXZlbnQgY2FsbGJhY2tzCisgfCBuZXZlciwgc29tZXRpbWVzLCBvciBhbHdheXMgb2NjdXIuCisgfAorIHwgVGhlIHZhbHVlcyBmb3IgdGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4xLjIgb2YKKyB8IHRoZSBPTVBUIFRSLiBUaGV5IGFyZSBleHBvc2VkIHRvIHRvb2xzIHRocm91Z2ggb21wdF9zZXRfY2FsbGJhY2suCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X05FVkVSICAgICAgICAgICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMKKyNkZWZpbmUgb21wdF9ldmVudF9VTklNUExFTUVOVEVEICAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX25vX2NhbGxiYWNrCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0NPTlZFTklFTlQgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19zb21lCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZUyAgICAgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMKKworI2lmIE9NUFRfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZWxzZQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNlbmRpZgorCisjaWYgT01QVF9CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNlbHNlCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRSAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgTWFuZGF0b3J5IEV2ZW50cworICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZGVmaW5lIG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKworI2RlZmluZSBvbXB0X2V2ZW50X3RocmVhZF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNkZWZpbmUgb21wdF9ldmVudF90aHJlYWRfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF9jb250cm9sX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBPcHRpb25hbCBFdmVudHMgKGJsYW1lIHNoaWZ0aW5nKQorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9pZGxlX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfaWRsZV9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmRfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKworI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW5faW1wbGVtZW50ZWQgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2VuZF9pbXBsZW1lbnRlZCAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX2xhc3RfaW1wbGVtZW50ZWQgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzKQorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luX2ltcGxlbWVudGVkICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmRfaW1wbGVtZW50ZWQgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2JlZ2luX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X2luaXRpYWxfdGFza19lbmRfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoX2ltcGxlbWVudGVkICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2xvb3BfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9sb29wX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9zZWN0aW9uc19iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfc2VjdGlvbnNfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luX2ltcGxlbWVudGVkICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmRfaW1wbGVtZW50ZWQgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luX2ltcGxlbWVudGVkICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19lbmRfaW1wbGVtZW50ZWQgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfd29ya3NoYXJlX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dvcmtzaGFyZV9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2RlZmluZSBvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9tYXN0ZXJfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYmFycmllcl9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF90YXNrZ3JvdXBfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2X2ltcGxlbWVudGVkICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2tfaW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfZmlyc3RfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHRfaW1wbGVtZW50ZWQgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9ja19pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9ja19pbXBsZW1lbnRlZCAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9mbHVzaF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvb21wdC1nZW5lcmFsLmMgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWdlbmVyYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFhZTgxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1nZW5lcmFsLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzdGVtIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvbXB0IGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5jIgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIG9tcHRfZ2V0X2NhbGxiYWNrX3N1Y2Nlc3MgMQorI2RlZmluZSBvbXB0X2dldF9jYWxsYmFja19mYWlsdXJlIDAKKworI2RlZmluZSBub190b29sX3ByZXNlbnQgMAorCisjZGVmaW5lIE9NUFRfQVBJX1JPVVRJTkUgc3RhdGljCisKKyNpZm5kZWYgT01QVF9TVFJfTUFUQ0gKKyNkZWZpbmUgT01QVF9TVFJfTUFUQ0goaGF5c3RhY2ssIG5lZWRsZSkgKCFzdHJjYXNlY21wKGhheXN0YWNrLCBuZWVkbGUpKQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpzdGF0ZV9uYW1lOworICAgIG9tcHRfc3RhdGVfdCAgc3RhdGVfaWQ7Cit9IG9tcHRfc3RhdGVfaW5mb190OworCisKK2VudW0gdG9vbF9zZXR0aW5nX2UgeworICAgIG9tcF90b29sX2Vycm9yLAorICAgIG9tcF90b29sX3Vuc2V0LAorICAgIG9tcF90b29sX2Rpc2FibGVkLAorICAgIG9tcF90b29sX2VuYWJsZWQKK307CisKKwordHlwZWRlZiB2b2lkICgqb21wdF9pbml0aWFsaXplX3QpICgKKyAgICBvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IG9tcHRfZm5fbG9va3VwLCAKKyAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKyk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdsb2JhbCB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgb21wdF9lbmFibGVkID0gMDsKKworb21wdF9zdGF0ZV9pbmZvX3Qgb21wdF9zdGF0ZV9pbmZvW10gPSB7CisjZGVmaW5lIG9tcHRfc3RhdGVfbWFjcm8oc3RhdGUsIGNvZGUpIHsgIyBzdGF0ZSwgc3RhdGUgfSwKKyAgICBGT1JFQUNIX09NUFRfU1RBVEUob21wdF9zdGF0ZV9tYWNybykKKyN1bmRlZiBvbXB0X3N0YXRlX21hY3JvCit9OworCitvbXB0X2NhbGxiYWNrc190IG9tcHRfY2FsbGJhY2tzOworCitzdGF0aWMgb21wdF9pbml0aWFsaXplX3QgIG9tcHRfaW5pdGlhbGl6ZV9mbiA9IE5VTEw7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIG9tcHRfaW50ZXJmYWNlX2ZuX3Qgb21wdF9mbl9sb29rdXAoY29uc3QgY2hhciAqcyk7CisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF90aHJlYWRfaWRfdCBvbXB0X2dldF90aHJlYWRfaWQodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbml0aWFsaXphdGlvbiBhbmQgZmluYWxpemF0aW9uIChwcml2YXRlIG9wZXJhdGlvbnMpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT24gVW5peC1saWtlIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHdlYWsgc3ltYm9scyB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uCisgKiBvZiBvbXB0X3Rvb2woKSB3aWxsIGJlIHVzZWQgaW4gY2FzZSBubyB0b29sLXN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mCisgKiB0aGlzIGZ1bmN0aW9uIGlzIHByZXNlbnQgaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgYSBwcm9jZXNzLgorICoKKyAqIE9uIFdpbmRvd3MsIHRoZSBvbXB0X3Rvb2xfd2luZG93cyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZpbmQgdGhlCisgKiBvbXB0X3Rvb2wgc3ltYm9sIGFjcm9zcyBhbGwgbW9kdWxlcyBsb2FkZWQgYnkgYSBwcm9jZXNzLiBJZiBvbXB0X3Rvb2wgaXMKKyAqIGZvdW5kLCBvbXB0X3Rvb2wncyByZXR1cm4gdmFsdWUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSB0b29sLiBPdGhlcndpc2UsCisgKiBOVUxMIGlzIHJldHVybmVkIGFuZCBPTVBUIHdvbid0IGJlIGVuYWJsZWQgKi8KKyNpZiBPTVBUX0hBVkVfV0VBS19BVFRSSUJVVEUKK19PTVBfRVhURVJOIAorX19hdHRyaWJ1dGVfXyAoKCB3ZWFrICkpCitvbXB0X2luaXRpYWxpemVfdCBvbXB0X3Rvb2woKQoreworI2lmIE9NUFRfREVCVUcKKyAgICBwcmludGYoIm9tcHRfdG9vbCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBSVExcbiIpOworI2VuZGlmCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbGlmIE9NUFRfSEFWRV9QU0FQSQorCisjaW5jbHVkZSA8cHNhcGkuaD4KKyNwcmFnbWEgY29tbWVudChsaWIsICJwc2FwaS5saWIiKQorI2RlZmluZSBvbXB0X3Rvb2wgb21wdF90b29sX3dpbmRvd3MKKworLy8gVGhlIG51bWJlciBvZiBsb2FkZWQgbW9kdWxlcyB0byBzdGFydCBlbnVtZXJhdGlvbiB3aXRoIEVudW1Qcm9jZXNzTW9kdWxlcygpCisjZGVmaW5lIE5VTV9NT0RVTEVTIDEyOAorCitzdGF0aWMKK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbF93aW5kb3dzKCkKK3sKKyAgICBpbnQgaTsKKyAgICBEV09SRCBuZWVkZWQsIG5ld19zaXplOworICAgIEhNT0RVTEUgKm1vZHVsZXM7CisgICAgSEFORExFICBwcm9jZXNzID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKKyAgICBtb2R1bGVzID0gKEhNT0RVTEUqKW1hbGxvYyggTlVNX01PRFVMRVMgKiBzaXplb2YoSE1PRFVMRSkgKTsKKyAgICBvbXB0X2luaXRpYWxpemVfdCAoKm9tcHRfdG9vbF9wKSgpID0gTlVMTDsKKworI2lmIE9NUFRfREVCVUcKKyAgICBwcmludGYoIm9tcHRfdG9vbF93aW5kb3dzKCk6IGxvb2tpbmcgZm9yIG9tcHRfdG9vbFxuIik7CisjZW5kaWYKKyAgICBpZiAoIUVudW1Qcm9jZXNzTW9kdWxlcyggcHJvY2VzcywgbW9kdWxlcywgTlVNX01PRFVMRVMgKiBzaXplb2YoSE1PRFVMRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVlZGVkKSkgeworICAgICAgICAvLyBSZWdhcmRsZXNzIG9mIHRoZSBlcnJvciByZWFzb24gdXNlIHRoZSBzdHViIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgICAgICAgIGZyZWUobW9kdWxlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvLyBDaGVjayBpZiBOVU1fTU9EVUxFUyBpcyBlbm91Z2ggdG8gbGlzdCBhbGwgbW9kdWxlcworICAgIG5ld19zaXplID0gbmVlZGVkIC8gc2l6ZW9mKEhNT0RVTEUpOworICAgIGlmIChuZXdfc2l6ZSA+IE5VTV9NT0RVTEVTKSB7CisjaWYgT01QVF9ERUJVRworICAgIHByaW50Zigib21wdF90b29sX3dpbmRvd3MoKTogcmVzaXplIGJ1ZmZlciB0byAlZCBieXRlc1xuIiwgbmVlZGVkKTsKKyNlbmRpZgorICAgICAgICBtb2R1bGVzID0gKEhNT0RVTEUqKXJlYWxsb2MoIG1vZHVsZXMsIG5lZWRlZCApOworICAgICAgICAvLyBJZiByZXNpemluZyBmYWlsZWQgdXNlIHRoZSBzdHViIGZ1bmN0aW9uLgorICAgICAgICBpZiAoIUVudW1Qcm9jZXNzTW9kdWxlcyhwcm9jZXNzLCBtb2R1bGVzLCBuZWVkZWQsICZuZWVkZWQpKSB7CisgICAgICAgICAgICBmcmVlKG1vZHVsZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5ld19zaXplOyArK2kpIHsKKyAgICAgICAgKEZBUlBST0MgJilvbXB0X3Rvb2xfcCA9IEdldFByb2NBZGRyZXNzKG1vZHVsZXNbaV0sICJvbXB0X3Rvb2wiKTsKKyAgICAgICAgaWYgKG9tcHRfdG9vbF9wKSB7CisjaWYgT01QVF9ERUJVRworICAgICAgICAgICAgVENIQVIgbW9kTmFtZVtNQVhfUEFUSF07CisgICAgICAgICAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUobW9kdWxlc1tpXSwgbW9kTmFtZSwgTUFYX1BBVEgpKQorICAgICAgICAgICAgICAgIHByaW50Zigib21wdF90b29sX3dpbmRvd3MoKTogb21wdF90b29sIGZvdW5kIGluIG1vZHVsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kTmFtZSk7CisjZW5kaWYKKyAgICAgICAgICAgIGZyZWUobW9kdWxlcyk7CisgICAgICAgICAgICByZXR1cm4gb21wdF90b29sX3AoKTsKKyAgICAgICAgfQorI2lmIE9NUFRfREVCVUcKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBUQ0hBUiBtb2ROYW1lW01BWF9QQVRIXTsKKyAgICAgICAgICAgIGlmIChHZXRNb2R1bGVGaWxlTmFtZShtb2R1bGVzW2ldLCBtb2ROYW1lLCBNQVhfUEFUSCkpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJvbXB0X3Rvb2xfd2luZG93cygpOiBvbXB0X3Rvb2wgbm90IGZvdW5kIGluIG1vZHVsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kTmFtZSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBmcmVlKG1vZHVsZXMpOworICAgIHJldHVybiBOVUxMOworfQorI2Vsc2UKKyMgZXJyb3IgRWl0aGVyIF9fYXR0cmlidXRlX18oKHdlYWspKSBvciBwc2FwaS5kbGwgYXJlIHJlcXVpcmVkIGZvciBPTVBUIHN1cHBvcnQKKyNlbmRpZiAvLyBPTVBUX0hBVkVfV0VBS19BVFRSSUJVVEUKKwordm9pZCBvbXB0X3ByZV9pbml0KCkKK3sKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRXhlY3V0ZSB0aGUgcHJlLWluaXRpYWxpemF0aW9uIGxvZ2ljIG9ubHkgb25jZS4KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc3RhdGljIGludCBvbXB0X3ByZV9pbml0aWFsaXplZCA9IDA7CisKKyAgICBpZiAob21wdF9wcmVfaW5pdGlhbGl6ZWQpIHJldHVybjsKKworICAgIG9tcHRfcHJlX2luaXRpYWxpemVkID0gMTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBVc2UgYSB0b29sIGlmZiBhIHRvb2wgaXMgZW5hYmxlZCBhbmQgYXZhaWxhYmxlLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBjb25zdCBjaGFyICpvbXB0X2Vudl92YXIgPSBnZXRlbnYoIk9NUF9UT09MIik7CisgICAgdG9vbF9zZXR0aW5nX2UgdG9vbF9zZXR0aW5nID0gb21wX3Rvb2xfZXJyb3I7CisKKyAgICBpZiAoIW9tcHRfZW52X3ZhciAgfHwgIXN0cmNtcChvbXB0X2Vudl92YXIsICIiKSkKKyAgICAgICAgdG9vbF9zZXR0aW5nID0gb21wX3Rvb2xfdW5zZXQ7CisgICAgZWxzZSBpZiAoT01QVF9TVFJfTUFUQ0gob21wdF9lbnZfdmFyLCAiZGlzYWJsZWQiKSkKKyAgICAgICAgdG9vbF9zZXR0aW5nID0gb21wX3Rvb2xfZGlzYWJsZWQ7CisgICAgZWxzZSBpZiAoT01QVF9TVFJfTUFUQ0gob21wdF9lbnZfdmFyLCAiZW5hYmxlZCIpKQorICAgICAgICB0b29sX3NldHRpbmcgPSBvbXBfdG9vbF9lbmFibGVkOworCisjaWYgT01QVF9ERUJVRworICAgIHByaW50Zigib21wdF9wcmVfaW5pdCgpOiB0b29sX3NldHRpbmcgPSAlZFxuIiwgdG9vbF9zZXR0aW5nKTsKKyNlbmRpZgorICAgIHN3aXRjaCh0b29sX3NldHRpbmcpIHsKKyAgICBjYXNlIG9tcF90b29sX2Rpc2FibGVkOgorICAgICAgICBicmVhazsKKworICAgIGNhc2Ugb21wX3Rvb2xfdW5zZXQ6CisgICAgY2FzZSBvbXBfdG9vbF9lbmFibGVkOgorICAgICAgICBvbXB0X2luaXRpYWxpemVfZm4gPSBvbXB0X3Rvb2woKTsKKyAgICAgICAgaWYgKG9tcHRfaW5pdGlhbGl6ZV9mbikgeworICAgICAgICAgICAgb21wdF9lbmFibGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2Ugb21wX3Rvb2xfZXJyb3I6CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIldhcm5pbmc6IE9NUF9UT09MIGhhcyBpbnZhbGlkIHZhbHVlIFwiJXNcIi5cbiIKKyAgICAgICAgICAgICIgIGxlZ2FsIHZhbHVlcyBhcmUgKE5VTEwsXCJcIixcImRpc2FibGVkXCIsIgorICAgICAgICAgICAgIlwiZW5hYmxlZFwiKS5cbiIsIG9tcHRfZW52X3Zhcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNpZiBPTVBUX0RFQlVHCisgICAgcHJpbnRmKCJvbXB0X3ByZV9pbml0KCk6IG9tcHRfZW5hYmxlZCA9ICVkXG4iLCBvbXB0X2VuYWJsZWQpOworI2VuZGlmCit9CisKKwordm9pZCBvbXB0X3Bvc3RfaW5pdCgpCit7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEV4ZWN1dGUgdGhlIHBvc3QtaW5pdGlhbGl6YXRpb24gbG9naWMgb25seSBvbmNlLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBzdGF0aWMgaW50IG9tcHRfcG9zdF9pbml0aWFsaXplZCA9IDA7CisKKyAgICBpZiAob21wdF9wb3N0X2luaXRpYWxpemVkKSByZXR1cm47CisKKyAgICBvbXB0X3Bvc3RfaW5pdGlhbGl6ZWQgPSAxOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEluaXRpYWxpemUgdGhlIHRvb2wgaWYgc28gaW5kaWNhdGVkLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG9tcHRfaW5pdGlhbGl6ZV9mbihvbXB0X2ZuX2xvb2t1cCwgb21wdF9nZXRfcnVudGltZV92ZXJzaW9uKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QVF9WRVJTSU9OKTsKKworICAgICAgICBvbXB0X3RocmVhZF90ICpyb290X3RocmVhZCA9IG9tcHRfZ2V0X3RocmVhZCgpOworCisgICAgICAgIG9tcHRfc2V0X3RocmVhZF9zdGF0ZShyb290X3RocmVhZCwgb21wdF9zdGF0ZV9vdmVyaGVhZCk7CisKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfYmVnaW4pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luKQorICAgICAgICAgICAgICAgIChvbXB0X3RocmVhZF9pbml0aWFsLCBvbXB0X2dldF90aHJlYWRfaWQoKSk7CisgICAgICAgIH0KKworICAgICAgICBvbXB0X3NldF90aHJlYWRfc3RhdGUocm9vdF90aHJlYWQsIG9tcHRfc3RhdGVfd29ya19zZXJpYWwpOworICAgIH0KK30KKworCit2b2lkIG9tcHRfZmluaSgpCit7CisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd24pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcnVudGltZV9zaHV0ZG93bikoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9tcHRfZW5hYmxlZCA9IDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbnRlcmZhY2Ugb3BlcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X2VudW1lcmF0ZV9zdGF0ZShpbnQgY3VycmVudF9zdGF0ZSwgaW50ICpuZXh0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZSkKK3sKKyAgICBjb25zdCBzdGF0aWMgaW50IGxlbiA9IHNpemVvZihvbXB0X3N0YXRlX2luZm8pIC8gc2l6ZW9mKG9tcHRfc3RhdGVfaW5mb190KTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChvbXB0X3N0YXRlX2luZm9baV0uc3RhdGVfaWQgPT0gY3VycmVudF9zdGF0ZSkgeworICAgICAgICAgICAgKm5leHRfc3RhdGUgPSBvbXB0X3N0YXRlX2luZm9baSsxXS5zdGF0ZV9pZDsKKyAgICAgICAgICAgICpuZXh0X3N0YXRlX25hbWUgPSBvbXB0X3N0YXRlX2luZm9baSsxXS5zdGF0ZV9uYW1lOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2tzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfUk9VVElORSBpbnQgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF90IGV2aWQsIG9tcHRfY2FsbGJhY2tfdCBjYikKK3sKKyAgICBzd2l0Y2ggKGV2aWQpIHsKKworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50X25hbWUsIGNhbGxiYWNrX3R5cGUsIGV2ZW50X2lkKSAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIGV2ZW50X25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChvbXB0X2V2ZW50X2ltcGxlbWVudGF0aW9uX3N0YXR1cyhldmVudF9uYW1lKSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhldmVudF9uYW1lKSA9IChjYWxsYmFja190eXBlKSBjYjsgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbXB0X2V2ZW50X2ltcGxlbWVudGF0aW9uX3N0YXR1cyhldmVudF9uYW1lKTsKKworICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworCisgICAgZGVmYXVsdDogcmV0dXJuIG9tcHRfc2V0X3Jlc3VsdF9yZWdpc3RyYXRpb25fZXJyb3I7CisgICAgfQorfQorCisKK09NUFRfQVBJX1JPVVRJTkUgaW50IG9tcHRfZ2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdCBldmlkLCBvbXB0X2NhbGxiYWNrX3QgKmNiKQoreworICAgIHN3aXRjaCAoZXZpZCkgeworCisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnRfbmFtZSwgY2FsbGJhY2tfdHlwZSwgZXZlbnRfaWQpICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgZXZlbnRfbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGV2ZW50X25hbWUpKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrX3QgbXljYiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChvbXB0X2NhbGxiYWNrX3QpIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2soZXZlbnRfbmFtZSk7ICAgIFwKKyAgICAgICAgICAgIGlmIChteWNiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKmNiID0gbXljYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiBvbXB0X2dldF9jYWxsYmFja19zdWNjZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb21wdF9nZXRfY2FsbGJhY2tfZmFpbHVyZTsKKworICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworCisgICAgZGVmYXVsdDogcmV0dXJuIG9tcHRfZ2V0X2NhbGxiYWNrX2ZhaWx1cmU7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcGFyYWxsZWwgcmVnaW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfZ2V0X3BhcmFsbGVsX2lkKGludCBhbmNlc3Rvcl9sZXZlbCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF9wYXJhbGxlbF9pZF9pbnRlcm5hbChhbmNlc3Rvcl9sZXZlbCk7Cit9CisKKworT01QVF9BUElfUk9VVElORSBpbnQgb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplKGludCBhbmNlc3Rvcl9sZXZlbCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemVfaW50ZXJuYWwoYW5jZXN0b3JfbGV2ZWwpOworfQorCisKK09NUFRfQVBJX1JPVVRJTkUgdm9pZCAqb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb24oaW50IGFuY2VzdG9yX2xldmVsKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X3BhcmFsbGVsX2Z1bmN0aW9uX2ludGVybmFsKGFuY2VzdG9yX2xldmVsKTsKK30KKworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfc3RhdGVfdCBvbXB0X2dldF9zdGF0ZShvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkKQoreworICAgIG9tcHRfc3RhdGVfdCB0aHJlYWRfc3RhdGUgPSBfX29tcHRfZ2V0X3N0YXRlX2ludGVybmFsKG9tcHRfd2FpdF9pZCk7CisKKyAgICBpZiAodGhyZWFkX3N0YXRlID09IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgIHRocmVhZF9zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19zZXJpYWw7CisgICAgfQorCisgICAgcmV0dXJuIHRocmVhZF9zdGF0ZTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGhyZWFkcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworT01QVF9BUElfUk9VVElORSB2b2lkICpvbXB0X2dldF9pZGxlX2ZyYW1lKCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF9pZGxlX2ZyYW1lX2ludGVybmFsKCk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHRhc2tzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfdGhyZWFkX2lkX3Qgb21wdF9nZXRfdGhyZWFkX2lkKHZvaWQpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfdGhyZWFkX2lkX2ludGVybmFsKCk7Cit9CisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF90YXNrX2lkX3Qgb21wdF9nZXRfdGFza19pZChpbnQgZGVwdGgpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbChkZXB0aCk7Cit9CisKKworT01QVF9BUElfUk9VVElORSBvbXB0X2ZyYW1lX3QgKm9tcHRfZ2V0X3Rhc2tfZnJhbWUoaW50IGRlcHRoKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoZGVwdGgpOworfQorCisKK09NUFRfQVBJX1JPVVRJTkUgdm9pZCAqb21wdF9nZXRfdGFza19mdW5jdGlvbihpbnQgZGVwdGgpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfdGFza19mdW5jdGlvbl9pbnRlcm5hbChkZXB0aCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwbGFjZWhvbGRlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBEb24ndCBkZWZpbmUgdGhpcyBhcyBzdGF0aWMuIFRoZSBsb2FkZXIgbWF5IGNob29zZSB0byBlbGltaW5hdGUgdGhlIHN5bWJvbAorLy8gZXZlbiB0aG91Z2ggaXQgaXMgbmVlZGVkIGJ5IHRvb2xzLiAgCisjZGVmaW5lIE9NUFRfQVBJX1BMQUNFSE9MREVSIAorCisvLyBFbnN1cmUgdGhhdCBwbGFjZWhvbGRlcnMgZG9uJ3QgaGF2ZSBtYW5nbGVkIG5hbWVzIGluIHRoZSBzeW1ib2wgdGFibGUuCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworT01QVF9BUElfUExBQ0VIT0xERVIgdm9pZCBvbXB0X2lkbGUodm9pZCkgIAoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY2FsbGluZyBjb250ZXh0IG9mCisgICAgLy8gaWRsZSBPcGVuTVAgd29ya2VyIHRocmVhZHMuIEl0IGlzIG5vdCBtZWFudCB0byBiZSBpbnZva2VkLgorICAgIGFzc2VydCgwKTsKK30KKworCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfb3ZlcmhlYWQodm9pZCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgcGxhY2Vob2xkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIE9wZW5NUCBjb250ZXh0IG9mCisgICAgLy8gdGhyZWFkcyB3b3JraW5nIGluIHRoZSBPcGVuTVAgcnVudGltZS4gIEl0IGlzIG5vdCBtZWFudCB0byBiZSBpbnZva2VkLgorICAgIGFzc2VydCgwKTsKK30KKworCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfYmFycmllcl93YWl0KHZvaWQpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBPcGVuTVAgY29udGV4dCBvZgorICAgIC8vIHRocmVhZHMgd2FpdGluZyBmb3IgYSBiYXJyaWVyIGluIHRoZSBPcGVuTVAgcnVudGltZS4gSXQgaXMgbm90IG1lYW50CisgICAgLy8gdG8gYmUgaW52b2tlZC4KKyAgICBhc3NlcnQoMCk7Cit9CisKKworT01QVF9BUElfUExBQ0VIT0xERVIgdm9pZCBvbXB0X3Rhc2tfd2FpdCh2b2lkKQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgT3Blbk1QIGNvbnRleHQgb2YKKyAgICAvLyB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgdGFzayBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUuIEl0IGlzIG5vdCBtZWFudAorICAgIC8vIHRvIGJlIGludm9rZWQuCisgICAgYXNzZXJ0KDApOworfQorCisKK09NUFRfQVBJX1BMQUNFSE9MREVSIHZvaWQgb21wdF9tdXRleF93YWl0KHZvaWQpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBPcGVuTVAgY29udGV4dCBvZgorICAgIC8vIHRocmVhZHMgd2FpdGluZyBmb3IgYSBtdXRleCBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUuIEl0IGlzIG5vdCBtZWFudAorICAgIC8vIHRvIGJlIGludm9rZWQuCisgICAgYXNzZXJ0KDApOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbXBhdGFiaWxpdHkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X2dldF9vbXB0X3ZlcnNpb24oKQoreworICAgIHJldHVybiBPTVBUX1ZFUlNJT047Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGFwcGxpY2F0aW9uLWZhY2luZyBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgY29udHJvbAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19PTVBfRVhURVJOIHZvaWQgb21wdF9jb250cm9sKHVpbnQ2NF90IGNvbW1hbmQsIHVpbnQ2NF90IG1vZGlmaWVyKQoreworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2NvbnRyb2wpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9jb250cm9sKShjb21tYW5kLCBtb2RpZmllcik7CisgICAgfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBUEkgaW5xdWlyeSBmb3IgdG9vbAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBvbXB0X2ludGVyZmFjZV9mbl90IG9tcHRfZm5fbG9va3VwKGNvbnN0IGNoYXIgKnMpCit7CisKKyNkZWZpbmUgb21wdF9pbnRlcmZhY2VfZm4oZm4pIFwKKyAgICBpZiAoc3RyY21wKHMsICNmbikgPT0gMCkgcmV0dXJuIChvbXB0X2ludGVyZmFjZV9mbl90KSBmbjsKKworICAgIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG9tcHRfaW50ZXJmYWNlX2ZuKQorCisgICAgRk9SRUFDSF9PTVBUX1BMQUNFSE9MREVSX0ZOKG9tcHRfaW50ZXJmYWNlX2ZuKQorCisgICAgcmV0dXJuIChvbXB0X2ludGVyZmFjZV9mbl90KSAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvb21wdC1pbnRlcm5hbC5oIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZThkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWludGVybmFsLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBfX09NUFRfSU5URVJOQUxfSF9fCisjZGVmaW5lIF9fT01QVF9JTlRFUk5BTF9IX18KKworI2luY2x1ZGUgIm9tcHQuaCIKKyNpbmNsdWRlICJvbXB0LWV2ZW50LXNwZWNpZmljLmgiCisKKyNkZWZpbmUgT01QVF9WRVJTSU9OIDEKKworI2RlZmluZSBfT01QX0VYVEVSTiBleHRlcm4gIkMiCisKKyNkZWZpbmUgT01QVF9JTlZPS0VSKHgpIFwKKyAgKCh4ID09IGZvcmtfY29udGV4dF9nbnUpID8gb21wdF9pbnZva2VyX3Byb2dyYW0gOiBvbXB0X2ludm9rZXJfcnVudGltZSkKKworCisjZGVmaW5lIG9tcHRfY2FsbGJhY2soZSkgZSAjIyBfY2FsbGJhY2sKKworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2NhbGxiYWNrc19zIHsKKyNkZWZpbmUgb21wdF9ldmVudF9tYWNybyhldmVudCwgY2FsbGJhY2ssIGV2ZW50aWQpIGNhbGxiYWNrIG9tcHRfY2FsbGJhY2soZXZlbnQpOworCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCit9IG9tcHRfY2FsbGJhY2tzX3Q7CisKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgb21wdF9mcmFtZV90ICAgICAgICBmcmFtZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgIGZ1bmN0aW9uOworICAgIG9tcHRfdGFza19pZF90ICAgICAgdGFza19pZDsKK30gb21wdF90YXNrX2luZm9fdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgb21wdF9wYXJhbGxlbF9pZF90ICBwYXJhbGxlbF9pZDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICptaWNyb3Rhc2s7Cit9IG9tcHRfdGVhbV9pbmZvX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3Qgb21wdF9sd190YXNrdGVhbV9zIHsKKyAgICBvbXB0X3RlYW1faW5mb190ICAgIG9tcHRfdGVhbV9pbmZvOworICAgIG9tcHRfdGFza19pbmZvX3QgICAgb21wdF90YXNrX2luZm87CisgICAgc3RydWN0IG9tcHRfbHdfdGFza3RlYW1fcyAqcGFyZW50OworfSBvbXB0X2x3X3Rhc2t0ZWFtX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3Qgb21wdF9wYXJhbGxlbF9pbmZvX3MgeworICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkOyAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkOyAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lOyAgLyogZnJhbWUgZGF0YSBvZiBwYXJlbnQgdGFzayAgICAqLworICAgIHZvaWQgKnBhcmFsbGVsX2Z1bmN0aW9uOyAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCit9IG9tcHRfcGFyYWxsZWxfaW5mb190OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBvbXB0X3N0YXRlX3QgICAgICAgIHN0YXRlOworICAgIG9tcHRfd2FpdF9pZF90ICAgICAgd2FpdF9pZDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICppZGxlX2ZyYW1lOworfSBvbXB0X3RocmVhZF9pbmZvX3Q7CisKKworZXh0ZXJuIG9tcHRfY2FsbGJhY2tzX3Qgb21wdF9jYWxsYmFja3M7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBvbXB0X3ByZV9pbml0KHZvaWQpOwordm9pZCBvbXB0X3Bvc3RfaW5pdCh2b2lkKTsKK3ZvaWQgb21wdF9maW5pKHZvaWQpOworCitleHRlcm4gaW50IG9tcHRfZW5hYmxlZDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5jIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjY2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmMKQEAgLTAsMCArMSwzMzIgQEAKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBpbmNsdWRlIGZpbGVzCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAib21wdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIG1hY3JvcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworI2RlZmluZSBHVElEX1RPX09NUFRfVEhSRUFEX0lEKGlkKSAoKG9tcHRfdGhyZWFkX2lkX3QpIChpZCA+PTApID8gaWQgKyAxOiAwKQorCisjZGVmaW5lIExXVF9GUk9NX1RFQU0odGVhbSkgKHRlYW0pLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm87CisKKyNkZWZpbmUgT01QVF9USFJFQURfSURfQklUUyAxNgorCisvLyAyMDEzIDA4IDI0IC0gSm9obiBNZWxsb3ItQ3J1bW1leQorLy8gICBpZGVhbGx5LCBhIHRocmVhZCBzaG91bGQgYXNzaWduIGl0cyBvd24gaWRzIGJhc2VkIG9uIHRocmVhZCBwcml2YXRlIGRhdGEuCisvLyAgIGhvd2V2ZXIsIHRoZSB3YXkgdGhlIGludGVsIHJ1bnRpbWUgcmVpbml0aWFsaXplcyB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzCisvLyAgIHdoZW4gaXQgY3JlYXRlcyB0ZWFtcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gbWFpbnRhaW4gcGVyc2lzdGVudCB0aHJlYWQKKy8vICAgZGF0YS4gdXNpbmcgYSBzaGFyZWQgdmFyaWFibGUgaW5zdGVhZCBpcyBzaW1wbGUuIEkgbGVhdmUgaXQgdG8gaW50ZWwgdG8KKy8vICAgc29ydCBvdXQgaG93IHRvIGltcGxlbWVudCBhIGhpZ2hlciBwZXJmb3JtYW5jZSB2ZXJzaW9uIGluIHRoZWlyIHJ1bnRpbWUuCisKKy8vIHdoZW4gdXNpbmcgZmV0Y2hfYW5kX2FkZCB0byBnZW5lcmF0ZSB0aGUgSURzLCB0aGVyZSBpc24ndCBhbnkgcmVhc29uIHRvIHdhc3RlCisvLyBiaXRzIGZvciB0aHJlYWQgaWQuCisjaWYgMAorI2RlZmluZSBORVhUX0lEKGlkX3B0cix0aWQpIFwKKyAgKChLTVBfVEVTVF9USEVOX0lOQzY0KGlkX3B0cikgPDwgT01QVF9USFJFQURfSURfQklUUykgfCAodGlkKSkKKyNlbHNlCisjZGVmaW5lIE5FWFRfSUQoaWRfcHRyLHRpZCkgKEtNUF9URVNUX1RIRU5fSU5DNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKWlkX3B0cikpCisjZW5kaWYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIHByaXZhdGUgb3BlcmF0aW9ucworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0cmF2ZXJzZSB0aGUgdGVhbSBhbmQgdGFzayBoaWVyYXJjaHkKKy8vIG5vdGU6IF9fb21wdF9nZXRfdGVhbWluZm8gYW5kIF9fb21wdF9nZXRfdGFza2luZm8KKy8vICAgICAgIHRyYXZlcnNlIHRoZSBoaWVyYXJjaHkgc2ltaWxhcmx5IGFuZCBuZWVkIHRvIGJlCisvLyAgICAgICBrZXB0IGNvbnNpc3RlbnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvbXB0X3RlYW1faW5mb190ICoKK19fb21wdF9nZXRfdGVhbWluZm8oaW50IGRlcHRoLCBpbnQgKnNpemUpCit7CisgICAga21wX2luZm9fdCAqdGhyID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgICBpZiAodGhyKSB7CisgICAgICAgIGttcF90ZWFtICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgICAgICBpZiAodGVhbSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IExXVF9GUk9NX1RFQU0odGVhbSk7CisKKyAgICAgICAgd2hpbGUoZGVwdGggPiAwKSB7CisgICAgICAgICAgICAvLyBuZXh0IGxpZ2h0d2VpZ2h0IHRlYW0gKGlmIGFueSkKKyAgICAgICAgICAgIGlmIChsd3QpIGx3dCA9IGx3dC0+cGFyZW50OworCisgICAgICAgICAgICAvLyBuZXh0IGhlYXZ5d2VpZ2h0IHRlYW0gKGlmIGFueSkgYWZ0ZXIKKyAgICAgICAgICAgIC8vIGxpZ2h0d2VpZ2h0IHRlYW1zIGFyZSBleGhhdXN0ZWQKKyAgICAgICAgICAgIGlmICghbHd0ICYmIHRlYW0pIHRlYW09dGVhbS0+dC50X3BhcmVudDsKKworICAgICAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsd3QpIHsKKyAgICAgICAgICAgIC8vIGxpZ2h0d2VpZ2h0IHRlYW1zIGhhdmUgb25lIHRhc2sKKyAgICAgICAgICAgIGlmIChzaXplKSAqc2l6ZSA9IDE7CisKKyAgICAgICAgICAgIC8vIHJldHVybiB0ZWFtIGluZm8gZm9yIGxpZ2h0d2VpZ2h0IHRlYW0KKyAgICAgICAgICAgIHJldHVybiAmbHd0LT5vbXB0X3RlYW1faW5mbzsKKyAgICAgICAgfSBlbHNlIGlmICh0ZWFtKSB7CisgICAgICAgICAgICAvLyBleHRyYWN0IHNpemUgZnJvbSBoZWF2eXdlaWdodCB0ZWFtCisgICAgICAgICAgICBpZiAoc2l6ZSkgKnNpemUgPSB0ZWFtLT50LnRfbnByb2M7CisKKyAgICAgICAgICAgIC8vIHJldHVybiB0ZWFtIGluZm8gZm9yIGhlYXZ5d2VpZ2h0IHRlYW0KKyAgICAgICAgICAgIHJldHVybiAmdGVhbS0+dC5vbXB0X3RlYW1faW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisKK29tcHRfdGFza19pbmZvX3QgKgorX19vbXB0X2dldF90YXNraW5mbyhpbnQgZGVwdGgpCit7CisgICAgb21wdF90YXNrX2luZm9fdCAqaW5mbyA9IE5VTEw7CisgICAga21wX2luZm9fdCAqdGhyID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgICBpZiAodGhyKSB7CisgICAgICAgIGttcF90YXNrZGF0YV90ICAqdGFza2RhdGEgPSB0aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgb21wdF9sd190YXNrdGVhbV90ICpsd3QgPSBMV1RfRlJPTV9URUFNKHRhc2tkYXRhLT50ZF90ZWFtKTsKKworICAgICAgICB3aGlsZSAoZGVwdGggPiAwKSB7CisgICAgICAgICAgICAvLyBuZXh0IGxpZ2h0d2VpZ2h0IHRlYW0gKGlmIGFueSkKKyAgICAgICAgICAgIGlmIChsd3QpIGx3dCA9IGx3dC0+cGFyZW50OworCisgICAgICAgICAgICAvLyBuZXh0IGhlYXZ5d2VpZ2h0IHRlYW0gKGlmIGFueSkgYWZ0ZXIKKyAgICAgICAgICAgIC8vIGxpZ2h0d2VpZ2h0IHRlYW1zIGFyZSBleGhhdXN0ZWQKKyAgICAgICAgICAgIGlmICghbHd0ICYmIHRhc2tkYXRhKSB7CisgICAgICAgICAgICAgICAgdGFza2RhdGEgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICAgICAgICAgIGlmICh0YXNrZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBsd3QgPSBMV1RfRlJPTV9URUFNKHRhc2tkYXRhLT50ZF90ZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXB0aC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGx3dCkgeworICAgICAgICAgICAgaW5mbyA9ICZsd3QtPm9tcHRfdGFza19pbmZvOworICAgICAgICB9IGVsc2UgaWYgKHRhc2tkYXRhKSB7CisgICAgICAgICAgICBpbmZvID0gJnRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbmZvOworfQorCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGludGVyZmFjZSBvcGVyYXRpb25zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRocmVhZCBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb21wdF9wYXJhbGxlbF9pZF90CitfX29tcHRfdGhyZWFkX2lkX25ldygpCit7CisgICAgc3RhdGljIHVpbnQ2NF90IG9tcHRfdGhyZWFkX2lkID0gMTsKKyAgICByZXR1cm4gTkVYVF9JRCgmb21wdF90aHJlYWRfaWQsIDApOworfQorCit2b2lkCitfX29tcHRfdGhyZWFkX2JlZ2luKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpCit7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9iZWdpbikoCisgICAgICAgIHRocmVhZF90eXBlLCBHVElEX1RPX09NUFRfVEhSRUFEX0lEKGd0aWQpKTsKK30KKworCit2b2lkCitfX29tcHRfdGhyZWFkX2VuZChvbXB0X3RocmVhZF90eXBlX3QgdGhyZWFkX3R5cGUsIGludCBndGlkKQoreworICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfZW5kKSgKKyAgICAgICAgdGhyZWFkX3R5cGUsIEdUSURfVE9fT01QVF9USFJFQURfSUQoZ3RpZCkpOworfQorCisKK29tcHRfdGhyZWFkX2lkX3QKK19fb21wdF9nZXRfdGhyZWFkX2lkX2ludGVybmFsKCkKK3sKKyAgICAvLyBGSVhNRQorICAgIC8vIHVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgd2F5IG9mIGFzc2lnbmluZyBpZHMsIHVzZSBfX2ttcF9nZXRfZ3RpZAorICAgIC8vIHNpbmNlIHRoZSByZXR1cm4gdmFsdWUgbWlnaHQgYmUgbmVnYXRpdmUsIHdlIG5lZWQgdG8gdGVzdCB0aGF0IGJlZm9yZQorICAgIC8vIGFzc2lnbmluZyBpdCB0byBhbiBvbXB0X3RocmVhZF9pZF90LCB3aGljaCBpcyB1bnNpZ25lZC4KKyAgICBpbnQgaWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGFzc2VydChpZCA+PSAwKTsKKworICAgIHJldHVybiBHVElEX1RPX09NUFRfVEhSRUFEX0lEKGlkKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdGF0ZSBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19vbXB0X3RocmVhZF9hc3NpZ25fd2FpdF9pZCh2b2lkICp2YXJpYWJsZSkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAga21wX2luZm9fdCAqdGkgPSBvbXB0X2dldF90aHJlYWRfZ3RpZChndGlkKTsKKworICAgIHRpLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAob21wdF93YWl0X2lkX3QpIHZhcmlhYmxlOworfQorCitvbXB0X3N0YXRlX3QKK19fb21wdF9nZXRfc3RhdGVfaW50ZXJuYWwob21wdF93YWl0X2lkX3QgKm9tcHRfd2FpdF9pZCkKK3sKKyAgICBrbXBfaW5mb190ICp0aSA9IG9tcHRfZ2V0X3RocmVhZCgpOworCisgICAgaWYgKHRpKSB7CisgICAgICAgIGlmIChvbXB0X3dhaXRfaWQpCisgICAgICAgICAgICAqb21wdF93YWl0X2lkID0gdGktPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZDsKKyAgICAgICAgcmV0dXJuIHRpLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlOworICAgIH0KKyAgICByZXR1cm4gb21wdF9zdGF0ZV91bmRlZmluZWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaWRsZSBmcmFtZSBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCAqCitfX29tcHRfZ2V0X2lkbGVfZnJhbWVfaW50ZXJuYWwodm9pZCkKK3sKKyAgICBrbXBfaW5mb190ICp0aSA9IG9tcHRfZ2V0X3RocmVhZCgpOworICAgIHJldHVybiB0aSA/IHRpLT50aC5vbXB0X3RocmVhZF9pbmZvLmlkbGVfZnJhbWUgOiBOVUxMOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyYWxsZWwgcmVnaW9uIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvbXB0X3BhcmFsbGVsX2lkX3QKK19fb21wdF9wYXJhbGxlbF9pZF9uZXcoaW50IGd0aWQpCit7CisgICAgc3RhdGljIHVpbnQ2NF90IG9tcHRfcGFyYWxsZWxfaWQgPSAxOworICAgIHJldHVybiBndGlkID49IDAgPyBORVhUX0lEKCZvbXB0X3BhcmFsbGVsX2lkLCBndGlkKSA6IDA7Cit9CisKKwordm9pZCAqCitfX29tcHRfZ2V0X3BhcmFsbGVsX2Z1bmN0aW9uX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3RlYW1faW5mb190ICppbmZvID0gX19vbXB0X2dldF90ZWFtaW5mbyhkZXB0aCwgTlVMTCk7CisgICAgdm9pZCAqZnVuY3Rpb24gPSBpbmZvID8gaW5mby0+bWljcm90YXNrIDogTlVMTDsKKyAgICByZXR1cm4gZnVuY3Rpb247Cit9CisKKworb21wdF9wYXJhbGxlbF9pZF90CitfX29tcHRfZ2V0X3BhcmFsbGVsX2lkX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3RlYW1faW5mb190ICppbmZvID0gX19vbXB0X2dldF90ZWFtaW5mbyhkZXB0aCwgTlVMTCk7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IGlkID0gaW5mbyA/IGluZm8tPnBhcmFsbGVsX2lkIDogMDsKKyAgICByZXR1cm4gaWQ7Cit9CisKKworaW50CitfX29tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZV9pbnRlcm5hbChpbnQgZGVwdGgpCit7CisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcmV0dXJuIHZhbHVlIHdpdGggdGhlIGVycm9yIHZhbHVlLgorICAgIC8vIGlmIHRoZXJlIGlzIGEgdGVhbSBhdCB0aGUgc3BlY2lmaWVkIGRlcHRoLCB0aGUgZGVmYXVsdAorICAgIC8vIHZhbHVlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gdGhlIHNpemUgb2YgdGhhdCB0ZWFtLgorICAgIGludCBzaXplID0gLTE7CisgICAgKHZvaWQpIF9fb21wdF9nZXRfdGVhbWluZm8oZGVwdGgsICZzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxpZ2h0d2VpZ2h0IHRhc2sgdGVhbSBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQob21wdF9sd190YXNrdGVhbV90ICpsd3QsIGttcF9pbmZvX3QgKnRociwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCB2b2lkICptaWNyb3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9waWQpCit7CisgICAgbHd0LT5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCA9IG9tcHRfcGlkOworICAgIGx3dC0+b21wdF90ZWFtX2luZm8ubWljcm90YXNrID0gbWljcm90YXNrOworICAgIGx3dC0+b21wdF90YXNrX2luZm8udGFza19pZCA9IDA7CisgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSAwOworICAgIGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICBsd3QtPm9tcHRfdGFza19pbmZvLmZ1bmN0aW9uID0gTlVMTDsKKyAgICBsd3QtPnBhcmVudCA9IDA7Cit9CisKKwordm9pZAorX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsob21wdF9sd190YXNrdGVhbV90ICpsd3QsICBrbXBfaW5mb190ICp0aHIpCit7CisgICAgb21wdF9sd190YXNrdGVhbV90ICpteV9wYXJlbnQgPSB0aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKyAgICBsd3QtPnBhcmVudCA9IG15X3BhcmVudDsKKyAgICB0aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbyA9IGx3dDsKK30KKworCitvbXB0X2x3X3Rhc2t0ZWFtX3QgKgorX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayhrbXBfaW5mb190ICp0aHIpCit7CisgICAgb21wdF9sd190YXNrdGVhbV90ICpsd3Rhc2sgPSB0aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKyAgICBpZiAobHd0YXNrKSB0aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbyA9IGx3dGFzay0+cGFyZW50OworICAgIHJldHVybiBsd3Rhc2s7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0YXNrIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvbXB0X3Rhc2tfaWRfdAorX19vbXB0X3Rhc2tfaWRfbmV3KGludCBndGlkKQoreworICAgIHN0YXRpYyB1aW50NjRfdCBvbXB0X3Rhc2tfaWQgPSAxOworICAgIHJldHVybiBORVhUX0lEKCZvbXB0X3Rhc2tfaWQsIGd0aWQpOworfQorCisKK29tcHRfdGFza19pZF90CitfX29tcHRfZ2V0X3Rhc2tfaWRfaW50ZXJuYWwoaW50IGRlcHRoKQoreworICAgIG9tcHRfdGFza19pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKGRlcHRoKTsKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkID0gaW5mbyA/ICBpbmZvLT50YXNrX2lkIDogMDsKKyAgICByZXR1cm4gdGFza19pZDsKK30KKworCit2b2lkICoKK19fb21wdF9nZXRfdGFza19mdW5jdGlvbl9pbnRlcm5hbChpbnQgZGVwdGgpCit7CisgICAgb21wdF90YXNrX2luZm9fdCAqaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oZGVwdGgpOworICAgIHZvaWQgKmZ1bmN0aW9uID0gaW5mbyA/IGluZm8tPmZ1bmN0aW9uIDogTlVMTDsKKyAgICByZXR1cm4gZnVuY3Rpb247Cit9CisKKworb21wdF9mcmFtZV90ICoKK19fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbChpbnQgZGVwdGgpCit7CisgICAgb21wdF90YXNrX2luZm9fdCAqaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oZGVwdGgpOworICAgIG9tcHRfZnJhbWVfdCAqZnJhbWUgPSBpbmZvID8gZnJhbWUgPSAmaW5mby0+ZnJhbWUgOiBOVUxMOworICAgIHJldHVybiBmcmFtZTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRlYW0gc3VwcG9ydAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fb21wdF90ZWFtX2Fzc2lnbl9pZChrbXBfdGVhbV90ICp0ZWFtLCBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9waWQpCit7CisgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCA9IG9tcHRfcGlkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5oIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Zjg0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmgKQEAgLTAsMCArMSw5MCBAQAorI2lmbmRlZiBPTVBUX1NQRUNJRklDX0gKKyNkZWZpbmUgT01QVF9TUEVDSUZJQ19ICisKKyNpbmNsdWRlICJrbXAuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYga21wX2luZm9fdCBvbXB0X3RocmVhZF90OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgX19vbXB0X3RlYW1fYXNzaWduX2lkKGttcF90ZWFtX3QgKnRlYW0sIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCk7Cit2b2lkIF9fb21wdF90aHJlYWRfYXNzaWduX3dhaXRfaWQodm9pZCAqdmFyaWFibGUpOworCit2b2lkIF9fb21wdF9sd190YXNrdGVhbV9pbml0KG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0LCBvbXB0X3RocmVhZF90ICp0aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCB2b2lkICptaWNyb3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCk7CisKK3ZvaWQgX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsob21wdF9sd190YXNrdGVhbV90ICpsd3QsICBvbXB0X3RocmVhZF90ICp0aHIpOworCitvbXB0X2x3X3Rhc2t0ZWFtX3QgKiBfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKG9tcHRfdGhyZWFkX3QgKnRocik7CisKK29tcHRfcGFyYWxsZWxfaWRfdCBfX29tcHRfcGFyYWxsZWxfaWRfbmV3KGludCBndGlkKTsKK29tcHRfdGFza19pZF90IF9fb21wdF90YXNrX2lkX25ldyhpbnQgZ3RpZCk7CisKK29tcHRfdGVhbV9pbmZvX3QgKl9fb21wdF9nZXRfdGVhbWluZm8oaW50IGRlcHRoLCBpbnQgKnNpemUpOworCitvbXB0X3Rhc2tfaW5mb190ICpfX29tcHRfZ2V0X3Rhc2tpbmZvKGludCBkZXB0aCk7CisKK3ZvaWQgX19vbXB0X3RocmVhZF9iZWdpbihvbXB0X3RocmVhZF90eXBlX3QgdGhyZWFkX3R5cGUsIGludCBndGlkKTsKKwordm9pZCBfX29tcHRfdGhyZWFkX2VuZChvbXB0X3RocmVhZF90eXBlX3QgdGhyZWFkX3R5cGUsIGludCBndGlkKTsKKworaW50IF9fb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplX2ludGVybmFsKGludCBhbmNlc3Rvcl9sZXZlbCk7CisKK29tcHRfdGFza19pZF90IF9fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbChpbnQgZGVwdGgpOworCitvbXB0X2ZyYW1lX3QgKl9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbChpbnQgZGVwdGgpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9NUFRfSEFWRV9XRUFLX0FUVFJJQlVURSBLTVBfSEFWRV9XRUFLX0FUVFJJQlVURQorI2RlZmluZSBPTVBUX0hBVkVfUFNBUEkgS01QX0hBVkVfUFNBUEkKKyNkZWZpbmUgT01QVF9TVFJfTUFUQ0goaGF5c3RhY2ssIG5lZWRsZSkgX19rbXBfc3RyX21hdGNoKGhheXN0YWNrLCAwLCBuZWVkbGUpCisKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gaW5saW5lIGZ1bmN0aW9ucworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworaW5saW5lIG9tcHRfdGhyZWFkX3QgKgorb21wdF9nZXRfdGhyZWFkX2d0aWQoaW50IGd0aWQpCit7CisgICAgcmV0dXJuIChndGlkID49IDApID8gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKSA6IE5VTEw7Cit9CisKKworaW5saW5lIG9tcHRfdGhyZWFkX3QgKgorb21wdF9nZXRfdGhyZWFkKCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgcmV0dXJuIG9tcHRfZ2V0X3RocmVhZF9ndGlkKGd0aWQpOworfQorCisKK2lubGluZSB2b2lkIAorb21wdF9zZXRfdGhyZWFkX3N0YXRlKG9tcHRfdGhyZWFkX3QgKnRocmVhZCwgb21wdF9zdGF0ZV90IHN0YXRlKQoreworICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IHN0YXRlOyAKK30KKworCitpbmxpbmUgY29uc3QgY2hhciAqCitvbXB0X2dldF9ydW50aW1lX3ZlcnNpb24oKQoreworICAgIHJldHVybiAmX19rbXBfdmVyc2lvbl9saWJfdmVyW0tNUF9WRVJTSU9OX01BR0lDX0xFTl07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGVzdC10b3VjaC5jIGIvZmluYWwvcnVudGltZS9zcmMvdGVzdC10b3VjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTUyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90ZXN0LXRvdWNoLmMKQEAgLTAsMCArMSwzMSBAQAorLy8gdGVzdC10b3VjaC5jIC8vCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitleHRlcm4gZG91YmxlIG9tcF9nZXRfd3RpbWUoKTsKK2V4dGVybiBpbnQgICAgb21wX2dldF9udW1fdGhyZWFkcygpOworZXh0ZXJuIGludCAgICBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitpbnQgbWFpbigpIHsKKyAgICBvbXBfZ2V0X3d0aW1lKCk7CisgICAgb21wX2dldF9udW1fdGhyZWFkcygpOworICAgIG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2Rpc2FibGVfd2FybmluZ3MuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2Rpc2FibGVfd2FybmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI0MmZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvZGlzYWJsZV93YXJuaW5ncy5oCkBAIC0wLDAgKzEsMjkgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIml0dG5vdGlmeV9jb25maWcuaCIKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDU5MykgICAvKiBwYXJhbWV0ZXIgIlhYWFgiIHdhcyBzZXQgYnV0IG5ldmVyIHVzZWQgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDM0NCkgICAvKiB0eXBlZGVmIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZCAod2l0aCBzYW1lIHR5cGUpICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDE3NCkgICAvKiBleHByZXNzaW9uIGhhcyBubyBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQxMjcpICAvKiBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQzMDYpICAvKiBjb252ZXJzaW9uIGZyb20gJz8nIHRvICc/JyBvZiBncmVhdGVyIHNpemUgICAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDg2OSkgIC8qIHBhcmFtZXRlciAiWFhYWFgiIHdhcyBuZXZlciByZWZlcmVuY2VkICAgICAgICAgICAgICAgICAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogMTQxOCkgLyogZXh0ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbiB3aXRoIG5vIHByaW9yIGRlY2xhcmF0aW9uICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAxNDE5KSAvKiBleHRlcm5hbCBkZWNsYXJhdGlvbiBpbiBwcmltYXJ5IHNvdXJjZSBmaWxlICAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiBfX0lOVEVMX0NPTVBJTEVSICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnkuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzkyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnkuaApAQCAtMCwwICsxLDM4MDQgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisjZGVmaW5lIF9JVFROT1RJRllfSF8KKworLyoqCitAZmlsZQorQGJyaWVmIFB1YmxpYyBVc2VyIEFQSSBmdW5jdGlvbnMgYW5kIHR5cGVzCitAbWFpbnBhZ2UKKworVGhlIElUVCBBUEkgaXMgdXNlZCB0byBhbm5vdGF0ZSBhIHVzZXIncyBwcm9ncmFtIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbgordGhhdCBjYW4gYmUgdXNlZCBieSBjb3JyZWN0bmVzcyBhbmQgcGVyZm9ybWFuY2UgdG9vbHMuIFRoZSB1c2VyIGluc2VydHMKK2NhbGxzIGluIHRoZWlyIHByb2dyYW0uIFRob3NlIGNhbGxzIGdlbmVyYXRlIGluZm9ybWF0aW9uIHRoYXQgaXMgY29sbGVjdGVkCithdCBydW50aW1lLCBhbmQgdXNlZCBieSBJbnRlbChSKSBUaHJlYWRpbmcgVG9vbHMuCisKK0BzZWN0aW9uIEFQSSBDb25jZXB0cworVGhlIGZvbGxvd2luZyBnZW5lcmFsIGNvbmNlcHRzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIEFQSS4KKworQHN1YnNlY3Rpb24gVW5pY29kZSBTdXBwb3J0CitNYW55IEFQSSBmdW5jdGlvbnMgdGFrZSBjaGFyYWN0ZXIgc3RyaW5nIGFyZ3VtZW50cy4gT24gV2luZG93cywgdGhlcmUKK2FyZSB0d28gdmVyc2lvbnMgb2YgZWFjaCBzdWNoIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbmFtZSBpcyBzdWZmaXhlZAorYnkgVyBpZiBVbmljb2RlIHN1cHBvcnQgaXMgZW5hYmxlZCwgYW5kIGJ5IEEgb3RoZXJ3aXNlLiBBbnkgQVBJIGZ1bmN0aW9uCit0aGF0IHRha2VzIGEgY2hhcmFjdGVyIHN0cmluZyBhcmd1bWVudCBhZGhlcmVzIHRvIHRoaXMgY29udmVudGlvbi4KKworQHN1YnNlY3Rpb24gQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24KK01hbnkgdXNlcnMgcHJlZmVyIGhhdmluZyBhbiBvcHRpb24gdG8gbW9kaWZ5IElUVCBBUEkgY29kZSB3aGVuIGxpbmtpbmcgaXQKK2luc2lkZSB0aGVpciBydW50aW1lcy4gSVRUIEFQSSBoZWFkZXIgZmlsZSBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byByZXBsYWNlCitJVFQgQVBJIGZ1bmN0aW9uIG5hbWVzIGluc2lkZSB5b3VyIGNvZGUgd2l0aCBlbXB0eSBzdHJpbmdzLiBUbyBkbyB0aGlzLAorZGVmaW5lIHRoZSBtYWNyb3MgSU5URUxfTk9fSVRUTk9USUZZX0FQSSBkdXJpbmcgY29tcGlsYXRpb24gYW5kIHJlbW92ZSB0aGUKK3N0YXRpYyBsaWJyYXJ5IGZyb20gdGhlIGxpbmtlciBzY3JpcHQuCisKK0BzdWJzZWN0aW9uIERvbWFpbnMKK1tzZWUgZG9tYWluc10KK0RvbWFpbnMgcHJvdmlkZSBhIHdheSB0byBzZXBhcmF0ZSBub3RpZmljYXRpb24gZm9yIGRpZmZlcmVudCBtb2R1bGVzIG9yCitsaWJyYXJpZXMgaW4gYSBwcm9ncmFtLiBEb21haW5zIGFyZSBzcGVjaWZpZWQgYnkgZG90dGVkIGNoYXJhY3RlciBzdHJpbmdzLAorZS5nLiBUQkIuSW50ZXJuYWwuQ29udHJvbC4KKworQSBtZWNoYW5pc20gKHRvIGJlIHNwZWNpZmllZCkgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlCitkb21haW5zLiBCeSBkZWZhdWx0LCBhbGwgZG9tYWlucyBhcmUgZW5hYmxlZC4KK0BzdWJzZWN0aW9uIE5hbWVkIEVudGl0aWVzIGFuZCBJbnN0YW5jZXMKK05hbWVkIGVudGl0aWVzIChmcmFtZXMsIHJlZ2lvbnMsIHRhc2tzLCBhbmQgbWFya2VycykgY29tbXVuaWNhdGUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmFtIHRvIHRoZSBhbmFseXNpcyB0b29scy4gQSBuYW1lZCBlbnRpdHkgb2Z0ZW4KK3JlZmVycyB0byBhIHNlY3Rpb24gb2YgcHJvZ3JhbSBjb2RlLCBvciB0byBzb21lIHNldCBvZiBsb2dpY2FsIGNvbmNlcHRzCit0aGF0IHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdyb3VwIHRvZ2V0aGVyLgorCitOYW1lZCBlbnRpdGllcyByZWxhdGUgdG8gdGhlIHByb2dyYW1tZXIncyBzdGF0aWMgdmlldyBvZiB0aGUgcHJvZ3JhbS4gV2hlbgordGhlIHByb2dyYW0gYWN0dWFsbHkgZXhlY3V0ZXMsIG1hbnkgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gbmFtZWQgZW50aXR5CittYXkgYmUgY3JlYXRlZC4KKworVGhlIEFQSSBhbm5vdGF0aW9ucyBkZW5vdGUgaW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzLiBUaGUgYWN0dWFsCituYW1lZCBlbnRpdGllcyBhcmUgZGlzcGxheWVkIHVzaW5nIHRoZSBhbmFseXNpcyB0b29scy4gSW4gb3RoZXIgd29yZHMsCit0aGUgbmFtZWQgZW50aXRpZXMgY29tZSBpbnRvIGV4aXN0ZW5jZSB3aGVuIGluc3RhbmNlcyBhcmUgY3JlYXRlZC4KKworSW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzIG1heSBoYXZlIGluc3RhbmNlIGlkZW50aWZpZXJzIChJRHMpLiBTb21lCitBUEkgY2FsbHMgdXNlIGluc3RhbmNlIGlkZW50aWZpZXJzIHRvIGNyZWF0ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4KK2RpZmZlcmVudCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuIE90aGVyIEFQSSBjYWxscyBhc3NvY2lhdGUgZGF0YQord2l0aCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuCisKK1NvbWUgbmFtZWQgZW50aXRpZXMgbXVzdCBhbHdheXMgaGF2ZSBpbnN0YW5jZSBJRHMuIEluIHBhcnRpY3VsYXIsIHJlZ2lvbnMKK2FuZCBmcmFtZXMgYWx3YXlzIGhhdmUgSURzLiBUYXNrIGFuZCBtYXJrZXJzIG5lZWQgSURzIG9ubHkgaWYgdGhlIElEIGlzCituZWVkZWQgaW4gYW5vdGhlciBBUEkgY2FsbCAoc3VjaCBhcyBhZGRpbmcgYSByZWxhdGlvbiBvciBtZXRhZGF0YSkuCisKK1RoZSBsaWZldGltZSBvZiBpbnN0YW5jZSBJRHMgaXMgZGlzdGluY3QgZnJvbSB0aGUgbGlmZXRpbWUgb2YKK2luc3RhbmNlcy4gVGhpcyBhbGxvd3MgdmFyaW91cyByZWxhdGlvbnNoaXBzIHRvIGJlIHNwZWNpZmllZCBzZXBhcmF0ZQorZnJvbSB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiBpbnN0YW5jZXMuIFRoaXMgZmxleGliaWxpdHkgY29tZXMgYXQgdGhlCitleHBlbnNlIG9mIGV4dHJhIEFQSSBjYWxscy4KKworVGhlIHNhbWUgSUQgbWF5IG5vdCBiZSByZXVzZWQgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMsIHVubGVzcyBhIHByZXZpb3VzCitbcmVmXSBfX2l0dF9pZF9kZXN0cm95IGNhbGwgZm9yIHRoYXQgSUQgaGFzIGJlZW4gaXNzdWVkLgorKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXyAKKyMgICAgICBkZWZpbmUgQ0RFQ0wgX19hdHRyaWJ1dGVfXyAoKGNkZWNsKSkKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBDREVDTCAvKiBhY3R1YWwgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogQ0RFQ0wgKi8KKworI2lmbmRlZiBTVERDQUxMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBTVERDQUxMIF9fYXR0cmlidXRlX18gKChzdGRjYWxsKSkgCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIElOVEVMX0lUVE5PVElGWV9FTkFCTEVfTEVHQUNZCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgcHJhZ21hIG1lc3NhZ2UoIldBUk5JTkchISEgRGVwcmVjYXRlZCBBUEkgaXMgdXNlZC4gUGxlYXNlIHVuZGVmaW5lIElOVEVMX0lUVE5PVElGWV9FTkFCTEVfTEVHQUNZIG1hY3JvIikKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIHdhcm5pbmcgIkRlcHJlY2F0ZWQgQVBJIGlzIHVzZWQuIFBsZWFzZSB1bmRlZmluZSBJTlRFTF9JVFROT1RJRllfRU5BQkxFX0xFR0FDWSBtYWNybyIKKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgaW5jbHVkZSAibGVnYWN5L2l0dG5vdGlmeS5oIgorI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9FTkFCTEVfTEVHQUNZICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworLyogSGVscGVyIG1hY3JvIGZvciBqb2luaW5nIHRva2VucyAqLworI2RlZmluZSBJVFRfSk9JTl9BVVgocCxuKSBwIyNuCisjZGVmaW5lIElUVF9KT0lOKHAsbikgICAgIElUVF9KT0lOX0FVWChwLG4pCisKKyNpZmRlZiBJVFRfTUFKT1IKKyN1bmRlZiBJVFRfTUFKT1IKKyNlbmRpZgorI2lmZGVmIElUVF9NSU5PUgorI3VuZGVmIElUVF9NSU5PUgorI2VuZGlmCisjZGVmaW5lIElUVF9NQUpPUiAgICAgMworI2RlZmluZSBJVFRfTUlOT1IgICAgIDAKKworLyogU3RhbmRhcmQgdmVyc2lvbmluZyBvZiBhIHRva2VuIHdpdGggbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBJVFRfVkVSU0lPTklaRSh4KSAgICBcCisgICAgSVRUX0pPSU4oeCwgICAgICAgICAgICAgIFwKKyAgICBJVFRfSk9JTihfLCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKElUVF9NQUpPUiwgICAgICBcCisgICAgSVRUX0pPSU4oXywgSVRUX01JTk9SKSkpKQorCisjaWZuZGVmIElOVEVMX0lUVE5PVElGWV9QUkVGSVgKKyMgIGRlZmluZSBJTlRFTF9JVFROT1RJRllfUFJFRklYIF9faXR0XworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9QUkVGSVggKi8KKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BPU1RGSVgKKyMgIGRlZmluZSBJTlRFTF9JVFROT1RJRllfUE9TVEZJWCBfcHRyXworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9QT1NURklYICovCisKKyNkZWZpbmUgSVRUTk9USUZZX05BTUVfQVVYKG4pIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsbikKKyNkZWZpbmUgSVRUTk9USUZZX05BTUUobikgICAgIElUVF9WRVJTSU9OSVpFKElUVE5PVElGWV9OQU1FX0FVWChJVFRfSk9JTihuLElOVEVMX0lUVE5PVElGWV9QT1NURklYKSkpCisKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSUQobikgKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEEobikgKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikKKworI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDAobixkKSAgICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QxKG4sZCx4KSAgICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QyKG4sZCx4LHkpICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDMobixkLHgseSx6KSAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHopCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q0KG4sZCx4LHkseixhKSAgICAgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q1KG4sZCx4LHkseixhLGIpICAgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDYobixkLHgseSx6LGEsYixjKSAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiLGMpCisKKyNpZmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCCisjZW5kaWYKKyNpZmRlZiBJVFRfU1RVQlYKKyN1bmRlZiBJVFRfU1RVQlYKKyNlbmRpZgorI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZSAoYXBpKiBJVFRfSk9JTihJVFROT1RJRllfTkFNRShuYW1lKSxfdCkpIGFyZ3M7ICAgXAorICAgIGV4dGVybiBJVFRfSk9JTihJVFROT1RJRllfTkFNRShuYW1lKSxfdCkgSVRUTk9USUZZX05BTUUobmFtZSk7CisjZGVmaW5lIElUVF9TVFVCIElUVF9TVFVCVgorLyoqIEBlbmRjb25kICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworLyoqCisgKiBAZGVmZ3JvdXAgcHVibGljIFB1YmxpYyBBUEkKKyAqIEB7CisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIGNvbnRyb2wgQ29sbGVjdGlvbiBDb250cm9sCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEdlbmVyYWwgYmVoYXZpb3I6IGFwcGxpY2F0aW9uIGNvbnRpbnVlcyB0byBydW4sIGJ1dCBubyBwcm9maWxpbmcgaW5mb3JtYXRpb24gaXMgYmVpbmcgY29sbGVjdGVkCisgKgorICogUGF1c2luZyBvY2N1cnMgbm90IG9ubHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZCBidXQgZm9yIGFsbCBwcm9jZXNzIGFzIHdlbGwgYXMgc3Bhd25lZCBwcm9jZXNzZXMKKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEU6CisgKiAgIC0gRG9lcyBub3QgYW5hbHl6ZSBvciByZXBvcnQgZXJyb3JzIHRoYXQgaW52b2x2ZSBtZW1vcnkgYWNjZXNzLgorICogICAtIE90aGVyIGVycm9ycyBhcmUgcmVwb3J0ZWQgYXMgdXN1YWwuIFBhdXNpbmcgZGF0YSBjb2xsZWN0aW9uIGluCisgKiAgICAgSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEUKKyAqICAgICBvbmx5IHBhdXNlcyB0cmFjaW5nIGFuZCBhbmFseXppbmcgbWVtb3J5IGFjY2Vzcy4KKyAqICAgICBJdCBkb2VzIG5vdCBwYXVzZSB0cmFjaW5nIG9yIGFuYWx5emluZyB0aHJlYWRpbmcgQVBJcy4KKyAqICAgLgorICogLSBJbnRlbChSKSBQYXJhbGxlbCBBbXBsaWZpZXIgYW5kIEludGVsKFIpIFZUdW5lKFRNKSBBbXBsaWZpZXIgWEU6CisgKiAgIC0gRG9lcyBjb250aW51ZSB0byByZWNvcmQgd2hlbiBuZXcgdGhyZWFkcyBhcmUgc3RhcnRlZC4KKyAqICAgLgorICogLSBPdGhlciBlZmZlY3RzOgorICogICAtIFBvc3NpYmxlIHJlZHVjdGlvbiBvZiBydW50aW1lIG92ZXJoZWFkLgorICogICAuCisgKiBAeworICovCisvKiogQGJyaWVmIFBhdXNlIGNvbGxlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3BhdXNlKHZvaWQpOworLyoqIEBicmllZiBSZXN1bWUgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVzdW1lKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBwYXVzZSwgICh2b2lkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlc3VtZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9wYXVzZSAgICAgIElUVE5PVElGWV9WT0lEKHBhdXNlKQorI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIElUVE5PVElGWV9OQU1FKHBhdXNlKQorI2RlZmluZSBfX2l0dF9yZXN1bWUgICAgIElUVE5PVElGWV9WT0lEKHJlc3VtZSkKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciBJVFROT1RJRllfTkFNRShyZXN1bWUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9wYXVzZSgpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWUoKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gY29udHJvbCBncm91cCAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlZmdyb3VwIHRocmVhZHMgVGhyZWFkcworICogQGluZ3JvdXAgcHVibGljCisgKiBHaXZlIG5hbWVzIHRvIHRocmVhZHMKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIFNldHMgdGhyZWFkIG5hbWUgb2YgY2FsbGluZyB0aHJlYWQKKyAqIEBwYXJhbVtpbl0gbmFtZSAtIG5hbWUgb2YgdGhyZWFkCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9zZXRfbmFtZUEoY29uc3QgY2hhciAgICAqbmFtZSk7Cit2b2lkIElUVEFQSSBfX2l0dF90aHJlYWRfc2V0X25hbWVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWUgICAgIF9faXR0X3RocmVhZF9zZXRfbmFtZVcKKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lICAgICBfX2l0dF90aHJlYWRfc2V0X25hbWVBCisjICBkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lX3B0ciBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9zZXRfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBICAgICBJVFROT1RJRllfVk9JRCh0aHJlYWRfc2V0X25hbWVBKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVXICAgICBJVFROT1RJRllfVk9JRCh0aHJlYWRfc2V0X25hbWVXKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVXX3B0ciBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZSAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX3NldF9uYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUEobmFtZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVXKG5hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWUobmFtZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKworLyoqCisgKiBAYnJpZWYgTWFyayBjdXJyZW50IHRocmVhZCBhcyBpZ25vcmVkIGZyb20gdGhpcyBwb2ludCBvbiwgZm9yIHRoZSBkdXJhdGlvbiBvZiBpdHMgZXhpc3RlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF90aHJlYWRfaWdub3JlKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfaWdub3JlLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmUgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9pZ25vcmUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmVfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlKCkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSB0aHJlYWRzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHN1cHByZXNzIEVycm9yIHN1cHByZXNzaW9uCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEdlbmVyYWwgYmVoYXZpb3I6IGFwcGxpY2F0aW9uIGNvbnRpbnVlcyB0byBydW4sIGJ1dCBlcnJvcnMgYXJlIHN1cHByZXNzZWQKKyAqCisgKiBAeworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioKKyAqIEBuYW1lIGdyb3VwIG9mIGZ1bmN0aW9ucyB1c2VkIGZvciBlcnJvciBzdXBwcmVzc2lvbiBpbiBjb3JyZWN0bmVzcyB0b29scworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAeyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyIAorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrCisgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfYWxsX2Vycm9ycyAweDdmZmZmZmZmCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplciAKKyAqIEBicmllZiBwb3NzaWJsZSB2YWx1ZSBmb3Igc3VwcHJlc3Npb24gbWFzayAoc3VwcHJlc3NlcyBlcnJvcnMgZnJvbSB0aHJlYWRpbmcgYW5hbHlzaXMpCisgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfdGhyZWFkaW5nX2Vycm9ycyAweDAwMDAwMGZmCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplciAKKyAqIEBicmllZiBwb3NzaWJsZSB2YWx1ZSBmb3Igc3VwcHJlc3Npb24gbWFzayAoc3VwcHJlc3NlcyBlcnJvcnMgZnJvbSBtZW1vcnkgYW5hbHlzaXMpCisgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyAweDAwMDBmZjAwCisKKy8qKgorICogQGJyaWVmIFN0YXJ0IHN1cHByZXNzaW5nIGVycm9ycyBpZGVudGlmaWVkIGluIG1hc2sgb24gdGhpcyB0aHJlYWQKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3VwcHJlc3NfcHVzaCh1bnNpZ25lZCBpbnQgbWFzayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3B1c2gsICh1bnNpZ25lZCBpbnQgbWFzaykpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2ggICAgIElUVE5PVElGWV9WT0lEKHN1cHByZXNzX3B1c2gpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2hfcHRyIElUVE5PVElGWV9OQU1FKHN1cHByZXNzX3B1c2gpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wdXNoKG1hc2spCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wdXNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFVuZG8gdGhlIGVmZmVjdHMgb2YgdGhlIG1hdGNoaW5nIGNhbGwgdG8gX19pdHRfc3VwcHJlc3NfcHVzaCAgCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX3BvcCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcG9wLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcCAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfcG9wKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wb3BfcHRyIElUVE5PVElGWV9OQU1FKHN1cHByZXNzX3BvcCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcCgpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X21vZGVsX2Rpc2FibGUKKyAqIEBicmllZiBFbnVtZXJhdG9yIGZvciB0aGUgZGlzYWJsZSBtZXRob2RzCisgKi8KK3R5cGVkZWYgZW51bSBfX2l0dF9zdXBwcmVzc19tb2RlIHsKKyAgICBfX2l0dF91bnN1cHByZXNzX3JhbmdlLAorICAgIF9faXR0X3N1cHByZXNzX3JhbmdlCit9IF9faXR0X3N1cHByZXNzX21vZGVfdDsKKworLyoqCisgKiBAYnJpZWYgTWFyayBhIHJhbmdlIG9mIG1lbW9yeSBmb3IgZXJyb3Igc3VwcHJlc3Npb24gb3IgdW5zdXBwcmVzc2lvbiBmb3IgZXJyb3IgdHlwZXMgaW5jbHVkZWQgaW4gbWFzaworICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfbWFya19yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZSAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfbWFya19yYW5nZSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfbWFya19yYW5nZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UobWFzaykKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2VfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVW5kbyB0aGUgZWZmZWN0IG9mIGEgbWF0Y2hpbmcgY2FsbCB0byBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlLiAgIElmIG5vdCBtYXRjaGluZworICogICAgICAgIGNhbGwgaXMgZm91bmQsIG5vdGhpbmcgaXMgY2hhbmdlZC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2UoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19jbGVhcl9yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2UgICAgIElUVE5PVElGWV9WT0lEKHN1cHByZXNzX2NsZWFyX3JhbmdlKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZV9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfY2xlYXJfcmFuZ2UpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZShtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gKi8KKy8qKiBAfSBzdXBwcmVzcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBzeW5jIFN5bmNocm9uaXphdGlvbgorICogQGluZ3JvdXAgcHVibGljCisgKiBJbmRpY2F0ZSB1c2VyLXdyaXR0ZW4gc3luY2hyb25pemF0aW9uIGNvZGUKKyAqIEB7CisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfYmFycmllciAxCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfbXV0ZXggICAyCisKKy8qKgorQGJyaWVmIE5hbWUgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0CitAcGFyYW1baW5dIGFkZHIgICAgICAgSGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4gWW91IHNob3VsZAordXNlIGEgcmVhbCBhZGRyZXNzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LgorQHBhcmFtW2luXSBvYmp0eXBlICAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMKK3Bhc3NlZCwgdGhlIG5hbWUgd2lsbCBiZSAiVXNlciBTeW5jaHJvbml6YXRpb24iLgorQHBhcmFtW2luXSBvYmpuYW1lICAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuIElmIE5VTEwsCitubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIG9iamVjdC4KK0BwYXJhbVtpbl0gYXR0cmlidXRlICBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XQorICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlQSh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlVyh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIF9faXR0X3N5bmNfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIF9faXR0X3N5bmNfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBfX2l0dF9zeW5jX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2NyZWF0ZSAodm9pZCAqYWRkciwgY29uc3QgY2hhciAqb2JqdHlwZSwgY29uc3QgY2hhciAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyKiAgICBvYmp0eXBlLCBjb25zdCBjaGFyKiAgICBvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUEoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXKGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGUoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKK0BicmllZiBSZW5hbWUgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0CisKK1lvdSBjYW4gdXNlIHRoZSByZW5hbWUgY2FsbCB0byBhc3NpZ24gb3IgcmVhc3NpZ24gYSBuYW1lIHRvIGEgZ2l2ZW4KK3N5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIGFkZHIgIGhhbmRsZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIG5hbWUgIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZSAgICAgX19pdHRfc3luY19yZW5hbWVXCisjICBkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIF9faXR0X3N5bmNfcmVuYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZSAgICAgX19pdHRfc3luY19yZW5hbWVBCisjICBkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcmVuYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19yZW5hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVuYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZVcpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lV19wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBKGFkZHIsIG5hbWUpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVcoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWUoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgQGJyaWVmIERlc3Ryb3kgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LgorIEBwYXJhbSBhZGRyIEhhbmRsZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfZGVzdHJveSh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19kZXN0cm95LCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19kZXN0cm95KQorI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveShhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQG5hbWUgZ3JvdXAgb2YgZnVuY3Rpb25zIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHRvb2xzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEB7ICovCisvKioKKyAqIEBicmllZiBFbnRlciBzcGluIGxvb3Agb24gdXNlci1kZWZpbmVkIHN5bmMgb2JqZWN0CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcHJlcGFyZSh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19wcmVwYXJlKQorI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZShhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUXVpdCBzcGluIGxvb3Agd2l0aG91dCBhY3F1aXJpbmcgc3BpbiBvYmplY3QKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19jYW5jZWwodm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChzeW5jX2NhbmNlbCkKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWwoYWRkcikKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTdWNjZXNzZnVsIHNwaW4gbG9vcCBjb21wbGV0aW9uIChzeW5jIG9iamVjdCBhY3F1aXJlZCkKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19hY3F1aXJlZCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkICAgICBJVFROT1RJRllfVk9JRChzeW5jX2FjcXVpcmVkKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2FjcXVpcmVkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19hY3F1aXJlZChhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTdGFydCBzeW5jIG9iamVjdCByZWxlYXNpbmcgY29kZS4gSXMgY2FsbGVkIGJlZm9yZSB0aGUgbG9jayByZWxlYXNlIGNhbGwuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcmVsZWFzaW5nKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbGVhc2luZywgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19yZWxlYXNpbmcpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworCisvKiogQH0gc3luYyBncm91cCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgY29ycmVjdG5lc3MgY2hlY2tpbmcgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworICovCit2b2lkIElUVEFQSSBfX2l0dF9mc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmUgICAgIElUVE5PVElGWV9WT0lEKGZzeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX3ByZXBhcmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19wcmVwYXJlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19jYW5jZWwodm9pZCAqYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbCAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX2NhbmNlbCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworICovCit2b2lkIElUVEFQSSBfX2l0dF9mc3luY19hY3F1aXJlZCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfYWNxdWlyZWQsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfYWNxdWlyZWQgICAgIElUVE5PVElGWV9WT0lEKGZzeW5jX2FjcXVpcmVkKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZF9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfYWNxdWlyZWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZChhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfcmVsZWFzaW5nKQorI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZyhhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBtb2RlbCBNb2RlbGluZyBieSBJbnRlbChSKSBQYXJhbGxlbCBBZHZpc29yCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFRoaXMgaXMgdGhlIHN1YnNldCBvZiBpdHQgdXNlZCBmb3IgbW9kZWxpbmcgYnkgSW50ZWwoUikgUGFyYWxsZWwgQWR2aXNvci4KKyAqIFRoaXMgQVBJIGlzIGNhbGxlZCBPTkxZIHVzaW5nIGFubm90YXRlLmgsIGJ5ICJBbm5vdGF0aW9uIiBtYWNyb3MKKyAqIHRoZSB1c2VyIHBsYWNlcyBpbiB0aGVpciBzb3VyY2VzIGR1cmluZyB0aGUgcGFyYWxsZWxpc20gbW9kZWxpbmcgc3RlcHMuCisgKgorICogc2l0ZV9iZWdpbi9lbmQgYW5kIHRhc2tfYmVnaW4vZW5kIHRha2UgdGhlIGFkZHJlc3Mgb2YgaGFuZGxlIHZhcmlhYmxlcywKKyAqIHdoaWNoIGFyZSB3cml0ZWFibGUgYnkgdGhlIEFQSS4gIEhhbmRsZXMgbXVzdCBiZSAwIGluaXRpYWxpemVkIHByaW9yCisgKiB0byB0aGUgZmlyc3QgY2FsbCB0byBiZWdpbiwgb3IgbWF5IGNhdXNlIGEgcnVuLXRpbWUgZmFpbHVyZS4KKyAqIFRoZSBoYW5kbGVzIGFyZSBpbml0aWFsaXplZCBpbiBhIG11bHRpLXRocmVhZCBzYWZlIHdheSBieSB0aGUgQVBJIGlmCisgKiB0aGUgaGFuZGxlIGlzIDAuICBUaGUgY29tbW9ubHkgZXhwZWN0ZWQgaWRpb20gaXMgb25lIHN0YXRpYyBoYW5kbGUgdG8KKyAqIGlkZW50aWZ5IGEgc2l0ZSBvciB0YXNrLiAgSWYgYSBzaXRlIG9yIHRhc2sgb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeQorICogYmVlbiBzdGFydGVkIGR1cmluZyB0aGlzIGNvbGxlY3Rpb24sIHRoZSBzYW1lIGhhbmRsZSBNQVkgYmUgcmV0dXJuZWQsCisgKiBidXQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIC0gaXQgaXMgdW5zcGVjaWZpZWQgaWYgZGF0YSBtZXJnaW5nIGlzIGRvbmUKKyAqIGJhc2VkIG9uIG5hbWUuICBUaGVzZSByb3V0aW5lcyBhbHNvIHRha2UgYW4gaW5zdGFuY2UgdmFyaWFibGUuICBMaWtlCisgKiB0aGUgbGV4aWNhbCBpbnN0YW5jZSwgdGhlc2UgbXVzdCBiZSAwIGluaXRpYWxpemVkLiAgVW5saWtlIHRoZSBsZXhpY2FsCisgKiBpbnN0YW5jZSwgdGhpcyBpcyB1c2VkIHRvIHRyYWNrIGEgc2luZ2xlIGR5bmFtaWMgaW5zdGFuY2UuCisgKgorICogQVBJIHVzZWQgYnkgdGhlIEludGVsKFIpIFBhcmFsbGVsIEFkdmlzb3IgdG8gZGVzY3JpYmUgcG90ZW50aWFsIGNvbmN1cnJlbmN5CisgKiBhbmQgcmVsYXRlZCBhY3Rpdml0aWVzLiBVc2VyLWFkZGVkIHNvdXJjZSBhbm5vdGF0aW9ucyBleHBhbmQgdG8gY2FsbHMKKyAqIHRvIHRoZXNlIHByb2NlZHVyZXMgdG8gZW5hYmxlIG1vZGVsaW5nIG9mIGEgaHlwb3RoZXRpY2FsIGNvbmN1cnJlbnQKKyAqIGV4ZWN1dGlvbiBzZXJpYWxseS4KKyAqIEB7CisgKi8KKyNpZiAhZGVmaW5lZChfQURWSVNPUl9BTk5PVEFURV9IXykgfHwgZGVmaW5lZChBTk5PVEFURV9FWFBBTkRfTlVMTCkKKwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF9zaXRlOyAgICAgICAgICAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGxleGljYWwgc2l0ZSAgICAgKi8KK3R5cGVkZWYgdm9pZCogX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZTsgICAgLyohPCBAYnJpZWYgaGFuZGxlIGZvciBkeW5hbWljIGluc3RhbmNlICovCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3Rhc2s7ICAgICAgICAgICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgbGV4aWNhbCBzaXRlICAgICAqLwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlOyAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGR5bmFtaWMgaW5zdGFuY2UgKi8KKworLyoqCisgKiBAZW51bSBfX2l0dF9tb2RlbF9kaXNhYmxlCisgKiBAYnJpZWYgRW51bWVyYXRvciBmb3IgdGhlIGRpc2FibGUgbWV0aG9kcworICovCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X21vZGVsX2Rpc2FibGVfb2JzZXJ2YXRpb24sCisgICAgX19pdHRfbW9kZWxfZGlzYWJsZV9jb2xsZWN0aW9uCit9IF9faXR0X21vZGVsX2Rpc2FibGU7CisKKyNlbmRpZiAvKiAhX0FEVklTT1JfQU5OT1RBVEVfSF8gfHwgQU5OT1RBVEVfRVhQQU5EX05VTEwgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfU0lURV9CRUdJTi9BTk5PVEFURV9TSVRFX0VORCBzdXBwb3J0LgorICoKKyAqIHNpdGVfYmVnaW4vZW5kIG1vZGVsIGEgcG90ZW50aWFsIGNvbmN1cnJlbmN5IHNpdGUuCisgKiBzaXRlIGluc3RhbmNlcyBtYXkgYmUgcmVjdXJzaXZlbHkgbmVzdGVkIHdpdGggdGhlbXNlbHZlcy4KKyAqIHNpdGVfZW5kIGV4aXRzIHRoZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQgYnV0IHVuZW5kZWQgc2l0ZSBmb3IgdGhlIGN1cnJlbnQKKyAqIHRocmVhZC4gIFRoZSBoYW5kbGUgcGFzc2VkIHRvIGVuZCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBzdHJ1Y3R1cmUuCisgKiBJbnN0YW5jZXMgb2YgYSBzaXRlIGVuY291bnRlcmVkIG9uIGRpZmZlcmVudCB0aHJlYWRzIGNvbmN1cnJlbnRseQorICogYXJlIGNvbnNpZGVyZWQgY29tcGxldGVseSBkaXN0aW5jdC4gSWYgdGhlIHNpdGUgbmFtZSBmb3IgdHdvIGRpZmZlcmVudAorICogbGV4aWNhbCBzaXRlcyBtYXRjaCwgaXQgaXMgdW5zcGVjaWZpZWQgd2hldGhlciB0aGV5IGFyZSB0cmVhdGVkIGFzIHRoZQorICogc2FtZSBvciBkaWZmZXJlbnQgZm9yIGRhdGEgcHJlc2VudGF0aW9uLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2VuZGlmCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l0ZU5hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9lbmQgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luLCAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5XLCAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2VuZGlmCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQSwgIChjb25zdCBjaGFyICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l0ZU5hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmQsICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZF8yLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW4pCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpblcpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9iZWdpblcpCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkEgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpbkFMKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2VuZCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2VuZF8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yX3B0ciAgICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2VuZF8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbihzaXRlLCBpbnN0YW5jZSwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbl9wdHIgIDAKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbldfcHRyICAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkEobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTChuYW1lLCBzaXRlTmFtZUxlbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZChzaXRlLCBpbnN0YW5jZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfMigpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yX3B0ciAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX1RBU0tfQkVHSU4vQU5OT1RBVEVfVEFTS19FTkQgc3VwcG9ydAorICoKKyAqIHRhc2tfYmVnaW4vZW5kIG1vZGVsIGEgcG90ZW50aWFsIHRhc2ssIHdoaWNoIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG1vc3QKKyAqIGNsb3NlbHkgZW5jbG9zaW5nIGR5bmFtaWMgc2l0ZS4gIHRhc2tfZW5kIGV4aXRzIHRoZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQKKyAqIGJ1dCB1bmVuZGVkIHRhc2suICBUaGUgaGFuZGxlIHBhc3NlZCB0byBlbmQgbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUKKyAqIHN0cnVjdHVyZS4gIEl0IGlzIHVuc3BlY2lmaWVkIGlmIGJhZCBkeW5hbWljIG5lc3RpbmcgaXMgZGV0ZWN0ZWQuICBJZiBpdAorICogaXMsIGl0IHNob3VsZCBiZSBlbmNvZGVkIGluIHRoZSByZXN1bHRpbmcgZGF0YSBjb2xsZWN0aW9uLiAgVGhlIGNvbGxlY3RvcgorICogc2hvdWxkIG5vdCBmYWlsIGR1ZSB0byBjb25zdHJ1Y3QgbmVzdGluZyBpc3N1ZXMsIG5vciBhdHRlbXB0IHRvIGRpcmVjdGx5CisgKiBpbmRpY2F0ZSB0aGUgcHJvYmxlbS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19iZWdpbihfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNlbmRpZgordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19iZWdpbkEoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUwoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHRhc2tOYW1lTGVuKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHRhc2tOYW1lTGVuKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfZW5kICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19lbmRfMih2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbiwgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSkpCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luVywgIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2VuZGlmCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQSwgIChjb25zdCBjaGFyICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19lbmQsICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZF8yLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW4pCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbldfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5XKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza1cgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tXX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9pdGVyYXRpb25fdGFza1cpCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkEgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbkEpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQSAgICBJVFROT1RJRllfVk9JRChtb2RlbF9pdGVyYXRpb25fdGFza0EpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaXRlcmF0aW9uX3Rhc2tBKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2VuZCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2VuZF8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yX3B0ciAgICBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2VuZF8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbih0YXNrLCBpbnN0YW5jZSwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbl9wdHIgIDAKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpblcobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbldfcHRyICAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkEobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTChuYW1lLCBzaXRlTmFtZUxlbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0EobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZCh0YXNrLCBpbnN0YW5jZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMigpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgMAorI2VuZGlmCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQV9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfTE9DS19BQ1FVSVJFL0FOTk9UQVRFX0xPQ0tfUkVMRUFTRSBzdXBwb3J0CisgKgorICogbG9ja19hY3F1aXJlL3JlbGVhc2UgbW9kZWwgYSBwb3RlbnRpYWwgbG9jayBmb3IgYm90aCBsb2Nrc2V0IGFuZAorICogcGVyZm9ybWFuY2UgbW9kZWxpbmcuICBFYWNoIHVuaXF1ZSBhZGRyZXNzIGlzIG1vZGVsZWQgYXMgYSBzZXBhcmF0ZQorICogbG9jaywgd2l0aCBpbnZhbGlkIGFkZHJlc3NlcyBiZWluZyB2YWxpZCBsb2NrIElEcy4gIFNwZWNpZmljYWxseToKKyAqIG5vIHN0b3JhZ2UgaXMgYWNjZXNzZWQgYnkgdGhlIEFQSSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgLSBpdCBpcyBvbmx5CisgKiB1c2VkIGZvciBsb2NrIGlkZW50aWZpY2F0aW9uLiAgTG9jayBhY3F1aXJlcyBtYXkgYmUgc2VsZi1uZXN0ZWQgYW5kIGFyZQorICogdW5sb2NrZWQgYnkgYSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiByZWxlYXNlcy4KKyAqIChUaGVzZSBjbG9zZWx5IGNvcnJlc3BvbmQgdG8gX19pdHRfc3luY19hY3F1aXJlZC9fX2l0dF9zeW5jX3JlbGVhc2luZywKKyAqIGJ1dCBtYXkgbm90IGhhdmUgaWRlbnRpY2FsIHNlbWFudGljcy4pCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZSh2b2lkICpsb2NrKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzIodm9pZCAqbG9jayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZSwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlXzIsICh2b2lkICpsb2NrKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZSwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlXzIsICh2b2lkICpsb2NrKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX2FjcXVpcmUpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfbG9ja19hY3F1aXJlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfbG9ja19hY3F1aXJlXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX2FjcXVpcmVfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX3JlbGVhc2UpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfbG9ja19yZWxlYXNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfbG9ja19yZWxlYXNlXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX3JlbGVhc2VfMikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZShsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzIobG9jaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzJfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMihsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMl9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfUkVDT1JEX0FMTE9DQVRJT04vQU5OT1RBVEVfUkVDT1JEX0RFQUxMT0NBVElPTiBzdXBwb3J0CisgKgorICogcmVjb3JkX2FsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGRlc2NyaWJlIHVzZXItZGVmaW5lZCBtZW1vcnkgYWxsb2NhdG9yCisgKiBiZWhhdmlvciwgd2hpY2ggbWF5IGJlIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcyBtb2RlbGluZyB0byB1bmRlcnN0YW5kCisgKiB3aGVuIHN0b3JhZ2UgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGFjdHVhbGx5IHJldXNlZCBhY3Jvc3MgdGhyZWFkcy4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24gICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb25fcHRyICAgSVRUTk9USUZZX05BTUUobW9kZWxfcmVjb3JkX2FsbG9jYXRpb24pCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24gICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24pCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb25fcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbihhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbl9wdHIgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24oYWRkcikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9JTkRVQ1RJT05fVVNFUyBzdXBwb3J0CisgKgorICogTm90ZSBwYXJ0aWN1bGFyIHN0b3JhZ2UgaXMgaW5kdWN0aXZlIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzaXRlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaW5kdWN0aW9uX3VzZXMsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9pbmR1Y3Rpb25fdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2luZHVjdGlvbl91c2VzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXMoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfUkVEVUNUSU9OX1VTRVMgc3VwcG9ydAorICoKKyAqIE5vdGUgcGFydGljdWxhciBzdG9yYWdlIGlzIHVzZWQgZm9yIHJlZHVjdGlvbiB0aHJvdWdoIHRoZSBlbmQKKyAqIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXModm9pZCogYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlZHVjdGlvbl91c2VzKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfcmVkdWN0aW9uX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyhhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9PQlNFUlZFX1VTRVMgc3VwcG9ydAorICoKKyAqIEhhdmUgY29ycmVjdG5lc3MgbW9kZWxpbmcgcmVjb3JkIG9ic2VydmF0aW9ucyBhYm91dCB1c2VzIG9mIHN0b3JhZ2UKKyAqIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzaXRlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX29ic2VydmVfdXNlcyh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX29ic2VydmVfdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9vYnNlcnZlX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX29ic2VydmVfdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfb2JzZXJ2ZV91c2VzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX29ic2VydmVfdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfQ0xFQVJfVVNFUyBzdXBwb3J0CisgKgorICogQ2xlYXIgdGhlIHNwZWNpYWwgaGFuZGxpbmcgb2YgYSBwaWVjZSBvZiBzdG9yYWdlIHJlbGF0ZWQgdG8gaW5kdWN0aW9uLAorICogcmVkdWN0aW9uIG9yIG9ic2VydmVfdXNlcworICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9jbGVhcl91c2VzLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2NsZWFyX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2NsZWFyX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzKGFkZHIpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX0RJU0FCTEVfKl9QVVNIL0FOTk9UQVRFX0RJU0FCTEVfKl9QT1Agc3VwcG9ydAorICoKKyAqIGRpc2FibGVfcHVzaC9kaXNhYmxlX3BvcCBwdXNoIGFuZCBwb3AgZGlzYWJsaW5nIGJhc2VkIG9uIGEgcGFyYW1ldGVyLgorICogRGlzYWJsaW5nIG9ic2VydmF0aW9ucyBzdG9wcyBwcm9jZXNzaW5nIG9mIG1lbW9yeSByZWZlcmVuY2VzIGR1cmluZworICogY29ycmVjdG5lc3MgbW9kZWxpbmcsIGFuZCBhbGwgYW5ub3RhdGlvbnMgdGhhdCBvY2N1ciBpbiB0aGUgZGlzYWJsZWQKKyAqIHJlZ2lvbi4gIFRoaXMgYWxsb3dzIGRlc2NyaXB0aW9uIG9mIGNvZGUgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBoYW5kbGVkCisgKiBzcGVjaWFsbHkgZHVyaW5nIGNvbnZlcnNpb24gdG8gcGFyYWxsZWxpc20gb3IgdGhhdCBpcyBub3QgcmVjb2duaXplZAorICogYnkgdG9vbHMgKGUuZy4gc29tZSBraW5kcyBvZiBzeW5jaHJvbml6YXRpb24gb3BlcmF0aW9ucy4pCisgKiBUaGlzIG1lY2hhbmlzbSBjYXVzZXMgYWxsIGFubm90YXRpb25zIGluIHRoZSBkaXNhYmxlZCByZWdpb24sIG90aGVyCisgKiB0aGFuIGRpc2FibGVfcHVzaCBhbmQgZGlzYWJsZV9wb3AsIHRvIGJlIGlnbm9yZWQuICAoRm9yIGV4YW1wbGUsIHRoaXMKKyAqIG1pZ2h0IHZhbGlkbHkgYmUgdXNlZCB0byBkaXNhYmxlIGFuIGVudGlyZSBwYXJhbGxlbCBzaXRlIGFuZCB0aGUgY29udGFpbmVkCisgKiB0YXNrcyBhbmQgbG9ja2luZyBpbiBpdCBmb3IgZGF0YSBjb2xsZWN0aW9uIHB1cnBvc2VzLikKKyAqIFRoZSBkaXNhYmxlIGZvciBjb2xsZWN0aW9uIGlzIGEgbW9yZSBleHBlbnNpdmUgb3BlcmF0aW9uLCBidXQgcmVkdWNlcworICogY29sbGVjdG9yIG92ZXJoZWFkIHNpZ25pZmljYW50bHkuICBUaGlzIGFwcGxpZXMgdG8gQk9USCBjb3JyZWN0bmVzcyBkYXRhCisgKiBjb2xsZWN0aW9uIGFuZCBwZXJmb3JtYW5jZSBkYXRhIGNvbGxlY3Rpb24uICBGb3IgZXhhbXBsZSwgYSBzaXRlCisgKiBjb250YWluaW5nIGEgdGFzayBtaWdodCBvbmx5IGVuYWJsZSBkYXRhIGNvbGxlY3Rpb24gZm9yIHRoZSBmaXJzdCAxMAorICogaXRlcmF0aW9ucy4gIEJvdGggcGVyZm9ybWFuY2UgYW5kIGNvcnJlY3RuZXNzIGRhdGEgc2hvdWxkIHJlZmxlY3QgdGhpcywKKyAqIGFuZCB0aGUgcHJvZ3JhbSBzaG91bGQgcnVuIGFzIGNsb3NlIHRvIGZ1bGwgc3BlZWQgYXMgcG9zc2libGUgd2hlbgorICogY29sbGVjdGlvbiBpcyBkaXNhYmxlZC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoKF9faXR0X21vZGVsX2Rpc2FibGUgeCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCh2b2lkKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrKHNpemVfdCB4KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wdXNoLCAoX19pdHRfbW9kZWxfZGlzYWJsZSB4KSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcG9wLCAgKHZvaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfYWdncmVnYXRlX3Rhc2ssIChzaXplX3QgeCkpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaCAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfZGlzYWJsZV9wdXNoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2hfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2Rpc2FibGVfcHVzaCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3AgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9kaXNhYmxlX3BvcCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3BfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9kaXNhYmxlX3BvcCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2sgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9hZ2dyZWdhdGVfdGFzaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2tfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9hZ2dyZWdhdGVfdGFzaykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaCh4KQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2hfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3AoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFzayh4KQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IG1vZGVsIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGhlYXAgSGVhcAorICogQGluZ3JvdXAgcHVibGljCisgKiBIZWFwIGdyb3VwCisgKiBAeworICovCisKK3R5cGVkZWYgdm9pZCogX19pdHRfaGVhcF9mdW5jdGlvbjsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGFuIGlkZW50aWZpY2F0aW9uIGZvciBoZWFwIGZ1bmN0aW9uCisgKiBAcmV0dXJuIG5vbi16ZXJvIGlkZW50aWZpZXIgb3IgTlVMTAorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9oZWFwX2Z1bmN0aW9uIElUVEFQSSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEoY29uc3QgY2hhciogICAgbmFtZSwgY29uc3QgY2hhciogICAgZG9tYWluKTsKK19faXR0X2hlYXBfZnVuY3Rpb24gSVRUQVBJIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlVyhjb25zdCB3Y2hhcl90KiBuYW1lLCBjb25zdCB3Y2hhcl90KiBkb21haW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGUgICAgIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfaGVhcF9mdW5jdGlvbiBJVFRBUEkgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGUoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZG9tYWluKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEsIChjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90KiBuYW1lLCBjb25zdCB3Y2hhcl90KiBkb21haW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIChjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGhlYXBfZnVuY3Rpb25fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGhlYXBfZnVuY3Rpb25fY3JlYXRlKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBKG5hbWUsIGRvbWFpbikgKF9faXR0X2hlYXBfZnVuY3Rpb24pMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXKG5hbWUsIGRvbWFpbikgKF9faXR0X2hlYXBfZnVuY3Rpb24pMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZShuYW1lLCBkb21haW4pICAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGFsbG9jYXRpb24gYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbihfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2FsbG9jYXRlX2JlZ2luLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9hbGxvY2F0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9hbGxvY2F0ZV9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW4oaCwgc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gYWxsb2NhdGlvbiBlbmQgb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfZW5kLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2FsbG9jYXRlX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfYWxsb2NhdGVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQoaCwgYWRkciwgc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBmcmVlIGJlZ2luIG9jY3VycmVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfZnJlZV9iZWdpbihfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGhlYXBfZnJlZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ZyZWVfYmVnaW4pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW4oaCwgYWRkcikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2JlZ2luX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZnJlZSBlbmQgb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9mcmVlX2VuZChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfZW5kLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9mcmVlX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9mcmVlX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9lbmQoaCwgYWRkcikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiByZWFsbG9jYXRpb24gYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlYWxsb2NhdGVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9yZWFsbG9jYXRlX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luKGgsIGFkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gcmVhbGxvY2F0aW9uIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIsIHZvaWQqKiBuZXdfYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlYWxsb2NhdGVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlYWxsb2NhdGVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2VuZChoLCBhZGRyLCBuZXdfYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBpbnRlcm5hbCBhY2Nlc3MgYmVnaW4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgaW50ZXJuYWwgYWNjZXNzIGVuZCAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVjb3JkIG1lbW9yeSBncm93dGggYmVnaW4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4odm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sICAodm9pZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4oKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luX3B0ciAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVjb3JkIG1lbW9yeSBncm93dGggZW5kICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCgpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU3BlY2lmeSB0aGUgdHlwZSBvZiBoZWFwIGRldGVjdGlvbi9yZXBvcnRpbmcgdG8gbW9kaWZ5LgorICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIgCisgKiBAYnJpZWYgUmVwb3J0IG9uIG1lbW9yeSBsZWFrcy4KKyAqLworI2RlZmluZSBfX2l0dF9oZWFwX2xlYWtzIDB4MDAwMDAwMDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyIAorICogQGJyaWVmIFJlcG9ydCBvbiBtZW1vcnkgZ3Jvd3RoLgorICovCisjZGVmaW5lIF9faXR0X2hlYXBfZ3Jvd3RoIDB4MDAwMDAwMDIKKworCisvKiogQGJyaWVmIGhlYXAgcmVzZXQgZGV0ZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbih1bnNpZ25lZCBpbnQgcmVzZXRfbWFzayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVzZXRfZGV0ZWN0aW9uLCAgKHVuc2lnbmVkIGludCByZXNldF9tYXNrKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb24gICAgICBJVFROT1RJRllfVk9JRChoZWFwX3Jlc2V0X2RldGVjdGlvbikKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX3Jlc2V0X2RldGVjdGlvbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVwb3J0ICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlY29yZCh1bnNpZ25lZCBpbnQgcmVjb3JkX21hc2spOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZCwgKHVuc2lnbmVkIGludCByZWNvcmRfbWFzaykpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlY29yZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfcmVjb3JkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmQoKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAfSBoZWFwIGdyb3VwICovCisvKiogQGVuZGNvbmQgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogQGRlZmdyb3VwIGRvbWFpbnMgRG9tYWlucworICogQGluZ3JvdXAgcHVibGljCisgKiBEb21haW5zIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9kb21haW4KK3sKKyAgICB2b2xhdGlsZSBpbnQgZmxhZ3M7IC8qITwgWmVybyBpZiBkaXNhYmxlZCwgbm9uLXplcm8gaWYgZW5hYmxlZC4gVGhlIG1lYW5pbmcgb2YgZGlmZmVyZW50IG5vbi16ZXJvIHZhbHVlcyBpcyByZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIGNvbnN0IGNoYXIqIG5hbWVBOyAgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIG5hbWVXOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBVTklDT0RFLiAqLworI2Vsc2UgIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICB2b2lkKiBuYW1lVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgaW50ICAgZXh0cmExOyAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgdm9pZCogZXh0cmEyOyAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgc3RydWN0IF9fX2l0dF9kb21haW4qIG5leHQ7Cit9IF9faXR0X2RvbWFpbjsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGRvbWFpbnMKKyAqIEBicmllZiBDcmVhdGUgYSBkb21haW4uCisgKiBDcmVhdGUgZG9tYWluIHVzaW5nIHNvbWUgZG9tYWluIG5hbWU6IHRoZSBVUkkgbmFtaW5nIHN0eWxlIGlzIHJlY29tbWVuZGVkLgorICogQmVjYXVzZSB0aGUgc2V0IG9mIGRvbWFpbnMgaXMgZXhwZWN0ZWQgdG8gYmUgc3RhdGljIG92ZXIgdGhlIGFwcGxpY2F0aW9uJ3MgCisgKiBleGVjdXRpb24gdGltZSwgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBkb21haW4uCisgKiBBbnkgZG9tYWluIGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzLCByZWdhcmRsZXNzIG9mCisgKiB3aGljaCB0aHJlYWQgY3JlYXRlZCB0aGUgZG9tYWluLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIG5hbWUgbmFtZSBvZiBkb21haW4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZG9tYWluKiBJVFRBUEkgX19pdHRfZG9tYWluX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSk7CitfX2l0dF9kb21haW4qIElUVEFQSSBfX2l0dF9kb21haW5fY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZSAgICAgX19pdHRfZG9tYWluX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlX3B0ciBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlICAgICBfX2l0dF9kb21haW5fY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2RvbWFpbiogSVRUQVBJIF9faXR0X2RvbWFpbl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShkb21haW5fY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQShuYW1lKSAoX19pdHRfZG9tYWluKikwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXKG5hbWUpIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlKG5hbWUpICAoX19pdHRfZG9tYWluKikwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZG9tYWlucyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBpZHMgSURzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIElEcyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfaWQKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgZDEsIGQyLCBkMzsKK30gX19pdHRfaWQ7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworc3RhdGljIGNvbnN0IF9faXR0X2lkIF9faXR0X251bGwgPSB7IDAsIDAsIDAgfTsKKworLyoqCisgKiBAaW5ncm91cCBpZHMKKyAqIEBicmllZiBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIGNyZWF0ZSBhbiBJRCB3aXRob3V0IGRvbWFpbiBjb250cm9sLgorICogQGJyaWVmIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBpbml0aWFsaXplIGFuIF9faXR0X2lkIHN0cnVjdHVyZS4KKyAqIEFmdGVyIHlvdSBtYWtlIHRoZSBJRCB3aXRoIHRoaXMgZnVuY3Rpb24sIHlvdSBzdGlsbCBtdXN0IGNyZWF0ZSBpdCB3aXRoIHRoZQorICogX19pdHRfaWRfY3JlYXRlIGZ1bmN0aW9uIGJlZm9yZSB1c2luZyB0aGUgSUQgdG8gaWRlbnRpZnkgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGFkZHIgVGhlIGFkZHJlc3Mgb2Ygb2JqZWN0OyBoaWdoIFFXT1JEIG9mIHRoZSBJRCB2YWx1ZS4KKyAqIEBwYXJhbVtpbl0gZXh0cmEgVGhlIGV4dHJhIGRhdGEgdG8gdW5pcXVlIGlkZW50aWZ5IG9iamVjdDsgbG93IFFXT1JEIG9mIHRoZSBJRCB2YWx1ZS4KKyAqLworCitJVFRfSU5MSU5FIF9faXR0X2lkIElUVEFQSSBfX2l0dF9pZF9tYWtlKHZvaWQqIGFkZHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBleHRyYSkgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIF9faXR0X2lkIElUVEFQSSBfX2l0dF9pZF9tYWtlKHZvaWQqIGFkZHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBleHRyYSkKK3sKKyAgICBfX2l0dF9pZCBpZCA9IF9faXR0X251bGw7CisgICAgaWQuZDEgPSAodW5zaWduZWQgbG9uZyBsb25nKSgodWludHB0cl90KWFkZHIpOworICAgIGlkLmQyID0gKHVuc2lnbmVkIGxvbmcgbG9uZylleHRyYTsKKyAgICBpZC5kMyA9ICh1bnNpZ25lZCBsb25nIGxvbmcpMDsgLyogUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAqLworICAgIHJldHVybiBpZDsKK30KKworLyoqCisgKiBAaW5ncm91cCBpZHMKKyAqIEBicmllZiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4KKyAqIFRoaXMgZXN0YWJsaXNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlmZXRpbWUgb2YgYW4gaW5zdGFuY2Ugb2YKKyAqIHRoZSBnaXZlbiBJRCBpbiB0aGUgdHJhY2UuIE9uY2UgdGhpcyBsaWZldGltZSBzdGFydHMsIHRoZSBJRAorICogY2FuIGJlIHVzZWQgdG8gdGFnIG5hbWVkIGVudGl0eSBpbnN0YW5jZXMgaW4gY2FsbHMgc3VjaCBhcworICogX19pdHRfdGFza19iZWdpbiwgYW5kIHRvIHNwZWNpZnkgcmVsYXRpb25zaGlwcyBhbW9uZworICogaWRlbnRpZmllZCBuYW1lZCBlbnRpdHkgaW5zdGFuY2VzLCB1c2luZyB0aGUgXHJlZiByZWxhdGlvbnMgQVBJcy4KKyAqIEluc3RhbmNlIElEcyBhcmUgbm90IGRvbWFpbiBzcGVjaWZpYyEKKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBJRCB0byBjcmVhdGUuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2lkX2NyZWF0ZShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpKQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGUoZCx4KSBJVFROT1RJRllfVk9JRF9EMShpZF9jcmVhdGUsZCx4KQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfcHRyICBJVFROT1RJRllfTkFNRShpZF9jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9pZF9jcmVhdGUoZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBpZHMKKyAqIEBicmllZiBEZXN0cm95IGFuIGluc3RhbmNlIG9mIGlkZW50aWZpZXIuCisgKiBUaGlzIGVuZHMgdGhlIGxpZmV0aW1lIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBnaXZlbiBJRCB2YWx1ZSBpbiB0aGUgdHJhY2UuCisgKiBBbnkgcmVsYXRpb25zaGlwcyB0aGF0IGFyZSBlc3RhYmxpc2hlZCBhZnRlciB0aGlzIGxpZmV0aW1lIGVuZHMgYXJlIGludmFsaWQuCisgKiBUaGlzIGNhbGwgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBnaXZlbiBJRCB2YWx1ZSBjYW4gYmUgcmV1c2VkIGZvciBhIGRpZmZlcmVudCAKKyAqIG5hbWVkIGVudGl0eSBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBJRCB0byBkZXN0cm95LgorICovCit2b2lkIElUVEFQSSBfX2l0dF9pZF9kZXN0cm95KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2Rlc3Ryb3ksIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpKQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95KGQseCkgSVRUTk9USUZZX1ZPSURfRDEoaWRfZGVzdHJveSxkLHgpCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfcHRyICBJVFROT1RJRllfTkFNRShpZF9kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveShkb21haW4saWQpCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gaWRzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGhhbmRsZXNzIFN0cmluZyBIYW5kbGVzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFN0cmluZyBIYW5kbGVzIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9zdHJpbmdfaGFuZGxlCit7CisgICAgY29uc3QgY2hhciogc3RyQTsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIHN0cmluZyBpbiBBU0NJSS4gKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgY29uc3Qgd2NoYXJfdCogc3RyVzsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIHN0cmluZyBpbiBVTklDT0RFLiAqLworI2Vsc2UgIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICB2b2lkKiBzdHJXOworI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICBpbnQgICBleHRyYTE7IC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgICovCisgICAgdm9pZCogZXh0cmEyOyAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICAqLworICAgIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZSogbmV4dDsKK30gX19pdHRfc3RyaW5nX2hhbmRsZTsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGhhbmRsZXMKKyAqIEBicmllZiBDcmVhdGUgYSBzdHJpbmcgaGFuZGxlLgorICogQ3JlYXRlIGFuZCByZXR1cm4gaGFuZGxlIHZhbHVlIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHN0cmluZy4KKyAqIENvbnNlY3V0aXZlIGNhbGxzIHRvIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlIHdpdGggdGhlIHNhbWUgbmFtZQorICogcmV0dXJuIHRoZSBzYW1lIHZhbHVlLiBCZWNhdXNlIHRoZSBzZXQgb2Ygc3RyaW5nIGhhbmRsZXMgaXMgZXhwZWN0ZWQgdG8gcmVtYWluCisgKiBzdGF0aWMgZHVyaW5nIHRoZSBhcHBsaWNhdGlvbidzIGV4ZWN1dGlvbiB0aW1lLCB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZGVzdHJveSBhIHN0cmluZyBoYW5kbGUuCisgKiBBbnkgc3RyaW5nIGhhbmRsZSBjYW4gYmUgYWNjZXNzZWQgYnkgYW55IHRocmVhZCBpbiB0aGUgcHJvY2VzcywgcmVnYXJkbGVzcyBvZiB3aGljaCB0aHJlYWQgY3JlYXRlZAorICogdGhlIHN0cmluZyBoYW5kbGUuIFRoaXMgY2FsbCBpcyB0aHJlYWQtc2FmZS4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgaW5wdXQgc3RyaW5nCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSk7CitfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSAgICAgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSAgICAgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKHN0cmluZ19oYW5kbGVfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKHN0cmluZ19oYW5kbGVfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUEobmFtZSkgKF9faXR0X3N0cmluZ19oYW5kbGUqKTAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVyhuYW1lKSAoX19pdHRfc3RyaW5nX2hhbmRsZSopMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZShuYW1lKSAgKF9faXR0X3N0cmluZ19oYW5kbGUqKTAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gaGFuZGxlcyBncm91cCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9faXR0X3RpbWVzdGFtcDsKKy8qKiBAZW5kY29uZCAqLworCitzdGF0aWMgY29uc3QgX19pdHRfdGltZXN0YW1wIF9faXR0X3RpbWVzdGFtcF9ub25lID0gKF9faXR0X3RpbWVzdGFtcCktMUxMOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisKKy8qKgorICogQGluZ3JvdXAgdGltZXN0YW1wcworICogQGJyaWVmIFJldHVybiB0aW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBtb21lbnQuCisgKiBUaGlzIHJldHVybnMgdGhlIHRpbWVzdGFtcCBpbiB0aGUgZm9ybWF0IHRoYXQgaXMgdGhlIG1vc3QgcmVsZXZhbnQgZm9yIHRoZSBjdXJyZW50CisgKiBob3N0IG9yIHBsYXRmb3JtIChSRFRTQywgUVBDLCBhbmQgb3RoZXJzKS4gWW91IGNhbiB1c2UgdGhlICI8IiBvcGVyYXRvciB0bworICogY29tcGFyZSBfX2l0dF90aW1lc3RhbXAgdmFsdWVzLgorICovCitfX2l0dF90aW1lc3RhbXAgSVRUQVBJIF9faXR0X2dldF90aW1lc3RhbXAodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfdGltZXN0YW1wLCBnZXRfdGltZXN0YW1wLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXAgICAgICBJVFROT1RJRllfREFUQShnZXRfdGltZXN0YW1wKQorI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wX3B0ciAgSVRUTk9USUZZX05BTUUoZ2V0X3RpbWVzdGFtcCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXAoKQorI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRpbWVzdGFtcHMgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisKKy8qKgorICogQGRlZmdyb3VwIHJlZ2lvbnMgUmVnaW9ucworICogQGluZ3JvdXAgcHVibGljCisgKiBSZWdpb25zIGdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBpbmdyb3VwIHJlZ2lvbnMKKyAqIEBicmllZiBCZWdpbiBvZiByZWdpb24gaW5zdGFuY2UuCisgKiBTdWNjZXNzaXZlIGNhbGxzIHRvIF9faXR0X3JlZ2lvbl9iZWdpbiB3aXRoIHRoZSBzYW1lIElEIGFyZSBpZ25vcmVkCisgKiB1bnRpbCBhIGNhbGwgdG8gX19pdHRfcmVnaW9uX2VuZCB3aXRoIHRoZSBzYW1lIElECisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHJlZ2lvbiBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgcmVnaW9uIGluc3RhbmNlLiBNdXN0IG5vdCBiZSBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhlIHBhcmVudCBvZiB0aGlzIHJlZ2lvbiBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgcmVnaW9uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3JlZ2lvbl9iZWdpbihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCByZWdpb25zCisgKiBAYnJpZWYgRW5kIG9mIHJlZ2lvbiBpbnN0YW5jZS4KKyAqIFRoZSBmaXJzdCBjYWxsIHRvIF9faXR0X3JlZ2lvbl9lbmQgd2l0aCBhIGdpdmVuIElEIGVuZHMgdGhlCisgKiByZWdpb24uIFN1Y2Nlc3NpdmUgY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZCwgYXMgYXJlCisgKiBjYWxscyB0aGF0IGRvIG5vdCBoYXZlIGEgbWF0Y2hpbmcgX19pdHRfcmVnaW9uX2JlZ2luIGNhbGwuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHJlZ2lvbiBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgcmVnaW9uIGluc3RhbmNlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3JlZ2lvbl9lbmQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVnaW9uX2JlZ2luLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWdpb25fZW5kLCAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpKQorI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW4oZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDMocmVnaW9uX2JlZ2luLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbl9wdHIgICAgICBJVFROT1RJRllfTkFNRShyZWdpb25fYmVnaW4pCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmQoZCx4KSAgICAgICBJVFROT1RJRllfVk9JRF9EMShyZWdpb25fZW5kLGQseCkKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZF9wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKHJlZ2lvbl9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW4oZCx4LHkseikKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luX3B0ciAwCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmQoZCx4KQorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gcmVnaW9ucyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBmcmFtZXMgRnJhbWVzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEZyYW1lcyBhcmUgc2ltaWxhciB0byByZWdpb25zLCBidXQgYXJlIGludGVuZGVkIHRvIGJlIGVhc2llciB0byB1c2UgYW5kIHRvIGltcGxlbWVudC4KKyAqIEluIHBhcnRpY3VsYXI6CisgKiAtIEZyYW1lcyBhbHdheXMgcmVwcmVzZW50IHBlcmlvZHMgb2YgZWxhcHNlZCB0aW1lCisgKiAtIEJ5IGRlZmF1bHQsIGZyYW1lcyBoYXZlIG5vIG5lc3RpbmcgcmVsYXRpb25zaGlwcworICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIGZyYW1lcworICogQGJyaWVmIEJlZ2luIGEgZnJhbWUgaW5zdGFuY2UuCisgKiBTdWNjZXNzaXZlIGNhbGxzIHRvIF9faXR0X2ZyYW1lX2JlZ2luIHdpdGggdGhlCisgKiBzYW1lIElEIGFyZSBpZ25vcmVkIHVudGlsIGEgY2FsbCB0byBfX2l0dF9mcmFtZV9lbmQgd2l0aCB0aGUgc2FtZSBJRC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlIG9yIE5VTEwKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfYmVnaW5fdjMoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCk7CisKKy8qKgorICogQGluZ3JvdXAgZnJhbWVzCisgKiBAYnJpZWYgRW5kIGEgZnJhbWUgaW5zdGFuY2UuCisgKiBUaGUgZmlyc3QgY2FsbCB0byBfX2l0dF9mcmFtZV9lbmQgd2l0aCBhIGdpdmVuIElECisgKiBlbmRzIHRoZSBmcmFtZS4gU3VjY2Vzc2l2ZSBjYWxscyB3aXRoIHRoZSBzYW1lIElEIGFyZSBpZ25vcmVkLCBhcyBhcmUKKyAqIGNhbGxzIHRoYXQgZG8gbm90IGhhdmUgYSBtYXRjaGluZyBfX2l0dF9mcmFtZV9iZWdpbiBjYWxsLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2Ugb3IgTlVMTCBmb3IgY3VycmVudAorICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9lbmRfdjMoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCk7CisKKy8qKgorICogQGluZ3JvdXAgZnJhbWVzCisgKiBAYnJpZWYgU3VibWl0cyBhIGZyYW1lIGluc3RhbmNlLgorICogU3VjY2Vzc2l2ZSBjYWxscyB0byBfX2l0dF9mcmFtZV9iZWdpbiBvciBfX2l0dF9mcmFtZV9zdWJtaXQgd2l0aCB0aGUKKyAqIHNhbWUgSUQgYXJlIGlnbm9yZWQgdW50aWwgYSBjYWxsIHRvIF9faXR0X2ZyYW1lX2VuZCBvciBfX2l0dF9mcmFtZV9zdWJtaXQKKyAqIHdpdGggdGhlIHNhbWUgSUQuCisgKiBQYXNzaW5nIHNwZWNpYWwgX19pdHRfdGltZXN0YW1wX25vbmUgdmFsdWUgYXMgImVuZCIgYXJndW1lbnQgbWVhbnMKKyAqIHRha2UgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGFzIHRoZSBlbmQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2Ugb3IgTlVMTAorICogQHBhcmFtW2luXSBiZWdpbiBUaW1lc3RhbXAgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUKKyAqIEBwYXJhbVtpbl0gZW5kIFRpbWVzdGFtcCBvZiB0aGUgZW5kIG9mIHRoZSBmcmFtZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCwKKyAgICBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbl92MywgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZF92MywgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfc3VibWl0X3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCwgX19pdHRfdGltZXN0YW1wIGJlZ2luLCBfX2l0dF90aW1lc3RhbXAgZW5kKSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjMoZCx4KSAgICAgIElUVE5PVElGWV9WT0lEX0QxKGZyYW1lX2JlZ2luX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyICAgICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2JlZ2luX3YzKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjMoZCx4KSAgICAgICAgSVRUTk9USUZZX1ZPSURfRDEoZnJhbWVfZW5kX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgICAgICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2VuZF92MykKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzKGQseCxiLGUpIElUVE5PVElGWV9WT0lEX0QzKGZyYW1lX3N1Ym1pdF92MyxkLHgsYixlKQorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICAgICAgSVRUTk9USUZZX05BTUUoZnJhbWVfc3VibWl0X3YzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjMoZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjMoZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICAgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoZG9tYWluLGlkLGJlZ2luLGVuZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICAgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGZyYW1lcyBncm91cCAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlZmdyb3VwIHRhc2tncm91cCBUYXNrIEdyb3VwCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFRhc2sgR3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGluZ3JvdXAgdGFza19ncm91cHMKKyAqIEBicmllZiBEZW5vdGVzIGEgdGFza19ncm91cCBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfdGFza19ncm91cCB3aXRoIHRoZSBzYW1lIElEIGFyZSBpZ25vcmVkLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlLiBNdXN0IG5vdCBiZSBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFza19ncm91cAorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2dyb3VwKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2dyb3VwLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXAoZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDModGFza19ncm91cCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZ3JvdXApCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGFza2dyb3VwIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHRhc2tzIFRhc2tzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEEgdGFzayBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGllY2Ugb2Ygd29yayBwZXJmb3JtZWQgYnkgYSBwYXJ0aWN1bGFyCisgKiB0aHJlYWQgZm9yIGEgcGVyaW9kIG9mIHRpbWUuIEEgY2FsbCB0byBfX2l0dF90YXNrX2JlZ2luIGNyZWF0ZXMgYQorICogdGFzayBpbnN0YW5jZS4gVGhpcyBiZWNvbWVzIHRoZSBjdXJyZW50IGluc3RhbmNlIGZvciB0aGF0IHRhc2sgb24gdGhhdAorICogdGhyZWFkLiBBIGZvbGxvd2luZyBjYWxsIHRvIF9faXR0X3Rhc2tfZW5kIG9uIHRoZSBzYW1lIHRocmVhZCBlbmRzIHRoZQorICogaW5zdGFuY2UuIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBzaW11bHRhbmVvdXMgaW5zdGFuY2VzIG9mIHRhc2tzIHdpdGggdGhlCisgKiBzYW1lIG5hbWUgb24gZGlmZmVyZW50IHRocmVhZHMuIElmIGFuIElEIGlzIHNwZWNpZmllZCwgdGhlIHRhc2sgaW5zdGFuY2UKKyAqIHJlY2VpdmVzIHRoYXQgSUQuIE5lc3RlZCB0YXNrcyBhcmUgYWxsb3dlZC4KKyAqCisgKiBOb3RlOiBUaGUgdGFzayBpcyBkZWZpbmVkIGJ5IHRoZSBicmFja2V0aW5nIG9mIF9faXR0X3Rhc2tfYmVnaW4gYW5kCisgKiBfX2l0dF90YXNrX2VuZCBvbiB0aGUgc2FtZSB0aHJlYWQuIElmIHNvbWUgc2NoZWR1bGluZyBtZWNoYW5pc20gY2F1c2VzCisgKiB0YXNrIHN3aXRjaGluZyAodGhlIHRocmVhZCBleGVjdXRlcyBhIGRpZmZlcmVudCB1c2VyIHRhc2spIG9yIHRhc2sKKyAqIHN3aXRjaGluZyAodGhlIHVzZXIgdGFzayBzd2l0Y2hlcyB0byBhIGRpZmZlcmVudCB0aHJlYWQpIHRoZW4gdGhpcyBicmVha3MKKyAqIHRoZSBub3Rpb24gb2YgIGN1cnJlbnQgaW5zdGFuY2UuIEFkZGl0aW9uYWwgQVBJIGNhbGxzIGFyZSByZXF1aXJlZCB0bworICogZGVhbCB3aXRoIHRoYXQgcG9zc2liaWxpdHkuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyB0YXNrIGluc3RhbmNlIGJlbG9uZ3MsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UgKG1heSBiZSAwKQorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzayAobWF5IGJlIDApCisgKiBAcGFyYW1baW5dIGZuIFRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB5b3UgYXJlIHRyYWNpbmcKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9mbihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pOworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgRW5kIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4pOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbihkLHgseSx6KSAgICBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2JlZ2luLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2JlZ2luX2ZuLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9mbikKKyNkZWZpbmUgX19pdHRfdGFza19lbmQoZCkgICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMCh0YXNrX2VuZCxkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9wdHIgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbihkb21haW4saWQscGFyZW50aWQsbmFtZSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9wdHIgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuKGRvbWFpbixpZCxwYXJlbnRpZCxmbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9wdHIgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZChkb21haW4pCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX3B0ciAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfcHRyICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRhc2tzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGNvdW50ZXJzIENvdW50ZXJzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIENvdW50ZXJzIGFyZSB1c2VyLWRlZmluZWQgb2JqZWN0cyB3aXRoIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCisgKiB2YWx1ZS4gQ291bnRlciB2YWx1ZXMgYXJlIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4gQ291bnRlciB2YWx1ZXMKKyAqIGFyZSB0cmFja2VkIHBlci10aHJlYWQuIENvdW50ZXJzIGhhdmUgbmFtZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluCisgKiB0aGUgdG9vbHMuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgY291bnRlcnMKKyAqIEBicmllZiBJbmNyZW1lbnQgYSBjb3VudGVyIGJ5IG9uZS4KKyAqIFRoZSBmaXJzdCBjYWxsIHdpdGggYSBnaXZlbiBuYW1lIGNyZWF0ZXMgYSBjb3VudGVyIGJ5IHRoYXQgbmFtZSBhbmQgc2V0cyBpdHMKKyAqIHZhbHVlIHRvIHplcm8gb24gZXZlcnkgdGhyZWFkLiBTdWNjZXNzaXZlIGNhbGxzIGluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZQorICogb24gdGhlIHRocmVhZCBvbiB3aGljaCB0aGUgY2FsbCBpcyBpc3N1ZWQuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsLiBDb3VudGVyIG5hbWVzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljLgorICogICAgICAgICAgICBUaGUgZG9tYWluIGFyZ3VtZW50IGlzIHVzZWQgb25seSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBJIGNhbGxzLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjb3VudGVycworICogQGJyaWVmIEluY3JlbWVudCBhIGNvdW50ZXIgYnkgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiBkZWx0YS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwuIENvdW50ZXIgbmFtZXMgYXJlIG5vdCBkb21haW4gc3BlY2lmaWMuCisgKiAgICAgICAgICAgIFRoZSBkb21haW4gYXJndW1lbnQgaXMgdXNlZCBvbmx5IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEkgY2FsbHMuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbVtpbl0gZGVsdGEgVGhlIGFtb3VudCBieSB3aGljaCB0byBpbmNyZW1lbnQgdGhlIGNvdW50ZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX3YzLCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGFfdjMsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjMoZCx4KSAgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKGNvdW50ZXJfaW5jX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfaW5jX3YzKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92MyhkLHgseSkgSVRUTk9USUZZX1ZPSURfRDIoY291bnRlcl9pbmNfZGVsdGFfdjMsZCx4LHkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzX3B0ciAgICBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY19kZWx0YV92MykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzKGRvbWFpbixuYW1lKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192M19wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92Myhkb21haW4sbmFtZSxkZWx0YSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192M19wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92M19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGNvdW50ZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIG1hcmtlcnMgTWFya2VycworICogTWFya2VycyByZXByZXNlbnQgYSBzaW5nbGUgZGlzY3JlZXQgZXZlbnQgaW4gdGltZS4gTWFya2VycyBoYXZlIGEgc2NvcGUsCisgKiBkZXNjcmliZWQgYnkgYW4gZW51bWVyYXRlZCB0eXBlIF9faXR0X3Njb3BlLiBNYXJrZXJzIGFyZSBjcmVhdGVkIGJ5CisgKiB0aGUgQVBJIGNhbGwgX19pdHRfbWFya2VyLiBBIG1hcmtlciBpbnN0YW5jZSBjYW4gYmUgZ2l2ZW4gYW4gSUQgZm9yIHVzZSBpbgorICogYWRkaW5nIG1ldGFkYXRhLgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBEZXNjcmliZXMgdGhlIHNjb3BlIG9mIGFuIGV2ZW50IG9iamVjdCBpbiB0aGUgdHJhY2UuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIF9faXR0X3Njb3BlX3Vua25vd24gPSAwLAorICAgIF9faXR0X3Njb3BlX2dsb2JhbCwKKyAgICBfX2l0dF9zY29wZV90cmFja19ncm91cCwKKyAgICBfX2l0dF9zY29wZV90cmFjaywKKyAgICBfX2l0dF9zY29wZV90YXNrLAorICAgIF9faXR0X3Njb3BlX21hcmtlcgorfSBfX2l0dF9zY29wZTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV91bmtub3duICBfX2l0dF9zY29wZV91bmtub3duCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV9nbG9iYWwgICBfX2l0dF9zY29wZV9nbG9iYWwKKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX3Byb2Nlc3MgIF9faXR0X3Njb3BlX3RyYWNrX2dyb3VwCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV90aHJlYWQgICBfX2l0dF9zY29wZV90cmFjaworI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdGFzayAgICAgX19pdHRfc2NvcGVfdGFzaworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbWFya2VycworICogQGJyaWVmIENyZWF0ZSBhIG1hcmtlciBpbnN0YW5jZQorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBtYXJrZXIKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIG1hcmtlciBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBmb3IgdGhpcyBtYXJrZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbWFya2VyKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXIsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSkKKyNkZWZpbmUgX19pdHRfbWFya2VyKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKG1hcmtlcixkLHgseSx6KQorI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyICAgICAgSVRUTk9USUZZX05BTUUobWFya2VyKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyKGRvbWFpbixpZCxuYW1lLHNjb3BlKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBtYXJrZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIG1ldGFkYXRhIE1ldGFkYXRhCisgKiBUaGUgbWV0YWRhdGEgQVBJIGlzIHVzZWQgdG8gYXR0YWNoIGV4dHJhIGluZm9ybWF0aW9uIHRvIG5hbWVkCisgKiBlbnRpdGllcy4gTWV0YWRhdGEgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIGlkZW50aWZpZWQgbmFtZWQgZW50aXR5IGJ5IElELAorICogb3IgdG8gdGhlIGN1cnJlbnQgZW50aXR5ICh3aGljaCBpcyBhbHdheXMgYSB0YXNrKS4KKyAqCisgKiBDb25jZXB0dWFsbHkgbWV0YWRhdGEgaGFzIGEgdHlwZSAod2hhdCBraW5kIG9mIG1ldGFkYXRhKSwgYSBrZXkgKHRoZQorICogbmFtZSBvZiB0aGUgbWV0YWRhdGEpLCBhbmQgYSB2YWx1ZSAodGhlIGFjdHVhbCBkYXRhKS4gVGhlIGVuY29kaW5nIG9mCisgKiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEuCisgKgorICogVGhlIHR5cGUgb2YgbWV0YWRhdGEgaXMgc3BlY2lmaWVkIGJ5IGFuIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9tZXRkYXRhX3R5cGUuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBtZXRhZGF0YQorICovCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X21ldGFkYXRhX3Vua25vd24gPSAwLAorICAgIF9faXR0X21ldGFkYXRhX3U2NCwgICAgIC8qKjwgVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zNjQsICAgICAvKio8IFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3UzMiwgICAgIC8qKjwgVW5zaWduZWQgMzItYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zMzIsICAgICAvKio8IFNpZ25lZCAzMi1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3UxNiwgICAgIC8qKjwgVW5zaWduZWQgMTYtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zMTYsICAgICAvKio8IFNpZ25lZCAxNi1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX2Zsb2F0LCAgIC8qKjwgU2lnbmVkIDMyLWJpdCBmbG9hdGluZy1wb2ludCAqLworICAgIF9faXR0X21ldGFkYXRhX2RvdWJsZSAgIC8qKjwgU0lnbmVkIDY0LWJpdCBmbG9hdGluZy1wb2ludCAqLworfSBfX2l0dF9tZXRhZGF0YV90eXBlOworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBBZGQgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQsIG9yIF9faXR0X251bGwgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRhc2sKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiB0eXBlLiBJZiBjb3VudCA9PSAwLCBubyBtZXRhZGF0YSB3aWxsIGJlIGFkZGVkLgorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkKGQseCx5LHosYSxiKSBJVFROT1RJRllfVk9JRF9ENShtZXRhZGF0YV9hZGQsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfYWRkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkKGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIHN0cmluZyBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworICogQHBhcmFtW2luXSBrZXkgVGhlIG5hbWUgb2YgdGhlIG1ldGFkYXRhCisgKiBAcGFyYW1baW5dIGRhdGEgVGhlIG1ldGFkYXRhIGl0c2VsZgorICogQHBhcmFtW2luXSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcsIG9yIC0xIGlmIHRoZSBsZW5ndGggaXMgdW5rbm93biBidXQgdGhlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQgCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkICAgICBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyNlbmRpZgorCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkQSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZEEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZFcsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoZCx4LHkseixhKSAgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZCxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBKGQseCx5LHosYSkgCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBX3B0ciAwCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXKGQseCx5LHosYSkgCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZChkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQKKworICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisgCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gdHlwZS4gSWYgY291bnQgPT0gMCwgbm8gbWV0YWRhdGEgd2lsbCBiZSBhZGRlZC4KKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisqLwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEsYikgSVRUTk9USUZZX1ZPSURfRDUobWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBzdHJpbmcgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkCisKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisgKiBAcGFyYW1baW5dIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgb3IgLTEgaWYgdGhlIGxlbmd0aCBpcyB1bmtub3duIGJ1dCB0aGUgc3RyaW5nIGlzIG51bGwtdGVybWluYXRlZCAKKyovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlICAgICBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyNlbmRpZgorCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQShkLHgseSx6LGEpIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyhkLHgseSx6LGEpIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUoZCx4LHkseixhKSAgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciAgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEoZCx4LHkseixhKSAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyhkLHgseSx6LGEpIAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0ciAgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIgIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyICAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQH0gbWV0YWRhdGEgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcmVsYXRpb25zIFJlbGF0aW9ucworICogSW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzIGNhbiBiZSBleHBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCBvdGhlcgorICogaW5zdGFuY2VzIHVzaW5nIGluc3RhbmNlIElEcyBhbmQgdGhlIHJlbGF0aW9uc2hpcCBBUEkgY2FsbHMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIFRoZSBraW5kIG9mIHJlbGF0aW9uIGJldHdlZW4gdHdvIGluc3RhbmNlcyBpcyBzcGVjaWZpZWQgYnkgdGhlIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9yZWxhdGlvbi4KKyAqIFJlbGF0aW9ucyBiZXR3ZWVuIGluc3RhbmNlcyBjYW4gYmUgYWRkZWQgd2l0aCBhbiBBUEkgY2FsbC4gVGhlIHJlbGF0aW9uCisgKiBBUEkgdXNlcyBpbnN0YW5jZSBJRHMuIFJlbGF0aW9ucyBjYW4gYmUgYWRkZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBhY3R1YWwKKyAqIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBhbmQgcGVyc2lzdCBpbmRlcGVuZGVudGx5IG9mIHRoZSBpbnN0YW5jZXMuIFRoaXMKKyAqIGlzIHRoZSBtb3RpdmF0aW9uIGZvciBoYXZpbmcgZGlmZmVyZW50IGxpZmV0aW1lcyBmb3IgaW5zdGFuY2UgSURzIGFuZAorICogdGhlIGFjdHVhbCBpbnN0YW5jZXMuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIF9faXR0X3JlbGF0aW9uX2lzX3Vua25vd24gPSAwLAorICAgIF9faXR0X3JlbGF0aW9uX2lzX2RlcGVuZGVudF9vbiwgICAgICAgICAvKio8ICJBIGlzIGRlcGVuZGVudCBvbiBCIiBtZWFucyB0aGF0IEEgY2Fubm90IHN0YXJ0IHVudGlsIEIgY29tcGxldGVzICovCisgICAgX19pdHRfcmVsYXRpb25faXNfc2libGluZ19vZiwgICAgICAgICAgIC8qKjwgIkEgaXMgc2libGluZyBvZiBCIiBtZWFucyB0aGF0IEEgYW5kIEIgd2VyZSBjcmVhdGVkIGFzIGEgZ3JvdXAgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19wYXJlbnRfb2YsICAgICAgICAgICAgLyoqPCAiQSBpcyBwYXJlbnQgb2YgQiIgbWVhbnMgdGhhdCBBIGNyZWF0ZWQgQiAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX2NvbnRpbnVhdGlvbl9vZiwgICAgICAvKio8ICJBIGlzIGNvbnRpbnVhdGlvbiBvZiBCIiBtZWFucyB0aGF0IEEgYXNzdW1lcyB0aGUgZGVwZW5kZW5jaWVzIG9mIEIgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19jaGlsZF9vZiwgICAgICAgICAgICAgLyoqPCAiQSBpcyBjaGlsZCBvZiBCIiBtZWFucyB0aGF0IEEgd2FzIGNyZWF0ZWQgYnkgQiAoaW52ZXJzZSBvZiBpc19wYXJlbnRfb2YpICovCisgICAgX19pdHRfcmVsYXRpb25faXNfY29udGludWVkX2J5LCAgICAgICAgIC8qKjwgIkEgaXMgY29udGludWVkIGJ5IEIiIG1lYW5zIHRoYXQgQiBhc3N1bWVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgQSAoaW52ZXJzZSBvZiBpc19jb250aW51YXRpb25fb2YpICovCisgICAgX19pdHRfcmVsYXRpb25faXNfcHJlZGVjZXNzb3JfdG8gICAgICAgIC8qKjwgIkEgaXMgcHJlZGVjZXNzb3IgdG8gQiIgbWVhbnMgdGhhdCBCIGNhbm5vdCBzdGFydCB1bnRpbCBBIGNvbXBsZXRlcyAoaW52ZXJzZSBvZiBpc19kZXBlbmRlbnRfb24pICovCit9IF9faXR0X3JlbGF0aW9uOworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBUaGUgY3VycmVudCB0YXNrIGluc3RhbmNlIGlzIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbi4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqCisgKiBAaW5ncm91cCByZWxhdGlvbnMKKyAqIEBicmllZiBBZGQgYSByZWxhdGlvbiBiZXR3ZWVuIHR3byBpbnN0YW5jZSBpZGVudGlmaWVycy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGhlYWQgVGhlIElEIGZvciB0aGUgaGVhZCBvZiB0aGUgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkLCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChkLHgseSkgSVRUTk9USUZZX1ZPSURfRDIocmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsZCx4LHkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGRfdG9fY3VycmVudCkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkKGQseCx5LHopICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QzKHJlbGF0aW9uX2FkZCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocmVsYXRpb25fYWRkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQoZCx4LHkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZChkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSByZWxhdGlvbnMgZ3JvdXAgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2Nsb2NrX2luZm8KK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgY2xvY2tfZnJlcTsgLyohPCBDbG9jayBkb21haW4gZnJlcXVlbmN5ICovCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGNsb2NrX2Jhc2U7IC8qITwgQ2xvY2sgZG9tYWluIGJhc2UgdGltZXN0YW1wICovCit9IF9faXR0X2Nsb2NrX2luZm87CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIHZvaWQgKElUVEFQSSAqX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4pKF9faXR0X2Nsb2NrX2luZm8qIGNsb2NrX2luZm8sIHZvaWQqIGRhdGEpOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jbG9ja19kb21haW4KK3sKKyAgICBfX2l0dF9jbG9ja19pbmZvIGluZm87ICAgICAgLyohPCBNb3N0IHJlY2VudCBjbG9jayBkb21haW4gaW5mbyAqLworICAgIF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuOyAvKiE8IENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICB2b2lkKiBmbl9kYXRhOyAgICAgICAgICAgICAgLyohPCBJbnB1dCBhcmd1bWVudCBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgaW50ICAgZXh0cmExOyAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gKi8KKyAgICBzdHJ1Y3QgX19faXR0X2Nsb2NrX2RvbWFpbiogbmV4dDsKK30gX19pdHRfY2xvY2tfZG9tYWluOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW5zCisgKiBAYnJpZWYgQ3JlYXRlIGEgY2xvY2sgZG9tYWluLgorICogQ2VydGFpbiBhcHBsaWNhdGlvbnMgcmVxdWlyZSB0aGUgY2FwYWJpbGl0eSB0byB0cmFjZSB0aGVpciBhcHBsaWNhdGlvbiB1c2luZworICogYSBjbG9jayBkb21haW4gZGlmZmVyZW50IHRoYW4gdGhlIENQVSwgZm9yIGluc3RhbmNlIHRoZSBpbnN0cnVtZW50YXRpb24gb2YgZXZlbnRzCisgKiB0aGF0IG9jY3VyIG9uIGEgR1BVLgorICogQmVjYXVzZSB0aGUgc2V0IG9mIGRvbWFpbnMgaXMgZXhwZWN0ZWQgdG8gYmUgc3RhdGljIG92ZXIgdGhlIGFwcGxpY2F0aW9uJ3MgZXhlY3V0aW9uIHRpbWUsCisgKiB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZGVzdHJveSBhIGRvbWFpbi4KKyAqIEFueSBkb21haW4gY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGNyZWF0ZWQKKyAqIHRoZSBkb21haW4uIFRoaXMgY2FsbCBpcyB0aHJlYWQtc2FmZS4KKyAqIEBwYXJhbVtpbl0gZm4gQSBwb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggcmV0cmlldmVzIGFsdGVybmF0aXZlIENQVSB0aW1lc3RhbXBzCisgKiBAcGFyYW1baW5dIGZuX2RhdGEgQXJndW1lbnQgZm9yIGEgY2FsbGJhY2sgZnVuY3Rpb247IG1heSBiZSBOVUxMCisgKi8KK19faXR0X2Nsb2NrX2RvbWFpbiogSVRUQVBJIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUoX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm4sIHZvaWQqIGZuX2RhdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2Nsb2NrX2RvbWFpbiosIGNsb2NrX2RvbWFpbl9jcmVhdGUsIChfX2l0dF9nZXRfY2xvY2tfaW5mb19mbiBmbiwgdm9pZCogZm5fZGF0YSkpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGNsb2NrX2RvbWFpbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGNsb2NrX2RvbWFpbl9jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlKGZuLGZuX2RhdGEpIChfX2l0dF9jbG9ja19kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbnMKKyAqIEBicmllZiBSZWNhbGN1bGF0ZSBjbG9jayBkb21haW5zIGZyZXF1ZW5jZXMgYW5kIGNsb2NrIGJhc2UgdGltZXN0YW1wcy4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0KHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjbG9ja19kb21haW5fcmVzZXQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0ICAgICBJVFROT1RJRllfVk9JRChjbG9ja19kb21haW5fcmVzZXQpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9yZXNldF9wdHIgSVRUTk9USUZZX05BTUUoY2xvY2tfZG9tYWluX3Jlc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0KCkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4gVGhpcyBlc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWZldGltZSBvZgorICogYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIElEIGluIHRoZSB0cmFjZS4gT25jZSB0aGlzIGxpZmV0aW1lIHN0YXJ0cywgdGhlIElEIGNhbiBiZSB1c2VkIHRvCisgKiB0YWcgbmFtZWQgZW50aXR5IGluc3RhbmNlcyBpbiBjYWxscyBzdWNoIGFzIF9faXR0X3Rhc2tfYmVnaW4sIGFuZCB0byBzcGVjaWZ5IHJlbGF0aW9uc2hpcHMgYW1vbmcKKyAqIGlkZW50aWZpZWQgbmFtZWQgZW50aXR5IGluc3RhbmNlcywgdXNpbmcgdGhlIFxyZWYgcmVsYXRpb25zIEFQSXMuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gY3JlYXRlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9pZF9jcmVhdGVfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBEZXN0cm95IGFuIGluc3RhbmNlIG9mIGlkZW50aWZpZXIuIFRoaXMgZW5kcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlCisgKiBnaXZlbiBJRCB2YWx1ZSBpbiB0aGUgdHJhY2UuIEFueSByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIGVzdGFibGlzaGVkIGFmdGVyIHRoaXMgbGlmZXRpbWUgZW5kcyBhcmUKKyAqIGludmFsaWQuIFRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGdpdmVuIElEIHZhbHVlIGNhbiBiZSByZXVzZWQgZm9yIGEgZGlmZmVyZW50CisgKiBuYW1lZCBlbnRpdHkgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gZGVzdHJveS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfZGVzdHJveV9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlX2V4LCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveV9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpKQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXgoZCx4LHkseikgIElUVE5PVElGWV9WT0lEX0QzKGlkX2NyZWF0ZV9leCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgICAgIElUVE5PVElGWV9OQU1FKGlkX2NyZWF0ZV9leCkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leChkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhpZF9kZXN0cm95X2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXhfcHRyICAgICAgSVRUTk9USUZZX05BTUUoaWRfZGVzdHJveV9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCkKKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4X3B0ciAgICAwCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQpCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgdGFzayBpbnN0YW5jZSBiZWxvbmdzLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEJlZ2luIGEgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzaywgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBmbiBUaGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24geW91IGFyZSB0cmFjaW5nCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbik7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBFbmQgdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2VuZF9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXApOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2V4LCAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZm5fZXgsICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX2V4LCAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leChkLHgseSx6LGEsYikgICAgICBJVFROT1RJRllfVk9JRF9ENSh0YXNrX2JlZ2luX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoZCx4LHkseixhLGIpICAgSVRUTk9USUZZX1ZPSURfRDUodGFza19iZWdpbl9mbl9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX2ZuX2V4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leChkLHgseSkgICAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QyKHRhc2tfZW5kX2V4LGQseCx5KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leF9wdHIgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQscGFyZW50aWQsZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXhfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXApCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4X3B0ciAgICAgICAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXhfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXhfcHRyICAgICAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIG1hcmtlcnMKKyAqIEBicmllZiBDcmVhdGUgYSBtYXJrZXIgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIG1hcmtlcgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgbWFya2VyLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBmb3IgdGhpcyBtYXJrZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbWFya2VyX2V4KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1hcmtlcl9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSkpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leChkLHgseSx6LGEsYikgICAgSVRUTk9USUZZX1ZPSURfRDUobWFya2VyX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1hcmtlcl9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxuYW1lLHNjb3BlKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBUaGUgY3VycmVudCB0YXNrIGluc3RhbmNlIGlzIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbi4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gYmV0d2VlbiB0d28gaW5zdGFuY2UgaWRlbnRpZmllcnMuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoaXMgY2FsbAorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBoZWFkIFRoZSBJRCBmb3IgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX2V4KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF9leCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQocmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoZCx4LHkseixhLGIpICAgICAgICAgIElUVE5PVElGWV9WT0lEX0Q1KHJlbGF0aW9uX2FkZF9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX2V4X3B0ciAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtZSxyZWxhdGlvbix0YWlsKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaGVhZCxyZWxhdGlvbix0YWlsKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIGVudW0gX19faXR0X3RyYWNrX2dyb3VwX3R5cGUKK3sKKyAgICBfX2l0dF90cmFja19ncm91cF90eXBlX25vcm1hbCA9IDAKK30gX19pdHRfdHJhY2tfZ3JvdXBfdHlwZTsKKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdHJhY2tfZ3JvdXAKK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lOyAgICAgLyohPCBOYW1lIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIHN0cnVjdCBfX19pdHRfdHJhY2sqIHRyYWNrOyAgICAvKiE8IExpc3Qgb2YgY2hpbGQgdHJhY2tzICAgICovCisgICAgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0Z3R5cGU7IC8qITwgVHlwZSBvZiB0aGUgdHJhY2sgZ3JvdXAgKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgc3RydWN0IF9fX2l0dF90cmFja19ncm91cCogbmV4dDsKK30gX19pdHRfdHJhY2tfZ3JvdXA7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUGxhY2Vob2xkZXIgZm9yIGN1c3RvbSB0cmFjayB0eXBlcy4gQ3VycmVudGx5LCAibm9ybWFsIiBjdXN0b20gdHJhY2sKKyAqIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSB0cmFjayB0eXBlLgorICovCit0eXBlZGVmIGVudW0gX19faXR0X3RyYWNrX3R5cGUKK3sKKyAgICBfX2l0dF90cmFja190eXBlX25vcm1hbCA9IDAKKyNpZmRlZiBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyAgICAsIF9faXR0X3RyYWNrX3R5cGVfcXVldWUKKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUgKi8KK30gX19pdHRfdHJhY2tfdHlwZTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X3RyYWNrCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZTsgLyohPCBOYW1lIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIF9faXR0X3RyYWNrX2dyb3VwKiBncm91cDsgIC8qITwgUGFyZW50IGdyb3VwIHRvIGEgdHJhY2sgKi8KKyAgICBfX2l0dF90cmFja190eXBlIHR0eXBlOyAgICAvKiE8IFR5cGUgb2YgdGhlIHRyYWNrICAgICAgICovCisgICAgaW50ICAgZXh0cmExOyAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RyYWNrKiBuZXh0OworfSBfX2l0dF90cmFjazsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGUgbG9naWNhbCB0cmFjayBncm91cC4KKyAqLworX19pdHRfdHJhY2tfZ3JvdXAqIElUVEFQSSBfX2l0dF90cmFja19ncm91cF9jcmVhdGUoX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0cmFja19ncm91cF90eXBlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90cmFja19ncm91cCosIHRyYWNrX2dyb3VwX2NyZWF0ZSwgKF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdHJhY2tfZ3JvdXBfdHlwZSkpCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEodHJhY2tfZ3JvdXBfY3JlYXRlKQorI2RlZmluZSBfX2l0dF90cmFja19ncm91cF9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHRyYWNrX2dyb3VwX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZShuYW1lKSAgKF9faXR0X3RyYWNrX2dyb3VwKikwCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGUgbG9naWNhbCB0cmFjay4KKyAqLworX19pdHRfdHJhY2sqIElUVEFQSSBfX2l0dF90cmFja19jcmVhdGUoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja190eXBlIHRyYWNrX3R5cGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RyYWNrKiwgdHJhY2tfY3JlYXRlLCAoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSkpCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEodHJhY2tfY3JlYXRlKQorI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHRyYWNrX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZSh0cmFja19ncm91cCxuYW1lLHRyYWNrX3R5cGUpICAoX19pdHRfdHJhY2sqKTAKKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgbG9naWNhbCB0cmFjay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc2V0X3RyYWNrKF9faXR0X3RyYWNrKiB0cmFjayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHNldF90cmFjaywgKF9faXR0X3RyYWNrICp0cmFjaykpCisjZGVmaW5lIF9faXR0X3NldF90cmFjayAgICAgSVRUTk9USUZZX1ZPSUQoc2V0X3RyYWNrKQorI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIElUVE5PVElGWV9OQU1FKHNldF90cmFjaykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3NldF90cmFjayh0cmFjaykKKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisvKioKKyAqIEBkZWZncm91cCBldmVudHMgRXZlbnRzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEV2ZW50cyBncm91cAorICogQHsKKyAqLworLyoqIEBicmllZiB1c2VyIGV2ZW50IHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X2V2ZW50OworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gZXZlbnQgbm90aWZpY2F0aW9uCisgKiBAbm90ZSBuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbC9uYW1lIGFuZCBuYW1lbGVuIG5vdCBtYXRjaGluZywgdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkCisgKiBAcmV0dXJuIG5vbi16ZXJvIGV2ZW50IGlkZW50aWZpZXIgdXBvbiBzdWNjZXNzIGFuZCBfX2l0dF9lcnIgb3RoZXJ3aXNlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKTsKK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICBfX2l0dF9ldmVudF9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciBfX2l0dF9ldmVudF9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUEobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXKG5hbWUsIG5hbWVsZW4pIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUobmFtZSwgbmFtZWxlbikgIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBldmVudCBvY2N1cnJlbmNlLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9zdGFydChfX2l0dF9ldmVudCBldmVudCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBldmVudF9zdGFydCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X3N0YXJ0KQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfc3RhcnQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydChldmVudCkgKGludCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IGVuZCBvY2N1cnJlbmNlLgorICogQG5vdGUgSXQgaXMgb3B0aW9uYWwgaWYgZXZlbnRzIGRvIG5vdCBoYXZlIGR1cmF0aW9ucy4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAoaW52YWxpZCBldmVudCBpZC91c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQpCisgKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfZW5kKF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X2VuZCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kICAgICBJVFROT1RJRllfREFUQShldmVudF9lbmQpCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kKGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZXZlbnRzIGdyb3VwICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgYXJyYXlzIEFycmF5cyBWaXN1YWxpemVyCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFZpc3VhbGl6ZSBhcnJheXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZW51bSBfX2l0dF9hdl9kYXRhX3R5cGUKKyAqIEBicmllZiBEZWZpbmVzIHR5cGVzIG9mIGFycmF5cyBkYXRhIChmb3IgQy9DKysgaW50cmluc2ljIHR5cGVzKSAKKyAqLwordHlwZWRlZiBlbnVtIAoreworICAgIF9faXR0X2VfZmlyc3QgPSAwLAorICAgIF9faXR0X2VfY2hhciA9IDAsICAvKiAxLWJ5dGUgaW50ZWdlciAqLworICAgIF9faXR0X2VfdWNoYXIsICAgICAvKiAxLWJ5dGUgdW5zaWduZWQgaW50ZWdlciAqLworICAgIF9faXR0X2VfaW50MTYsICAgICAvKiAyLWJ5dGUgaW50ZWdlciAqLworICAgIF9faXR0X2VfdWludDE2LCAgICAvKiAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciAgKi8KKyAgICBfX2l0dF9lX2ludDMyLCAgICAgLyogNC1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQzMiwgICAgLyogNC1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2ludDY0LCAgICAgLyogOC1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQ2NCwgICAgLyogOC1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2Zsb2F0LCAgICAgLyogNC1ieXRlIGZsb2F0aW5nICovCisgICAgX19pdHRfZV9kb3VibGUsICAgIC8qIDgtYnl0ZSBmbG9hdGluZyAqLworICAgIF9faXR0X2VfbGFzdCA9IF9faXR0X2VfZG91YmxlCit9IF9faXR0X2F2X2RhdGFfdHlwZTsKKworLyoqCisgKiBAYnJpZWYgU2F2ZSBhbiBhcnJheSBkYXRhIHRvIGEgZmlsZS4KKyAqIE91dHB1dCBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgZmlsZSBleHRlbnNpb24uIFRoZSBjc3YgYW5kIGJtcCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgKGJtcCAtIGZvciAyLWRpbWVuc2lvbmFsIGFycmF5IG9ubHkpLgorICogQHBhcmFtW2luXSBkYXRhIC0gcG9pbnRlciB0byB0aGUgYXJyYXkgZGF0YQorICogQHBhcmFtW2luXSByYW5rIC0gdGhlIHJhbmsgb2YgdGhlIGFycmF5IAorICogQHBhcmFtW2luXSBkaW1lbnNpb25zIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBpbnRlZ2Vycywgd2hpY2ggc3BlY2lmaWVzIHRoZSBhcnJheSBkaW1lbnNpb25zLiAKKyAqIFRoZSBzaXplIG9mIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCB0byB0aGUgcmFuaworICogQHBhcmFtW2luXSB0eXBlIC0gdGhlIHR5cGUgb2YgdGhlIGFycmF5LCBzcGVjaWZpZWQgYXMgb25lIG9mIHRoZSBfX2l0dF9hdl9kYXRhX3R5cGUgdmFsdWVzIChmb3IgaW50cmluc2ljIHR5cGVzKQorICogQHBhcmFtW2luXSBmaWxlUGF0aCAtIHRoZSBmaWxlIHBhdGg7IHRoZSBvdXRwdXQgZm9ybWF0IGlzIGRlZmluZWQgYnkgdGhlIGZpbGUgZXh0ZW5zaW9uCisgKiBAcGFyYW1baW5dIGNvbHVtbk9yZGVyIC0gZGVmaW5lcyBob3cgdGhlIGFycmF5IGlzIHN0b3JlZCBpbiB0aGUgbGluZWFyIG1lbW9yeS4KKyAqIEl0IHNob3VsZCBiZSAxIGZvciBjb2x1bW4tbWFqb3Igb3JkZXIgKGUuZy4gaW4gRk9SVFJBTikgb3IgMCAtIGZvciByb3ctbWFqb3Igb3JkZXIgKGUuZy4gaW4gQykuCisgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IElUVEFQSSBfX2l0dF9hdl9zYXZlQSh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcik7CitpbnQgSVRUQVBJIF9faXR0X2F2X3NhdmVXKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCB3Y2hhcl90ICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZSAgICAgX19pdHRfYXZfc2F2ZVcKKyMgIGRlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciBfX2l0dF9hdl9zYXZlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9hdl9zYXZlICAgICBfX2l0dF9hdl9zYXZlQQorIyAgZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIF9faXR0X2F2X3NhdmVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBJVFRBUEkgX19pdHRfYXZfc2F2ZSh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBhdl9zYXZlQSwgKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKSkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBhdl9zYXZlVywgKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCB3Y2hhcl90ICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBhdl9zYXZlLCAgKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUEgICAgIElUVE5PVElGWV9EQVRBKGF2X3NhdmVBKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlQV9wdHIgSVRUTk9USUZZX05BTUUoYXZfc2F2ZUEpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXICAgICBJVFROT1RJRllfREFUQShhdl9zYXZlVykKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVdfcHRyIElUVE5PVElGWV9OQU1FKGF2X3NhdmVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2F2X3NhdmUgICAgIElUVE5PVElGWV9EQVRBKGF2X3NhdmUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIElUVE5PVElGWV9OQU1FKGF2X3NhdmUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9hdl9zYXZlQShuYW1lKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9hdl9zYXZlVyhuYW1lKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2F2X3NhdmUobmFtZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCit2b2lkIElUVEFQSSBfX2l0dF9lbmFibGVfYXR0YWNoKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBlbmFibGVfYXR0YWNoLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2ggICAgIElUVE5PVElGWV9WT0lEKGVuYWJsZV9hdHRhY2gpCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2hfcHRyIElUVE5PVElGWV9OQU1FKGVuYWJsZV9hdHRhY2gpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoKCkKKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKiogQH0gYXJyYXlzIGdyb3VwICovCisKKy8qKiBAZW5kY29uZCAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfSVRUTk9USUZZX0hfICovCisKKyNpZmRlZiBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKworI2lmbmRlZiBfSVRUTk9USUZZX1BSSVZBVEVfCisjZGVmaW5lIF9JVFROT1RJRllfUFJJVkFURV8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgQmVnaW4gYW4gb3ZlcmxhcHBlZCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrLgorICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgKmNhbm5vdCogYmUgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBvZiB0aGlzIHRhc2ssIG9yIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrLgorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWQoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQmVnaW4gYW4gb3ZlcmxhcHBlZCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCAqY2Fubm90KiBiZSBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzaywgb3IgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2suCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgRW5kIGFuIG92ZXJsYXBwZWQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSB0YXNraWQgRXhwbGljaXQgSUQgb2YgZmluaXNoZWQgdGFzaworICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCB0YXNraWQpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgRW5kIGFuIG92ZXJsYXBwZWQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSB0YXNraWQgRXhwbGljaXQgSUQgb2YgZmluaXNoZWQgdGFzaworICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9vdmVybGFwcGVkLCAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9vdmVybGFwcGVkX2V4LCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWQsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCB0YXNraWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZF9leCwgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQpKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWQoZCx4LHkseikgICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2JlZ2luX292ZXJsYXBwZWQsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX3B0ciAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9vdmVybGFwcGVkKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgoZCx4LHkseixhLGIpICAgICBJVFROT1RJRllfVk9JRF9ENSh0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leF9wdHIgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZChkLHgpICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDEodGFza19lbmRfb3ZlcmxhcHBlZCxkLHgpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kX292ZXJsYXBwZWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXgoZCx4LHkseikgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leF9wdHIgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19lbmRfb3ZlcmxhcHBlZF9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZChkb21haW4sdGFza2lkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9wdHIgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCx0YXNraWQscGFyZW50aWQsbmFtZSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4X3B0ciAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZChkb21haW4sdGFza2lkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX3B0ciAgICAgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLHRhc2tpZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leF9wdHIgICAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfcHRyICAgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXhfcHRyICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX3B0ciAgICAgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZWZncm91cCBtYWtyc19pbnRlcm5hbCBNYXJrcworICogQGluZ3JvdXAgaW50ZXJuYWwKKyAqIE1hcmtzIGdyb3VwCisgKiBAd2FybmluZyBJbnRlcm5hbCBBUEk6CisgKiAgIC0gSXQgaXMgbm90IHNoaXBwZWQgdG8gb3V0c2lkZSBvZiBJbnRlbAorICogICAtIEl0IGlzIGRlbGl2ZXJlZCB0byBpbnRlcm5hbCBJbnRlbCB0ZWFtcyB1c2luZyBlLW1haWwgb3IgU1ZOIGFjY2VzcyBvbmx5CisgKiBAeworICovCisvKiogQGJyaWVmIHVzZXIgbWFyayB0eXBlICovCit0eXBlZGVmIGludCBfX2l0dF9tYXJrX3R5cGU7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZXMgYSB1c2VyIG1hcmsgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB1c2luZyBjaGFyIG9yIFVuaWNvZGUgc3RyaW5nLgorICogQHBhcmFtW2luXSBuYW1lIC0gbmFtZSBvZiBtYXJrIHRvIGNyZWF0ZQorICogQHJldHVybiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBtYXJrIHR5cGUKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfbWFya190eXBlIElUVEFQSSBfX2l0dF9tYXJrX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSk7CitfX2l0dF9tYXJrX3R5cGUgSVRUQVBJIF9faXR0X21hcmtfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWFya19jcmVhdGUgICAgIF9faXR0X21hcmtfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlX3B0ciBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfbWFya19jcmVhdGUgICAgIF9faXR0X21hcmtfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlX3B0ciBfX2l0dF9tYXJrX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9tYXJrX3R5cGUgSVRUQVBJIF9faXR0X21hcmtfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSkpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGUsICAoY29uc3QgY2hhciAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEobWFya19jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShtYXJrX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUobWFya19jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlICAgICAgSVRUTk9USUZZX0RBVEEobWFya19jcmVhdGUpCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUobWFya19jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUEobmFtZSkgKF9faXR0X21hcmtfdHlwZSkwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVcobmFtZSkgKF9faXR0X21hcmtfdHlwZSkwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlKG5hbWUpICAoX19pdHRfbWFya190eXBlKTAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGEgImRpc2NyZXRlIiB1c2VyIG1hcmsgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB1c2luZyBjaGFyIG9yIFVuaWNvZGUgc3RyaW5nLgorICoKKyAqIC0gVGhlIG1hcmsgb2YgImRpc2NyZXRlIiB0eXBlIGlzIHBsYWNlZCB0byBjb2xsZWN0aW9uIHJlc3VsdHMgaW4gY2FzZSBvZiBzdWNjZXNzLiBJdCBhcHBlYXJzIGluIG92ZXJ0aW1lIHZpZXcocykgYXMgYSBzcGVjaWFsIHRpY2sgc2lnbi4KKyAqIC0gVGhlIGNhbGwgaXMgInN5bmNocm9ub3VzIiAtIGZ1bmN0aW9uIHJldHVybnMgYWZ0ZXIgbWFyayBpcyBhY3R1YWxseSBhZGRlZCB0byByZXN1bHRzLgorICogLSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHRvIG1hcmsgZGlmZmVyZW50IHBoYXNlcyBvZiBhcHBsaWNhdGlvbgorICogICAoYmVnaW5uaW5nIG9mIHRoZSBuZXh0IG1hcmsgYXV0b21hdGljYWxseSBtZWFuZCBlbmQgb2YgY3VycmVudCByZWdpb24pLgorICogLSBDYW4gYmUgdXNlZCB0b2dldGhlciB3aXRoICJjb250aW51b3VzIiBtYXJrcyAoc2VlIGJlbG93KSBhdCB0aGUgc2FtZSBjb2xsZWN0aW9uIHNlc3Npb24KKyAqIEBwYXJhbVtpbl0gbXQgLSBtYXJrLCBjcmVhdGVkIGJ5IF9faXR0X21hcmtfY3JlYXRlKGNvbnN0IGNoYXIqIG5hbWUpIGZ1bmN0aW9uCisgKiBAcGFyYW1baW5dIHBhcmFtZXRlciAtIHN0cmluZyBwYXJhbWV0ZXIgb2YgbWFyaworICogQHJldHVybiBSZXR1cm5zIHplcm8gdmFsdWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBub24temVybyB2YWx1ZSBvdGhlcndpc2UuCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBJVFRBUEkgX19pdHRfbWFya0EoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpOworaW50IElUVEFQSSBfX2l0dF9tYXJrVyhfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlcik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21hcmsgICAgIF9faXR0X21hcmtXCisjICBkZWZpbmUgX19pdHRfbWFya19wdHIgX19pdHRfbWFya1dfcHRyCisjZWxzZSAvKiBVTklDT0RFICAqLworIyAgZGVmaW5lIF9faXR0X21hcmsgICAgIF9faXR0X21hcmtBCisjICBkZWZpbmUgX19pdHRfbWFya19wdHIgX19pdHRfbWFya0FfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgSVRUQVBJIF9faXR0X21hcmsoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya0EsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlcikpCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya1csIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlcikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFyaywgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtBICAgICBJVFROT1RJRllfREFUQShtYXJrQSkKKyNkZWZpbmUgX19pdHRfbWFya0FfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtBKQorI2RlZmluZSBfX2l0dF9tYXJrVyAgICAgSVRUTk9USUZZX0RBVEEobWFya1cpCisjZGVmaW5lIF9faXR0X21hcmtXX3B0ciBJVFROT1RJRllfTkFNRShtYXJrVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrICAgICAgSVRUTk9USUZZX0RBVEEobWFyaykKKyNkZWZpbmUgX19pdHRfbWFya19wdHIgIElUVE5PVElGWV9OQU1FKG1hcmspCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrQShtdCwgcGFyYW1ldGVyKSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya0FfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya1cobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFyayhtdCwgcGFyYW1ldGVyKSAgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya0FfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya1dfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVc2UgdGhpcyBpZiBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgImRpc2NyZXRlIiB1c2VyIGV2ZW50IHR5cGUgKG1hcmspIGZvciBwcm9jZXNzCisgKiByYXRoZXIgdGhlbiBmb3Igb25lIHRocmVhZAorICogQHNlZSBpbnQgX19pdHRfbWFyayhfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIqIHBhcmFtZXRlcik7CisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBJVFRBUEkgX19pdHRfbWFya19nbG9iYWxBKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKTsKK2ludCBJVFRBUEkgX19pdHRfbWFya19nbG9iYWxXKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWwgICAgIF9faXR0X21hcmtfZ2xvYmFsVworIyAgZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyCisjZWxzZSAvKiBVTklDT0RFICAqLworIyAgZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsICAgICBfX2l0dF9tYXJrX2dsb2JhbEEKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgX19pdHRfbWFya19nbG9iYWxBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbEEsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlcikpCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19nbG9iYWxXLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsLCAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBICAgICBJVFROT1RJRllfREFUQShtYXJrX2dsb2JhbEEpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIgSVRUTk9USUZZX05BTUUobWFya19nbG9iYWxBKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFcgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsVykKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2dsb2JhbFcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWwgICAgICBJVFROT1RJRllfREFUQShtYXJrX2dsb2JhbCkKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyICBJVFROT1RJRllfTkFNRShtYXJrX2dsb2JhbCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQShtdCwgcGFyYW1ldGVyKSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsVyhtdCwgcGFyYW1ldGVyKSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWwobXQsIHBhcmFtZXRlcikgIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZXMgYW4gImVuZCIgcG9pbnQgZm9yICJjb250aW51b3VzIiBtYXJrIHdpdGggc3BlY2lmaWVkIG5hbWUuCisgKgorICogLSBSZXR1cm5zIHplcm8gdmFsdWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBub24temVybyB2YWx1ZSBvdGhlcndpc2UuCisgKiAgIEFsc28gcmV0dXJucyBub24temVybyB2YWx1ZSB3aGVuIHByZWNlZGluZyAiYmVnaW4iIHBvaW50IGZvciB0aGUKKyAqICAgbWFyayB3aXRoIHRoZSBzYW1lIG5hbWUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgb3Igbm90IGNyZWF0ZWQuCisgKiAtIFRoZSBtYXJrIG9mICJjb250aW51b3VzIiB0eXBlIGlzIHBsYWNlZCB0byBjb2xsZWN0aW9uIHJlc3VsdHMgaW4KKyAqICAgY2FzZSBvZiBzdWNjZXNzLiBJdCBhcHBlYXJzIGluIG92ZXJ0aW1lIHZpZXcocykgYXMgYSBzcGVjaWFsIHRpY2sKKyAqICAgc2lnbiAoZGlmZmVyZW50IGZyb20gImRpc2NyZXRlIiBtYXJrKSB0b2dldGhlciB3aXRoIGxpbmUgZnJvbQorICogICBjb3JyZXNwb25kaW5nICJiZWdpbiIgbWFyayB0byAiZW5kIiBtYXJrLgorICogQG5vdGUgQ29udGludW91cyBtYXJrcyBjYW4gb3ZlcmxhcCBhbmQgYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyLgorICogRGlzY3JldGUgbWFyayBjYW4gYmUgbmVzdGVkIGluc2lkZSBtYXJrZWQgcmVnaW9uCisgKiBAcGFyYW1baW5dIG10IC0gbWFyaywgY3JlYXRlZCBieSBfX2l0dF9tYXJrX2NyZWF0ZShjb25zdCBjaGFyKiBuYW1lKSBmdW5jdGlvbgorICogQHJldHVybiBSZXR1cm5zIHplcm8gdmFsdWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBub24temVybyB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBJVFRBUEkgX19pdHRfbWFya19vZmYoX19pdHRfbWFya190eXBlIG10KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfb2ZmLCAoX19pdHRfbWFya190eXBlIG10KSkKKyNkZWZpbmUgX19pdHRfbWFya19vZmYgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfb2ZmKQorI2RlZmluZSBfX2l0dF9tYXJrX29mZl9wdHIgSVRUTk9USUZZX05BTUUobWFya19vZmYpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tYXJrX29mZihtdCkgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWFya19vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVXNlIHRoaXMgaWYgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhbiAiZW5kIiBwb2ludCBmb3IgbWFyayBvZiBwcm9jZXNzCisgKiBAc2VlIGludCBfX2l0dF9tYXJrX29mZihfX2l0dF9tYXJrX3R5cGUgbXQpOworICovCitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsX29mZihfX2l0dF9tYXJrX3R5cGUgbXQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19nbG9iYWxfb2ZmLCAoX19pdHRfbWFya190eXBlIG10KSkKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfb2ZmICAgICBJVFROT1RJRllfREFUQShtYXJrX2dsb2JhbF9vZmYpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZl9wdHIgSVRUTk9USUZZX05BTUUobWFya19nbG9iYWxfb2ZmKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfb2ZmKG10KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfb2ZmX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfb2ZmX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbWFya3MgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgY291bnRlcnNfaW50ZXJuYWwgQ291bnRlcnMKKyAqIEBpbmdyb3VwIGludGVybmFsCisgKiBDb3VudGVycyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgb3BhcXVlIHN0cnVjdHVyZSBmb3IgY291bnRlciBpZGVudGlmaWNhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfY291bnRlciAqX19pdHRfY291bnRlcjsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGEgY291bnRlciB3aXRoIGdpdmVuIG5hbWUvZG9tYWluIGZvciB0aGUgY2FsbGluZyB0aHJlYWQKKyAqCisgKiBBZnRlciBfX2l0dF9jb3VudGVyX2NyZWF0ZSgpIGlzIGNhbGxlZCwgX19pdHRfY291bnRlcl9pbmMoKSAvIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhKCkgY2FuIGJlIHVzZWQKKyAqIHRvIGluY3JlbWVudCB0aGUgY291bnRlciBvbiBhbnkgdGhyZWFkCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2NvdW50ZXIgSVRUQVBJIF9faXR0X2NvdW50ZXJfY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pOworX19pdHRfY291bnRlciBJVFRBUEkgX19pdHRfY291bnRlcl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlICAgICBfX2l0dF9jb3VudGVyX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlICAgICBfX2l0dF9jb3VudGVyX2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgX19pdHRfY291bnRlcl9jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfY291bnRlciBJVFRBUEkgX19pdHRfY291bnRlcl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBjb25zdCB3Y2hhcl90ICpkb21haW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZSwgIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGNvdW50ZXJfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoY291bnRlcl9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoY291bnRlcl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQShuYW1lLCBkb21haW4pCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZVcobmFtZSwgZG9tYWluKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZShuYW1lLCBkb21haW4pCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgRGVzdHJveSB0aGUgY291bnRlciBpZGVudGlmaWVkIGJ5IHRoZSBwb2ludGVyIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgX19pdHRfY291bnRlcl9jcmVhdGUoKQorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3koX19pdHRfY291bnRlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfZGVzdHJveSwgKF9faXR0X2NvdW50ZXIgaWQpKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3kgICAgIElUVE5PVElGWV9WT0lEKGNvdW50ZXJfZGVzdHJveSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95X3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2Rlc3Ryb3kpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3koaWQpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBJbmNyZW1lbnQgdGhlIGNvdW50ZXIgdmFsdWUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9pbmMoX19pdHRfY291bnRlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jLCAoX19pdHRfY291bnRlciBpZCkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jICAgICBJVFROT1RJRllfVk9JRChjb3VudGVyX2luYykKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfaW5jKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmMoaWQpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgSW5jcmVtZW50IHRoZSBjb3VudGVyIHZhbHVlIHdpdGggeAorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2luY19kZWx0YShfX2l0dF9jb3VudGVyIGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YSwgKF9faXR0X2NvdW50ZXIgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhICAgICBJVFROT1RJRllfVk9JRChjb3VudGVyX2luY19kZWx0YSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfaW5jX2RlbHRhKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGEoaWQsIHZhbHVlKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gY291bnRlcnMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgc3RpdGNoIFN0YWNrIFN0aXRjaGluZworICogQGluZ3JvdXAgaW50ZXJuYWwKKyAqIFN0YWNrIFN0aXRjaGluZyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgb3BhcXVlIHN0cnVjdHVyZSBmb3IgY291bnRlciBpZGVudGlmaWNhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfY2FsbGVyICpfX2l0dF9jYWxsZXI7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSB0aGUgc3RpdGNoIHBvaW50IGUuZy4gYSBwb2ludCBpbiBjYWxsIHN0YWNrIHdoZXJlIG90aGVyIHN0YWNrcyBzaG91bGQgYmUgc3RpdGNoZWQgdG8uCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHVuaXF1ZSBpZGVudGlmaWVyIHdoaWNoIGlzIHVzZWQgdG8gbWF0Y2ggdGhlIGN1dCBwb2ludHMgd2l0aCBjb3JyZXNwb25kaW5nIHN0aXRjaCBwb2ludHMuCisgKi8KK19faXR0X2NhbGxlciBJVFRBUEkgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jYWxsZXIsIHN0YWNrX2NhbGxlcl9jcmVhdGUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoc3RhY2tfY2FsbGVyX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVyX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKSAoX19pdHRfY2FsbGVyKTAKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgRGVzdHJveSB0aGUgaW5mb3JhbXRpb24gYWJvdXQgc3RpdGNoIHBvaW50IGlkZW50aWZpZWQgYnkgdGhlIHBvaW50ZXIgcHJldmlvdXNseSByZXR1cm5lZCBieSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCkKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koX19pdHRfY2FsbGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVyX2Rlc3Ryb3ksIChfX2l0dF9jYWxsZXIgaWQpKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveSAgICAgSVRUTk9USUZZX1ZPSUQoc3RhY2tfY2FsbGVyX2Rlc3Ryb3kpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95X3B0ciBJVFROT1RJRllfTkFNRShzdGFja19jYWxsZXJfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KGlkKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFNldHMgdGhlIGN1dCBwb2ludC4gU3RhY2sgZnJvbSBlYWNoIGV2ZW50IHdoaWNoIG9jY3VycyBhZnRlciB0aGlzIGNhbGwgd2lsbCBiZSBjdXQKKyAqIGF0IHRoZSBzYW1lIHN0YWNrIGxldmVsIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkIGFuZCBzdGl0Y2hlZCB0byB0aGUgY29ycmVzcG9uZGluZyBzdGl0Y2ggcG9pbnQuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcihfX2l0dF9jYWxsZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfZW50ZXIsIChfX2l0dF9jYWxsZXIgaWQpKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXIgICAgIElUVE5PVElGWV9WT0lEKHN0YWNrX2NhbGxlZV9lbnRlcikKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciBJVFROT1RJRllfTkFNRShzdGFja19jYWxsZWVfZW50ZXIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoaWQpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGVsaW1pbmF0ZXMgdGhlIGN1dCBwb2ludCB3aGljaCB3YXMgc2V0IGJ5IGxhdGVzdCBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoKS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKF9faXR0X2NhbGxlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9sZWF2ZSwgKF9faXR0X2NhbGxlciBpZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSAgICAgSVRUTk9USUZZX1ZPSUQoc3RhY2tfY2FsbGVlX2xlYXZlKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmVfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlZV9sZWF2ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZShpZCkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAfSBzdGl0Y2ggZ3JvdXAgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgZW51bSBfX2l0dF9lcnJvcl9jb2RlCit7CisgICAgX19pdHRfZXJyb3Jfc3VjY2VzcyAgICAgICA9IDAsIC8qITwgbm8gZXJyb3IgKi8KKyAgICBfX2l0dF9lcnJvcl9ub19tb2R1bGUgICAgID0gMSwgLyohPCBtb2R1bGUgY2FuJ3QgYmUgbG9hZGVkICovCisgICAgLyogJTEkcyAtLSBsaWJyYXJ5IG5hbWU7IHdpbjogJTIkZCAtLSBzeXN0ZW0gZXJyb3IgY29kZTsgdW54OiAlMiRzIC0tIHN5c3RlbSBlcnJvciBtZXNzYWdlLiAqLworICAgIF9faXR0X2Vycm9yX25vX3N5bWJvbCAgICAgPSAyLCAvKiE8IHN5bWJvbCBub3QgZm91bmQgKi8KKyAgICAvKiAlMSRzIC0tIGxpYnJhcnkgbmFtZSwgJTIkcyAtLSBzeW1ib2wgbmFtZS4gKi8KKyAgICBfX2l0dF9lcnJvcl91bmtub3duX2dyb3VwID0gMywgLyohPCB1bmtub3duIGdyb3VwIHNwZWNpZmllZCAqLworICAgIC8qICUxJHMgLS0gZW52IHZhciBuYW1lLCAlMiRzIC0tIGdyb3VwIG5hbWUuICovCisgICAgX19pdHRfZXJyb3JfY2FudF9yZWFkX2VudiA9IDQsIC8qITwgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpIGZhaWxlZCAqLworICAgIC8qICUxJHMgLS0gZW52IHZhciBuYW1lLCAlMiRkIC0tIHN5c3RlbSBlcnJvci4gKi8KKyAgICBfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcgID0gNSwgLyohPCB2YXJpYWJsZSB2YWx1ZSB0b28gbG9uZyAqLworICAgIC8qICUxJHMgLS0gZW52IHZhciBuYW1lLCAlMiRkIC0tIGFjdHVhbCBsZW5ndGggb2YgdGhlIHZhciwgJTMkZCAtLSBtYXggYWxsb3dlZCBsZW5ndGguICovCisgICAgX19pdHRfZXJyb3Jfc3lzdGVtICAgICAgICA9IDYgIC8qITwgcHRocmVhZF9tdXRleGF0dHJfaW5pdCBvciBwdGhyZWFkX211dGV4X2luaXQgZmFpbGVkICovCisgICAgLyogJTEkcyAtLSBmdW5jdGlvbiBuYW1lLCAlMiRkIC0tIGVycm5vLiAqLworfSBfX2l0dF9lcnJvcl9jb2RlOworCit0eXBlZGVmIHZvaWQgKF9faXR0X2Vycm9yX2hhbmRsZXJfdCkoX19pdHRfZXJyb3JfY29kZSBjb2RlLCB2YV9saXN0KTsKK19faXR0X2Vycm9yX2hhbmRsZXJfdCogX19pdHRfc2V0X2Vycm9yX2hhbmRsZXIoX19pdHRfZXJyb3JfaGFuZGxlcl90Kik7CisKK2NvbnN0IGNoYXIqIElUVEFQSSBfX2l0dF9hcGlfdmVyc2lvbih2b2lkKTsKKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjZGVmaW5lIF9faXR0X2Vycm9yX2hhbmRsZXIgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCwgZXJyb3JfaGFuZGxlcikKK3ZvaWQgX19pdHRfZXJyb3JfaGFuZGxlcihfX2l0dF9lcnJvcl9jb2RlIGNvZGUsIHZhX2xpc3QgYXJncyk7CitleHRlcm4gY29uc3QgaW50IElUVE5PVElGWV9OQU1FKGVycik7CisjZGVmaW5lIF9faXR0X2VyciBJVFROT1RJRllfTkFNRShlcnIpCitJVFRfU1RVQihJVFRBUEksIGNvbnN0IGNoYXIqLCBhcGlfdmVyc2lvbiwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbiAgICAgSVRUTk9USUZZX0RBVEEoYXBpX3ZlcnNpb24pCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uX3B0ciBJVFROT1RJRllfTkFNRShhcGlfdmVyc2lvbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uKCkgICAoY29uc3QgY2hhciopMAorI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfSVRUTk9USUZZX1BSSVZBVEVfICovCisKKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9jb25maWcuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBiYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X2NvbmZpZy5oCkBAIC0wLDAgKzEsNDc4IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0lUVE5PVElGWV9DT05GSUdfSF8KKyNkZWZpbmUgX0lUVE5PVElGWV9DT05GSUdfSF8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXyAKKyMgICAgICBkZWZpbmUgQ0RFQ0wgX19hdHRyaWJ1dGVfXyAoKGNkZWNsKSkKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBDREVDTCAvKiBhY3R1YWwgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogQ0RFQ0wgKi8KKworI2lmbmRlZiBTVERDQUxMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBTVERDQUxMIF9fYXR0cmlidXRlX18gKChzdGRjYWxsKSkgCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyCisjICBkZWZpbmUgSVRUX0FSQ0hfSUEzMiAgMQorI2VuZGlmIC8qIElUVF9BUkNIX0lBMzIgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyRQorIyAgZGVmaW5lIElUVF9BUkNIX0lBMzJFIDIKKyNlbmRpZiAvKiBJVFRfQVJDSF9JQTMyRSAqLworCisvKiBXYXMgdGhlcmUgYSBtYWdpY2FsIHJlYXNvbiB3ZSBkaWRuJ3QgaGF2ZSAzIGhlcmUgYmVmb3JlPyAqLworI2lmbmRlZiBJVFRfQVJDSF9BQVJDSDY0CisjICBkZWZpbmUgSVRUX0FSQ0hfQUFSQ0g2NCAgMworI2VuZGlmIC8qIElUVF9BUkNIX0FBUkNINjQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9BUk0KKyMgIGRlZmluZSBJVFRfQVJDSF9BUk0gIDQKKyNlbmRpZiAvKiBJVFRfQVJDSF9BUk0gKi8KKworI2lmbmRlZiBJVFRfQVJDSF9QUEM2NAorIyAgZGVmaW5lIElUVF9BUkNIX1BQQzY0ICA1CisjZW5kaWYgLyogSVRUX0FSQ0hfUFBDNjQgKi8KKworCisjaWZuZGVmIElUVF9BUkNICisjICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMgorIyAgZWxpZiBkZWZpbmVkIF9NX1g2NCB8fCBkZWZpbmVkIF9NX0FNRDY0IHx8IGRlZmluZWQgX194ODZfNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMkUKKyMgIGVsaWYgZGVmaW5lZCBfTV9JQTY0IHx8IGRlZmluZWQgX19pYTY0X18KKyMgICAgZGVmaW5lIElUVF9BUkNIIElUVF9BUkNIX0lBNjQKKyMgIGVsaWYgZGVmaW5lZCBfTV9BUk0gfHwgX19hcm1fXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQVJNCisjICBlbGlmIGRlZmluZWQgX19wb3dlcnBjNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfUFBDNjQKKyMgIGVsaWYgZGVmaW5lZCBfX2FhcmNoNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQUFSQ0g2NAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBJVFRfRVhURVJOX0MgZXh0ZXJuICJDIgorIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19CRUdJTiBleHRlcm4gIkMiIHsKKyMgIGRlZmluZSBJVFRfRVhURVJOX0NfRU5EIH0KKyNlbHNlCisjICBkZWZpbmUgSVRUX0VYVEVSTl9DIC8qIG5vdGhpbmcgKi8KKyMgIGRlZmluZSBJVFRfRVhURVJOX0NfQkVHSU4gLyogbm90aGluZyAqLworIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19FTkQgLyogbm90aGluZyAqLworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNkZWZpbmUgSVRUX1RPX1NUUl9BVVgoeCkgI3gKKyNkZWZpbmUgSVRUX1RPX1NUUih4KSAgICAgSVRUX1RPX1NUUl9BVVgoeCkKKworI2RlZmluZSBfX0lUVF9CVUlMRF9BU1NFUlQoZXhwciwgc3VmZml4KSBkbyB7IFwKKyAgICBzdGF0aWMgY2hhciBfX2l0dF9idWlsZF9jaGVja18jI3N1ZmZpeFsoZXhwcikgPyAxIDogLTFdOyBcCisgICAgX19pdHRfYnVpbGRfY2hlY2tfIyNzdWZmaXhbMF0gPSAwOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIF9JVFRfQlVJTERfQVNTRVJUKGV4cHIsIHN1ZmZpeCkgIF9fSVRUX0JVSUxEX0FTU0VSVCgoZXhwciksIHN1ZmZpeCkKKyNkZWZpbmUgSVRUX0JVSUxEX0FTU0VSVChleHByKSAgICAgICAgICAgX0lUVF9CVUlMRF9BU1NFUlQoKGV4cHIpLCBfX0xJTkVfXykKKworI2RlZmluZSBJVFRfTUFHSUMgeyAweEVELCAweEFCLCAweEFCLCAweEVDLCAweDBELCAweEVFLCAweERBLCAweDMwIH0KKworLyogUmVwbGFjZSB3aXRoIHNuYXBzaG90IGRhdGUgWVlZWU1NREQgZm9yIHByb21vdGlvbiBidWlsZC4gKi8KKyNkZWZpbmUgQVBJX1ZFUlNJT05fQlVJTEQgICAgMjAxMTExMTEKKworI2lmbmRlZiBBUElfVkVSU0lPTl9OVU0KKyNkZWZpbmUgQVBJX1ZFUlNJT05fTlVNIDAuMC4wCisjZW5kaWYgLyogQVBJX1ZFUlNJT05fTlVNICovCisKKyNkZWZpbmUgQVBJX1ZFUlNJT04gIklUVC1BUEktVmVyc2lvbiAiIElUVF9UT19TVFIoQVBJX1ZFUlNJT05fTlVNKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgSVRUX1RPX1NUUihBUElfVkVSU0lPTl9CVUlMRCkgIikiCisKKy8qIE9TIGNvbW11bmljYXRpb24gZnVuY3Rpb25zICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjaW5jbHVkZSA8d2luZG93cy5oPgordHlwZWRlZiBITU9EVUxFICAgICAgICAgICBsaWJfdDsKK3R5cGVkZWYgRFdPUkQgICAgICAgICAgICAgVElEVDsKK3R5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiAgbXV0ZXhfdDsKKyNkZWZpbmUgTVVURVhfSU5JVElBTElaRVIgeyAwIH0KKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgLyogZW1wdHkgZm9yIFdpbmRvd3MgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgX0dOVV9TT1VSQ0UgMSAvKiBuZWVkIGZvciBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSAqLworI2VuZGlmIC8qIF9HTlVfU09VUkNFICovCisjaWZuZGVmIF9fVVNFX1VOSVg5OAorI2RlZmluZSBfX1VTRV9VTklYOTggMSAvKiBuZWVkIGZvciBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSwgb24gU0xFUzExLjEgd2l0aCBnY2MgNC4zLjQgd2hlcmVpbiBwdGhyZWFkLmggbWlzc2luZyBkZXBlbmRlbmN5IG9uIF9fVVNFX1hPUEVOMks4ICovCisjZW5kaWYgLypfX1VTRV9VTklYOTgqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3R5cGVkZWYgdm9pZCogICAgICAgICAgICAgbGliX3Q7Cit0eXBlZGVmIHB0aHJlYWRfdCAgICAgICAgIFRJRFQ7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCAgIG11dGV4X3Q7CisjZGVmaW5lIE1VVEVYX0lOSVRJQUxJWkVSIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpIFwKKyAgICAgICAgICAgIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgYWxpYXNuYW1lIF9fYXR0cmlidXRlX18gKChhbGlhcyAoI25hbWUpKSk7CisjZGVmaW5lIHN0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpIF9zdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2dldF9wcm9jKGxpYiwgbmFtZSkgR2V0UHJvY0FkZHJlc3MobGliLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tdXRleF9pbml0KG11dGV4KSAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X2xvY2sobXV0ZXgpICAgRW50ZXJDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X3VubG9jayhtdXRleCkgTGVhdmVDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X2xvYWRfbGliKG5hbWUpICAgICAgTG9hZExpYnJhcnlBKG5hbWUpCisjZGVmaW5lIF9faXR0X3VubG9hZF9saWIoaGFuZGxlKSAgRnJlZUxpYnJhcnkoaGFuZGxlKQorI2RlZmluZSBfX2l0dF9zeXN0ZW1fZXJyb3IoKSAgICAgIChpbnQpR2V0TGFzdEVycm9yKCkKKyNkZWZpbmUgX19pdHRfZnN0cmNtcChzMSwgczIpICAgICBsc3RyY21wQShzMSwgczIpCisjZGVmaW5lIF9faXR0X2ZzdHJsZW4ocykgICAgICAgICAgbHN0cmxlbkEocykKKyNkZWZpbmUgX19pdHRfZnN0cmNweW4oczEsIHMyLCBsKSBsc3RyY3B5bkEoczEsIHMyLCBsKQorI2RlZmluZSBfX2l0dF9mc3RyZHVwKHMpICAgICAgICAgIF9zdHJkdXAocykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lkKCkgICAgICAgICBHZXRDdXJyZW50VGhyZWFkSWQoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfeWllbGQoKSAgICAgIFN3aXRjaFRvVGhyZWFkKCkKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCitJVFRfSU5MSU5FIGxvbmcKK19faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpIElUVF9JTkxJTkVfQVRUUklCVVRFOworSVRUX0lOTElORSBsb25nIF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpCit7CisgICAgcmV0dXJuIEludGVybG9ja2VkSW5jcmVtZW50KHB0cik7Cit9CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZ2V0X3Byb2MobGliLCBuYW1lKSBkbHN5bShsaWIsIG5hbWUpCisjZGVmaW5lIF9faXR0X211dGV4X2luaXQobXV0ZXgpICAge1wKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4X2F0dHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleF9hdHRyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZtdXRleF9hdHRyLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7ICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhfaW5pdCIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleF9hdHRyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9zeXN0ZW0sICJwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95IiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgX19pdHRfbXV0ZXhfbG9jayhtdXRleCkgICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X3VubG9jayhtdXRleCkgcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpCisjZGVmaW5lIF9faXR0X2xvYWRfbGliKG5hbWUpICAgICAgZGxvcGVuKG5hbWUsIFJUTERfTEFaWSkKKyNkZWZpbmUgX19pdHRfdW5sb2FkX2xpYihoYW5kbGUpICBkbGNsb3NlKGhhbmRsZSkKKyNkZWZpbmUgX19pdHRfc3lzdGVtX2Vycm9yKCkgICAgICBlcnJubworI2RlZmluZSBfX2l0dF9mc3RyY21wKHMxLCBzMikgICAgIHN0cmNtcChzMSwgczIpCisjZGVmaW5lIF9faXR0X2ZzdHJsZW4ocykgICAgICAgICAgc3RybGVuKHMpCisjZGVmaW5lIF9faXR0X2ZzdHJjcHluKHMxLCBzMiwgbCkgc3RybmNweShzMSwgczIsIGwpCisjZGVmaW5lIF9faXR0X2ZzdHJkdXAocykgICAgICAgICAgc3RyZHVwKHMpCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZCgpICAgICAgICAgcHRocmVhZF9zZWxmKCkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3lpZWxkKCkgICAgICBzY2hlZF95aWVsZCgpCisjaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0lBNjQKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjZGVmaW5lIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KGFkZHIsIHZhbCkgX19mZXRjaGFkZDRfYWNxKCh2b2lkICopYWRkciwgdmFsKQorI2Vsc2UgIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KKy8qIFRPRE86IEFkZCBTdXBwb3J0IGZvciBub3QgSW50ZWwgY29tcGlsZXJzIGZvciBJQS02NCBhcmNoaXRlY3R1cmUgKi8KKyNlbmRpZiAvKiBfX0lOVEVMX0NPTVBJTEVSICovCisjZWxpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMiB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMkUgLyogSVRUX0FSQ0ghPUlUVF9BUkNIX0lBNjQgKi8KK0lUVF9JTkxJTkUgbG9uZworX19UQkJfbWFjaGluZV9mZXRjaGFkZDQodm9sYXRpbGUgdm9pZCogcHRyLCBsb25nIGFkZGVuZCkgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQodm9sYXRpbGUgdm9pZCogcHRyLCBsb25nIGFkZGVuZCkKK3sKKyAgICBsb25nIHJlc3VsdDsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9ja1xueGFkZCAlMCwlMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiKHJlc3VsdCksIj1tIigqKGludCopcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIihhZGRlbmQpLCAibSIoKihpbnQqKXB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbGlmIElUVF9BUkNIPT1JVFRfQVJDSF9BUk0gfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX1BQQzY0IHx8IElUVF9BUkNIPT1JVFRfQVJDSF9BQVJDSDY0CisjZGVmaW5lIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KGFkZHIsIHZhbCkgX19zeW5jX2ZldGNoX2FuZF9hZGQoYWRkciwgdmFsKQorI2VuZGlmIC8qIElUVF9BUkNIPT1JVFRfQVJDSF9JQTY0ICovCisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorSVRUX0lOTElORSBsb25nCitfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQodm9sYXRpbGUgbG9uZyogcHRyKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgbG9uZyBfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQodm9sYXRpbGUgbG9uZyogcHRyKQoreworICAgIHJldHVybiBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNChwdHIsIDEpICsgMUw7Cit9CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfY29sbGVjdGlvbl9ub3JtYWwgPSAwLAorICAgIF9faXR0X2NvbGxlY3Rpb25fcGF1c2VkID0gMQorfSBfX2l0dF9jb2xsZWN0aW9uX3N0YXRlOworCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X3RocmVhZF9ub3JtYWwgID0gMCwKKyAgICBfX2l0dF90aHJlYWRfaWdub3JlZCA9IDEKK30gX19pdHRfdGhyZWFkX3N0YXRlOworCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X3RocmVhZF9pbmZvCit7CisgICAgY29uc3QgY2hhciogbmFtZUE7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIEFTQ0lJLiAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICBjb25zdCB3Y2hhcl90KiBuYW1lVzsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogbmFtZVc7CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIFRJRFQgICAgICAgICAgICAgICB0aWQ7CisgICAgX19pdHRfdGhyZWFkX3N0YXRlIHN0YXRlOyAgIC8qITwgVGhyZWFkIHN0YXRlIChwYXVzZWQgb3Igbm9ybWFsKSAqLworICAgIGludCAgICAgICAgICAgICAgICBleHRyYTE7ICAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgdm9pZCogICAgICAgICAgICAgIGV4dHJhMjsgIC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RocmVhZF9pbmZvKiBuZXh0OworfSBfX2l0dF90aHJlYWRfaW5mbzsKKworI2luY2x1ZGUgIml0dG5vdGlmeV90eXBlcy5oIiAvKiBGb3IgX19pdHRfZ3JvdXBfaWQgZGVmaW5pdGlvbiAqLworCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfYXBpX2luZm9fMjAxMDEwMDEKK3sKKyAgICBjb25zdCBjaGFyKiAgICBuYW1lOworICAgIHZvaWQqKiAgICAgICAgIGZ1bmNfcHRyOworICAgIHZvaWQqICAgICAgICAgIGluaXRfZnVuYzsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cDsKK30gIF9faXR0X2FwaV9pbmZvXzIwMTAxMDAxOworCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfYXBpX2luZm8KK3sKKyAgICBjb25zdCBjaGFyKiAgICBuYW1lOworICAgIHZvaWQqKiAgICAgICAgIGZ1bmNfcHRyOworICAgIHZvaWQqICAgICAgICAgIGluaXRfZnVuYzsKKyAgICB2b2lkKiAgICAgICAgICBudWxsX2Z1bmM7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXA7Cit9ICBfX2l0dF9hcGlfaW5mbzsKKworc3RydWN0IF9fX2l0dF9kb21haW47CitzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGU7CisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9nbG9iYWwKK3sKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIG1hZ2ljWzhdOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmVyc2lvbl9tYWpvcjsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZlcnNpb25fbWlub3I7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2ZXJzaW9uX2J1aWxkOworICAgIHZvbGF0aWxlIGxvbmcgICAgICAgICAgYXBpX2luaXRpYWxpemVkOworICAgIHZvbGF0aWxlIGxvbmcgICAgICAgICAgbXV0ZXhfaW5pdGlhbGl6ZWQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBhdG9taWNfY291bnRlcjsKKyAgICBtdXRleF90ICAgICAgICAgICAgICAgIG11dGV4OworICAgIGxpYl90ICAgICAgICAgICAgICAgICAgbGliOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgZXJyb3JfaGFuZGxlcjsKKyAgICBjb25zdCBjaGFyKiogICAgICAgICAgIGRsbF9wYXRoX3B0cjsKKyAgICBfX2l0dF9hcGlfaW5mbyogICAgICAgIGFwaV9saXN0X3B0cjsKKyAgICBzdHJ1Y3QgX19faXR0X2dsb2JhbCogIG5leHQ7CisgICAgLyogSm9pbmFibGUgc3RydWN0dXJlcyBiZWxvdyAqLworICAgIF9faXR0X3RocmVhZF9pbmZvKiAgICAgdGhyZWFkX2xpc3Q7CisgICAgc3RydWN0IF9fX2l0dF9kb21haW4qICBkb21haW5fbGlzdDsKKyAgICBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUqIHN0cmluZ19saXN0OworICAgIF9faXR0X2NvbGxlY3Rpb25fc3RhdGUgc3RhdGU7Cit9IF9faXR0X2dsb2JhbDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBORVdfVEhSRUFEX0lORk9fVyhncHRyLGgsaF90YWlsLHQscyxuKSB7IFwKKyAgICBoID0gKF9faXR0X3RocmVhZF9pbmZvKiltYWxsb2Moc2l6ZW9mKF9faXR0X3RocmVhZF9pbmZvKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+dGlkICAgID0gdDsgXAorICAgICAgICBoLT5uYW1lQSAgPSBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IG4gPyBfd2NzZHVwKG4pIDogTlVMTDsgXAorICAgICAgICBoLT5zdGF0ZSAgPSBzOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT50aHJlYWRfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX1RIUkVBRF9JTkZPX0EoZ3B0cixoLGhfdGFpbCx0LHMsbikgeyBcCisgICAgaCA9IChfX2l0dF90aHJlYWRfaW5mbyopbWFsbG9jKHNpemVvZihfX2l0dF90aHJlYWRfaW5mbykpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnRpZCAgICA9IHQ7IFwKKyAgICAgICAgaC0+bmFtZUEgID0gbiA/IF9faXR0X2ZzdHJkdXAobikgOiBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IE5VTEw7IFwKKyAgICAgICAgaC0+c3RhdGUgID0gczsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+dGhyZWFkX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19ET01BSU5fVyhncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfZG9tYWluKiltYWxsb2Moc2l6ZW9mKF9faXR0X2RvbWFpbikpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPmZsYWdzICA9IDA7ICAgIC8qIGRvbWFpbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0ICovIFwKKyAgICAgICAgaC0+bmFtZUEgID0gTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPmRvbWFpbl9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfRE9NQUlOX0EoZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X2RvbWFpbiopbWFsbG9jKHNpemVvZihfX2l0dF9kb21haW4pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5mbGFncyAgPSAwOyAgICAvKiBkb21haW4gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLyBcCisgICAgICAgIGgtPm5hbWVBICA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5kb21haW5fbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX1NUUklOR19IQU5ETEVfVyhncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfc3RyaW5nX2hhbmRsZSopbWFsbG9jKHNpemVvZihfX2l0dF9zdHJpbmdfaGFuZGxlKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+c3RyQSAgID0gTlVMTDsgXAorICAgICAgICBoLT5zdHJXICAgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnN0cmluZ19saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfU1RSSU5HX0hBTkRMRV9BKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9zdHJpbmdfaGFuZGxlKiltYWxsb2Moc2l6ZW9mKF9faXR0X3N0cmluZ19oYW5kbGUpKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5zdHJBICAgPSBuYW1lID8gX19pdHRfZnN0cmR1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+c3RyVyAgID0gTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+c3RyaW5nX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZW5kaWYgLyogX0lUVE5PVElGWV9DT05GSUdfSF8gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjJhODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jCkBAIC0wLDAgKzEsMTA1MSBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorI2luY2x1ZGUgIml0dG5vdGlmeV9jb25maWcuaCIKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBQQVRIX01BWCA1MTIKKyNlbHNlIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIElOVEVMX05PX01BQ1JPX0JPRFkgCisjZGVmaW5lIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorI2luY2x1ZGUgIml0dG5vdGlmeS5oIgorI2luY2x1ZGUgImxlZ2FjeS9pdHRub3RpZnkuaCIKKworI2luY2x1ZGUgImRpc2FibGVfd2FybmluZ3MuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgYXBpX3ZlcnNpb25bXSA9IEFQSV9WRVJTSU9OICJcMFxuQCgjKSAkUmV2aXNpb246IDQzMzc1ICRcbiI7CisKKyNkZWZpbmUgX05fKG4pIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsbikKKworI2lmIElUVF9PUz09SVRUX09TX1dJTgorc3RhdGljIGNvbnN0IGNoYXIqIGl0dG5vdGlmeV9saWJfbmFtZSA9ICJsaWJpdHRub3RpZnkuZGxsIjsKKyNlbGlmIElUVF9PUz09SVRUX09TX0xJTlVYCitzdGF0aWMgY29uc3QgY2hhciogaXR0bm90aWZ5X2xpYl9uYW1lID0gImxpYml0dG5vdGlmeS5zbyI7CisjZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKK3N0YXRpYyBjb25zdCBjaGFyKiBpdHRub3RpZnlfbGliX25hbWUgPSAibGliaXR0bm90aWZ5LmR5bGliIjsKKyNlbHNlCisjZXJyb3IgVW5zdXBwb3J0ZWQgb3IgdW5rbm93biBPUy4KKyNlbmRpZgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorCisjaWZkZWYgSVRUX0FORFJPSURfTE9HCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dfVEFHICAgIklOVEVMX1ZUVU5FX1VTRVJBUEkiCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dJKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgSVRUX0FORFJPSURfTE9HX1RBRywgX19WQV9BUkdTX18pKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HVyguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sIElUVF9BTkRST0lEX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0UoLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUixJVFRfQU5EUk9JRF9MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dEKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfREVCVUcsSVRUX0FORFJPSURfTE9HX1RBRywgX19WQV9BUkdTX18pKQorI2Vsc2UKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0koLi4uKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HVyguLi4pCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dFKC4uLikKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0QoLi4uKQorI2VuZGlmCisKKy8qIGRlZmF1bHQgbG9jYXRpb24gb2YgdXNlcmFwaSBjb2xsZWN0b3Igb24gQW5kcm9pZCAqLworI2RlZmluZSBBTkRST0lEX0lUVE5PVElGWV9ERUZBVUxUX1BBVEggICIvZGF0YS9kYXRhL2NvbS5pbnRlbC52dHVuZS9pbnRlbC9saWJpdHRub3RpZnkuc28iCisjZW5kaWYKKworCisjaWZuZGVmIExJQl9WQVJfTkFNRQorI2lmIElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9BUk0KKyNkZWZpbmUgTElCX1ZBUl9OQU1FIElOVEVMX0xJQklUVE5PVElGWTMyCisjZWxzZQorI2RlZmluZSBMSUJfVkFSX05BTUUgSU5URUxfTElCSVRUTk9USUZZNjQKKyNlbmRpZgorI2VuZGlmIC8qIExJQl9WQVJfTkFNRSAqLworCisjZGVmaW5lIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKHApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghcC5tdXRleF9pbml0aWFsaXplZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KCZwLmF0b21pY19jb3VudGVyKSA9PSAxKSBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19pdHRfbXV0ZXhfaW5pdCgmcC5tdXRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcC5tdXRleF9pbml0aWFsaXplZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd2hpbGUgKCFwLm11dGV4X2luaXRpYWxpemVkKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIF9faXR0X3RocmVhZF95aWVsZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X211dGV4X2xvY2soJnAubXV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK2NvbnN0IGludCBfTl8oZXJyKSA9IDA7CisKK3R5cGVkZWYgaW50IChfX2l0dF9pbml0X2l0dGxpYl90KShjb25zdCBjaGFyKiwgX19pdHRfZ3JvdXBfaWQpOworCisvKiB0aGlzIGRlZmluZSB1c2VkIHRvIGNvbnRyb2wgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gbmFtZS4gKi8KKyNpZm5kZWYgX19pdHRfaW5pdF9pdHRsaWJfbmFtZQorSVRUX0VYVEVSTl9DIGludCBfTl8oaW5pdF9pdHRsaWIpKGNvbnN0IGNoYXIqLCBfX2l0dF9ncm91cF9pZCk7CitzdGF0aWMgX19pdHRfaW5pdF9pdHRsaWJfdCogX19pdHRfaW5pdF9pdHRsaWJfcHRyID0gX05fKGluaXRfaXR0bGliKTsKKyNkZWZpbmUgX19pdHRfaW5pdF9pdHRsaWJfbmFtZSBfX2l0dF9pbml0X2l0dGxpYl9wdHIKKyNlbmRpZiAvKiBfX2l0dF9pbml0X2l0dGxpYl9uYW1lICovCisKK3R5cGVkZWYgdm9pZCAoX19pdHRfZmluaV9pdHRsaWJfdCkodm9pZCk7CisKKy8qIHRoaXMgZGVmaW5lIHVzZWQgdG8gY29udHJvbCBmaW5hbGl6YXRpb24gZnVuY3Rpb24gbmFtZS4gKi8KKyNpZm5kZWYgX19pdHRfZmluaV9pdHRsaWJfbmFtZQorSVRUX0VYVEVSTl9DIHZvaWQgX05fKGZpbmlfaXR0bGliKSh2b2lkKTsKK3N0YXRpYyBfX2l0dF9maW5pX2l0dGxpYl90KiBfX2l0dF9maW5pX2l0dGxpYl9wdHIgPSBfTl8oZmluaV9pdHRsaWIpOworI2RlZmluZSBfX2l0dF9maW5pX2l0dGxpYl9uYW1lIF9faXR0X2ZpbmlfaXR0bGliX3B0cgorI2VuZGlmIC8qIF9faXR0X2ZpbmlfaXR0bGliX25hbWUgKi8KKworLyogYnVpbGRpbmcgcG9pbnRlcnMgdG8gaW1wb3J0ZWQgZnVuY3MgKi8KKyN1bmRlZiBJVFRfU1RVQlYKKyN1bmRlZiBJVFRfU1RVQgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DX0JFR0lOIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IElUVF9FWFRFUk5fQ19FTkQgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3MgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsgICAgICAgICAgICAgXAorICAgIGlmIChJVFROT1RJRllfTkFNRShuYW1lKSAmJiBJVFROT1RJRllfTkFNRShuYW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSkgXAorICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUobmFtZSkgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gKHR5cGUpMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0NfQkVHSU4gSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgSVRUX0VYVEVSTl9DX0VORCBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncyBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOyAgICAgICAgICAgICBcCisgICAgaWYgKElUVE5PVElGWV9OQU1FKG5hbWUpICYmIElUVE5PVElGWV9OQU1FKG5hbWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpKSBcCisgICAgICAgIElUVE5PVElGWV9OQU1FKG5hbWUpIHBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyN1bmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorCisjdW5kZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQlYKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQ19CRUdJTiBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOyBJVFRfRVhURVJOX0NfRU5ECisKKyNkZWZpbmUgSVRUX1NUVUJWKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQ19CRUdJTiBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOyBJVFRfRVhURVJOX0NfRU5ECisKKyNkZWZpbmUgX19JVFRfSU5URVJOQUxfSU5JVAorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKyN1bmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisKK0lUVF9HUk9VUF9MSVNUKGdyb3VwX2xpc3QpOworCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2dyb3VwX2FsaWFzCit7CisgICAgY29uc3QgY2hhciogICAgZW52X3ZhcjsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cHM7Cit9IF9faXR0X2dyb3VwX2FsaWFzOworCitzdGF0aWMgX19pdHRfZ3JvdXBfYWxpYXMgZ3JvdXBfYWxpYXNbXSA9IHsKKyAgICB7ICJLTVBfRk9SX1RQUk9GSUxFIiwgKF9faXR0X2dyb3VwX2lkKShfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfc3luYyAgfCBfX2l0dF9ncm91cF9tYXJrKSB9LAorICAgIHsgIktNUF9GT1JfVENIRUNLIiwgICAoX19pdHRfZ3JvdXBfaWQpKF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9zeW5jICB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX3N1cHByZXNzKSB9LAorICAgIHsgTlVMTCwgICAgICAgICAgICAgICAoX19pdHRfZ3JvdXBfbm9uZSkgfSwKKyAgICB7IGFwaV92ZXJzaW9uLCAgICAgICAgKF9faXR0X2dyb3VwX25vbmUpIH0gLyogISEhIEp1c3QgdG8gYXZvaWQgdW51c2VkIGNvZGUgZWxpbWluYXRpb24gISEhICovCit9OworCisjcHJhZ21hIHBhY2socG9wKQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU0KSAvKiB3YXJuaW5nIEM0MDU0OiAndHlwZSBjYXN0JyA6IGZyb20gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyB0byBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworc3RhdGljIF9faXR0X2FwaV9pbmZvIGFwaV9saXN0W10gPSB7CisvKiBEZWZpbmUgZnVuY3Rpb25zIHdpdGggc3RhdGljIGltcGxlbWVudGF0aW9uICovCisjdW5kZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQlYKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxuYW1laW5kbGwsZ3JvdXAsZm9ybWF0KSB7IElUVF9UT19TVFIoSVRUX0pPSU4oX19pdHRfLG5hbWVpbmRsbCkpLCAodm9pZCoqKSh2b2lkKikmSVRUTk9USUZZX05BTUUobmFtZSksICh2b2lkKikoc2l6ZV90KSZJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSwgKHZvaWQqKShzaXplX3QpJklUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpLCAoX19pdHRfZ3JvdXBfaWQpKGdyb3VwKX0sCisjZGVmaW5lIElUVF9TVFVCViBJVFRfU1RVQgorI2RlZmluZSBfX0lUVF9JTlRFUk5BTF9JTklUCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorI3VuZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKy8qIERlZmluZSBmdW5jdGlvbnMgd2l0aG91dCBzdGF0aWMgaW1wbGVtZW50YXRpb24gKi8KKyN1bmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCVgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLG5hbWVpbmRsbCxncm91cCxmb3JtYXQpIHtJVFRfVE9fU1RSKElUVF9KT0lOKF9faXR0XyxuYW1laW5kbGwpKSwgKHZvaWQqKikodm9pZCopJklUVE5PVElGWV9OQU1FKG5hbWUpLCAodm9pZCopKHNpemVfdCkmSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSksIE5VTEwsIChfX2l0dF9ncm91cF9pZCkoZ3JvdXApfSwKKyNkZWZpbmUgSVRUX1NUVUJWIElUVF9TVFVCCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBfX2l0dF9ncm91cF9ub25lfQorfTsKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyogcHJpdmF0ZSwgaW5pdCB0aHJlYWQgaW5mbyBpdGVtLiB1c2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlcyAqLworc3RhdGljIF9faXR0X3RocmVhZF9pbmZvIGluaXRfdGhyZWFkX2luZm8gPSB7CisgICAgKGNvbnN0IGNoYXIqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZUEgKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgKGNvbnN0IHdjaGFyX3QqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogbmFtZVcgKi8KKyNlbHNlCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZVcgKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpZCAqLworICAgIF9faXR0X3RocmVhZF9ub3JtYWwsICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmExICovCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEyICovCisgICAgKF9faXR0X3RocmVhZF9pbmZvKilOVUxMICAgICAgICAgICAgICAgICAgLyogbmV4dCAqLworfTsKKworLyogcHJpdmF0ZSwgTlVMTCBkb21haW4gaXRlbS4gdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgKi8KK3N0YXRpYyBfX2l0dF9kb21haW4gbnVsbF9kb21haW4gPSB7CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3M6ICBkaXNhYmxlZCBieSBkZWZhdWx0ICovCisgICAgKGNvbnN0IGNoYXIqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZUEgKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgKGNvbnN0IHdjaGFyX3QqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogbmFtZVcgKi8KKyNlbHNlCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZVcgKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMSAqLworICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMiAqLworICAgIChfX2l0dF9kb21haW4qKU5VTEwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KK307CisKKy8qIHByaXZhdGUsIE5VTEwgc3RyaW5nIGhhbmRsZSBpdGVtLiB1c2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlcyAqLworc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUgbnVsbF9zdHJpbmdfaGFuZGxlID0geworICAgIChjb25zdCBjaGFyKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0ckEgKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgKGNvbnN0IHdjaGFyX3QqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogc3RyVyAqLworI2Vsc2UKKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJXICovCisjZW5kaWYKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTEgKi8KKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTIgKi8KKyAgICAoX19pdHRfc3RyaW5nX2hhbmRsZSopTlVMTCAgICAgICAgICAgICAgICAvKiBuZXh0ICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciBkbGxfcGF0aFtQQVRIX01BWF0gPSB7IDAgfTsKKworLyogc3RhdGljIHBhcnQgZGVzY3JpcHRvciB3aGljaCBoYW5kbGVzLiBhbGwgbm90aWZpY2F0aW9uIGFwaSBhdHRyaWJ1dGVzLiAqLworX19pdHRfZ2xvYmFsIF9OXyhfaXR0YXBpX2dsb2JhbCkgPSB7CisgICAgSVRUX01BR0lDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZGVudGlmaWNhdGlvbiBpbmZvICovCisgICAgSVRUX01BSk9SLCBJVFRfTUlOT1IsIEFQSV9WRVJTSU9OX0JVSUxELCAgICAgICAvKiB2ZXJzaW9uIGluZm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFwaV9pbml0aWFsaXplZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXV0ZXhfaW5pdGlhbGl6ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF0b21pY19jb3VudGVyICovCisgICAgTVVURVhfSU5JVElBTElaRVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRleCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBsaWJyYXJ5IGhhbmRsZSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXJyb3JfaGFuZGxlciAqLworICAgIChjb25zdCBjaGFyKiopJmRsbF9wYXRoLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGxsX3BhdGhfcHRyICovCisgICAgKF9faXR0X2FwaV9pbmZvKikmYXBpX2xpc3QsICAgICAgICAgICAgICAgICAgICAvKiBhcGlfbGlzdF9wdHIgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgX19pdHRfZ2xvYmFsICovCisgICAgKF9faXR0X3RocmVhZF9pbmZvKikmaW5pdF90aHJlYWRfaW5mbywgICAgICAgICAvKiB0aHJlYWRfbGlzdCAqLworICAgIChfX2l0dF9kb21haW4qKSZudWxsX2RvbWFpbiwgICAgICAgICAgICAgICAgICAgLyogZG9tYWluX2xpc3QgKi8KKyAgICAoX19pdHRfc3RyaW5nX2hhbmRsZSopJm51bGxfc3RyaW5nX2hhbmRsZSwgICAgIC8qIHN0cmluZ19saXN0ICovCisgICAgX19pdHRfY29sbGVjdGlvbl9ub3JtYWwgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2xsZWN0aW9uIHN0YXRlICovCit9OworCit0eXBlZGVmIHZvaWQgKF9faXR0X2FwaV9pbml0X3QpKF9faXR0X2dsb2JhbCosIF9faXR0X2dyb3VwX2lkKTsKK3R5cGVkZWYgdm9pZCAoX19pdHRfYXBpX2ZpbmlfdCkoX19pdHRfZ2xvYmFsKik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmZGVmIElUVF9OT1RJRllfRVhUX1JFUE9SVAorSVRUX0VYVEVSTl9DIHZvaWQgX05fKGVycm9yX2hhbmRsZXIpKF9faXR0X2Vycm9yX2NvZGUsIHZhX2xpc3QgYXJncyk7CisjZW5kaWYgLyogSVRUX05PVElGWV9FWFRfUkVQT1JUICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTUpIC8qIHdhcm5pbmcgQzQwNTU6ICd0eXBlIGNhc3QnIDogZnJvbSBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgdG8gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitzdGF0aWMgdm9pZCBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfY29kZSBjb2RlLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGNvZGUpOworICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIF9faXR0X2Vycm9yX2hhbmRsZXJfdCogaGFuZGxlciA9IChfX2l0dF9lcnJvcl9oYW5kbGVyX3QqKShzaXplX3QpX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyOworICAgICAgICBoYW5kbGVyKGNvZGUsIGFyZ3MpOworICAgIH0KKyNpZmRlZiBJVFRfTk9USUZZX0VYVF9SRVBPUlQKKyAgICBfTl8oZXJyb3JfaGFuZGxlcikoY29kZSwgYXJncyk7CisjZW5kaWYgLyogSVRUX05PVElGWV9FWFRfUkVQT1JUICovCisgICAgdmFfZW5kKGFyZ3MpOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgX19pdHRfZG9tYWluKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUpCit7CisgICAgX19pdHRfZG9tYWluICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKSAmJiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlVykgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVXKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKShuYW1lKTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5uYW1lVyAhPSBOVUxMICYmICF3Y3NjbXAoaC0+bmFtZVcsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfRE9NQUlOX1coJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyBfX2l0dF9kb21haW4qIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZUEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyBfX2l0dF9kb21haW4qIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworeworICAgIF9faXR0X2RvbWFpbiAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkgJiYgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlQSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkobmFtZSk7CisjZWxzZQorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkgJiYgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGUpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkobmFtZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5uYW1lQSAhPSBOVUxMICYmICFfX2l0dF9mc3RyY21wKGgtPm5hbWVBLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX0RPTUFJTl9BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSkKK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlVykgJiYgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlVykobmFtZSk7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+c3RyVyAhPSBOVUxMICYmICF3Y3NjbXAoaC0+c3RyVywgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19TVFJJTkdfSEFORExFX1coJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlQSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGUpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkgJiYgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkobmFtZSk7CisjZWxzZQorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGUpICYmIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGUpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGUpKG5hbWUpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+c3RyQSAhPSBOVUxMICYmICFfX2l0dF9mc3RyY21wKGgtPnN0ckEsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfU1RSSU5HX0hBTkRMRV9BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHBhdXNlKSxfaW5pdCkpKHZvaWQpCit7CisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHBhdXNlKSAmJiBJVFROT1RJRllfTkFNRShwYXVzZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHBhdXNlKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRShwYXVzZSkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0YXRlID0gX19pdHRfY29sbGVjdGlvbl9wYXVzZWQ7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocmVzdW1lKSxfaW5pdCkpKHZvaWQpCit7CisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHJlc3VtZSkgJiYgSVRUTk9USUZZX05BTUUocmVzdW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocmVzdW1lKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRShyZXN1bWUpKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5zdGF0ZSA9IF9faXR0X2NvbGxlY3Rpb25fbm9ybWFsOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZVcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSkKK3sKKyAgICBUSURUIHRpZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgIF9faXR0X3RocmVhZF9pbmZvICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVXKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT50aWQgPT0gdGlkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfVEhSRUFEX0lORk9fVygmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaCwgaF90YWlsLCB0aWQsIF9faXR0X3RocmVhZF9ub3JtYWwsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoLT5uYW1lVyA9IG5hbWUgPyBfd2NzZHVwKG5hbWUpIDogTlVMTDsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKK30KKworc3RhdGljIGludCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9uYW1lX3NldFcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgbmFtZWxlbiA9IG5hbWVsZW47CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZVcpLF9pbml0KSkobmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lQSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWUpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3sKKyAgICBUSURUIHRpZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgIF9faXR0X3RocmVhZF9pbmZvICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVBKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWUpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICB9CisKKyAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+dGlkID09IHRpZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1RIUkVBRF9JTkZPX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksIGgsIGhfdGFpbCwgdGlkLCBfX2l0dF90aHJlYWRfbm9ybWFsLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaC0+bmFtZUEgPSBuYW1lID8gX19pdHRfZnN0cmR1cChuYW1lKSA6IE5VTEw7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyBpbnQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfbmFtZV9zZXRBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIG5hbWVsZW4gPSBuYW1lbGVuOworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVBKSxfaW5pdCkpKG5hbWUpOworICAgIHJldHVybiAwOworfQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIGludCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9uYW1lX3NldCksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBuYW1lbGVuID0gbmFtZWxlbjsKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lKSxfaW5pdCkpKG5hbWUpOworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9pZ25vcmUpLF9pbml0KSkodm9pZCkKK3sKKyAgICBUSURUIHRpZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgIF9faXR0X3RocmVhZF9pbmZvICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfaWdub3JlKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnRpZCA9PSB0aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBuYW1lID0gInVua25vd24iOworICAgICAgICBORVdfVEhSRUFEX0lORk9fQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaCwgaF90YWlsLCB0aWQsIF9faXR0X3RocmVhZF9pZ25vcmVkLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaC0+c3RhdGUgPSBfX2l0dF90aHJlYWRfaWdub3JlZDsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfaWdub3JlKSxfaW5pdCkpKHZvaWQpCit7CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9pZ25vcmUpLF9pbml0KSkoKTsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhlbmFibGVfYXR0YWNoKSxfaW5pdCkpKHZvaWQpCit7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAvKgorICAgICAqIGlmIExJQl9WQVJfTkFNRSBlbnYgdmFyaWFibGUgd2VyZSBzZXQgYmVmb3JlIHRoZW4gc3RheSBwcmV2aW91cyB2YWx1ZQorICAgICAqIGVsc2Ugc2V0IGRlZmF1bHQgcGF0aAorICAgICovCisgICAgc2V0ZW52KElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSwgQU5EUk9JRF9JVFROT1RJRllfREVGQVVMVF9QQVRILCAwKTsKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciogX19pdHRfZnNwbGl0KGNvbnN0IGNoYXIqIHMsIGNvbnN0IGNoYXIqIHNlcCwgY29uc3QgY2hhcioqIG91dCwgaW50KiBsZW4pCit7CisgICAgaW50IGk7CisgICAgaW50IGo7CisKKyAgICBpZiAoIXMgfHwgIXNlcCB8fCAhb3V0IHx8ICFsZW4pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChpID0gMDsgc1tpXTsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBzZXBbal07IGorKykKKyAgICAgICAgICAgIGlmIChzW2ldID09IHNlcFtqXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFiKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFzW2ldKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICpsZW4gPSAwOworICAgICpvdXQgPSAmc1tpXTsKKworICAgIGZvciAoOyBzW2ldOyBpKyssICgqbGVuKSsrKQorICAgIHsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBzZXBbal07IGorKykKKyAgICAgICAgICAgIGlmIChzW2ldID09IHNlcFtqXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKDsgc1tpXTsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBzZXBbal07IGorKykKKyAgICAgICAgICAgIGlmIChzW2ldID09IHNlcFtqXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFiKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuICZzW2ldOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiBlbnYgdmFyaWFibGUgdGhhdCBwbGFjZWQgaW50byBzdGF0aWMgYnVmZmVyLgorICogISEhIFRoZSBzYW1lIHN0YXRpYyBidWZmZXIgaXMgdXNlZCBmb3Igc3Vic2VxdWVudCBjYWxscy4gISEhCisgKiBUaGlzIHdhcyBkb25lIHRvIGF2aW9kIGR5bmFtaWMgYWxsb2NhdGlvbiBmb3IgZmV3IGNhbGxzLgorICogQWN0dWFsbHkgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uIG9ubHkgZm91ciB0aW1lcy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIqIF9faXR0X2dldF9lbnZfdmFyKGNvbnN0IGNoYXIqIG5hbWUpCit7CisjZGVmaW5lIE1BWF9FTlZfVkFMVUVfU0laRSA0MDg2CisgICAgc3RhdGljIGNoYXIgIGVudl9idWZmW01BWF9FTlZfVkFMVUVfU0laRV07CisgICAgc3RhdGljIGNoYXIqIGVudl92YWx1ZSA9IChjaGFyKillbnZfYnVmZjsKKworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBzaXplX3QgbWF4X2xlbiA9IE1BWF9FTlZfVkFMVUVfU0laRSAtIChzaXplX3QpKGVudl92YWx1ZSAtIGVudl9idWZmKTsKKyAgICAgICAgRFdPUkQgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlQShuYW1lLCBlbnZfdmFsdWUsIChEV09SRCltYXhfbGVuKTsKKyAgICAgICAgaWYgKHJjID49IG1heF9sZW4pCisgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfZW52X3Rvb19sb25nLCBuYW1lLCAoc2l6ZV90KXJjIC0gMSwgKHNpemVfdCkobWF4X2xlbiAtIDEpKTsKKyAgICAgICAgZWxzZSBpZiAocmMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiByZXQgPSAoY29uc3QgY2hhciopZW52X3ZhbHVlOworICAgICAgICAgICAgZW52X3ZhbHVlICs9IHJjICsgMTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBlbXB0eSwgR2V0RW52aXJvcm5tZW50VmFyaWFibGVzKCkKKyAgICAgICAgICAgICAqIHJldHVybnMgemVybyAobnVtYmVyIG9mIGNoYXJhY3RlcnMgKG5vdCBpbmNsdWRpbmcgdGVybWluYXRpbmcgbnVsbCksCisgICAgICAgICAgICAgKiBhbmQgR2V0TGFzdEVycm9yKCkgcmV0dXJucyBFUlJPUl9TVUNDRVNTLiAqLworICAgICAgICAgICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVudl92YWx1ZTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52LCBuYW1lLCAoaW50KWVycik7CisgICAgICAgIH0KKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgY2hhciogZW52ID0gZ2V0ZW52KG5hbWUpOworICAgICAgICBpZiAoZW52ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oZW52KTsKKyAgICAgICAgICAgIHNpemVfdCBtYXhfbGVuID0gTUFYX0VOVl9WQUxVRV9TSVpFIC0gKHNpemVfdCkoZW52X3ZhbHVlIC0gZW52X2J1ZmYpOworICAgICAgICAgICAgaWYgKGxlbiA8IG1heF9sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmV0ID0gKGNvbnN0IGNoYXIqKWVudl92YWx1ZTsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGVudl92YWx1ZSwgZW52LCBsZW4gKyAxKTsKKyAgICAgICAgICAgICAgICBlbnZfdmFsdWUgKz0gbGVuICsgMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2Vudl90b29fbG9uZywgbmFtZSwgKHNpemVfdClsZW4sIChzaXplX3QpKG1heF9sZW4gLSAxKSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBfX2l0dF9nZXRfbGliX25hbWUodm9pZCkKK3sKKyAgICBjb25zdCBjaGFyKiBsaWJfbmFtZSA9IF9faXR0X2dldF9lbnZfdmFyKElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSk7CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIGlmIChsaWJfbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogY29uc3Qgc3lzdGVtX3dpZGVfbWFya2VyX2ZpbGVuYW1lID0gIi9kYXRhL2xvY2FsL3RtcC9jb20uaW50ZWwuaXR0LmNvbGxlY3Rvcl9saWIiOworICAgICAgICBpbnQgaXR0X21hcmtlcl9maWxlX2ZkID0gb3BlbihzeXN0ZW1fd2lkZV9tYXJrZXJfZmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgICAgICAgc3NpemVfdCByZXMgPSAwOworCisgICAgICAgIGlmIChpdHRfbWFya2VyX2ZpbGVfZmQgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHBpZF90IG15X3BpZCA9IGdldHBpZCgpOworICAgICAgICAgICAgY2hhciBjbWRsaW5lX3BhdGhbUEFUSF9NQVhdID0gezB9OworICAgICAgICAgICAgY2hhciBwYWNrYWdlX25hbWVbUEFUSF9NQVhdID0gezB9OworICAgICAgICAgICAgY2hhciBhcHBfc2FuZGJveF9maWxlW1BBVEhfTUFYXSA9IHswfTsKKyAgICAgICAgICAgIGludCBjbWRsaW5lX2ZkID0gMDsKKworICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiVW5hYmxlIHRvIG9wZW4gc3lzdGVtLXdpZGUgbWFya2VyIGZpbGUuIik7CisgICAgICAgICAgICBzbnByaW50ZihjbWRsaW5lX3BhdGgsIFBBVEhfTUFYIC0gMSwgIi9wcm9jLyVkL2NtZGxpbmUiLCBteV9waWQpOworICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiQ01EIGZpbGU6ICVzXG4iLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgY21kbGluZV9mZCA9IG9wZW4oY21kbGluZV9wYXRoLCBPX1JET05MWSk7CisgICAgICAgICAgICBpZiAoY21kbGluZV9mZCA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gb3BlbiAlcyBmaWxlISIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gcmVhZChjbWRsaW5lX2ZkLCBwYWNrYWdlX25hbWUsIFBBVEhfTUFYIC0gMSk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byByZWFkICVzIGZpbGUhIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXMgPSBjbG9zZShjbWRsaW5lX2ZkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIGNsb3NlICVzIGZpbGUhIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gY2xvc2UoY21kbGluZV9mZCk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBjbG9zZSAlcyBmaWxlISIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiUGFja2FnZSBuYW1lOiAlc1xuIiwgcGFja2FnZV9uYW1lKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGFwcF9zYW5kYm94X2ZpbGUsIFBBVEhfTUFYIC0gMSwgIi9kYXRhL2RhdGEvJXMvY29tLmludGVsLml0dC5jb2xsZWN0b3JfbGliIiwgcGFja2FnZV9uYW1lKTsKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIkxpYiBtYXJrZXIgZmlsZSBuYW1lOiAlc1xuIiwgYXBwX3NhbmRib3hfZmlsZSk7CisgICAgICAgICAgICBpdHRfbWFya2VyX2ZpbGVfZmQgPSBvcGVuKGFwcF9zYW5kYm94X2ZpbGUsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgIGlmIChpdHRfbWFya2VyX2ZpbGVfZmQgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIG9wZW4gYXBwIG1hcmtlciBmaWxlISIpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgaXR0X2xpYl9uYW1lW1BBVEhfTUFYXSA9IHswfTsKKworICAgICAgICAgICAgcmVzID0gcmVhZChpdHRfbWFya2VyX2ZpbGVfZmQsIGl0dF9saWJfbmFtZSwgUEFUSF9NQVggLSAxKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIHJlYWQgJXMgZmlsZSEiLCBpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIHJlcyA9IGNsb3NlKGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBjbG9zZSAlcyBmaWxlISIsIGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIklUVCBMaWIgcGF0aDogJXMiLCBpdHRfbGliX25hbWUpOworICAgICAgICAgICAgcmVzID0gY2xvc2UoaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIGNsb3NlICVzIGZpbGUhIiwgaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJTZXQgZW52Iik7CisgICAgICAgICAgICByZXMgPSBzZXRlbnYoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpLCBpdHRfbGliX25hbWUsIDApOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gc2V0IGVudiB2YXIhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGliX25hbWUgPSBfX2l0dF9nZXRfZW52X3ZhcihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSkpOworICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiSVRUIExpYiBwYXRoIGZyb20gZW52OiAlcyIsIGl0dF9saWJfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBsaWJfbmFtZTsKK30KKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgKGEpIDwgKGIpID8gKGEpIDogKGIpCisjZW5kaWYgLyogbWluICovCisKK3N0YXRpYyBfX2l0dF9ncm91cF9pZCBfX2l0dF9nZXRfZ3JvdXBzKHZvaWQpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgX19pdHRfZ3JvdXBfaWQgcmVzID0gX19pdHRfZ3JvdXBfbm9uZTsKKyAgICBjb25zdCBjaGFyKiB2YXJfbmFtZSAgPSAiSU5URUxfSVRUTk9USUZZX0dST1VQUyI7CisgICAgY29uc3QgY2hhciogZ3JvdXBfc3RyID0gX19pdHRfZ2V0X2Vudl92YXIodmFyX25hbWUpOworCisgICAgaWYgKGdyb3VwX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgY2hhciBnclsyNTVdOworICAgICAgICBjb25zdCBjaGFyKiBjaHVuazsKKyAgICAgICAgd2hpbGUgKChncm91cF9zdHIgPSBfX2l0dF9mc3BsaXQoZ3JvdXBfc3RyLCAiLDsgIiwgJmNodW5rLCAmbGVuKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgX19pdHRfZnN0cmNweW4oZ3IsIGNodW5rLCBzaXplb2YoZ3IpIC0gMSk7CisgICAgICAgICAgICBnclttaW4obGVuLCAoaW50KShzaXplb2YoZ3IpIC0gMSkpXSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGdyb3VwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFfX2l0dF9mc3RyY21wKGdyLCBncm91cF9saXN0W2ldLm5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gKF9faXR0X2dyb3VwX2lkKShyZXMgfCBncm91cF9saXN0W2ldLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFRPRE86ICEhISBXb3JrYXJvdW5kIGZvciBidWcgd2l0aCB3YXJuaW5nIGZvciB1bmtub3duIGdyb3VwICEhIQorICAgICAgICAgKiBTaG91bGQgYmUgZml4ZWQgaW4gbmV3IGluaXRpYWxpemF0aW9uIHNjaGVtZS4KKyAgICAgICAgICogTm93IHRoZSBmb2xsb3dpbmcgZ3JvdXBzIHNob3VsZCBiZSBzZXQgYWx3YXlzLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9saXN0W2ldLmlkICE9IF9faXR0X2dyb3VwX25vbmU7IGkrKykKKyAgICAgICAgICAgIGlmIChncm91cF9saXN0W2ldLmlkICE9IF9faXR0X2dyb3VwX2FsbCAmJgorICAgICAgICAgICAgICAgIGdyb3VwX2xpc3RbaV0uaWQgPiBfX2l0dF9ncm91cF9zcGxpdHRlcl9taW4gJiYKKyAgICAgICAgICAgICAgICBncm91cF9saXN0W2ldLmlkIDwgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWF4KQorICAgICAgICAgICAgICAgIHJlcyA9IChfX2l0dF9ncm91cF9pZCkocmVzIHwgZ3JvdXBfbGlzdFtpXS5pZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGdyb3VwX2FsaWFzW2ldLmVudl92YXIgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgaWYgKF9faXR0X2dldF9lbnZfdmFyKGdyb3VwX2FsaWFzW2ldLmVudl92YXIpICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwX2FsaWFzW2ldLmdyb3VwczsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9faXR0X2xpYl92ZXJzaW9uKGxpYl90IGxpYikKK3sKKyAgICBpZiAobGliID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChfX2l0dF9nZXRfcHJvYyhsaWIsICJfX2l0dF9hcGlfaW5pdCIpKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoX19pdHRfZ2V0X3Byb2MobGliLCAiX19pdHRfYXBpX3ZlcnNpb24iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEl0J3Mgbm90IHVzZWQgcmlnaHQgbm93ISBDb21tZW50IGl0IG91dCB0byBhdm9pZCB3YXJuaW5ncy4KK3N0YXRpYyB2b2lkIF9faXR0X3JlaW5pdF9hbGxfcG9pbnRlcnModm9pZCkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICAvLyBGaWxsIGFsbCBwb2ludGVycyB3aXRoIGluaXRpYWwgc3R1YnMKKyAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uaW5pdF9mdW5jOworfQorKi8KKworc3RhdGljIHZvaWQgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnModm9pZCkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICAvKiBOdWxpZnkgYWxsIHBvaW50ZXJzIGV4Y2VwdCBkb21haW5fY3JlYXRlIGFuZCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSAqLworICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmM7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTQpIC8qIHdhcm5pbmcgQzQwNTQ6ICd0eXBlIGNhc3QnIDogZnJvbSBmdW5jdGlvbiBwb2ludGVyICdYWFgnIHRvIGRhdGEgcG9pbnRlciAndm9pZCAqJyAqLworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTUpIC8qIHdhcm5pbmcgQzQwNTU6ICd0eXBlIGNhc3QnIDogZnJvbSBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgdG8gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitJVFRfRVhURVJOX0Mgdm9pZCBfTl8oZmluaV9pdHRsaWIpKHZvaWQpCit7CisgICAgX19pdHRfYXBpX2ZpbmlfdCogX19pdHRfYXBpX2ZpbmlfcHRyOworICAgIHN0YXRpYyB2b2xhdGlsZSBUSURUIGN1cnJlbnRfdGhyZWFkID0gMDsKKworICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICB7CisgICAgICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3RocmVhZCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgICAgICAgICAgICAgX19pdHRfYXBpX2ZpbmlfcHRyID0gKF9faXR0X2FwaV9maW5pX3QqKShzaXplX3QpX19pdHRfZ2V0X3Byb2MoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIsICJfX2l0dF9hcGlfZmluaSIpOworICAgICAgICAgICAgICAgIGlmIChfX2l0dF9hcGlfZmluaV9wdHIpCisgICAgICAgICAgICAgICAgICAgIF9faXR0X2FwaV9maW5pX3B0cigmX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisKKyAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworCisgLyogVE9ETzogISEhIG5vdCBzYWZlICEhISBkb24ndCBzdXBwb3J0IHVubG9hZCBzbyBmYXIuCisgICogICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliICE9IE5VTEwpCisgICogICAgICAgICAgICAgICAgIF9faXR0X3VubG9hZF9saWIoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIpOworICAqICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkubGliID0gTlVMTDsKKyAgKi8KKyAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCA9IDA7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgfQorfQorCitJVFRfRVhURVJOX0MgaW50IF9OXyhpbml0X2l0dGxpYikoY29uc3QgY2hhciogbGliX25hbWUsIF9faXR0X2dyb3VwX2lkIGluaXRfZ3JvdXBzKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwczsKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICBfX2l0dF9ncm91cF9pZCB6ZXJvX2dyb3VwID0gX19pdHRfZ3JvdXBfbm9uZTsKKyNlbmRpZiAvKiBJVFRfQ09NUExFVEVfR1JPVVAgKi8KKyAgICBzdGF0aWMgdm9sYXRpbGUgVElEVCBjdXJyZW50X3RocmVhZCA9IDA7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgIHsKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCisgICAgICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworI2VuZGlmIC8qIElUVF9TSU1QTEVfSU5JVCAqLworCisgICAgICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3RocmVhZCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID0gY3VycmVudF90aHJlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGxpYl9uYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGxpYl9uYW1lID0gX19pdHRfZ2V0X2xpYl9uYW1lKCk7CisgICAgICAgICAgICAgICAgZ3JvdXBzID0gX19pdHRfZ2V0X2dyb3VwcygpOworICAgICAgICAgICAgICAgIGlmIChncm91cHMgIT0gX19pdHRfZ3JvdXBfbm9uZSB8fCBsaWJfbmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIgPSBfX2l0dF9sb2FkX2xpYigobGliX25hbWUgPT0gTlVMTCkgPyBpdHRub3RpZnlfbGliX25hbWUgOiBsaWJfbmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2FwaV9pbml0X3QqIF9faXR0X2FwaV9pbml0X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaWJfdmVyc2lvbiA9IF9faXR0X2xpYl92ZXJzaW9uKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChsaWJfdmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyA9IF9faXR0X2dyb3VwX2xlZ2FjeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxsIGFsbCBwb2ludGVycyBmcm9tIGR5bmFtaWMgbGlicmFyeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwICYgZ3JvdXBzICYgaW5pdF9ncm91cHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9ICh2b2lkKilfX2l0dF9nZXRfcHJvYyhfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiwgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBwb2ludGVycyBmb3IgZnVuY3Rpb24gd2l0aCBzdGF0aWMgaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX25vX3N5bWJvbCwgbGliX25hbWUsIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUpOworI2lmZGVmIElUVF9DT01QTEVURV9HUk9VUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9fZ3JvdXAgPSAoX19pdHRfZ3JvdXBfaWQpKHplcm9fZ3JvdXAgfCBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCk7CisjZW5kaWYgLyogSVRUX0NPTVBMRVRFX0dST1VQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cHMgPT0gX19pdHRfZ3JvdXBfbGVnYWN5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSB0b29scyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSAgPSBJVFROT1RJRllfTkFNRSh0aHJfaWdub3JlKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVBKSAgID0gSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZUEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZVcpICAgPSBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lVyk7CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlKSAgICA9IElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX3ByZXBhcmUpICAgPSBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19wcmVwYXJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jYW5jZWwpICAgID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfY2FuY2VsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19hY3F1aXJlZCkgID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfYWNxdWlyZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX3JlbGVhc2luZykgPSBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19yZWxlYXNpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIElUVF9DT01QTEVURV9HUk9VUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXAgJiB6ZXJvX2dyb3VwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworI2VuZGlmIC8qIElUVF9DT01QTEVURV9HUk9VUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2FwaV9pbml0X3B0ciA9IChfX2l0dF9hcGlfaW5pdF90Kikoc2l6ZV90KV9faXR0X2dldF9wcm9jKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliLCAiX19pdHRfYXBpX2luaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19pdHRfYXBpX2luaXRfcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF9wdHIoJl9OXyhfaXR0YXBpX2dsb2JhbCksIGluaXRfZ3JvdXBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9ub19tb2R1bGUsIGxpYl9uYW1lLAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N5c3RlbV9lcnJvcigpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxlcnJvcigpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkID0gMTsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IDA7CisgICAgICAgICAgICAgICAgLyogISEhIEp1c3QgdG8gYXZvaWQgdW51c2VkIGNvZGUgZWxpbWluYXRpb24gISEhICovCisgICAgICAgICAgICAgICAgaWYgKF9faXR0X2ZpbmlfaXR0bGliX3B0ciA9PSBfTl8oZmluaV9pdHRsaWIpKSBjdXJyZW50X3RocmVhZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKKyAgICAgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyAgICB9CisKKyAgICAvKiBFdmFsdWF0aW5nIGlmIGFueSBmdW5jdGlvbiBwdHIgaXMgbm9uIGVtcHR5IGFuZCBpdCdzIGluIGluaXRfZ3JvdXBzICovCisgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgIGlmICgqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgIT0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jICYmCisgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCAmIGluaXRfZ3JvdXBzKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0lUVF9FWFRFUk5fQyBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIF9OXyhzZXRfZXJyb3JfaGFuZGxlcikoX19pdHRfZXJyb3JfaGFuZGxlcl90KiBoYW5kbGVyKQoreworICAgIF9faXR0X2Vycm9yX2hhbmRsZXJfdCogcHJldiA9IChfX2l0dF9lcnJvcl9oYW5kbGVyX3QqKShzaXplX3QpX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyOworICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlciA9ICh2b2lkKikoc2l6ZV90KWhhbmRsZXI7CisgICAgcmV0dXJuIHByZXY7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE4Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5oCkBAIC0wLDAgKzEsMzE2IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJpdHRub3RpZnlfY29uZmlnLmgiCisKKyNpZm5kZWYgSVRUX0ZPUk1BVF9ERUZJTkVECisjICBpZm5kZWYgSVRUX0ZPUk1BVAorIyAgICBkZWZpbmUgSVRUX0ZPUk1BVAorIyAgZW5kaWYgLyogSVRUX0ZPUk1BVCAqLworIyAgaWZuZGVmIElUVF9OT19QQVJBTVMKKyMgICAgZGVmaW5lIElUVF9OT19QQVJBTVMKKyMgIGVuZGlmIC8qIElUVF9OT19QQVJBTVMgKi8KKyNlbmRpZiAvKiBJVFRfRk9STUFUX0RFRklORUQgKi8KKworLyoKKyAqIHBhcmFtZXRlcnMgZm9yIG1hY3JvIGV4cGVjdGVkOgorICogSVRUX1NUVUIoYXBpLCB0eXBlLCBmdW5jX25hbWUsIGFyZ3VtZW50cywgcGFyYW1zLCBmdW5jX25hbWVfaW5fZGxsLCBncm91cCwgcHJpbnRmX2ZtdCkKKyAqLworI2lmZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2RvbWFpbiosIGRvbWFpbl9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBkb21haW5fY3JlYXRlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIGRvbWFpbl9jcmVhdGVXLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgZG9tYWluX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgc3RyaW5nX2hhbmRsZV9jcmVhdGVBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZVcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHN0cmluZ19oYW5kbGVfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcGF1c2UsICAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgcGF1c2UsICBfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZXN1bWUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCByZXN1bWUsIF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgdGhyZWFkX3NldF9uYW1lQSwgX19pdHRfZ3JvdXBfdGhyZWFkLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHRocmVhZF9zZXRfbmFtZVcsIF9faXR0X2dyb3VwX3RocmVhZCwgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCB0aHJlYWRfc2V0X25hbWUsICBfX2l0dF9ncm91cF90aHJlYWQsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX2lnbm9yZSwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHRocmVhZF9pZ25vcmUsIF9faXR0X2dyb3VwX3RocmVhZCwgIm5vIGFyZ3MiKQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIHRocl9uYW1lX3NldEEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCB0aHJfbmFtZV9zZXRBLCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgdGhyX25hbWVfc2V0VywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIHRocl9uYW1lX3NldFcsIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICB0aHJfbmFtZV9zZXQsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgdGhyX25hbWVfc2V0LCAgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCB0aHJfaWdub3JlLCAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICAgICB0aHJfaWdub3JlLCAgICBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGVuYWJsZV9hdHRhY2gsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBlbmFibGVfYXR0YWNoLCBfX2l0dF9ncm91cF9hbGwsICJubyBhcmdzIikKKworI2Vsc2UgIC8qIF9fSVRUX0lOVEVSTkFMX0lOSVQgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfY3JlYXRlQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiwgXCIlc1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19jcmVhdGVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlU1wiLCBcIiVTXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBuYW1lKSwgc3luY19yZW5hbWVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBuYW1lKSwgc3luY19yZW5hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIGFkZHIsIG5hbWUpLCBzeW5jX3JlbmFtZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19kZXN0cm95LCAgICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2Rlc3Ryb3ksICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3ByZXBhcmUsICAgICh2b2lkKiBhZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfcHJlcGFyZSwgICBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY2FuY2VsLCAgICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19jYW5jZWwsICAgIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19hY3F1aXJlZCwgICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2FjcXVpcmVkLCAgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbGVhc2luZywgICh2b2lkKiBhZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfcmVsZWFzaW5nLCBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcHVzaCwgICAgICAgKHVuc2lnbmVkIGludCBtYXNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIG1hc2spLCBzdXBwcmVzc19wdXNoLCAgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcG9wLCAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICBzdXBwcmVzc19wb3AsICAgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19tYXJrX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpLChJVFRfRk9STUFUIG1vZGUsIG1hc2ssIGFkZHJlc3MsIHNpemUpLCBzdXBwcmVzc19tYXJrX3JhbmdlLCBfX2l0dF9ncm91cF9zdXBwcmVzcywgIiVkLCAlcCwgJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX2NsZWFyX3JhbmdlLChfX2l0dF9zdXBwcmVzc19tb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IG1hc2ssIHZvaWQgKiBhZGRyZXNzLCBzaXplX3Qgc2l6ZSksKElUVF9GT1JNQVQgbW9kZSwgbWFzaywgYWRkcmVzcywgc2l6ZSksIHN1cHByZXNzX2NsZWFyX3JhbmdlLF9faXR0X2dyb3VwX3N1cHByZXNzLCAiJWQsICVwLCAlcCwgJWQiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19wcmVwYXJlLCAgICh2b2lkKiBhZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfcHJlcGFyZSwgICBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX2NhbmNlbCwgICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19jYW5jZWwsICAgIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfYWNxdWlyZWQsICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2FjcXVpcmVkLCAgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19yZWxlYXNpbmcsICh2b2lkKiBhZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfcmVsZWFzaW5nLCBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbiwgICAgICAgICAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSwgKElUVF9GT1JNQVQgc2l0ZSwgaW5zdGFuY2UsIG5hbWUpLCBtb2RlbF9zaXRlX2JlZ2luLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlcCwgXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfZW5kLCAgICAgICAgICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSksICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHNpdGUsIGluc3RhbmNlKSwgICAgICAgbW9kZWxfc2l0ZV9lbmQsICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbiwgICAgICAgICAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSwgKElUVF9GT1JNQVQgdGFzaywgaW5zdGFuY2UsIG5hbWUpLCBtb2RlbF90YXNrX2JlZ2luLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlcCwgXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfZW5kLCAgICAgICAgICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSksICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHRhc2ssIGluc3RhbmNlKSwgICAgICAgbW9kZWxfdGFza19lbmQsICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlLCAgICAgICAgKHZvaWQgKmxvY2spLCAoSVRUX0ZPUk1BVCBsb2NrKSwgbW9kZWxfbG9ja19hY3F1aXJlLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZSwgICAgICAgICh2b2lkICpsb2NrKSwgKElUVF9GT1JNQVQgbG9jayksIG1vZGVsX2xvY2tfcmVsZWFzZSwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24sICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiwgKHZvaWQgKmFkZHIpLCAgICAgICAgICAgICAgKElUVF9GT1JNQVQgYWRkciksICAgICAgIG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24sIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaW5kdWN0aW9uX3VzZXMsICAgICAgKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX2luZHVjdGlvbl91c2VzLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlZHVjdGlvbl91c2VzLCAgICAgICh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9vYnNlcnZlX3VzZXMsICAgICAgICAodm9pZCogYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfY2xlYXJfdXNlcywgICAgICAgICAgKHZvaWQqIGFkZHIpLCAgICAgICAgICAgICAgKElUVF9GT1JNQVQgYWRkciksICAgICAgIG1vZGVsX2NsZWFyX3VzZXMsICAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5XLCAgICAgICAgIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9zaXRlX2JlZ2luVywgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luVywgICAgICAgICAoY29uc3Qgd2NoYXJfdCAqbmFtZSksICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfdGFza19iZWdpblcsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tXLCAgICAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BLCAgICAgICAgIChjb25zdCBjaGFyICpuYW1lKSwgICAgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9zaXRlX2JlZ2luQSwgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQUwsICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiksIChJVFRfRk9STUFUIG5hbWUsIGxlbiksIG1vZGVsX3NpdGVfYmVnaW5BTCwgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BLCAgICAgICAgIChjb25zdCBjaGFyICpuYW1lKSwgICAgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF90YXNrX2JlZ2luQSwgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQUwsICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiksIChJVFRfRk9STUFUIG5hbWUsIGxlbiksIG1vZGVsX3Rhc2tfYmVnaW5BTCwgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrQSwgICAgIChjb25zdCBjaGFyICpuYW1lKSwgICAgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCAgICAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiksIChJVFRfRk9STUFUIG5hbWUsIGxlbiksIG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwsIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZF8yLCAgICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgbW9kZWxfc2l0ZV9lbmRfMiwgICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfZW5kXzIsICAgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICBtb2RlbF90YXNrX2VuZF8yLCAgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlXzIsICAgICAgKHZvaWQgKmxvY2spLCAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbG9jayksICAgICAgIG1vZGVsX2xvY2tfYWNxdWlyZV8yLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlXzIsICAgICAgKHZvaWQgKmxvY2spLCAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbG9jayksICAgICAgIG1vZGVsX2xvY2tfcmVsZWFzZV8yLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfYWdncmVnYXRlX3Rhc2ssICAgICAgKHNpemVfdCBjb3VudCksICAgICAgICAgICAgKElUVF9GT1JNQVQgY291bnQpLCAgICAgIG1vZGVsX2FnZ3JlZ2F0ZV90YXNrLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wdXNoLCAgICAgICAgKF9faXR0X21vZGVsX2Rpc2FibGUgeCksICAgKElUVF9GT1JNQVQgeCksICAgICAgICAgIG1vZGVsX2Rpc2FibGVfcHVzaCwgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wb3AsICAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgIG1vZGVsX2Rpc2FibGVfcG9wLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfaGVhcF9mdW5jdGlvbiwgaGVhcF9mdW5jdGlvbl9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgaGVhcF9mdW5jdGlvbl9jcmVhdGVBLCBfX2l0dF9ncm91cF9oZWFwLCAiXCIlc1wiLCBcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBjb25zdCB3Y2hhcl90ICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcsIF9faXR0X2dyb3VwX2hlYXAsICJcIiVzXCIsIFwiJXNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGhlYXBfZnVuY3Rpb25fY3JlYXRlLCAgX19pdHRfZ3JvdXBfaGVhcCwgIlwiJXNcIiwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2FsbG9jYXRlX2JlZ2luLCAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpLCAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBoLCBzaXplLCBpbml0aWFsaXplZCksICAgICAgIGhlYXBfYWxsb2NhdGVfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2FsbG9jYXRlX2VuZCwgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgKElUVF9GT1JNQVQgaCwgYWRkciwgc2l6ZSwgaW5pdGlhbGl6ZWQpLCBoZWFwX2FsbG9jYXRlX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwLCAlbHUsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9iZWdpbiwgICAgICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogIGFkZHIpLCAoSVRUX0ZPUk1BVCBoLCBhZGRyKSwgaGVhcF9mcmVlX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9lbmQsICAgICAgICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogIGFkZHIpLCAoSVRUX0ZPUk1BVCBoLCBhZGRyKSwgaGVhcF9mcmVlX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogIGFkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBoLCBhZGRyLCBuZXdfc2l6ZSwgaW5pdGlhbGl6ZWQpLCAgICAgICAgICAgaGVhcF9yZWFsbG9jYXRlX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwLCAlbHUsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9lbmQsICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogIGFkZHIsIHZvaWQqKiBuZXdfYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpLCAoSVRUX0ZPUk1BVCBoLCBhZGRyLCBuZXdfYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKSwgaGVhcF9yZWFsbG9jYXRlX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICAgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQsICAgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVzZXRfZGV0ZWN0aW9uLCAodW5zaWduZWQgaW50IHJlc2V0X21hc2spLCAgKElUVF9GT1JNQVQgcmVzZXRfbWFzayksIGhlYXBfcmVzZXRfZGV0ZWN0aW9uLCBfX2l0dF9ncm91cF9oZWFwLCAiJXUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmQsICAgICAgICAgICh1bnNpZ25lZCBpbnQgcmVjb3JkX21hc2spLCAoSVRUX0ZPUk1BVCByZWNvcmRfbWFzayksICBoZWFwX3JlY29yZCwgICAgICAgIF9faXR0X2dyb3VwX2hlYXAsICIldSIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZSwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgaWRfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIGlkX2Rlc3Ryb3ksIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RpbWVzdGFtcCwgZ2V0X3RpbWVzdGFtcCwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGdldF90aW1lc3RhbXAsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJubyBhcmdzIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVnaW9uX2JlZ2luLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCByZWdpb25fYmVnaW4sIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVnaW9uX2VuZCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgICAgICAgICAgICAgICByZWdpb25fZW5kLCAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luX3YzLCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCAgICAgICAgICAgICBmcmFtZV9iZWdpbl92MywgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmRfdjMsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgICAgICAgICAgICAgZnJhbWVfZW5kX3YzLCAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfc3VibWl0X3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCwgX19pdHRfdGltZXN0YW1wIGJlZ2luLCBfX2l0dF90aW1lc3RhbXAgZW5kKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgYmVnaW4sIGVuZCksIGZyYW1lX3N1Ym1pdF92MywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2dyb3VwLCAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHRhc2tfZ3JvdXAsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbiwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgdGFza19iZWdpbiwgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIHZvaWQqIGZuKSwgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIGZuKSwgICB0YXNrX2JlZ2luX2ZuLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kLCAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiksICAgICAgICAgICAgICAgICAgIHRhc2tfZW5kLCAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfdjMsICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBuYW1lKSwgICAgICAgIGNvdW50ZXJfaW5jX3YzLCAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGFfdjMsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKSwgKElUVF9GT1JNQVQgZG9tYWluLCBuYW1lLCB2YWx1ZSksIGNvdW50ZXJfaW5jX2RlbHRhX3YzLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1hcmtlciwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBuYW1lLCBzY29wZSksIG1hcmtlciwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVkIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkLCAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIHR5cGUsIGNvdW50LCBkYXRhKSwgbWV0YWRhdGFfYWRkLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJWQsICVsdSwgJXAiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZEEsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZEEsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRXLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJXAsICVsdSIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkLCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVwLCAlbHUiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfdG9fY3VycmVudCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgcmVsYXRpb24sIHRhaWwpLCAgICAgICByZWxhdGlvbl9hZGRfdG9fY3VycmVudCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkLCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGhlYWQsIHJlbGF0aW9uLCB0YWlsKSwgcmVsYXRpb25fYWRkLCAgICAgICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIGV2ZW50X2NyZWF0ZUEsIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCBldmVudF9jcmVhdGVXLCBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlU1wiLCAlZCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgZXZlbnRfY3JlYXRlLCAgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICBldmVudF9zdGFydCwgICAgICAgICAgKF9faXR0X2V2ZW50IGV2ZW50KSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZXZlbnQpLCAgICAgICAgIGV2ZW50X3N0YXJ0LCAgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIGV2ZW50X2VuZCwgICAgICAgICAgICAoX19pdHRfZXZlbnQgZXZlbnQpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBldmVudCksICAgICAgICAgZXZlbnRfZW5kLCAgICAgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19zZXRfbmFtZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19zZXRfbmFtZVcsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVTXCIsIFwiJVNcIiwgJXgiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19zZXRfbmFtZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgInAsIFwiJXNcIiwgXCIlc1wiLCAleCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lQSwgKHZvaWQgKnAsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIHAsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSksIG5vdGlmeV9zeW5jX25hbWVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlc1wiLCAlZCwgXCIlc1wiLCAlZCwgJXgiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWVXLCAodm9pZCAqcCwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgcCwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKSwgbm90aWZ5X3N5bmNfbmFtZVcsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVTXCIsICVkLCBcIiVTXCIsICVkLCAleCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZSwgICh2b2lkICpwLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBwLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpLCBub3RpZnlfc3luY19uYW1lLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJXNcIiwgJWQsIFwiJXNcIiwgJWQsICV4IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfcHJlcGFyZSwgICAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19wcmVwYXJlLCAgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2NhbmNlbCwgICAgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19hY3F1aXJlZCwgICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX2FjcXVpcmVkLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19yZWxlYXNpbmcsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV9yZWFkLCAgICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtZW1vcnlfcmVhZCwgICBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgJWx1IikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV93cml0ZSwgICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtZW1vcnlfd3JpdGUsICBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgJWx1IikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV91cGRhdGUsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtZW1vcnlfdXBkYXRlLCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgJWx1IikKKworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCAgICAgc3RhdGVfZ2V0LCAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgIHN0YXRlX2dldCwgICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X3N0YXRlX3QsICAgICBzdGF0ZV9zZXQsICAgIChfX2l0dF9zdGF0ZV90IHMpLCAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBzKSwgICAgc3RhdGVfc2V0LCAgICBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X29ial9zdGF0ZV90LCBvYmpfbW9kZV9zZXQsIChfX2l0dF9vYmpfcHJvcF90IHAsIF9faXR0X29ial9zdGF0ZV90IHMpLCAoSVRUX0ZPUk1BVCBwLCBzKSwgb2JqX21vZGVfc2V0LCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCwgJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF90aHJfc3RhdGVfdCwgdGhyX21vZGVfc2V0LCAoX19pdHRfdGhyX3Byb3BfdCBwLCBfX2l0dF90aHJfc3RhdGVfdCBzKSwgKElUVF9GT1JNQVQgcCwgcyksIHRocl9tb2RlX3NldCwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQsICVkIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgZG9tYWluKSwgZnJhbWVfY3JlYXRlQSwgX19pdHRfZ3JvdXBfZnJhbWUsICJcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKmRvbWFpbiksIChJVFRfRk9STUFUIGRvbWFpbiksIGZyYW1lX2NyZWF0ZVcsIF9faXR0X2dyb3VwX2ZyYW1lLCAiXCIlc1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBkb21haW4pLCBmcmFtZV9jcmVhdGUsICBfX2l0dF9ncm91cF9mcmFtZSwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW4sICAgICAgICAgKF9faXR0X2ZyYW1lIGZyYW1lKSwgICAgIChJVFRfRk9STUFUIGZyYW1lKSwgIGZyYW1lX2JlZ2luLCAgIF9faXR0X2dyb3VwX2ZyYW1lLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfZW5kLCAgICAgICAgICAgKF9faXR0X2ZyYW1lIGZyYW1lKSwgICAgIChJVFRfRk9STUFUIGZyYW1lKSwgIGZyYW1lX2VuZCwgICAgIF9faXR0X2dyb3VwX2ZyYW1lLCAiJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgY291bnRlcl9jcmVhdGVBLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiXCIlc1wiLCBcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBjb25zdCB3Y2hhcl90ICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBjb3VudGVyX2NyZWF0ZVcsIF9faXR0X2dyb3VwX2NvdW50ZXIsICJcIiVzXCIsIFwiJXNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGNvdW50ZXJfY3JlYXRlLCAgX19pdHRfZ3JvdXBfY291bnRlciwgIlwiJXNcIiwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2Rlc3Ryb3ksICAgKF9faXR0X2NvdW50ZXIgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGlkKSwgICAgICAgIGNvdW50ZXJfZGVzdHJveSwgICBfX2l0dF9ncm91cF9jb3VudGVyLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmMsICAgICAgIChfX2l0dF9jb3VudGVyIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBpZCksICAgICAgICBjb3VudGVyX2luYywgICAgICAgX19pdHRfZ3JvdXBfY291bnRlciwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhLCAoX19pdHRfY291bnRlciBpZCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKSwgKElUVF9GT1JNQVQgaWQsIHZhbHVlKSwgY291bnRlcl9pbmNfZGVsdGEsIF9faXR0X2dyb3VwX2NvdW50ZXIsICIlcCwgJWx1IikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtYXJrX2NyZWF0ZUEsIF9faXR0X2dyb3VwX21hcmssICJcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbWFya19jcmVhdGVXLCBfX2l0dF9ncm91cF9tYXJrLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1hcmtfY3JlYXRlLCAgX19pdHRfZ3JvdXBfbWFyaywgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrQSwgICAgICAgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrQSwgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrVywgICAgICAgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrVywgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrLCAgICAgICAgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrLCAgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX29mZiwgKF9faXR0X21hcmtfdHlwZSBtdCksIChJVFRfRk9STUFUIG10KSwgbWFya19vZmYsIF9faXR0X2dyb3VwX21hcmssICIlZCIpCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsQSwgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtfZ2xvYmFsQSwgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbFcsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrX2dsb2JhbFcsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWwsICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya19nbG9iYWwsICBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJVNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsX29mZiwgKF9faXR0X21hcmtfdHlwZSBtdCksICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbXQpLCAgICAgICAgICAgIG1hcmtfZ2xvYmFsX29mZiwgX19pdHRfZ3JvdXBfbWFyaywgIiVkIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NhbGxlciwgc3RhY2tfY2FsbGVyX2NyZWF0ZSwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHN0YWNrX2NhbGxlcl9jcmVhdGUsICBfX2l0dF9ncm91cF9zdGl0Y2gsICJubyBhcmdzIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZXJfZGVzdHJveSwgKF9faXR0X2NhbGxlciBpZCksIChJVFRfRk9STUFUIGlkKSwgc3RhY2tfY2FsbGVyX2Rlc3Ryb3ksIF9faXR0X2dyb3VwX3N0aXRjaCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9lbnRlciwgICAoX19pdHRfY2FsbGVyIGlkKSwgKElUVF9GT1JNQVQgaWQpLCBzdGFja19jYWxsZWVfZW50ZXIsICAgX19pdHRfZ3JvdXBfc3RpdGNoLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2xlYXZlLCAgIChfX2l0dF9jYWxsZXIgaWQpLCAoSVRUX0ZPUk1BVCBpZCksIHN0YWNrX2NhbGxlZV9sZWF2ZSwgICBfX2l0dF9ncm91cF9zdGl0Y2gsICIlcCIpCisKK0lUVF9TVFVCKElUVEFQSSwgIF9faXR0X2Nsb2NrX2RvbWFpbiosIGNsb2NrX2RvbWFpbl9jcmVhdGUsIChfX2l0dF9nZXRfY2xvY2tfaW5mb19mbiBmbiwgdm9pZCogZm5fZGF0YSksIChJVFRfRk9STUFUIGZuLCBmbl9kYXRhKSwgY2xvY2tfZG9tYWluX2NyZWF0ZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsICAgICAgICAgICAgICAgIGNsb2NrX2RvbWFpbl9yZXNldCwgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICAgY2xvY2tfZG9tYWluX3Jlc2V0LCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGVfZXgsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkKSwgaWRfY3JlYXRlX2V4LCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95X2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkKSwgaWRfZGVzdHJveV9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2V4LCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgcGFyZW50aWQsIG5hbWUpLCB0YXNrX2JlZ2luX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZm5fZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pLCAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkLCBwYXJlbnRpZCwgZm4pLCB0YXNrX2JlZ2luX2ZuX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX2V4LCAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXApLCB0YXNrX2VuZF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9vdmVybGFwcGVkLCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCB0YXNrX2JlZ2luX292ZXJsYXBwZWQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9vdmVybGFwcGVkX2V4LCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgcGFyZW50aWQsIG5hbWUpLCB0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgdGFza19lbmRfb3ZlcmxhcHBlZCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkKSwgdGFza19lbmRfb3ZlcmxhcHBlZF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXJfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkLCBuYW1lLCBzY29wZSksIG1hcmtlcl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZF93aXRoX3Njb3BlLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSwgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCB0eXBlLCBjb3VudCwgZGF0YSksIG1ldGFkYXRhX2FkZF93aXRoX3Njb3BlLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlZCwgJWx1LCAlcCIpCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKSwgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlcCwgJWx1IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJXAsICVsdSIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCByZWxhdGlvbiwgdGFpbCksICAgICAgIHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWQsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfZXgsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBoZWFkLCByZWxhdGlvbiwgdGFpbCksIHJlbGF0aW9uX2FkZF9leCwgICAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlZCwgJWx1IikKK0lUVF9TVFVCKElUVEFQSSwgIF9faXR0X3RyYWNrX2dyb3VwKiwgdHJhY2tfZ3JvdXBfY3JlYXRlLCAoX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0cmFja19ncm91cF90eXBlKSwgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIG5hbWUsIHRyYWNrX2dyb3VwX3R5cGUpLCAgICAgICAgdHJhY2tfZ3JvdXBfY3JlYXRlLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQiKQorSVRUX1NUVUIoSVRUQVBJLCAgX19pdHRfdHJhY2sqLCAgICAgICB0cmFja19jcmVhdGUsICAgICAgIChfX2l0dF90cmFja19ncm91cCogdHJhY2tfZ3JvdXAsX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfdHlwZSB0cmFja190eXBlKSwgKElUVF9GT1JNQVQgdHJhY2tfZ3JvdXAsIG5hbWUsIHRyYWNrX3R5cGUpLCB0cmFja19jcmVhdGUsICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgICAgICAgICAgICAgICBzZXRfdHJhY2ssICAgICAgICAgIChfX2l0dF90cmFjayAqdHJhY2spLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgdHJhY2spLCAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdHJhY2ssICAgICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCitJVFRfU1RVQihJVFRBUEksIGNvbnN0IGNoYXIqLCBhcGlfdmVyc2lvbiwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGFwaV92ZXJzaW9uLCBfX2l0dF9ncm91cF9hbGwgJiB+X19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBhdl9zYXZlQSwgKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKSwgKElUVF9GT1JNQVQgZGF0YSwgcmFuaywgZGltZW5zaW9ucywgdHlwZSwgZmlsZVBhdGgsIGNvbHVtbk9yZGVyKSwgYXZfc2F2ZUEsIF9faXR0X2dyb3VwX2FycmF5cywgIiVwLCAlZCwgJXAsICVkLCBcIiVzXCIsICVkIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBhdl9zYXZlVywgKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCB3Y2hhcl90ICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKSwgKElUVF9GT1JNQVQgZGF0YSwgcmFuaywgZGltZW5zaW9ucywgdHlwZSwgZmlsZVBhdGgsIGNvbHVtbk9yZGVyKSwgYXZfc2F2ZVcsIF9faXR0X2dyb3VwX2FycmF5cywgIiVwLCAlZCwgJXAsICVkLCBcIiVTXCIsICVkIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBhdl9zYXZlLCAgKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKSwgKElUVF9GT1JNQVQgZGF0YSwgcmFuaywgZGltZW5zaW9ucywgdHlwZSwgZmlsZVBhdGgsIGNvbHVtbk9yZGVyKSwgYXZfc2F2ZSwgIF9faXR0X2dyb3VwX2FycmF5cywgIiVwLCAlZCwgJXAsICVkLCBcIiVzXCIsICVkIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9JTklUICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTVhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaApAQCAtMCwwICsxLDY3IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0lUVE5PVElGWV9UWVBFU19IXworI2RlZmluZSBfSVRUTk9USUZZX1RZUEVTX0hfCisKK3R5cGVkZWYgZW51bSBfX19pdHRfZ3JvdXBfaWQKK3sKKyAgICBfX2l0dF9ncm91cF9ub25lICAgICAgPSAwLAorICAgIF9faXR0X2dyb3VwX2xlZ2FjeSAgICA9IDE8PDAsCisgICAgX19pdHRfZ3JvdXBfY29udHJvbCAgID0gMTw8MSwKKyAgICBfX2l0dF9ncm91cF90aHJlYWQgICAgPSAxPDwyLAorICAgIF9faXR0X2dyb3VwX21hcmsgICAgICA9IDE8PDMsCisgICAgX19pdHRfZ3JvdXBfc3luYyAgICAgID0gMTw8NCwKKyAgICBfX2l0dF9ncm91cF9mc3luYyAgICAgPSAxPDw1LAorICAgIF9faXR0X2dyb3VwX2ppdCAgICAgICA9IDE8PDYsCisgICAgX19pdHRfZ3JvdXBfbW9kZWwgICAgID0gMTw8NywKKyAgICBfX2l0dF9ncm91cF9zcGxpdHRlcl9taW4gPSAxPDw3LAorICAgIF9faXR0X2dyb3VwX2NvdW50ZXIgICA9IDE8PDgsCisgICAgX19pdHRfZ3JvdXBfZnJhbWUgICAgID0gMTw8OSwKKyAgICBfX2l0dF9ncm91cF9zdGl0Y2ggICAgPSAxPDwxMCwKKyAgICBfX2l0dF9ncm91cF9oZWFwICAgICAgPSAxPDwxMSwKKyAgICBfX2l0dF9ncm91cF9zcGxpdHRlcl9tYXggPSAxPDwxMiwKKyAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUgPSAxPDwxMiwKKyAgICBfX2l0dF9ncm91cF9zdXBwcmVzcyA9IDE8PDEzLAorICAgIF9faXR0X2dyb3VwX2FycmF5cyAgICA9IDE8PDE0LAorICAgIF9faXR0X2dyb3VwX2FsbCAgICAgICA9IC0xCit9IF9faXR0X2dyb3VwX2lkOworCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2dyb3VwX2xpc3QKK3sKKyAgICBfX2l0dF9ncm91cF9pZCBpZDsKKyAgICBjb25zdCBjaGFyKiAgICBuYW1lOworfSBfX2l0dF9ncm91cF9saXN0OworCisjcHJhZ21hIHBhY2socG9wKQorCisjZGVmaW5lIElUVF9HUk9VUF9MSVNUKHZhcm5hbWUpIFwKKyAgICBzdGF0aWMgX19pdHRfZ3JvdXBfbGlzdCB2YXJuYW1lW10gPSB7ICAgICAgIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9hbGwsICAgICAgICJhbGwiICAgICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9jb250cm9sLCAgICJjb250cm9sIiAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF90aHJlYWQsICAgICJ0aHJlYWQiICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9tYXJrLCAgICAgICJtYXJrIiAgICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9zeW5jLCAgICAgICJzeW5jIiAgICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9mc3luYywgICAgICJmc3luYyIgICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9qaXQsICAgICAgICJqaXQiICAgICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9tb2RlbCwgICAgICJtb2RlbCIgICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9jb3VudGVyLCAgICJjb3VudGVyIiAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9mcmFtZSwgICAgICJmcmFtZSIgICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9zdGl0Y2gsICAgICJzdGl0Y2giICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9oZWFwLCAgICAgICJoZWFwIiAgICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJzdHJ1Y3R1cmUiIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9zdXBwcmVzcywgICJzdXBwcmVzcyIgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9hcnJheXMsICAgICJhcnJheXMiICAgIH0sIFwKKyAgICAgICAgeyBfX2l0dF9ncm91cF9ub25lLCAgICAgIE5VTEwgICAgICAgIH0gIFwKKyAgICB9CisKKyNlbmRpZiAvKiBfSVRUTk9USUZZX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmODFkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2xlZ2FjeS9pdHRub3RpZnkuaApAQCAtMCwwICsxLDk3MiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MRUdBQ1lfSVRUTk9USUZZX0hfCisjZGVmaW5lIF9MRUdBQ1lfSVRUTk9USUZZX0hfCisKKy8qKgorICogQGZpbGUKKyAqIEBicmllZiBMZWdhY3kgVXNlciBBUEkgZnVuY3Rpb25zIGFuZCB0eXBlcworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJVFRfT1NfV0lOCisjICBkZWZpbmUgSVRUX09TX1dJTiAgIDEKKyNlbmRpZiAvKiBJVFRfT1NfV0lOICovCisKKyNpZm5kZWYgSVRUX09TX0xJTlVYCisjICBkZWZpbmUgSVRUX09TX0xJTlVYIDIKKyNlbmRpZiAvKiBJVFRfT1NfTElOVVggKi8KKworI2lmbmRlZiBJVFRfT1NfTUFDCisjICBkZWZpbmUgSVRUX09TX01BQyAgIDMKKyNlbmRpZiAvKiBJVFRfT1NfTUFDICovCisKKyNpZm5kZWYgSVRUX09TCisjICBpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgX1dJTjMyCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX1dJTgorIyAgZWxpZiBkZWZpbmVkKCBfX0FQUExFX18gKSAmJiBkZWZpbmVkKCBfX01BQ0hfXyApCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19MSU5VWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfT1MgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fV0lOCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1dJTiAxCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9QT1NJWAorIyAgZGVmaW5lIElUVF9QTEFURk9STV9QT1NJWCAyCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1BPU0lYICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX01BQworIyAgZGVmaW5lIElUVF9QTEFURk9STV9NQUMgMworI2VuZGlmIC8qIElUVF9QTEFURk9STV9NQUMgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk0KKyMgIGlmIElUVF9PUz09SVRUX09TX1dJTgorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9XSU4KKyMgIGVsaWYgSVRUX09TPT1JVFRfT1NfTUFDCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9QT1NJWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk0gKi8KKworI2lmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKFVOSUNPREUpCisjZGVmaW5lIFVOSUNPREUKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjaW5jbHVkZSA8dGNoYXIuaD4KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjaW5jbHVkZSA8d2NoYXIuaD4KKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgQ0RFQ0wKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgQ0RFQ0wgX19jZGVjbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18gCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpIAorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lLCB1bnVzZWQpKQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworLyogSGVscGVyIG1hY3JvIGZvciBqb2luaW5nIHRva2VucyAqLworI2RlZmluZSBJVFRfSk9JTl9BVVgocCxuKSBwIyNuCisjZGVmaW5lIElUVF9KT0lOKHAsbikgICAgIElUVF9KT0lOX0FVWChwLG4pCisKKyNpZmRlZiBJVFRfTUFKT1IKKyN1bmRlZiBJVFRfTUFKT1IKKyNlbmRpZgorI2lmZGVmIElUVF9NSU5PUgorI3VuZGVmIElUVF9NSU5PUgorI2VuZGlmCisjZGVmaW5lIElUVF9NQUpPUiAgICAgMworI2RlZmluZSBJVFRfTUlOT1IgICAgIDAKKworLyogU3RhbmRhcmQgdmVyc2lvbmluZyBvZiBhIHRva2VuIHdpdGggbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBJVFRfVkVSU0lPTklaRSh4KSAgICBcCisgICAgSVRUX0pPSU4oeCwgICAgICAgICAgICAgIFwKKyAgICBJVFRfSk9JTihfLCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKElUVF9NQUpPUiwgICAgICBcCisgICAgSVRUX0pPSU4oXywgSVRUX01JTk9SKSkpKQorCisjaWZuZGVmIElOVEVMX0lUVE5PVElGWV9QUkVGSVgKKyMgIGRlZmluZSBJTlRFTF9JVFROT1RJRllfUFJFRklYIF9faXR0XworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9QUkVGSVggKi8KKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BPU1RGSVgKKyMgIGRlZmluZSBJTlRFTF9JVFROT1RJRllfUE9TVEZJWCBfcHRyXworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9QT1NURklYICovCisKKyNkZWZpbmUgSVRUTk9USUZZX05BTUVfQVVYKG4pIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsbikKKyNkZWZpbmUgSVRUTk9USUZZX05BTUUobikgICAgIElUVF9WRVJTSU9OSVpFKElUVE5PVElGWV9OQU1FX0FVWChJVFRfSk9JTihuLElOVEVMX0lUVE5PVElGWV9QT1NURklYKSkpCisKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSUQobikgKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEEobikgKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikKKworI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDAobixkKSAgICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QxKG4sZCx4KSAgICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QyKG4sZCx4LHkpICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDMobixkLHgseSx6KSAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHopCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q0KG4sZCx4LHkseixhKSAgICAgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q1KG4sZCx4LHkseixhLGIpICAgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDYobixkLHgseSx6LGEsYixjKSAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiLGMpCisKKyNpZmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCCisjZW5kaWYKKyNpZmRlZiBJVFRfU1RVQlYKKyN1bmRlZiBJVFRfU1RVQlYKKyNlbmRpZgorI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZSAoYXBpKiBJVFRfSk9JTihJVFROT1RJRllfTkFNRShuYW1lKSxfdCkpIGFyZ3M7ICAgXAorICAgIGV4dGVybiBJVFRfSk9JTihJVFROT1RJRllfTkFNRShuYW1lKSxfdCkgSVRUTk9USUZZX05BTUUobmFtZSk7CisjZGVmaW5lIElUVF9TVFVCIElUVF9TVFVCVgorLyoqIEBlbmRjb25kICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5IExlZ2FjeSBBUEkKKyAqIEB7CisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9jb250cm9sIENvbGxlY3Rpb24gQ29udHJvbAorICogQGluZ3JvdXAgbGVnYWN5CisgKiBHZW5lcmFsIGJlaGF2aW9yOiBhcHBsaWNhdGlvbiBjb250aW51ZXMgdG8gcnVuLCBidXQgbm8gcHJvZmlsaW5nIGluZm9ybWF0aW9uIGlzIGJlaW5nIGNvbGxlY3RlZAorICoKKyAqIFBhdXNpbmcgb2NjdXJzIG5vdCBvbmx5IGZvciB0aGUgY3VycmVudCB0aHJlYWQgYnV0IGZvciBhbGwgcHJvY2VzcyBhcyB3ZWxsIGFzIHNwYXduZWQgcHJvY2Vzc2VzCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFOgorICogICAtIERvZXMgbm90IGFuYWx5emUgb3IgcmVwb3J0IGVycm9ycyB0aGF0IGludm9sdmUgbWVtb3J5IGFjY2Vzcy4KKyAqICAgLSBPdGhlciBlcnJvcnMgYXJlIHJlcG9ydGVkIGFzIHVzdWFsLiBQYXVzaW5nIGRhdGEgY29sbGVjdGlvbiBpbgorICogICAgIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFCisgKiAgICAgb25seSBwYXVzZXMgdHJhY2luZyBhbmQgYW5hbHl6aW5nIG1lbW9yeSBhY2Nlc3MuCisgKiAgICAgSXQgZG9lcyBub3QgcGF1c2UgdHJhY2luZyBvciBhbmFseXppbmcgdGhyZWFkaW5nIEFQSXMuCisgKiAgIC4KKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyIGFuZCBJbnRlbChSKSBWVHVuZShUTSkgQW1wbGlmaWVyIFhFOgorICogICAtIERvZXMgY29udGludWUgdG8gcmVjb3JkIHdoZW4gbmV3IHRocmVhZHMgYXJlIHN0YXJ0ZWQuCisgKiAgIC4KKyAqIC0gT3RoZXIgZWZmZWN0czoKKyAqICAgLSBQb3NzaWJsZSByZWR1Y3Rpb24gb2YgcnVudGltZSBvdmVyaGVhZC4KKyAqICAgLgorICogQHsKKyAqLworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisvKiogQGJyaWVmIFBhdXNlIGNvbGxlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3BhdXNlKHZvaWQpOworLyoqIEBicmllZiBSZXN1bWUgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVzdW1lKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBwYXVzZSwgICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZXN1bWUsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X3BhdXNlICAgICAgSVRUTk9USUZZX1ZPSUQocGF1c2UpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgSVRUTk9USUZZX05BTUUocGF1c2UpCisjZGVmaW5lIF9faXR0X3Jlc3VtZSAgICAgSVRUTk9USUZZX1ZPSUQocmVzdW1lKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIElUVE5PVElGWV9OQU1FKHJlc3VtZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3BhdXNlKCkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZSgpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKyNlbmRpZiAvKiBfSVRUTk9USUZZX0hfICovCisvKiogQH0gbGVnYWN5X2NvbnRyb2wgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3RocmVhZHMgVGhyZWFkcworICogQGluZ3JvdXAgbGVnYWN5CisgKiBUaHJlYWRzIGdyb3VwCisgKiBAd2FybmluZyBMZWdhY3kgQVBJCisgKiBAeworICovCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTZXQgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhyZWFkIGluIGFuYWx5c2lzIEdVSS4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAobmFtZSBvciBuYW1lbGVuIGJlaW5nIG51bGwsbmFtZSBhbmQgbmFtZWxlbiBtaXNtYXRjaGVkKQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldEEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworaW50IExJQklUVEFQSSBfX2l0dF90aHJfbmFtZV9zZXRXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0ICAgICBfX2l0dF90aHJfbmFtZV9zZXRXCisjICBkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciBfX2l0dF90aHJfbmFtZV9zZXRXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIF9faXR0X3Rocl9uYW1lX3NldEEKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldChjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCB0aHJfbmFtZV9zZXRBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIHRocl9uYW1lX3NldFcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgdGhyX25hbWVfc2V0LCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QSAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0QSkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgSVRUTk9USUZZX05BTUUodGhyX25hbWVfc2V0QSkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0VyAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0VykKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0V19wdHIgSVRUTk9USUZZX05BTUUodGhyX25hbWVfc2V0VykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHRocl9uYW1lX3NldCkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXQpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBKG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0VyhuYW1lLCBuYW1lbGVuKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0KG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0V19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBNYXJrIGN1cnJlbnQgdGhyZWFkIGFzIGlnbm9yZWQgZnJvbSB0aGlzIHBvaW50IG9uLCBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyBleGlzdGVuY2UuCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X3Rocl9pZ25vcmUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIHRocl9pZ25vcmUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZSAgICAgSVRUTk9USUZZX1ZPSUQodGhyX2lnbm9yZSkKKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZV9wdHIgSVRUTk9USUZZX05BTUUodGhyX2lnbm9yZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmUoKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV90aHJlYWRzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9zeW5jIFN5bmNocm9uaXphdGlvbgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBTeW5jaHJvbml6YXRpb24gZ3JvdXAKKyAqIEB3YXJuaW5nIExlZ2FjeSBBUEkKKyAqIEB7CisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfYmFycmllciAxCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfbXV0ZXggICAyCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEFzc2lnbiBhIG5hbWUgdG8gYSBzeW5jIG9iamVjdCB1c2luZyBjaGFyIG9yIFVuaWNvZGUgc3RyaW5nCisgKiBAcGFyYW1baW5dIGFkZHIgICAgLSBwb2ludGVyIHRvIHRoZSBzeW5jIG9iamVjdC4gWW91IHNob3VsZCB1c2UgYSByZWFsIHBvaW50ZXIgdG8geW91ciBvYmplY3QKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgZG9uJ3QgY2xhc2ggd2l0aCBvdGhlciBvYmplY3QgYWRkcmVzc2VzCisgKiBAcGFyYW1baW5dIG9ianR5cGUgLSBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IHR5cGUgc3RyaW5nLiBJZiBOVUxMIGlzIHBhc3NlZCwgdGhlIG9iamVjdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBhc3N1bWVkIHRvIGJlIG9mIGdlbmVyaWMgIlVzZXIgU3luY2hyb25pemF0aW9uIiB0eXBlCisgKiBAcGFyYW1baW5dIG9iam5hbWUgLSBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IG5hbWUgc3RyaW5nLiBJZiBOVUxMLCBubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBvYmplY3QgLS0geW91IGNhbiB1c2UgdGhlIF9faXR0X3N5bmNfcmVuYW1lIGNhbGwgbGF0ZXIgdG8gYXNzaWduCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbmFtZQorICogQHBhcmFtW2luXSBhdHRyaWJ1dGUgLSBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XSB2YWx1ZXMgd2hpY2ggZGVmaW5lcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGV4YWN0IHNlbWFudGljcyBvZiBob3cgcHJlcGFyZS9hY3F1aXJlZC9yZWxlYXNpbmcgY2FsbHMgd29yay4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19zZXRfbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lVyh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZSAgICAgX19pdHRfc3luY19zZXRfbmFtZVcKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBfX2l0dF9zeW5jX3NldF9uYW1lQQorIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIF9faXR0X3N5bmNfc2V0X25hbWVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19zZXRfbmFtZSh2b2lkICphZGRyLCBjb25zdCBjaGFyKiBvYmp0eXBlLCBjb25zdCBjaGFyKiBvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfc2V0X25hbWVXKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBKGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVcoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEFzc2lnbiBhIG5hbWUgYW5kIHR5cGUgdG8gYSBzeW5jIG9iamVjdCB1c2luZyBjaGFyIG9yIFVuaWNvZGUgc3RyaW5nCisgKiBAcGFyYW1baW5dIGFkZHIgLSAgICAgIHBvaW50ZXIgdG8gdGhlIHN5bmMgb2JqZWN0LiBZb3Ugc2hvdWxkIHVzZSBhIHJlYWwgcG9pbnRlciB0byB5b3VyIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGRvbid0IGNsYXNoIHdpdGggb3RoZXIgb2JqZWN0IGFkZHJlc3NlcworICogQHBhcmFtW2luXSBvYmp0eXBlIC0gICBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IHR5cGUgc3RyaW5nLiBJZiBOVUxMIGlzIHBhc3NlZCwgdGhlIG9iamVjdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFzc3VtZWQgdG8gYmUgb2YgZ2VuZXJpYyAiVXNlciBTeW5jaHJvbml6YXRpb24iIHR5cGUKKyAqIEBwYXJhbVtpbl0gb2JqbmFtZSAtICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4gSWYgTlVMTCwgbm8gbmFtZSB3aWxsIGJlIGFzc2lnbmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBvYmplY3QgLS0geW91IGNhbiB1c2UgdGhlIF9faXR0X3N5bmNfcmVuYW1lIGNhbGwgbGF0ZXIgdG8gYXNzaWduCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lCisgKiBAcGFyYW1baW5dIHR5cGVsZW4sIG5hbWVsZW4gLSAgIGEgbGVuZ3RoIG9mIHN0cmluZyBmb3IgYXBwcm9wcmlhdGUgb2JqdHlwZSBhbmQgb2JqbmFtZSBwYXJhbWV0ZXIKKyAqIEBwYXJhbVtpbl0gYXR0cmlidXRlIC0gb25lIG9mIFsjX19pdHRfYXR0cl9iYXJyaWVyLCAjX19pdHRfYXR0cl9tdXRleF0gdmFsdWVzIHdoaWNoIGRlZmluZXMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0IHNlbWFudGljcyBvZiBob3cgcHJlcGFyZS9hY3F1aXJlZC9yZWxlYXNpbmcgY2FsbHMgd29yay4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAobmFtZSBvciBuYW1lbGVuIGJlaW5nIG51bGwsbmFtZSBhbmQgbmFtZWxlbiBtaXNtYXRjaGVkKQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX25hbWVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CitpbnQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX25hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQQorI2VuZGlmCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSh2b2lkICphZGRyLCBjb25zdCBjaGFyICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lQSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWVBKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVyAgICAgSVRUTk9USUZZX0RBVEEobm90aWZ5X3N5bmNfbmFtZVcpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEoYWRkciwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVyhhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZShhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRW50ZXIgc3BpbiBsb29wIG9uIHVzZXItZGVmaW5lZCBzeW5jIG9iamVjdAorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUgICAgIElUVE5PVElGWV9WT0lEKG5vdGlmeV9zeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3ByZXBhcmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFF1aXQgc3BpbiBsb29wIHdpdGhvdXQgYWNxdWlyaW5nIHNwaW4gb2JqZWN0CisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbCAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2NhbmNlbCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgU3VjY2Vzc2Z1bCBzcGluIGxvb3AgY29tcGxldGlvbiAoc3luYyBvYmplY3QgYWNxdWlyZWQpCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZCAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19hY3F1aXJlZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgU3RhcnQgc3luYyBvYmplY3QgcmVsZWFzaW5nIGNvZGUuIElzIGNhbGxlZCBiZWZvcmUgdGhlIGxvY2sgcmVsZWFzZSBjYWxsLgorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcgICAgIElUVE5PVElGWV9WT0lEKG5vdGlmeV9zeW5jX3JlbGVhc2luZykKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19yZWxlYXNpbmcpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X3N5bmMgZ3JvdXAgKi8KKworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfZXZlbnRzIEV2ZW50cworICogQGluZ3JvdXAgbGVnYWN5CisgKiBFdmVudHMgZ3JvdXAKKyAqIEB7CisgKi8KKworLyoqIEBicmllZiB1c2VyIGV2ZW50IHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X2V2ZW50OworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gZXZlbnQgbm90aWZpY2F0aW9uCisgKiBAbm90ZSBuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbC9uYW1lIGFuZCBuYW1lbGVuIG5vdCBtYXRjaGluZywgdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkCisgKiBAcmV0dXJuIG5vbi16ZXJvIGV2ZW50IGlkZW50aWZpZXIgdXBvbiBzdWNjZXNzIGFuZCBfX2l0dF9lcnIgb3RoZXJ3aXNlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKTsKK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICBfX2l0dF9ldmVudF9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciBfX2l0dF9ldmVudF9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUEobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXKG5hbWUsIG5hbWVsZW4pIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUobmFtZSwgbmFtZWxlbikgIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBldmVudCBvY2N1cnJlbmNlLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9zdGFydChfX2l0dF9ldmVudCBldmVudCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBldmVudF9zdGFydCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X3N0YXJ0KQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfc3RhcnQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydChldmVudCkgKGludCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IGVuZCBvY2N1cnJlbmNlLgorICogQG5vdGUgSXQgaXMgb3B0aW9uYWwgaWYgZXZlbnRzIGRvIG5vdCBoYXZlIGR1cmF0aW9ucy4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAoaW52YWxpZCBldmVudCBpZC91c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQpCisgKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfZW5kKF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X2VuZCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kICAgICBJVFROT1RJRllfREFUQShldmVudF9lbmQpCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kKGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X2V2ZW50cyBncm91cCAqLworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X21lbW9yeSBNZW1vcnkgQWNjZXNzZXMKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEluZm9ybSB0aGUgdG9vbCBvZiBtZW1vcnkgYWNjZXNzZXMgb24gcmVhZGluZworICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9tZW1vcnlfcmVhZCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV9yZWFkLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZCAgICAgSVRUTk9USUZZX1ZPSUQobWVtb3J5X3JlYWQpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfcmVhZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgSW5mb3JtIHRoZSB0b29sIG9mIG1lbW9yeSBhY2Nlc3NlcyBvbiB3cml0aW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV93cml0ZSh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV93cml0ZSwgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfd3JpdGUpCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgSVRUTk9USUZZX05BTUUobWVtb3J5X3dyaXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBJbmZvcm0gdGhlIHRvb2wgb2YgbWVtb3J5IGFjY2Vzc2VzIG9uIHVwZGF0aW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV91cGRhdGUodm9pZCAqYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfdXBkYXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfdXBkYXRlKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfdXBkYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZShhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9tZW1vcnkgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3N0YXRlIFRocmVhZCBhbmQgT2JqZWN0IFN0YXRlcworICogQGluZ3JvdXAgbGVnYWN5CisgKi8KKworLyoqIEBicmllZiBzdGF0ZSB0eXBlICovCit0eXBlZGVmIGludCBfX2l0dF9zdGF0ZV90OworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgZW51bSBfX2l0dF9vYmpfc3RhdGUgeworICAgIF9faXR0X29ial9zdGF0ZV9lcnIgPSAwLAorICAgIF9faXR0X29ial9zdGF0ZV9jbHIgPSAxLAorICAgIF9faXR0X29ial9zdGF0ZV9zZXQgPSAyLAorICAgIF9faXR0X29ial9zdGF0ZV91c2UgPSAzCit9IF9faXR0X29ial9zdGF0ZV90OworCit0eXBlZGVmIGVudW0gX19pdHRfdGhyX3N0YXRlIHsKKyAgICBfX2l0dF90aHJfc3RhdGVfZXJyID0gMCwKKyAgICBfX2l0dF90aHJfc3RhdGVfY2xyID0gMSwKKyAgICBfX2l0dF90aHJfc3RhdGVfc2V0ID0gMgorfSBfX2l0dF90aHJfc3RhdGVfdDsKKwordHlwZWRlZiBlbnVtIF9faXR0X29ial9wcm9wIHsKKyAgICBfX2l0dF9vYmpfcHJvcF93YXRjaCAgICA9IDEsCisgICAgX19pdHRfb2JqX3Byb3BfaWdub3JlICAgPSAyLAorICAgIF9faXR0X29ial9wcm9wX3NoYXJhYmxlID0gMworfSBfX2l0dF9vYmpfcHJvcF90OworCit0eXBlZGVmIGVudW0gX19pdHRfdGhyX3Byb3AgeworICAgIF9faXR0X3Rocl9wcm9wX3F1aWV0ID0gMQorfSBfX2l0dF90aHJfcHJvcF90OworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IHN0YXRlcworICovCitfX2l0dF9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9zdGF0ZV9nZXQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RhdGVfdCwgc3RhdGVfZ2V0LCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldCAgICAgSVRUTk9USUZZX0RBVEEoc3RhdGVfZ2V0KQorI2RlZmluZSBfX2l0dF9zdGF0ZV9nZXRfcHRyIElUVE5PVElGWV9OQU1FKHN0YXRlX2dldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldCh2b2lkKSAoX19pdHRfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBtYW5hZ2luZyB0aHJlYWQgYW5kIG9iamVjdCBzdGF0ZXMKKyAqLworX19pdHRfc3RhdGVfdCBMSUJJVFRBUEkgX19pdHRfc3RhdGVfc2V0KF9faXR0X3N0YXRlX3Qgcyk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RhdGVfdCwgc3RhdGVfc2V0LCAoX19pdHRfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0ICAgICBJVFROT1RJRllfREFUQShzdGF0ZV9zZXQpCisjZGVmaW5lIF9faXR0X3N0YXRlX3NldF9wdHIgSVRUTk9USUZZX05BTUUoc3RhdGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0KHMpIChfX2l0dF9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IG1vZGVzCisgKi8KK19faXR0X3Rocl9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF90aHJfbW9kZV9zZXQoX19pdHRfdGhyX3Byb3BfdCBwLCBfX2l0dF90aHJfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aHJfc3RhdGVfdCwgdGhyX21vZGVfc2V0LCAoX19pdHRfdGhyX3Byb3BfdCBwLCBfX2l0dF90aHJfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0ICAgICBJVFROT1RJRllfREFUQSh0aHJfbW9kZV9zZXQpCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgSVRUTk9USUZZX05BTUUodGhyX21vZGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0KHAsIHMpIChfX2l0dF90aHJfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBtYW5hZ2luZyB0aHJlYWQgYW5kIG9iamVjdCBtb2RlcworICovCitfX2l0dF9vYmpfc3RhdGVfdCBMSUJJVFRBUEkgX19pdHRfb2JqX21vZGVfc2V0KF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3Qgcyk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfb2JqX3N0YXRlX3QsIG9ial9tb2RlX3NldCwgKF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3QgcykpCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldCAgICAgSVRUTk9USUZZX0RBVEEob2JqX21vZGVfc2V0KQorI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKG9ial9tb2RlX3NldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldChwLCBzKSAoX19pdHRfb2JqX3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfc3RhdGUgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgZnJhbWVzIEZyYW1lcworICogQGluZ3JvdXAgbGVnYWN5CisgKiBGcmFtZXMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGZyYW1lIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9faXR0X2ZyYW1lX3QgKl9faXR0X2ZyYW1lOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYSBnbG9iYWwgZnJhbWUgd2l0aCBnaXZlbiBkb21haW4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZnJhbWUgSVRUQVBJIF9faXR0X2ZyYW1lX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqZG9tYWluKTsKK19faXR0X2ZyYW1lIElUVEFQSSBfX2l0dF9mcmFtZV9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKmRvbWFpbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgX19pdHRfZnJhbWVfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGUgICAgIF9faXR0X2ZyYW1lX2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9mcmFtZSBJVFRBUEkgX19pdHRfZnJhbWVfY3JlYXRlKGNvbnN0IGNoYXIgKmRvbWFpbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpkb21haW4pKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKmRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGUsICAoY29uc3QgY2hhciAqZG9tYWluKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGZyYW1lX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZShkb21haW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgUmVjb3JkIGFuIGZyYW1lIGJlZ2luIG9jY3VycmVuY2UuICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9iZWdpbihfX2l0dF9mcmFtZSBmcmFtZSk7CisvKiogQGJyaWVmIFJlY29yZCBhbiBmcmFtZSBlbmQgb2NjdXJyZW5jZS4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2VuZCAgKF9faXR0X2ZyYW1lIGZyYW1lKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW4sIChfX2l0dF9mcmFtZSBmcmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmQsICAgKF9faXR0X2ZyYW1lIGZyYW1lKSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGZyYW1lX2JlZ2luKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZCAgICAgICBJVFROT1RJRllfVk9JRChmcmFtZV9lbmQpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICBJVFROT1RJRllfTkFNRShmcmFtZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbihmcmFtZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kKGZyYW1lKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZnJhbWVzIGdyb3VwICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTEVHQUNZX0lUVE5PVElGWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF9hc20ucyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfYXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5YmYzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfYXNtLnMKQEAgLTAsMCArMSwxNjY2IEBACisvLyAgel9MaW51eF9hc20uczogIC0gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseQorLy8gICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gZm9yIEludGVsIHBsYXRmb3JtcyBydW5uaW5nIExpbnV4KiBPUworCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWFjcm9zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisjIGlmIEtNUF9NSUMKKy8vCisvLyB0aGUgJ2RlbGF5IHIxNi9yMzIvcjY0JyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSAncGF1c2UnLgorLy8gVGhlIGRlbGF5IG9wZXJhdGlvbiBoYXMgdGhlIGVmZmVjdCBvZiByZW1vdmluZyB0aGUgY3VycmVudCB0aHJlYWQgZnJvbQorLy8gdGhlIHJvdW5kLXJvYmluIEhUIG1lY2hhbmlzbSwgYW5kIHRoZXJlZm9yZSBzcGVlZHMgdXAgdGhlIGlzc3VlIHJhdGUgb2YKKy8vIHRoZSBvdGhlciB0aHJlYWRzIG9uIHRoZSBzYW1lIGNvcmUuCisvLworLy8gQSB2YWx1ZSBvZiAwIHdvcmtzIGZpbmUgZm9yIDw9IDIgdGhyZWFkcyBwZXIgY29yZSwgYnV0IGNhdXNlcyB0aGUgRVBDQworLy8gYmFycmllciB0aW1lIHRvIGluY3JlYXNlIGdyZWF0bHkgZm9yIDMgb3IgbW9yZSB0aHJlYWRzIHBlciBjb3JlLgorLy8KKy8vIEEgdmFsdWUgb2YgMTAwIHdvcmtzIHByZXR0eSB3ZWxsIGZvciB1cCB0byA0IHRocmVhZHMgcGVyIGNvcmUsIGJ1dCBpc24ndAorLy8gcXVpdGUgYXMgZmFzdCBhcyAwIGZvciAyIHRocmVhZHMgcGVyIGNvcmUuCisvLworLy8gV2UgbmVlZCB0byBjaGVjayB3aGF0IGhhcHBlbnMgZm9yIG92ZXJzdWJzY3JpcHRpb24gLyA+IDQgdGhyZWFkcyBwZXIgY29yZS4KKy8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byBwYXNzIHRoZSBkZWxheSB2YWx1ZSBpbiBhcyBhIHBhcmFtZXRlcgorLy8gdGhhdCB0aGUgY2FsbGVyIGRldGVybWluZXMgYmFzZWQgb24gdGhlIHRvdGFsICMgdGhyZWFkcyAvICMgY29yZXMuCisvLworLy8ubWFjcm8gcGF1c2Vfb3AKKy8vCW1vdiAgICAkMTAwLCAlcmF4CisvLwlkZWxheSAgJXJheAorLy8uZW5kbQorIyBlbHNlCisjICBkZWZpbmUgcGF1c2Vfb3AgICAuYnl0ZSAweGYzLDB4OTAKKyMgZW5kaWYgLy8gS01QX01JQworCisjIGlmIEtNUF9PU19EQVJXSU4KKyMgIGRlZmluZSBLTVBfUFJFRklYX1VOREVSU0NPUkUoeCkgXyMjeCAgLy8gZXh0cmEgdW5kZXJzY29yZSBmb3IgT1MgWCogc3ltYm9scworIyAgZGVmaW5lIEtNUF9MQUJFTCh4KSBMXyMjeCAgICAgICAgICAgICAvLyBmb3JtIHRoZSBuYW1lIG9mIGxhYmVsCisubWFjcm8gS01QX0NGSV9ERUZfT0ZGU0VUCisuZW5kbWFjcm8KKy5tYWNybyBLTVBfQ0ZJX09GRlNFVAorLmVuZG1hY3JvCisubWFjcm8gS01QX0NGSV9SRUdJU1RFUgorLmVuZG1hY3JvCisubWFjcm8gS01QX0NGSV9ERUYKKy5lbmRtYWNybworLm1hY3JvIEFMSUdOCisJLmFsaWduICQwCisuZW5kbWFjcm8KKy5tYWNybyBERUJVR19JTkZPCisvKiBOb3Qgc3VyZSB3aGF0IC5zaXplIGRvZXMgaW4gaWNjLCBub3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZworICAgc2ltaWxhciBmb3IgT1MgWCouCisqLworLmVuZG1hY3JvCisubWFjcm8gUFJPQworCUFMSUdOICA0CisJLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSgkMCkKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRSgkMCk6CisuZW5kbWFjcm8KKyMgZWxzZSAvLyBLTVBfT1NfREFSV0lOCisjICBkZWZpbmUgS01QX1BSRUZJWF9VTkRFUlNDT1JFKHgpIHggIC8vIG5vIGV4dHJhIHVuZGVyc2NvcmUgZm9yIExpbnV4KiBPUyBzeW1ib2xzCisvLyBGb3JtYXQgbGFiZWxzIHNvIHRoYXQgdGhleSBkb24ndCBvdmVycmlkZSBmdW5jdGlvbiBuYW1lcyBpbiBnZGIncyBiYWNrdHJhY2VzCisvLyBNSUMgYXNzZW1ibGVyIGRvZXNuJ3QgYWNjZXB0IC5MIHN5bnRheCwgdGhlIEwgd29ya3MgZmluZSB0aGVyZSAoYXMgd2VsbCBhcyBvbiBPUyBYKikKKyMgaWYgS01QX01JQworIyAgZGVmaW5lIEtNUF9MQUJFTCh4KSBMXyMjeCAgICAgICAgICAvLyBsb2NhbCBsYWJlbAorIyBlbHNlCisjICBkZWZpbmUgS01QX0xBQkVMKHgpIC5MXyMjeCAgICAgICAgIC8vIGxvY2FsIGxhYmVsIGhpZGRlbiBmcm9tIGJhY2t0cmFjZXMKKyMgZW5kaWYgLy8gS01QX01JQworLm1hY3JvIEFMSUdOIHNpemUKKwkuYWxpZ24gMTw8KFxzaXplKQorLmVuZG0KKy5tYWNybyBERUJVR19JTkZPIHByb2MKKwkuY2ZpX2VuZHByb2MKKy8vIE5vdCBzdXJlIHdoeSB3ZSBuZWVkIC50eXBlIGFuZCAuc2l6ZSBmb3IgdGhlIGZ1bmN0aW9ucworCS5hbGlnbiAxNgorCS50eXBlICBccHJvYyxAZnVuY3Rpb24KKyAgICAgICAgLnNpemUgIFxwcm9jLC4tXHByb2MKKy5lbmRtCisubWFjcm8gUFJPQyBwcm9jCisJQUxJR04gIDQKKyAgICAgICAgLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYykKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYyk6CisJLmNmaV9zdGFydHByb2MKKy5lbmRtCisubWFjcm8gS01QX0NGSV9ERUZfT0ZGU0VUIHN6CisJLmNmaV9kZWZfY2ZhX29mZnNldAlcc3oKKy5lbmRtCisubWFjcm8gS01QX0NGSV9PRkZTRVQgcmVnLCBzegorCS5jZmlfb2Zmc2V0CVxyZWcsXHN6CisuZW5kbQorLm1hY3JvIEtNUF9DRklfUkVHSVNURVIgcmVnCisJLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCVxyZWcKKy5lbmRtCisubWFjcm8gS01QX0NGSV9ERUYgcmVnLCBzegorCS5jZmlfZGVmX2NmYQlccmVnLFxzegorLmVuZG0KKyMgZW5kaWYgLy8gS01QX09TX0RBUldJTgorI2VuZGlmIC8vIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF94ODZfNjQKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGF0YQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCisvLworLy8gU3VwcG9ydCBmb3IgdW5uYW1lZCBjb21tb24gYmxvY2tzLgorLy8KKy8vIEJlY2F1c2UgdGhlIHN5bWJvbCAiLmdvbXBfY3JpdGljYWxfdXNlcl8iIGNvbnRhaW5zIGEgIi4iLCB3ZSBoYXZlIHRvCisvLyBwdXQgdGhpcyBzdHVmZiBpbiBhc3NlbWJseS4KKy8vCisKKyMgaWYgS01QX0FSQ0hfWDg2CisjICBpZiBLTVBfT1NfREFSV0lOCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyCisgICAgICAgIC5kYXRhCisgICAgICAgIC5nbG9ibCBfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAubG9uZyAuZ29tcF9jcml0aWNhbF91c2VyXworIyAgZWxzZSAvKiBMaW51eCogT1MgKi8KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgICAgICAuZGF0YQorCUFMSUdOIDQKKyAgICAgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLjRieXRlIC5nb21wX2NyaXRpY2FsX3VzZXJfCisgICAgICAgIC50eXBlIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcixAb2JqZWN0CisgICAgICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw0CisjICBlbmRpZiAvKiBLTVBfT1NfREFSV0lOICovCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGlmIEtNUF9BUkNIX1g4Nl82NAorIyAgaWYgS01QX09TX0RBUldJTgorICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMgorICAgICAgICAuZGF0YQorICAgICAgICAuZ2xvYmwgX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLnF1YWQgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyMgIGVsc2UgLyogTGludXgqIE9TICovCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAgICAgLmRhdGEKKwlBTElHTiA4CisgICAgICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC44Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgICAgICAudHlwZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsQG9iamVjdAorICAgICAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsOAorIyAgZW5kaWYgLyogS01QX09TX0RBUldJTiAqLworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODZfNjQgKi8KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKyNpZiBLTVBfQVJDSF9YODYgJiYgIUtNUF9BUkNIX1BQQzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5IHdyaXR0ZW4gZm9yIElBLTMyIGFyY2hpdGVjdHVyZQorLy8gcnVubmluZyBMaW51eCogT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisJLmlkZW50ICJJbnRlbCBDb3Jwb3JhdGlvbiIKKwkuZGF0YQorCUFMSUdOIDQKKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApOworLy8KKworICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX3g4Nl9wYXVzZQorCisgICAgICAgIHBhdXNlX29wCisgICAgICAgIHJldAorCisJREVCVUdfSU5GTyBfX2ttcF94ODZfcGF1c2UKKworLy8KKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgdm9pZCAqY3B1aWRfYnVmZmVyICk7CisvLworCVBST0MgIF9fa21wX3g4Nl9jcHVpZAorCisJcHVzaGwgJWVicAorCW1vdmwgICVlc3AsJWVicAorICAgICAgICBwdXNobCAlZWRpCisgICAgICAgIHB1c2hsICVlYngKKyAgICAgICAgcHVzaGwgJWVjeAorICAgICAgICBwdXNobCAlZWR4CisKKwltb3ZsICA4KCVlYnApLCAlZWF4CisJbW92bCAgMTIoJWVicCksICVlY3gKKwljcHVpZAkJCQkvLyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92bCAgMTYoJWVicCksICVlZGkKKwltb3ZsICAlZWF4LCAwKCVlZGkpCisJbW92bCAgJWVieCwgNCglZWRpKQorCW1vdmwgICVlY3gsIDgoJWVkaSkKKwltb3ZsICAlZWR4LCAxMiglZWRpKQorCisgICAgICAgIHBvcGwgICVlZHgKKyAgICAgICAgcG9wbCAgJWVjeAorICAgICAgICBwb3BsICAlZWJ4CisgICAgICAgIHBvcGwgICVlZGkKKyAgICAgICAgbW92bCAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAlZWJwCisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworCisgICAgICAgIFBST0MgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZsICAgICAgOCglZXNwKSwgJWVheAorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRsICAgICAlZWF4LCglZWN4KQorICAgICAgICByZXQKKworCURFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDgKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVhbAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ4CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3ggICAgLy8gInAiCisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnYiAgICAgJWFsLCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQ4CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vIHJldHVybjogICAgICVheAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3Z3ICAgICAgOCglZXNwKSwgJWF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ3cgICAgICVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgk0KCVlc3ApCisvLyAJZDoJOCglZXNwKQorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3ZsICAgICAgOCglZXNwKSwgJWVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdsICAgICAlZWF4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQzMgorCisKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwKKyAgICAgICAgbW92YiAgICAgIDEyKCVlc3ApLCAlZGwKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAorICAgICAgICBtb3Z3ICAgICAgMTIoJWVzcCksICVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGd3ICAlZHgsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVheCA9PSAoJWVjeCkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmQgICAgICAgJDEsICVlYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAgICAgIDEyKCVlc3ApLCAlZWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVlYXggPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKworICAgICAgICBwdXNobCAgICAgJWVicAorICAgICAgICBtb3ZsICAgICAgJWVzcCwgJWVicAorICAgICAgICBwdXNobCAgICAgJWVieAorICAgICAgICBwdXNobCAgICAgJWVkaQorICAgICAgICBtb3ZsICAgICAgOCglZWJwKSwgJWVkaQorICAgICAgICBtb3ZsICAgICAgMTIoJWVicCksICVlYXggICAgICAgIC8vICJjdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDE2KCVlYnApLCAlZWR4ICAgICAgICAvLyAiY3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjAoJWVicCksICVlYnggICAgICAgIC8vICJzdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDI0KCVlYnApLCAlZWN4ICAgICAgICAvLyAic3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGc4YiAoJWVkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWVkeDplYXggPT0gKCVlZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcG9wbCAgICAgICVlZGkKKyAgICAgICAgcG9wbCAgICAgICVlYngKKyAgICAgICAgbW92bCAgICAgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92YiAgICAgIDgoJWVzcCksICVhbAorICAgICAgICBtb3ZiICAgICAgMTIoJWVzcCksICVkbAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdncgICAgICA4KCVlc3ApLCAlYXgKKyAgICAgICAgbW92dyAgICAgIDEyKCVlc3ApLCAlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAgICAgIDEyKCVlc3ApLCAlZWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKworLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKyAgICAgICAgcHVzaGwgICAgICVlYnAKKyAgICAgICAgbW92bCAgICAgICVlc3AsICVlYnAKKyAgICAgICAgcHVzaGwgICAgICVlYngKKyAgICAgICAgcHVzaGwgICAgICVlZGkKKyAgICAgICAgbW92bCAgICAgIDgoJWVicCksICVlZGkKKyAgICAgICAgbW92bCAgICAgIDEyKCVlYnApLCAlZWF4ICAgICAgICAvLyAiY3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAxNiglZWJwKSwgJWVkeCAgICAgICAgLy8gImN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDIwKCVlYnApLCAlZWJ4ICAgICAgICAvLyAic3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyNCglZWJwKSwgJWVjeCAgICAgICAgLy8gInN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnOGIgKCVlZGkpCisgICAgICAgIHBvcGwgICAgICAlZWRpCisgICAgICAgIHBvcGwgICAgICAlZWJ4CisgICAgICAgIG1vdmwgICAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgICAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCisvLworLy8ga21wX3JlYWwzMgorLy8gX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJYWRkcjoJNCglZXNwKQorLy8gCWRhdGE6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVlYXgKKworCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDMyCisKKyAgICAgICAgcHVzaGwgICAlZWJwCisgICAgICAgIG1vdmwgICAgJWVzcCwgJWVicAorICAgICAgICBzdWJsICAgICQ0LCAlZXNwCisgICAgICAgIHB1c2hsICAgJWVzaQorCisgICAgICAgIG1vdmwgICAgNCglZWJwKSwgJWVzaQorICAgICAgICBmbGRzICAgICglZXNpKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCA8YWRkcj4KKyAgICAgICAgZnN0cyAgICAtNCglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgb2xkIHZhbHVlCisKKyAgICAgICAgbW92bCAgICA4KCVlYnApLCAlZWF4CisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICVlYXgsICglZXNpKQorCisgICAgICAgIGZsZHMgICAgLTQoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBvbGQgdmFsdWUKKworICAgICAgICBwb3BsICAgICVlc2kKKyAgICAgICAgbW92bCAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDMyCisKKyMgZW5kaWYgLyogIUtNUF9BU01fSU5UUklOUyAqLworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8KKworICAgICAgICBQUk9DICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgbW92bCAgNCglZXNwKSwgJWVheAorICAgICAgICBmbGRjdyAoJWVheCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBtb3ZsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGZzdGN3ICglZWF4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworLy8KKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IHRpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKy8vICAgICgqcGtmbikoICYgZ3RpZCwgJiBndGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hsICVlYnAKKwlLTVBfQ0ZJX0RFRl9PRkZTRVQgOAorCUtNUF9DRklfT0ZGU0VUIGVicCwtOAorCW1vdmwgJWVzcCwlZWJwCQkvLyBlc3RhYmxpc2ggdGhlIGJhc2UgcG9pbnRlciBmb3IgdGhpcyByb3V0aW5lLgorCUtNUF9DRklfUkVHSVNURVIgZWJwCisJc3VibCAkOCwlZXNwCQkvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgdHdvIGxvY2FsIHZhcmlhYmxlcy4KKwkJCQkvLyBUaGVzZSB2YXJpYmFsZXMgYXJlOgorCQkJCS8vCWFyZ3Y6IC00KCVlYnApCisJCQkJLy8JdGVtcDogLTgoJWVicCkKKwkJCQkvLworCXB1c2hsICVlYngJCS8vIHNhdmUgJWVieCB0byB1c2UgZHVyaW5nIHRoaXMgcm91dGluZQorCQkJCS8vCisjaWYgT01QVF9TVVBQT1JUCisJbW92bCAyOCglZWJwKSwlZWJ4CS8vIGdldCBleGl0X2ZyYW1lIGFkZHJlc3MKKwltb3ZsICVlYnAsKCVlYngpCS8vIHNhdmUgZXhpdF9mcmFtZQorI2VuZGlmCisKKwltb3ZsIDIwKCVlYnApLCVlYngJLy8gU3RhY2sgYWxpZ25tZW50IC0gIyBhcmdzCisJYWRkbCAkMiwlZWJ4CQkvLyAjYXJncyArMiAgQWx3YXlzIHBhc3MgYXQgbGVhc3QgMiBhcmdzIChndGlkIGFuZCB0aWQpCisJc2hsbCAkMiwlZWJ4CQkvLyBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdGFjazogKCNhcmdzKzIpKjQKKwltb3ZsICVlc3AsJWVheAkJLy8KKwlzdWJsICVlYngsJWVheAkJLy8gJWVzcC0oKCNhcmdzKzIpKjQpIC0+ICVlYXggLS0gd2l0aG91dCBtb2RzLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdmwgJWVheCwlZWJ4CQkvLyBTYXZlIHRvICVlYngKKwlhbmRsICQweEZGRkZGRjgwLCVlYXgJLy8gbWFzayBvZmYgNyBiaXRzCisJc3VibCAlZWF4LCVlYngJCS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVlc3AKKwlzdWJsICVlYngsJWVzcAkJLy8gUHJlcGFyZSB0aGUgc3RhY2sgcHRyIC0tCisJCQkJLy8gICBub3cgaXQgd2lsbCBiZSBhbGlnbmVkIG9uIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IHRoZSBjYWxsCisKKwltb3ZsIDI0KCVlYnApLCVlYXgJLy8gY29weSBmcm9tIHBfYXJndltdCisJbW92bCAlZWF4LC00KCVlYnApCS8vIGludG8gdGhlIGxvY2FsIHZhcmlhYmxlICphcmd2LgorCisJbW92bCAyMCglZWJwKSwlZWJ4CS8vIGFyZ2MgaXMgMjAoJWVicCkKKwlzaGxsICQyLCVlYngKKworS01QX0xBQkVMKGludm9rZV8yKToKKwljbXBsICQwLCVlYngKKwlqZyAgS01QX0xBQkVMKGludm9rZV80KQorCWptcCBLTVBfTEFCRUwoaW52b2tlXzMpCisJQUxJR04gMgorS01QX0xBQkVMKGludm9rZV80KToKKwltb3ZsIC00KCVlYnApLCVlYXgKKwlzdWJsICQ0LCVlYngJCQkvLyBkZWNyZW1lbnQgYXJnYy4KKwlhZGRsICVlYngsJWVheAkJCS8vIGluZGV4IGludG8gYXJndi4KKwltb3ZsICglZWF4KSwlZWR4CisJcHVzaGwgJWVkeAorCisJam1wIEtNUF9MQUJFTChpbnZva2VfMikKKwlBTElHTiAyCitLTVBfTEFCRUwoaW52b2tlXzMpOgorCWxlYWwgMTYoJWVicCksJWVheAkJLy8gcHVzaCAmIHRpZAorCXB1c2hsICVlYXgKKworCWxlYWwgMTIoJWVicCksJWVheAkJLy8gcHVzaCAmIGd0aWQKKwlwdXNobCAlZWF4CisKKwltb3ZsIDgoJWVicCksJWVieAorCWNhbGwgKiVlYngJCQkvLyBjYWxsICgqcGtmbikoKTsKKworCW1vdmwgJDEsJWVheAkJCS8vIHJldHVybiAxOworCisJbW92bCAtMTIoJWVicCksJWVieAkJLy8gcmVzdG9yZSAlZWJ4CisJbGVhdmUKKwlLTVBfQ0ZJX0RFRiBlc3AsNAorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyAtLSBFbmQgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCisvLyBrbXBfdWludDY0CisvLyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCkKKwlQUk9DICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKwlyZHRzYworCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKy8vIC0tIEVuZCAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKworI2lmIEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kCisvLyBJbnRlbChSKSA2NCBydW5uaW5nIExpbnV4KiBPUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0gTWFjaGluZSB0eXBlIFAKKy8vIG1hcmtfZGVzY3JpcHRpb24gIkludGVsIENvcnBvcmF0aW9uIjsKKwkuaWRlbnQgIkludGVsIENvcnBvcmF0aW9uIgorLy8gLS0JLmZpbGUgInpfTGludXhfYXNtLnMiCisJLmRhdGEKKwlBTElHTiA0CisKKy8vIFRvIHByZXZlbnQgZ2V0dGluZyBvdXIgY29kZSBpbnRvIC5kYXRhIHNlY3Rpb24gLnRleHQgYWRkZWQgdG8gZXZlcnkgcm91dGluZSBkZWZpbml0aW9uIGZvciB4ODZfNjQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgdm9pZCAqY3B1aWRfYnVmZmVyICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAltb2RlOgkJJWVkaQorLy8gCW1vZGUyOgkJJWVzaQorLy8gCWNwdWlkX2J1ZmZlcjoJJXJkeAorCisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfeDg2X2NwdWlkCisKKwlwdXNocSAgJXJicAorCW1vdnEgICAlcnNwLCVyYnAKKyAgICAgICAgcHVzaHEgICVyYngJCQkvLyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorCisJbW92bCAgICVlc2ksICVlY3gJCS8vICJtb2RlMiIKKwltb3ZsICAgJWVkaSwgJWVheAkJLy8gIm1vZGUiCisgICAgICAgIG1vdnEgICAlcmR4LCAlcnNpICAgICAgICAgICAgICAgLy8gY3B1aWRfYnVmZmVyCisJY3B1aWQJCQkJLy8gUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworCW1vdmwgICAlZWF4LCAwKCVyc2kpCQkvLyBzdG9yZSByZXN1bHRzIGludG8gYnVmZmVyCisJbW92bCAgICVlYngsIDQoJXJzaSkKKwltb3ZsICAgJWVjeCwgOCglcnNpKQorCW1vdmwgICAlZWR4LCAxMiglcnNpKQorCisgICAgICAgIHBvcHEgICAlcmJ4CQkJLy8gY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92cSAgICVyYnAsICVyc3AKKyAgICAgICAgcG9wcSAgICVyYnAKKwlyZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKworIyBpZiAhS01QX0FTTV9JTlRSSU5TCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklZXNpCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisgICAgICAgIGxvY2sKKyAgICAgICAgeGFkZGwgICAgICVlYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVyc2kKKy8vCXJldHVybjoJJXJheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4CS8vICJkIgorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRxICAgICAlcmF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDgKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVzaWwKKy8vCisvLyByZXR1cm46CSVhbAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ4CisKKyAgICAgICAgbW92YiAgICAgICVzaWwsICVhbAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdiICAgICAlYWwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXNpCisvLyByZXR1cm46ICAgICAlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3Z3ICAgICAgJXNpLCAlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hndyAgICAgJWF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklZXNpCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ2NAorLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfeGNoZ19maXhlZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXJzaQorLy8gcmV0dXJuOgklcmF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hncSAgICAgJXJheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkNjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworICAgICAgICBtb3ZiICAgICAgJXNpbCwgJWFsCS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2Ogklc2kKKy8vCXN2OgklZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYXggPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVyc2kKKy8vCXN2OgklcmR4CisvLwlyZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXggICAgLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdxICAlcmR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlcmF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisgICAgICAgIG1vdmIgICAgICAlc2lsLCAlYWwJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTZfcmV0KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVzaQorLy8Jc3Y6CSVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVyc2kKKy8vCXN2OgklcmR4CisvLwlyZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4ICAgIC8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hncSAgJXJkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisjIGlmICFLTVBfTUlDCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCisvLworLy8ga21wX3JlYWwzMgorLy8gX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJYWRkcjoJJXJkaQorLy8gCWRhdGE6CSV4bW0wIChsb3dlciA0IGJ5dGVzKQorLy8KKy8vIHJldHVybjoJJXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsMzIKKworCW1vdmQJJXhtbTAsICVlYXgJLy8gbG9hZCAiZGF0YSIgdG8gZWF4CisKKyAgICAgICAgIGxvY2sKKyAgICAgICAgIHhjaGdsICVlYXgsICglcmRpKQorCisJbW92ZAklZWF4LCAleG1tMAkvLyBsb2FkIG9sZCB2YWx1ZSBpbnRvIHJldHVybiByZWdpc3RlcgorCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDY0CisvLworLy8ga21wX3JlYWw2NAorLy8gX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKmFkZHIsIGttcF9yZWFsNjQgZGF0YSApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAgICAgIGFkZHI6ICAgJXJkaQorLy8gICAgICBkYXRhOiAgICV4bW0wIChsb3dlciA4IGJ5dGVzKQorLy8gICAgICByZXR1cm46ICV4bW0wIChsb3dlciA4IGJ5dGVzKQorLy8KKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX3JlYWw2NAorCisJbW92ZAkleG1tMCwgJXJheAkvLyBsb2FkICJkYXRhIiB0byByYXgKKworICAgICAgICAgbG9jaworCXhjaGdxICAlcmF4LCAoJXJkaSkKKworCW1vdmQJJXJheCwgJXhtbTAJLy8gbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX3JlYWw2NAorCisKKyMgZW5kaWYgLyogIUtNUF9NSUMgKi8KKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmbGRjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmc3RjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKy8vCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworI2lmIEtNUF9NSUMKKy8vIFRPRE86IHJlbW92ZSB0aGUgd29ya2Fyb3VuZCBmb3IgcHJvYmxlbSB3aXRoIGZuY2xleCBpbnN0cnVjdGlvbiAobm8gQ1Ega25vd24pCisgICAgICAgIGZzdGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBzdG9yZSBGUCBlbnYKKyAgICAgICAgYW5kdyAgICAkfjB4ODBmZiwgNC0zMiglcnNwKSAgIC8vIGNsZWFyIDAtNywxNSBiaXRzIG9mIEZQIFNXCisgICAgICAgIGZsZGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBsb2FkIEZQIGVudiBiYWNrCisgICAgICAgIHJldAorI2Vsc2UKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorI2VuZGlmCisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgZ3RpZCwgaW50IHRpZCwgLi4uKSwKKy8vCQkgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworLy8gICAgKCpwa2ZuKSggJiBndGlkLCAmIHRpZCwgYXJndlswXSwgLi4uICk7CisvLyAgICByZXR1cm4gMTsKKy8vIH0KKy8vCisvLyBub3RlOgorLy8JYXQgY2FsbCB0byBwa2ZuIG11c3QgaGF2ZSAlcnNwIDEyOC1ieXRlIGFsaWduZWQgZm9yIGNvbXBpbGVyCisvLworLy8gcGFyYW1ldGVyczoKKy8vICAgICAgJXJkaTogIAlwa2ZuCisvLwklZXNpOglndGlkCisvLwklZWR4Ogl0aWQKKy8vCSVlY3g6CWFyZ2MKKy8vCSVyODoJcF9hcmd2CisvLwklcjk6CSZleGl0X2ZyYW1lCisvLworLy8gbG9jYWxzOgorLy8JX19ndGlkOglndGlkIHBhcm0gcHVzaGVkIG9uIHN0YWNrIHNvIGNhbiBwYXNzICZndGlkIHRvIHBrZm4KKy8vCV9fdGlkOgl0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRpZCB0byBwa2ZuCisvLworLy8gcmVnIHRlbXBzOgorLy8JJXJheDoJdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UKKy8vCSVyZHg6CXVzZWQgaW4gc3RhY2sgcG9pbnRlciBhbGlnbm1lbnQgY2FsY3VsYXRpb24KKy8vCSVyMTE6CXVzZWQgdG8gdHJhdmVyc2UgcF9hcmd2IGFycmF5CisvLwklcnNpOgl1c2VkIGFzIHRlbXBvcmFyeSBmb3Igc3RhY2sgcGFyYW1ldGVycworLy8JCXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBudW1iZXIgb2YgcGtmbiBwYXJtcyB0byBwdXNoCisvLwklcmJ4Ogl1c2VkIHRvIGhvbGQgcGtmbiBhZGRyZXNzLCBhbmQgemVybyBjb25zdGFudCwgY2FsbGVlLXNhdmUKKy8vCisvLyByZXR1cm46CSVlYXggCShhbHdheXMgMS9UUlVFKQorLy8KKworX19ndGlkID0gLTE2CitfX3RpZCA9IC0yNAorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hxIAklcmJwCQkvLyBzYXZlIGJhc2UgcG9pbnRlcgorCUtNUF9DRklfREVGX09GRlNFVCAxNgorCUtNUF9DRklfT0ZGU0VUIHJicCwtMTYKKwltb3ZxIAklcnNwLCVyYnAJLy8gZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIgZm9yIHRoaXMgcm91dGluZS4KKwlLTVBfQ0ZJX1JFR0lTVEVSIHJicAorCisjaWYgT01QVF9TVVBQT1JUCisJbW92cQklcmJwLCAoJXI5KQkvLyBzYXZlIGV4aXRfZnJhbWUKKyNlbmRpZgorCisJcHVzaHEgCSVyYngJCS8vICVyYnggaXMgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyCisJcHVzaHEJJXJzaQkJLy8gUHV0IGd0aWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRnaWQgdG8gcGtmbgorCXB1c2hxCSVyZHgJCS8vIFB1dCB0aWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRpZCB0byBwa2ZuCisKKwltb3ZxCSVyY3gsICVyYXgJLy8gU3RhY2sgYWxpZ25tZW50IGNhbGN1bGF0aW9uIGJlZ2luczsgYXJnYyAtPiAlcmF4CisJbW92cQkkMCwgJXJieAkvLyBjb25zdGFudCBmb3IgY21vdnMgbGF0ZXIKKwlzdWJxCSQ0LCAlcmF4CS8vIHN1YnRyYWN0IGZvdXIgYXJncyBwYXNzZWQgaW4gcmVnaXN0ZXJzIHRvIHBrZm4KKyNpZiBLTVBfTUlDCisJanMJS01QX0xBQkVMKGttcF8wKQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJS01QX0xBQkVMKGttcF8wX2V4aXQpCS8vIGp1bXAgYWhlYWQKK0tNUF9MQUJFTChrbXBfMCk6CisJbW92cQklcmJ4LCAlcmF4CS8vIHplcm8gbmVnYXRpdmUgdmFsdWUgaW4gJXJheCA8LSBtYXgoMCwgYXJnYy00KQorS01QX0xBQkVMKGttcF8wX2V4aXQpOgorI2Vsc2UKKwljbW92c3EJJXJieCwgJXJheAkvLyB6ZXJvIG5lZ2F0aXZlIHZhbHVlIGluICVyYXggPC0gbWF4KDAsIGFyZ2MtNCkKKyNlbmRpZiAvLyBLTVBfTUlDCisKKwltb3ZxCSVyYXgsICVyc2kJLy8gc2F2ZSBtYXgoMCwgYXJnYy00KSAtPiAlcnNpIGZvciBsYXRlcgorCXNobHEgCSQzLCAlcmF4CS8vIE51bWJlciBvZiBieXRlcyB1c2VkIG9uIHN0YWNrOiBtYXgoMCwgYXJnYy00KSo4CisKKwltb3ZxIAklcnNwLCAlcmR4CS8vCisJc3VicSAJJXJheCwgJXJkeAkvLyAlcnNwLShtYXgoMCxhcmdjLTQpKjgpIC0+ICVyZHggLS0KKwkJCQkvLyB3aXRob3V0IGFsaWduLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdnEgCSVyZHgsICVyYXgJLy8gU2F2ZSB0byAlcmF4CisKKwlhbmRxIAkkMHhGRkZGRkZGRkZGRkZGRjgwLCAlcmF4ICAvLyBtYXNrIG9mZiBsb3dlciA3IGJpdHMgKDEyOCBieXRlcyBhbGlnbikKKwlzdWJxIAklcmF4LCAlcmR4CS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVyc3AKKwlzdWJxIAklcmR4LCAlcnNwCS8vIFByZXBhcmUgdGhlIHN0YWNrIHB0ciAtLQorCQkJCS8vIG5vdyAlcnNwIHdpbGwgYWxpZ24gdG8gMTI4LWJ5dGUgYm91bmRhcnkgYXQgY2FsbCBzaXRlCisKKwkJCQkvLyBzZXR1cCBwa2ZuIHBhcmFtZXRlciByZWcgYW5kIHN0YWNrCisJbW92cQklcmN4LCAlcmF4CS8vIGFyZ2MgLT4gJXJheAorCWNtcHEJJDAsICVyc2kKKwlqZQlLTVBfTEFCRUwoa21wX2ludm9rZV9wYXNzX3Bhcm1zKQkvLyBqdW1wIGFoZWFkIGlmIG5vIHBhcm1zIHRvIHB1c2gKKwlzaGxxCSQzLCAlcmN4CS8vIGFyZ2MqOCAtPiAlcmN4CisJbW92cSAJJXI4LCAlcmR4CS8vIHBfYXJndiAtPiAlcmR4CisJYWRkcQklcmN4LCAlcmR4CS8vICZwX2FyZ3ZbYXJnY10gLT4gJXJkeAorCisJbW92cQklcnNpLCAlcmN4CS8vIG1heCAoMCwgYXJnYy00KSAtPiAlcmN4CisKK0tNUF9MQUJFTChrbXBfaW52b2tlX3B1c2hfcGFybXMpOgorCS8vIHB1c2ggbnRoIC0gN3RoIHBhcm1zIHRvIHBrZm4gb24gc3RhY2sKKwlzdWJxCSQ4LCAlcmR4CS8vIGRlY3JlbWVudCBwX2FyZ3YgcG9pbnRlciB0byBwcmV2aW91cyBwYXJtCisJbW92cQkoJXJkeCksICVyc2kJLy8gcF9hcmd2WyVyY3gtMV0gLT4gJXJzaQorCXB1c2hxCSVyc2kJCS8vIHB1c2ggcF9hcmd2WyVyY3gtMV0gb250byBzdGFjayAocmV2ZXJzZSBvcmRlcikKKwlzdWJsCSQxLCAlZWN4CisKKy8vIEM2OTU3MDogIlg4Nl82NF9SRUxPQ19CUkFOQ0ggbm90IHN1cHBvcnRlZCIgZXJyb3IgYXQgbGlua2luZyBvbiBtYWNfMzJlCisvLwkJaWYgdGhlIG5hbWUgb2YgdGhlIGxhYmVsIHRoYXQgaXMgYW4gb3BlcmFuZCBvZiB0aGlzIGplY3h6IHN0YXJ0cyB3aXRoIGEgZG90ICgiLiIpOworLy8JICAgQXBwbGUncyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCAxLWJ5dGUgbGVuZ3RoIHJlbG9jYXRpb247CisvLyAgICAgICAgIFJlc29sdXRpb246IHJlcGxhY2UgYWxsIC5sYWJlbFggZW50cmllcyB3aXRoIExfbGFiZWxYLgorCisJamVjeHogICBLTVBfTEFCRUwoa21wX2ludm9rZV9wYXNzX3Bhcm1zKSAgLy8gc3RvcCB3aGVuIGZvdXIgcF9hcmd2W10gcGFybXMgbGVmdAorCWptcAlLTVBfTEFCRUwoa21wX2ludm9rZV9wdXNoX3Bhcm1zKQorCUFMSUdOIDMKK0tNUF9MQUJFTChrbXBfaW52b2tlX3Bhc3NfcGFybXMpOgkvLyBwdXQgMXN0IC0gNnRoIHBhcm1zIHRvIHBrZm4gaW4gcmVnaXN0ZXJzLgorCQkJCS8vIG9yZGVyIGhlcmUgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHRyYXNoaW5nCisJCQkJLy8gcmVnaXN0ZXJzIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBwYXJtcyEKKwltb3ZxCSVyZGksICVyYngJLy8gcGtmbiAtPiAlcmJ4CisJbGVhcQlfX2d0aWQoJXJicCksICVyZGkgLy8gJmd0aWQgLT4gJXJkaSAoc3RvcmUgMXN0IHBhcm0gdG8gcGtmbikKKwlsZWFxCV9fdGlkKCVyYnApLCAlcnNpICAvLyAmdGlkIC0+ICVyc2kgKHN0b3JlIDJuZCBwYXJtIHRvIHBrZm4pCisKKwltb3ZxCSVyOCwgJXIxMQkvLyBwX2FyZ3YgLT4gJXIxMQorCisjaWYgS01QX01JQworCWNtcHEJJDQsICVyYXgJLy8gYXJnYyA+PSA0PworCWpucwlLTVBfTEFCRUwoa21wXzQpCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzRfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF80KToKKwltb3ZxCTI0KCVyMTEpLCAlcjkJLy8gcF9hcmd2WzNdIC0+ICVyOSAoc3RvcmUgNnRoIHBhcm0gdG8gcGtmbikKK0tNUF9MQUJFTChrbXBfNF9leGl0KToKKworCWNtcHEJJDMsICVyYXgJLy8gYXJnYyA+PSAzPworCWpucwlLTVBfTEFCRUwoa21wXzMpCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzNfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF8zKToKKwltb3ZxCTE2KCVyMTEpLCAlcjgJLy8gcF9hcmd2WzJdIC0+ICVyOCAoc3RvcmUgNXRoIHBhcm0gdG8gcGtmbikKK0tNUF9MQUJFTChrbXBfM19leGl0KToKKworCWNtcHEJJDIsICVyYXgJLy8gYXJnYyA+PSAyPworCWpucwlLTVBfTEFCRUwoa21wXzIpCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzJfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF8yKToKKwltb3ZxCTgoJXIxMSksICVyY3gJLy8gcF9hcmd2WzFdIC0+ICVyY3ggKHN0b3JlIDR0aCBwYXJtIHRvIHBrZm4pCitLTVBfTEFCRUwoa21wXzJfZXhpdCk6CisKKwljbXBxCSQxLCAlcmF4CS8vIGFyZ2MgPj0gMT8KKwlqbnMJS01QX0xBQkVMKGttcF8xKQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJS01QX0xBQkVMKGttcF8xX2V4aXQpCS8vIGp1bXAgYWhlYWQKK0tNUF9MQUJFTChrbXBfMSk6CisJbW92cQkoJXIxMSksICVyZHgJLy8gcF9hcmd2WzBdIC0+ICVyZHggKHN0b3JlIDNyZCBwYXJtIHRvIHBrZm4pCitLTVBfTEFCRUwoa21wXzFfZXhpdCk6CisjZWxzZQorCWNtcHEJJDQsICVyYXgJLy8gYXJnYyA+PSA0PworCWNtb3Zuc3EJMjQoJXIxMSksICVyOQkvLyBwX2FyZ3ZbM10gLT4gJXI5IChzdG9yZSA2dGggcGFybSB0byBwa2ZuKQorCisJY21wcQkkMywgJXJheAkvLyBhcmdjID49IDM/CisJY21vdm5zcQkxNiglcjExKSwgJXI4CS8vIHBfYXJndlsyXSAtPiAlcjggKHN0b3JlIDV0aCBwYXJtIHRvIHBrZm4pCisKKwljbXBxCSQyLCAlcmF4CS8vIGFyZ2MgPj0gMj8KKwljbW92bnNxCTgoJXIxMSksICVyY3gJLy8gcF9hcmd2WzFdIC0+ICVyY3ggKHN0b3JlIDR0aCBwYXJtIHRvIHBrZm4pCisKKwljbXBxCSQxLCAlcmF4CS8vIGFyZ2MgPj0gMT8KKwljbW92bnNxCSglcjExKSwgJXJkeAkvLyBwX2FyZ3ZbMF0gLT4gJXJkeCAoc3RvcmUgM3JkIHBhcm0gdG8gcGtmbikKKyNlbmRpZiAvLyBLTVBfTUlDCisKKwljYWxsCSolcmJ4CQkvLyBjYWxsICgqcGtmbikoKTsKKwltb3ZxCSQxLCAlcmF4CS8vIG1vdmUgMSBpbnRvIHJldHVybiByZWdpc3RlcjsKKworCW1vdnEJLTgoJXJicCksICVyYngJLy8gcmVzdG9yZSAlcmJ4CXVzaW5nICVyYnAgc2luY2UgJXJzcCB3YXMgbW9kaWZpZWQKKwltb3ZxIAklcmJwLCAlcnNwCS8vIHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCXBvcHEgCSVyYnAJCS8vIHJlc3RvcmUgZnJhbWUgcG9pbnRlcgorCUtNUF9DRklfREVGIHJzcCw4CisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIC0tIEVuZCAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisvLyBrbXBfdWludDY0CisvLyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCkKKyAgICAgICAgLnRleHQKKwlQUk9DICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKwlyZHRzYworCXNobHEgICAgJDMyLCAlcmR4CisJb3JxICAgICAlcmR4LCAlcmF4CisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorLy8gLS0gRW5kICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9ic3IzMgorLy8KKy8vIGludAorLy8gX19rbXBfYnNyMzIoIGludCApOworLy8KKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9ic3IzMgorCisgICAgICAgIGJzciAgICAlZWRpLCVlYXgKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9ic3IzMgorCisJCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgS01QX0FSQ0hfUFBDNjQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgZ3RpZCwgaW50IHRpZCwgLi4uKSwKKy8vCQkgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworLy8gICAgKCpwa2ZuKSggJiBndGlkLCAmIHRpZCwgYXJndlswXSwgLi4uICk7CisvLyAgICByZXR1cm4gMTsKKy8vIH0KKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8JcjM6CXBrZm4KKy8vCXI0OglndGlkCisvLwlyNToJdGlkCisvLwlyNjoJYXJnYworLy8Jcjc6CXBfYXJndgorLy8Jcjg6CSZleGl0X2ZyYW1lCisvLworLy8gcmV0dXJuOglyMwkoYWx3YXlzIDEvVFJVRSkKKy8vCisJLnRleHQKKyMgaWYgS01QX0FSQ0hfUFBDNjRfTEUKKwkuYWJpdmVyc2lvbiAyCisjIGVuZGlmCisJLmdsb2JsCV9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCS5wMmFsaWduCTQKKyMgZWxzZQorCS5wMmFsaWduCTIKKyMgZW5kaWYKKworCS50eXBlCV9fa21wX2ludm9rZV9taWNyb3Rhc2ssQGZ1bmN0aW9uCisKKyMgaWYgS01QX0FSQ0hfUFBDNjRfTEUKK19fa21wX2ludm9rZV9taWNyb3Rhc2s6CisuTGZ1bmNfYmVnaW4wOgorLkxmdW5jX2dlcDA6CisJYWRkaXMgMiwgMTIsIC5UT0MuLS5MZnVuY19nZXAwQGhhCisJYWRkaSAyLCAyLCAuVE9DLi0uTGZ1bmNfZ2VwMEBsCisuTGZ1bmNfbGVwMDoKKwkubG9jYWxlbnRyeQlfX2ttcF9pbnZva2VfbWljcm90YXNrLCAuTGZ1bmNfbGVwMC0uTGZ1bmNfZ2VwMAorIyBlbHNlCisJLnNlY3Rpb24JLm9wZCwiYXciLEBwcm9nYml0cworX19rbXBfaW52b2tlX21pY3JvdGFzazoKKwkucDJhbGlnbgkzCisJLnF1YWQJLkxmdW5jX2JlZ2luMAorCS5xdWFkCS5UT0MuQHRvY2Jhc2UKKwkucXVhZAkwCisJLnRleHQKKy5MZnVuY19iZWdpbjA6CisjIGVuZGlmCisKKy8vIC0tIEJlZ2luIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIG1hcmtfYmVnaW47CisKKy8vIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBzdGFjayBmcmFtZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgb2YgdGhlIHBhcmFtZXRlcnMKKy8vIG9uIHRoZSBzdGFjayBmb3IgdGhlIG1pY3JvdGFzayBwbHVzIHdoYXQgdGhpcyBmdW5jdGlvbiBuZWVkcy4gVGhhdCdzIDQ4CisvLyBieXRlcyB1bmRlciB0aGUgRUxGdjEgQUJJICgzMiBieXRlcyB1bmRlciBFTEZ2MiksIHBsdXMgOCooMiArIGFyZ2MpIGZvciB0aGUKKy8vIHBhcmFtZXRlcnMgdG8gdGhlIG1pY3JvdGFzaywgcGx1cyA4IGJ5dGVzIHRvIHN0b3JlIHRoZSB2YWx1ZXMgb2YgcjQgYW5kIHI1LAorLy8gYW5kIDggYnl0ZXMgdG8gc3RvcmUgcjMxLiBXaXRoIE9NUC1UIHN1cHBvcnQsIHdlIG5lZWQgYW4gYWRkaXRpb25hbCA4IGJ5dGVzCisvLyB0byBzYXZlIHIzMCB0byBob2xkIGEgY29weSBvZiByOC4KKworCS5jZmlfc3RhcnRwcm9jCisJbWZsciAwCisJc3RkIDMxLCAtOCgxKQorCXN0ZCAwLCAxNigxKQorCisvLyBUaGlzIGlzIHVudXN1YWwgYmVjYXVzZSBub3JtYWxseSB3ZSdkIHNldCByMzEgZXF1YWwgdG8gcjEgYWZ0ZXIgdGhlIHN0YWNrCisvLyBmcmFtZSBpcyBlc3RhYmxpc2hlZC4gSW4gdGhpcyBjYXNlLCBob3dldmVyLCB3ZSBuZWVkIHRvIGR5bmFtaWNhbGx5IGNvbXB1dGUKKy8vIHRoZSBzdGFjayBmcmFtZSBzaXplLCBhbmQgc28gd2Uga2VlcCBhIGRpcmVjdCBjb3B5IG9mIHIxIHRvIGFjY2VzcyBvdXIKKy8vIHJlZ2lzdGVyIHNhdmUgYXJlYXMgYW5kIHJlc3RvcmUgdGhlIHIxIHZhbHVlIGJlZm9yZSByZXR1cm5pbmcuCisJbXIgMzEsIDEKKwkuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgcjMxCisJLmNmaV9vZmZzZXQgcjMxLCAtOAorCS5jZmlfb2Zmc2V0IGxyLCAxNgorCisvLyBDb21wdXRlIHRoZSBzaXplIG5lY2Vzc2FyeSBmb3IgdGhlIGxvY2FsIHN0YWNrIGZyYW1lLgorIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCWxpIDEyLCA3MgorIyBlbHNlCisJbGkgMTIsIDg4CisjIGVuZGlmCisJc2xkaSAwLCA2LCAzCisJYWRkIDEyLCAwLCAxMgorCW5lZyAxMiwgMTIKKworLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhY2sgZnJhbWUgc3RheXMgYWxpZ25lZCAodG8gMTYgYnl0ZXMsIGV4Y2VwdAorLy8gdW5kZXIgdGhlIEJHL1EgQ05LLCB3aGVyZSBpdCBtdXN0IGJlIHRvIDMyIGJ5dGVzKS4KKyMgaWYgS01QX09TX0NOSworCWxpIDAsIC0zMgorIyBlbHNlCisJbGkgMCwgLTE2CisjIGVuZGlmCisJYW5kIDEyLCAwLCAxMgorCisvLyBFc3RhYmxpc2ggdGhlIGxvY2FsIHN0YWNrIGZyYW1lLgorCXN0ZHV4IDEsIDEsIDEyCisKKyMgaWYgT01QVF9TVVBQT1JUCisJLmNmaV9vZmZzZXQgcjMwLCAtMTYKKwlzdGQgMzAsIC0xNigzMSkKKwlzdGQgMSwgMCg4KQorCW1yIDMwLCA4CisjIGVuZGlmCisKKy8vIFN0b3JlIGd0aWQgYW5kIHRpZCB0byB0aGUgc3RhY2sgYmVjYXVzZSB0aGV5J3JlIHBhc3NlZCBieSByZWZlcmVuY2UgdG8gdGhlIG1pY3JvdGFzay4KKwlzdHcgNCwgLTIwKDMxKQorCXN0dyA1LCAtMjQoMzEpCisKKwltciAxMiwgNgorCW1yIDQsIDcKKworCWNtcHdpIDAsIDEyLCAxCisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDUsIDAoNCkKKworCWNtcHdpIDAsIDEyLCAyCisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDYsIDgoNCkKKworCWNtcHdpIDAsIDEyLCAzCisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDcsIDE2KDQpCisKKwljbXB3aSAwLCAxMiwgNAorCWJsdAkgMCwgLkxjYWxsCisKKwlsZCA4LCAyNCg0KQorCisJY21wd2kgMCwgMTIsIDUKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgOSwgMzIoNCkKKworCWNtcHdpIDAsIDEyLCA2CisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDEwLCA0MCg0KQorCisJY21wd2kgMCwgMTIsIDcKKwlibHQJIDAsIC5MY2FsbAorCisvLyBUaGVyZSBhcmUgbW9yZSB0aGFuIDYgbWljcm90YXNrIHBhcmFtZXRlcnMsIHNvIHdlIG5lZWQgdG8gc3RvcmUgdGhlCisvLyByZW1haW5kZXIgdG8gdGhlIHN0YWNrLgorCWFkZGkgMTIsIDEyLCAtNgorCW10Y3RyIDEyCisKKy8vIFRoZXNlIGFyZSBzZXQgdG8gOCBieXRlcyBiZWZvcmUgdGhlIGZpcnN0IGRlc2lyZWQgc3RvcmUgYWRkcmVzcyAod2UncmUgdXNpbmcKKy8vIHByZS1pbmNyZW1lbnQgbG9hZHMgYW5kIHN0b3JlcyBpbiB0aGUgbG9vcCBiZWxvdykuIFRoZSBwYXJhbWV0ZXIgc2F2ZSBhcmVhCisvLyBmb3IgdGhlIG1pY3JvdGFzayBiZWdpbnMgNDggKyA4KjggPT0gMTEyIGJ5dGVzIGFib3ZlIHIxIGZvciBFTEZ2MSBhbmQKKy8vIDMyICsgOCo4ID09IDk2IGJ5dGVzIGFib3ZlIHIxIGZvciBFTEZ2Mi4KKwlhZGRpIDQsIDQsIDQwCisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJYWRkaSAxMiwgMSwgODgKKyMgZWxzZQorCWFkZGkgMTIsIDEsIDEwNAorIyBlbmRpZgorCisuTG5leHQ6CisJbGR1IDAsIDgoNCkKKwlzdGR1IDAsIDgoMTIpCisJYmRueiAuTG5leHQKKworLkxjYWxsOgorIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCXN0ZCAyLCAyNCgxKQorCW1yIDEyLCAzCisjZWxzZQorCXN0ZCAyLCA0MCgxKQorLy8gRm9yIEVMRnYxLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGFjdHVhbCBmdW5jdGlvbiBhZGRyZXNzIGZyb20gdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IuCisJbGQgMTIsIDAoMykKKwlsZCAyLCA4KDMpCisJbGQgMTEsIDE2KDMpCisjZW5kaWYKKworCWFkZGkgMywgMzEsIC0yMAorCWFkZGkgNCwgMzEsIC0yNAorCisJbXRjdHIgMTIKKwliY3RybAorIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCWxkIDIsIDI0KDEpCisjIGVsc2UKKwlsZCAyLCA0MCgxKQorIyBlbmRpZgorCisjIGlmIE9NUFRfU1VQUE9SVAorCWxpIDMsIDAKKwlzdGQgMywgMCgzMCkKKyMgZW5kaWYKKworCWxpIDMsIDEKKworIyBpZiBPTVBUX1NVUFBPUlQKKwlsZCAzMCwgLTE2KDMxKQorIyBlbmRpZgorCisJbXIgMSwgMzEKKwlsZCAwLCAxNigxKQorCWxkIDMxLCAtOCgxKQorCW10bHIgMAorCWJscgorCisJLmxvbmcJMAorCS5xdWFkCTAKKy5MZnVuY19lbmQwOgorCS5zaXplCV9fa21wX2ludm9rZV9taWNyb3Rhc2ssIC5MZnVuY19lbmQwLS5MZnVuY19iZWdpbjAKKwkuY2ZpX2VuZHByb2MKKworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9QUEM2NCAqLworCisjaWYgS01QX0FSQ0hfQVJNCisgICAgLmRhdGEKKyAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMiw4CisgICAgLmRhdGEKKyAgICAuYWxpZ24gNAorICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgLjRieXRlIC5nb21wX2NyaXRpY2FsX3VzZXJfCisgICAgLnNpemUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLDQKKyNlbmRpZiAvKiBLTVBfQVJDSF9BUk0gKi8KKworI2lmIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQKKyAgICAuZGF0YQorICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAuZGF0YQorICAgIC5hbGlnbiA4CisgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAuOGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsOAorI2VuZGlmIC8qIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQgKi8KKworI2lmIEtNUF9PU19MSU5VWAorIyBpZiBLTVBfQVJDSF9BUk0KKy5zZWN0aW9uIC5ub3RlLkdOVS1zdGFjaywiIiwlcHJvZ2JpdHMKKyMgZWxzZQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjQxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuYwpAQCAtMCwwICsxLDI3MTQgQEAKKy8qCisgKiB6X0xpbnV4X3V0aWwuYyAtLSBwbGF0Zm9ybSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKyNpZiAhS01QX09TX0ZSRUVCU0QgJiYgIUtNUF9PU19ORVRCU0QKKyMgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgICAgICAgLy8gSFVHRV9WQUwuCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWYgS01QX09TX0xJTlVYICYmICFLTVBfT1NfQ05LCisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjIGlmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKy8vIFdlIHNob3VsZCByZWFsbHkgaW5jbHVkZSA8ZnV0ZXguaD4sIGJ1dCB0aGF0IGNhdXNlcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIG9uIGRpZmZlcmVudAorLy8gTGludXgqIE9TIGRpc3RyaWJ1dGlvbnMgdGhhdCBlaXRoZXIgcmVxdWlyZSB0aGF0IHlvdSBpbmNsdWRlIChvciBicmVhayB3aGVuIHlvdSB0cnkgdG8gaW5jbHVkZSkKKy8vIDxwY2kvdHlwZXMuaD4uCisvLyBTaW5jZSBhbGwgd2UgbmVlZCBpcyB0aGUgdHdvIG1hY3JvcyBiZWxvdyAod2hpY2ggYXJlIHBhcnQgb2YgdGhlIGtlcm5lbCBBQkksIHNvIGNhbid0IGNoYW5nZSkKKy8vIHdlIGp1c3QgZGVmaW5lIHRoZSBjb25zdGFudHMgaGVyZSBhbmQgZG9uJ3QgaW5jbHVkZSA8ZnV0ZXguaD4KKyMgIGlmbmRlZiBGVVRFWF9XQUlUCisjICAgZGVmaW5lIEZVVEVYX1dBSVQgICAgMAorIyAgZW5kaWYKKyMgIGlmbmRlZiBGVVRFWF9XQUtFCisjICAgZGVmaW5lIEZVVEVYX1dBS0UgICAgMQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbGlmIEtNUF9PU19EQVJXSU4KKyMgaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorIyBpbmNsdWRlIDxtYWNoL21hY2guaD4KKyNlbGlmIEtNUF9PU19GUkVFQlNECisjIGluY2x1ZGUgPHB0aHJlYWRfbnAuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBrbXBfc3lzX3RpbWVyIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHN0YXJ0OworfTsKKworLy8gQ29udmVydCB0aW1lc3BlYyB0byBuYW5vc2Vjb25kcy4KKyNkZWZpbmUgVFMyTlModGltZXNwZWMpICgoKHRpbWVzcGVjKS50dl9zZWMgKiAxZTkpICsgKHRpbWVzcGVjKS50dl9uc2VjKQorCitzdGF0aWMgc3RydWN0IGttcF9zeXNfdGltZXIgX19rbXBfc3lzX3RpbWVyX2RhdGE7CisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogc2lnX2Z1bmNfdCApKCBpbnQgKTsKKyAgICBTVEFUSUNfRUZJMl9XT1JLQVJPVU5EIHN0cnVjdCBzaWdhY3Rpb24gICAgX19rbXBfc2lnaGxkcnNbIE5TSUcgXTsKKyAgICBzdGF0aWMgc2lnc2V0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc2lnc2V0OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfaW5pdF9ydW50aW1lICAgPSBGQUxTRTsKKworc3RhdGljIGludCBfX2ttcF9mb3JrX2NvdW50ID0gMDsKKworc3RhdGljIHB0aHJlYWRfY29uZGF0dHJfdCAgX19rbXBfc3VzcGVuZF9jb25kX2F0dHI7CitzdGF0aWMgcHRocmVhZF9tdXRleGF0dHJfdCBfX2ttcF9zdXNwZW5kX211dGV4X2F0dHI7CisKK3N0YXRpYyBrbXBfY29uZF9hbGlnbl90ICAgIF9fa21wX3dhaXRfY3Y7CitzdGF0aWMga21wX211dGV4X2FsaWduX3QgICBfX2ttcF93YWl0X214OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAorc3RhdGljIHZvaWQKK19fa21wX3ByaW50X2NvbmQoIGNoYXIgKmJ1ZmZlciwga21wX2NvbmRfYWxpZ25fdCAqY29uZCApCit7CisgICAgS01QX1NOUFJJTlRGKCBidWZmZXIsIDEyOCwgIihjb25kIChsb2NrICglbGQsICVkKSksIChkZXNjciAoJXApKSkiLAorICAgICAgICAgICAgICAgICAgICAgIGNvbmQtPmNfY29uZC5fX2NfbG9jay5fX3N0YXR1cywgY29uZC0+Y19jb25kLl9fY19sb2NrLl9fc3BpbmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgY29uZC0+Y19jb25kLl9fY193YWl0aW5nICk7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICggS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQpCisKKy8qCisgKiBBZmZpbml0eSBzdXBwb3J0CisgKi8KKworLyoKKyAqIE9uIHNvbWUgb2YgdGhlIG9sZGVyIE9TJ3MgdGhhdCB3ZSBidWlsZCBvbiwgdGhlc2UgY29uc3RhbnRzIGFyZW4ndCBwcmVzZW50CisgKiBpbiA8YXNtL3VuaXN0ZC5oPiAjaW5jbHVkZWQgZnJvbSA8c3lzLnN5c2NhbGwuaD4uICBUaGV5IG11c3QgYmUgdGhlIHNhbWUgb24KKyAqIGFsbCBzeXN0ZW1zIG9mIHRoZSBzYW1lIGFyY2ggd2hlcmUgdGhleSBhcmUgZGVmaW5lZCwgYW5kIHRoZXkgY2Fubm90IGNoYW5nZS4KKyAqIHN0b25lIGZvcmV2ZXIuCisgKi8KKworIyAgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyNDEKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMjQxCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMjQyCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDI0MgorIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKyMgIGVsaWYgS01QX0FSQ0hfQUFSQ0g2NAorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAxMjIKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMTIyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMTIzCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDEyMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKyMgIGVsaWYgS01QX0FSQ0hfWDg2XzY0CisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDIwMworIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyMDMKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAyMDQKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMjA0CisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworIyAgZWxpZiBLTVBfQVJDSF9QUEM2NAorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyMjIKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMjIyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMjIzCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDIyMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKworIyAgZWxzZQorIyAgIGVycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlCisKKyMgIGVuZGlmIC8qIEtNUF9BUkNIXyogKi8KKworaW50CitfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IgKQoreworICAgIEtNUF9BU1NFUlQyKEtNUF9BRkZJTklUWV9DQVBBQkxFKCksCisgICAgICAiSWxsZWdhbCBzZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKyNpZiBLTVBfVVNFX0hXTE9DCisgICAgaW50IHJldHZhbCA9IGh3bG9jX3NldF9jcHViaW5kKF9fa21wX2h3bG9jX3RvcG9sb2d5LCAoaHdsb2NfY3B1c2V0X3QpbWFzaywgSFdMT0NfQ1BVQklORF9USFJFQUQpOworI2Vsc2UKKyAgICBpbnQgcmV0dmFsID0gc3lzY2FsbCggX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgX19rbXBfYWZmaW5fbWFza19zaXplLCBtYXNrICk7CisjZW5kaWYKKyAgICBpZiAocmV0dmFsID49IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBlcnJvciA9IGVycm5vOworICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGYXRhbFN5c0Vycm9yICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQKK19fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIGdldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisjaWYgS01QX1VTRV9IV0xPQworICAgIGludCByZXR2YWwgPSBod2xvY19nZXRfY3B1YmluZChfX2ttcF9od2xvY190b3BvbG9neSwgKGh3bG9jX2NwdXNldF90KW1hc2ssIEhXTE9DX0NQVUJJTkRfVEhSRUFEKTsKKyNlbHNlCisgICAgaW50IHJldHZhbCA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHksIDAsIF9fa21wX2FmZmluX21hc2tfc2l6ZSwgbWFzayApOworI2VuZGlmCisgICAgaWYgKHJldHZhbCA+PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRmF0YWxTeXNFcnJvciApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorICAgIHJldHVybiBlcnJvcjsKK30KKwordm9pZAorX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoIGludCB3aGljaCApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICBLTVBfQ1BVX1NFVCh3aGljaCwgbWFzayk7CisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShtYXNrLCBUUlVFKTsKKyAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKK30KKworLyoKKyAqIERldGVybWluZSBpZiB3ZSBjYW4gYWNjZXNzIGFmZmluaXR5IGZ1bmN0aW9uYWxpdHkgb24gdGhpcyB2ZXJzaW9uIG9mCisgKiBMaW51eCogT1MgYnkgY2hlY2tpbmcgX19OUl9zY2hlZF97Z2V0LHNldH1hZmZpbml0eSBzeXN0ZW0gY2FsbHMsIGFuZCBzZXQKKyAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgKDAgbWVhbnMgbm90IGNhcGFibGUpLgorICovCit2b2lkCitfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyICplbnZfdmFyKQoreworICAgIC8vCisgICAgLy8gQ2hlY2sgYW5kIHNlZSBpZiB0aGUgT1Mgc3VwcG9ydHMgdGhyZWFkIGFmZmluaXR5LgorICAgIC8vCisKKyMgZGVmaW5lIEtNUF9DUFVfU0VUX1NJWkVfTElNSVQgICAgICAgICAgKDEwMjQqMTAyNCkKKworICAgIGludCBnQ29kZTsKKyAgICBpbnQgc0NvZGU7CisgICAga21wX2FmZmluX21hc2tfdCAqYnVmOworICAgIGJ1ZiA9ICgga21wX2FmZmluX21hc2tfdCAqICkgS01QX0lOVEVSTkFMX01BTExPQyggS01QX0NQVV9TRVRfU0laRV9MSU1JVCApOworCisgICAgLy8gSWYgTGludXgqIE9TOgorICAgIC8vIElmIHRoZSBzeXNjYWxsIGZhaWxzIG9yIHJldHVybnMgYSBzdWdnZXN0aW9uIGZvciB0aGUgc2l6ZSwKKyAgICAvLyB0aGVuIHdlIGRvbid0IGhhdmUgdG8gc2VhcmNoIGZvciBhbiBhcHByb3ByaWF0ZSBzaXplLgorICAgIGdDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgS01QX0NQVV9TRVRfU0laRV9MSU1JVCwgYnVmICk7CisgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgImluaXRpYWwgZ2V0YWZmaW5pdHkgY2FsbCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgIGdDb2RlLCBlcnJubykpOworCisgICAgLy9pZiAoKGdDb2RlIDwgMCkgJiYgKGVycm5vID09IEVOT1NZUykpCisgICAgaWYgKGdDb2RlIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBHZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChnQ29kZSA+IDApIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAgICAgLy8gVGhlIG9wdGltYWwgc2l0dWF0aW9uOiB0aGUgT1MgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgICAgIC8vIGl0IGV4cGVjdHMuCisgICAgICAgIC8vCisgICAgICAgIC8vIEEgdmVyaWZpY2F0aW9uIG9mIGNvcnJlY3QgYmVoYXZpb3IgaXMgdGhhdCBJc2V0YWZmaW5pdHkgb24gYSBOVUxMCisgICAgICAgIC8vIGJ1ZmZlciB3aXRoIHRoZSBzYW1lIHNpemUgZmFpbHMgd2l0aCBlcnJubyBzZXQgdG8gRUZBVUxULgorICAgICAgICBzQ29kZSA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIGdDb2RlLCBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAic2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICBnQ29kZSwgc0NvZGUsIGVycm5vKSk7CisgICAgICAgIGlmIChzQ29kZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9TWVMpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm5vID09IEVGQVVMVCkgeworICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9FTkFCTEUoZ0NvZGUpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImFmZmluaXR5IHN1cHBvcnRlZCAobWFzayBzaXplICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpX19rbXBfYWZmaW5fbWFza19zaXplKSk7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIENhbGwgdGhlIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsIHJlcGVhdGVkbHkgd2l0aCBpbmNyZWFzaW5nIHNldCBzaXplcworICAgIC8vIHVudGlsIHdlIHN1Y2NlZWQsIG9yIHJlYWNoIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBzZWFyY2guCisgICAgLy8KKyAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICJzZWFyY2hpbmcgZm9yIHByb3BlciBzZXQgc2l6ZVxuIikpOworICAgIGludCBzaXplOworICAgIGZvciAoc2l6ZSA9IDE7IHNpemUgPD0gS01QX0NQVV9TRVRfU0laRV9MSU1JVDsgc2l6ZSAqPSAyKSB7CisgICAgICAgIGdDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgIHNpemUsIGJ1ZiApOworICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAiZ2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLCBzaXplLAorICAgICAgICAgICAgZ0NvZGUsIGVycm5vKSk7CisKKyAgICAgICAgaWYgKGdDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKCBlcnJubyA9PSBFTk9TWVMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgT1MgY2FsbCBiZWhhdmlvcjogZXJybm8gPT0gRU5PU1lTIGZvciBtYXNrIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIEdldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzQ29kZSA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIGdDb2RlLCBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAic2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICBnQ29kZSwgc0NvZGUsIGVycm5vKSk7CisgICAgICAgIGlmIChzQ29kZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9TWVMpIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZG4ndCBnZXQgaGVyZQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAiaW5jb25zaXN0ZW50IE9TIGNhbGwgYmVoYXZpb3I6IGVycm5vID09IEVOT1NZUyBmb3IgbWFzayBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHNpemUpKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKGdDb2RlKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJhZmZpbml0eSBzdXBwb3J0ZWQgKG1hc2sgc2l6ZSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvL2ludCBlcnJvciA9IGVycm5vOyAgLy8gc2F2ZSB1bmNhdWdodCBlcnJvciBjb2RlCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAvLyBlcnJubyA9IGVycm9yOyAgLy8gcmVzdG9yZSB1bmNhdWdodCBlcnJvciBjb2RlLCB3aWxsIGJlIHByaW50ZWQgYXQgdGhlIG5leHQgS01QX1dBUk5JTkcgYmVsb3cKKworICAgIC8vCisgICAgLy8gQWZmaW5pdHkgaXMgbm90IHN1cHBvcnRlZAorICAgIC8vCisgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICJjYW5ub3QgZGV0ZXJtaW5lIG1hc2sgc2l6ZSAtIGFmZmluaXR5IG5vdCBzdXBwb3J0ZWRcbiIpKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmQ2FudEdldE1hc2tTaXplLCBlbnZfdmFyICk7CisgICAgfQorfQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgIUtNUF9PU19DTksKKworaW50CitfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSgpCit7CisgICAgaW50IGxvYyA9IDA7CisgICAgaW50IHJjID0gc3lzY2FsbCggX19OUl9mdXRleCwgJmxvYywgRlVURVhfV0FLRSwgMSwgTlVMTCwgTlVMTCwgMCApOworICAgIGludCByZXR2YWwgPSAoIHJjID09IDAgKSB8fCAoIGVycm5vICE9IEVOT1NZUyApOworCisgICAgS0FfVFJBQ0UoMTAsICggIl9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlOiByYyA9ICVkIGVycm5vID0gJWRcbiIsIHJjLAorICAgICAgZXJybm8gKSApOworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZTogZnV0ZXggc3lzY2FsbCVzIHN1cHBvcnRlZFxuIiwKKyAgICAgICAgcmV0dmFsID8gIiIgOiAiIG5vdCIgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmICFLTVBfT1NfQ05LCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkgJiYgKCEgS01QX0FTTV9JTlRSSU5TKQorLyoKKyAqIE9ubHkgMzItYml0ICJhZGQtZXhjaGFuZ2UiIGluc3RydWN0aW9uIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBjYXVzZXMgdXMgdG8KKyAqIHVzZSBjb21wYXJlX2FuZF9zdG9yZSBmb3IgdGhlc2Ugcm91dGluZXMKKyAqLworCitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX29yOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKQoreworICAgIGttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDgKK19fa21wX3Rlc3RfdGhlbl9hbmQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApCit7CisgICAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDMyCitfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9QUEM2NCB8fCBLTVBfQVJDSF9BQVJDSDY0CitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX2FkZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDggKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2VuZGlmIC8qIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiAoISBLTVBfQVNNX0lOVFJJTlMpICovCisKK3ZvaWQKK19fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbmZvX3QgICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIGlmICggIXRoICkgcmV0dXJuOworCisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfdGVybWluYXRlX3RocmVhZDoga2lsbCAoJWQpXG4iLCBndGlkICkgKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jYW5jZWwoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFU1JDSCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFRlcm1pbmF0ZVdvcmtlclRocmVhZCApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorICAgIF9fa21wX3lpZWxkKCBUUlVFICk7Cit9IC8vCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBTZXQgdGhyZWFkIHN0YWNrIGluZm8gYWNjb3JkaW5nIHRvIHZhbHVlcyByZXR1cm5lZCBieQorICogcHRocmVhZF9nZXRhdHRyX25wKCkuCisgKiBJZiB2YWx1ZXMgYXJlIHVucmVhc29uYWJsZSwgYXNzdW1lIGNhbGwgZmFpbGVkIGFuZCB1c2UKKyAqIGluY3JlbWVudGFsIHN0YWNrIHJlZmluZW1lbnQgbWV0aG9kIGluc3RlYWQuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIHN0YWNrIHBhcmFtZXRlcnMgY291bGQgYmUgZGV0ZXJtaW5lZCBleGFjdGx5LAorICogRkFMU0UgaWYgaW5jcmVtZW50YWwgcmVmaW5lbWVudCBpcyBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX3NldF9zdGFja19pbmZvKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGggKQoreworICAgIGludCAgICAgICAgICAgIHN0YWNrX2RhdGE7CisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICAvKiBMaW51eCogT1Mgb25seSAtLSBubyBwdGhyZWFkX2dldGF0dHJfbnAgc3VwcG9ydCBvbiBPUyBYKiAqLworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgaW50ICAgICAgICAgICAgc3RhdHVzOworICAgIHNpemVfdCAgICAgICAgIHNpemUgPSAwOworICAgIHZvaWQgKiAgICAgICAgIGFkZHIgPSAwOworCisgICAgLyogQWx3YXlzIGRvIGluY3JlbWVudGFsIHN0YWNrIHJlZmluZW1lbnQgZm9yIHViZXJtYXN0ZXIgdGhyZWFkcyBzaW5jZSB0aGUgaW5pdGlhbAorICAgICAgIHRocmVhZCBzdGFjayByYW5nZSBjYW4gYmUgcmVkdWNlZCBieSBzaWJsaW5nIHRocmVhZCBjcmVhdGlvbiBzbyBwdGhyZWFkX2F0dHJfZ2V0c3RhY2sKKyAgICAgICBtYXkgY2F1c2UgdGhyZWFkIGd0aWQgYWxpYXNpbmcgKi8KKyAgICBpZiAoICEgS01QX1VCRVJfR1RJRChndGlkKSApIHsKKworICAgICAgICAvKiBGZXRjaCB0aGUgcmVhbCB0aHJlYWQgYXR0cmlidXRlcyAqLworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfaW5pdCggJmF0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfaW5pdCIsIHN0YXR1cyApOworI2lmIEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldF9ucCggcHRocmVhZF9zZWxmKCksICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2dldF9ucCIsIHN0YXR1cyApOworI2Vsc2UKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9nZXRhdHRyX25wKCBwdGhyZWFkX3NlbGYoKSwgJmF0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2dldGF0dHJfbnAiLCBzdGF0dXMgKTsKKyNlbmRpZgorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZ2V0c3RhY2soICZhdHRyLCAmYWRkciwgJnNpemUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfZ2V0c3RhY2siLCBzdGF0dXMgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDYwLCAoICJfX2ttcF9zZXRfc3RhY2tfaW5mbzogVCMlZCBwdGhyZWFkX2F0dHJfZ2V0c3RhY2sgcmV0dXJuZWQgc2l6ZTogJWx1LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAibG93IGFkZHI6ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgc2l6ZSwgYWRkciApKTsKKworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZGVzdHJveSggJmF0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfZGVzdHJveSIsIHN0YXR1cyApOworICAgIH0KKworICAgIGlmICggc2l6ZSAhPSAwICYmIGFkZHIgIT0gMCApIHsgICAgIC8qIHdhcyBzdGFjayBwYXJhbWV0ZXIgZGV0ZXJtaW5hdGlvbiBzdWNjZXNzZnVsPyAqLworICAgICAgICAvKiBTdG9yZSB0aGUgY29ycmVjdCBiYXNlIGFuZCBzaXplICovCisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAoKChjaGFyICopYWRkcikgKyBzaXplKSk7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCBzaXplKTsKKyAgICAgICAgVENXXzQodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93LCBGQUxTRSk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCAqLworICAgIC8qIFVzZSBpbmNyZW1lbnRhbCByZWZpbmVtZW50IHN0YXJ0aW5nIGZyb20gaW5pdGlhbCBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgKi8KKyAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgMCk7CisgICAgVENXX1BUUih0aCAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgJnN0YWNrX2RhdGEpOworICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgVFJVRSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZCoKK19fa21wX2xhdW5jaF93b3JrZXIoIHZvaWQgKnRociApCit7CisgICAgaW50IHN0YXR1cywgb2xkX3R5cGUsIG9sZF9zdGF0ZTsKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHNpZ3NldF90ICAgIG5ld19zZXQsIG9sZF9zZXQ7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKyAgICB2b2lkICpleGl0X3ZhbDsKKyNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICAgIHZvaWQgKiB2b2xhdGlsZSBwYWRkaW5nID0gMDsKKyNlbmRpZgorICAgIGludCBndGlkOworCisgICAgZ3RpZCA9ICgoa21wX2luZm9fdCopdGhyKSAtPiB0aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgIF9fa21wX2d0aWQgPSBndGlkOworI2VuZGlmCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgICAvLyBzZXQgX190aHJlYWQgbG9jYWwgaW5kZXggdG8gcG9pbnQgdG8gdGhyZWFkLXNwZWNpZmljIHN0YXRzCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ciA9ICgoa21wX2luZm9fdCopdGhyKS0+dGgudGhfc3RhdHM7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayggZ3RpZCwgRkFMU0UgKTsKKyNlbmRpZgorCisjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWx0eXBlKCBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMsICYgb2xkX3R5cGUgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2VsdHlwZSIsIHN0YXR1cyApOworICAgIC8qIGpvc2ggdG9kbzogaXNuJ3QgUFRIUkVBRF9DQU5DRUxfRU5BQkxFIGRlZmF1bHQgZm9yIG5ld2x5LWNyZWF0ZWQgdGhyZWFkcz8gKi8KKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKCBQVEhSRUFEX0NBTkNFTF9FTkFCTEUsICYgb2xkX3N0YXRlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAvLworICAgIC8vIFNldCB0aGUgRlAgY29udHJvbCByZWdzIHRvIGJlIGEgY29weSBvZgorICAgIC8vIHRoZSBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiB0aHJlYWQncy4KKyAgICAvLworICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCAmX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgIF9fa21wX2xvYWRfbXhjc3IoICZfX2ttcF9pbml0X214Y3NyICk7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWZkZWYgS01QX0JMT0NLX1NJR05BTFMKKyAgICBzdGF0dXMgPSBzaWdmaWxsc2V0KCAmIG5ld19zZXQgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggInNpZ2ZpbGxzZXQiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NpZ21hc2soIFNJR19CTE9DSywgJiBuZXdfc2V0LCAmIG9sZF9zZXQgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2lnbWFzayIsIHN0YXR1cyApOworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisKKyNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICAgIGlmICggX19rbXBfc3Rrb2Zmc2V0ID4gMCAmJiBndGlkID4gMCApIHsKKyAgICAgICAgcGFkZGluZyA9IEtNUF9BTExPQ0EoIGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQgKTsKKyAgICB9CisjZW5kaWYKKworICAgIEtNUF9NQigpOworICAgIF9fa21wX3NldF9zdGFja19pbmZvKCBndGlkLCAoa21wX2luZm9fdCopdGhyICk7CisKKyAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCAoa21wX2luZm9fdCopdGhyICk7CisKKyAgICBleGl0X3ZhbCA9IF9fa21wX2xhdW5jaF90aHJlYWQoIChrbXBfaW5mb190ICopIHRociApOworCisjaWZkZWYgS01QX0JMT0NLX1NJR05BTFMKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NpZ21hc2soIFNJR19TRVRNQVNLLCAmIG9sZF9zZXQsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2lnbWFzayIsIHN0YXR1cyApOworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisKKyAgICByZXR1cm4gZXhpdF92YWw7Cit9CisKKworLyogVGhlIG1vbml0b3IgdGhyZWFkIGNvbnRyb2xzIGFsbCBvZiB0aGUgdGhyZWFkcyBpbiB0aGUgY29tcGxleCAqLworCitzdGF0aWMgdm9pZCoKK19fa21wX2xhdW5jaF9tb25pdG9yKCB2b2lkICp0aHIgKQoreworICAgIGludCAgICAgICAgIHN0YXR1cywgb2xkX3R5cGUsIG9sZF9zdGF0ZTsKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHNpZ3NldF90ICAgIG5ld19zZXQ7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgIGludGVydmFsOworICAgIGludCB5aWVsZF9jb3VudDsKKyAgICBpbnQgeWllbGRfY3ljbGVzID0gMDsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMSBsYXVuY2hlZFxuIiApICk7CisKKyAgICAvKiByZWdpc3RlciB1cyBhcyB0aGUgbW9uaXRvciB0aHJlYWQgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggS01QX0dUSURfTU9OSVRPUiApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgX19rbXBfZ3RpZCA9IEtNUF9HVElEX01PTklUT1I7CisjZW5kaWYKKworICAgIEtNUF9NQigpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfaWdub3JlKCk7ICAgIC8vIEluc3RydWN0IEludGVsKFIpIFRocmVhZGluZyBUb29scyB0byBpZ25vcmUgbW9uaXRvciB0aHJlYWQuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgX19rbXBfc2V0X3N0YWNrX2luZm8oICgoa21wX2luZm9fdCopdGhyKS0+dGgudGhfaW5mby5kcy5kc19ndGlkLCAoa21wX2luZm9fdCopdGhyICk7CisKKyAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCAoa21wX2luZm9fdCopdGhyICk7CisKKyNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHR5cGUoIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUywgJiBvbGRfdHlwZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWx0eXBlIiwgc3RhdHVzICk7CisgICAgLyogam9zaCB0b2RvOiBpc24ndCBQVEhSRUFEX0NBTkNFTF9FTkFCTEUgZGVmYXVsdCBmb3IgbmV3bHktY3JlYXRlZCB0aHJlYWRzPyAqLworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwgJiBvbGRfc3RhdGUgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMgKTsKKyNlbmRpZgorCisgICAgI2lmIEtNUF9SRUFMX1RJTUVfRklYCisgICAgLy8gVGhpcyBpcyBhIHBvdGVudGlhbCBmaXggd2hpY2ggYWxsb3dzIGFwcGxpY2F0aW9uIHdpdGggcmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5IHdvcmsuCisgICAgLy8gSG93ZXZlciwgZGVjaXNpb24gYWJvdXQgdGhlIGZpeCBpcyBub3QgbWFkZSB5ZXQsIHNvIGl0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgeyAvLyBBcmUgcHJvZ3JhbSBzdGFydGVkIHdpdGggcmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5PworICAgICAgICBpbnQgc2NoZWQgPSBzY2hlZF9nZXRzY2hlZHVsZXIoIDAgKTsKKyAgICAgICAgaWYgKCBzY2hlZCA9PSBTQ0hFRF9GSUZPIHx8IHNjaGVkID09IFNDSEVEX1JSICkgeworICAgICAgICAgICAgLy8gWWVzLCB3ZSBhcmUgYSBwYXJ0IG9mIHJlYWwtdGltZSBhcHBsaWNhdGlvbi4gVHJ5IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGUKKyAgICAgICAgICAgIC8vIG1vbml0b3IuCisgICAgICAgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07CisgICAgICAgICAgICBpbnQgICAgbWF4X3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heCggc2NoZWQgKTsKKyAgICAgICAgICAgIGludCAgICByYzsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBSZWFsVGltZVNjaGVkTm90U3VwcG9ydGVkICk7CisgICAgICAgICAgICBzY2hlZF9nZXRwYXJhbSggMCwgJiBwYXJhbSApOworICAgICAgICAgICAgaWYgKCBwYXJhbS5zY2hlZF9wcmlvcml0eSA8IG1heF9wcmlvcml0eSApIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5zY2hlZF9wcmlvcml0eSArPSAxOworICAgICAgICAgICAgICAgIHJjID0gc2NoZWRfc2V0c2NoZWR1bGVyKCAwLCBzY2hlZCwgJiBwYXJhbSApOworICAgICAgICAgICAgICAgIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudENoYW5nZU1vbml0b3JQcmlvcml0eSApLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggTW9uaXRvcldpbGxTdGFydmUgKSwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgYWJvcnQgaGVyZSwgYmVjYXVzZSBudW1iZXIgb2YgQ1BVcyBtYXkgYmUgZW5vdWdoIGZvciBhbGwgdGhlIHRocmVhZHMsCisgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBtb25pdG9yIHRocmVhZCwgc28gYXBwbGljYXRpb24gY291bGQgcG90ZW50aWFsbHkgd29yay4uLgorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFJ1bm5pbmdBdE1heFByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIE1vbml0b3JXaWxsU3RhcnZlICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFJ1bm5pbmdBdE1heFByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgMCApOyAgLy8gQUM6IGZyZWUgdGhyZWFkIHRoYXQgd2FpdHMgZm9yIG1vbml0b3Igc3RhcnRlZAorICAgIH0KKyAgICAjZW5kaWYgLy8gS01QX1JFQUxfVElNRV9GSVgKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3dha2V1cHMgPT0gMSApIHsKKyAgICAgICAgaW50ZXJ2YWwudHZfc2VjICA9IDE7CisgICAgICAgIGludGVydmFsLnR2X25zZWMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludGVydmFsLnR2X3NlYyAgPSAwOworICAgICAgICBpbnRlcnZhbC50dl9uc2VjID0gKEtNUF9OU0VDX1BFUl9TRUMgLyBfX2ttcF9tb25pdG9yX3dha2V1cHMpOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzIgbW9uaXRvclxuIiApICk7CisKKyAgICBpZiAoX19rbXBfeWllbGRfY3ljbGUpIHsKKyAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAwOyAgLyogU3RhcnQgb3V0IHdpdGggeWllbGRpbmcgc2h1dCBvZmYgKi8KKyAgICAgICAgeWllbGRfY291bnQgPSBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOyAgLyogWWllbGRpbmcgaXMgb24gcGVybWFuZW50bHkgKi8KKyAgICB9CisKKyAgICB3aGlsZSggISBUQ1JfNCggX19rbXBfZ2xvYmFsLmcuZ19kb25lICkgKSB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAgbm93OworICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgIHR2YWw7CisKKyAgICAgICAgLyogIFRoaXMgdGhyZWFkIG1vbml0b3JzIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdXBkYXRlXG4iICkgKTsKKworICAgICAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmbm93ICk7CisKKyAgICAgICAgbm93LnR2X3NlYyAgKz0gaW50ZXJ2YWwudHZfc2VjOworICAgICAgICBub3cudHZfbnNlYyArPSBpbnRlcnZhbC50dl9uc2VjOworCisgICAgICAgIGlmIChub3cudHZfbnNlYyA+PSBLTVBfTlNFQ19QRVJfU0VDKSB7CisgICAgICAgICAgICBub3cudHZfc2VjICArPSAxOworICAgICAgICAgICAgbm93LnR2X25zZWMgLT0gS01QX05TRUNfUEVSX1NFQzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jayggJiBfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKyAgICAgICAgLy8gQUM6IHRoZSBtb25pdG9yIHNob3VsZCBub3QgZmFsbCBhc2xlZXAgaWYgZ19kb25lIGhhcyBiZWVuIHNldAorICAgICAgICBpZiAoICFUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeyAgLy8gY2hlY2sgb25jZSBtb3JlIHVuZGVyIG11dGV4CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCAmX19rbXBfd2FpdF9jdi5jX2NvbmQsICZfX2ttcF93YWl0X214Lm1fbXV0ZXgsICZub3cgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gRVRJTUVET1VUICYmIHN0YXR1cyAhPSBFSU5UUiApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfdGltZWR3YWl0Iiwgc3RhdHVzICk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisKKyAgICAgICAgaWYgKF9fa21wX3lpZWxkX2N5Y2xlKSB7CisgICAgICAgICAgICB5aWVsZF9jeWNsZXMrKzsKKyAgICAgICAgICAgIGlmICggKHlpZWxkX2N5Y2xlcyAlIHlpZWxkX2NvdW50KSA9PSAwICkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF95aWVsZGluZ19vbikgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDA7ICAgLyogVHVybiBpdCBvZmYgbm93ICovCisgICAgICAgICAgICAgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb2ZmX2NvdW50OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMTsgICAvKiBUdXJuIGl0IG9uIG5vdyAqLworICAgICAgICAgICAgICAgICAgICB5aWVsZF9jb3VudCA9IF9fa21wX3lpZWxkX29uX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5aWVsZF9jeWNsZXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOworICAgICAgICB9CisKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLAorICAgICAgICAgIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICsgMSApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzMgY2xlYW51cFxuIiApICk7CisKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHN0YXR1cyA9IHNpZ2ZpbGxzZXQoICYgbmV3X3NldCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAic2lnZmlsbHNldCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2lnbWFzayggU0lHX1VOQkxPQ0ssICYgbmV3X3NldCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zaWdtYXNrIiwgc3RhdHVzICk7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzQgZmluaXNoZWRcbiIgKSApOworCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgIT0gMCApIHsKKyAgICAgICAgLyogbm93IHdlIG5lZWQgdG8gdGVybWluYXRlIHRoZSB3b3JrZXIgdGhyZWFkcyAgKi8KKyAgICAgICAgLyogdGhlIHZhbHVlIG9mIHRfYWJvcnQgaXMgdGhlIHNpZ25hbCB3ZSBjYXVnaHQgKi8KKworICAgICAgICBpbnQgZ3RpZDsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM1IHRlcm1pbmF0ZSBzaWc9JWRcbiIsIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSApOworCisgICAgICAgIC8qIHRlcm1pbmF0ZSB0aGUgT3Blbk1QIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIC8qIFRPRE8gdGhpcyBpcyBub3QgdmFsaWQgZm9yIHNpYmxpbmcgdGhyZWFkcyEhCisgICAgICAgICAqIHRoZSB1YmVyIG1hc3RlciBtaWdodCBub3QgYmUgMCBhbnltb3JlLi4gKi8KKyAgICAgICAgZm9yIChndGlkID0gMTsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrZ3RpZCkKKyAgICAgICAgICAgIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGd0aWQgKTsKKworICAgICAgICBfX2ttcF9jbGVhbnVwKCk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjNiByYWlzZSBzaWc9JWRcbiIsIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSApOworCisgICAgICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID4gMCkKKyAgICAgICAgICAgIHJhaXNlKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICk7CisKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM3IGV4aXRcbiIgKSApOworCisgICAgcmV0dXJuIHRocjsKK30KKwordm9pZAorX19rbXBfY3JlYXRlX3dvcmtlciggaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc3RhY2tfc2l6ZSApCit7CisgICAgcHRocmVhZF90ICAgICAgaGFuZGxlOworICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOworICAgIGludCAgICAgICAgICAgIHN0YXR1czsKKworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IGd0aWQ7CisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIC8vIHNldHMgdXAgd29ya2VyIHRocmVhZCBzdGF0cworICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2soJl9fa21wX3N0YXRzX2xvY2ssIGd0aWQpOworCisgICAgLy8gdGgtPnRoLnRoX3N0YXRzIGlzIHVzZWQgdG8gdHJhbnNmZXIgdGhyZWFkIHNwZWNpZmljIHN0YXRzLXBvaW50ZXIgdG8gX19rbXBfbGF1bmNoX3dvcmtlcgorICAgIC8vIFNvIHdoZW4gdGhyZWFkIGlzIGNyZWF0ZWQgKGdvZXMgaW50byBfX2ttcF9sYXVuY2hfd29ya2VyKSBpdCB3aWxsCisgICAgLy8gc2V0IGl0J3MgX190aHJlYWQgbG9jYWwgcG9pbnRlciB0byB0aC0+dGgudGhfc3RhdHMKKyAgICB0aC0+dGgudGhfc3RhdHMgPSBfX2ttcF9zdGF0c19saXN0LnB1c2hfYmFjayhndGlkKTsKKyAgICBpZihLTVBfVUJFUl9HVElEKGd0aWQpKSB7CisgICAgICAgIF9fa21wX3N0YXRzX3N0YXJ0X3RpbWUgPSB0c2NfdGlja19jb3VudDo6bm93KCk7CisgICAgICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHIgPSB0aC0+dGgudGhfc3RhdHM7CisgICAgICAgIF9fa21wX3N0YXRzX2luaXQoKTsKKyAgICAgICAgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKE9NUF9zZXJpYWwpOworICAgICAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3N0YXJ0X2VuZCk7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfdGFzX2xvY2soJl9fa21wX3N0YXRzX2xvY2ssIGd0aWQpOworCisjZW5kaWYgLy8gS01QX1NUQVRTX0VOQUJMRUQKKworICAgIGlmICggS01QX1VCRVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IHViZXIgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworICAgICAgICB0aCAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IHB0aHJlYWRfc2VsZigpOworICAgICAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggZ3RpZCwgdGggKTsKKyAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGggKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfaW5pdCggJnRocmVhZF9hdHRyICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50SW5pdFRocmVhZEF0dHJzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSggJiB0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGF0ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgICAgIC8qIFNldCBzdGFjayBzaXplIGZvciB0aGlzIHRocmVhZCBub3cuIAorICAgICAgICAgICAgICogVGhlIG11bHRpcGxlIG9mIDIgaXMgdGhlcmUgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzLCByZXF1ZXN0aW5nIGFuIHVudXN1YWwgc3RhY2tzaXplCisgICAgICAgICAgICAgKiBjYXVzZXMgdGhlIHRocmVhZCB0byBoYXZlIGFuIG9mZnNldCBiZWZvcmUgdGhlIGR1bW15IGFsbG9jYSgpIHRha2VzIHBsYWNlIHRvIGNyZWF0ZSB0aGUKKyAgICAgICAgICAgICAqIG9mZnNldC4gIFNpbmNlIHdlIHdhbnQgdGhlIHVzZXIgdG8gaGF2ZSBhIHN1ZmZpY2llbnQgc3RhY2tzaXplIEFORCBzdXBwb3J0IGEgc3RhY2sgb2Zmc2V0LCB3ZSAKKyAgICAgICAgICAgICAqIGFsbG9jYSgpIHR3aWNlIHRoZSBvZmZzZXQgc28gdGhhdCB0aGUgdXBjb21pbmcgYWxsb2NhKCkgZG9lcyBub3QgZWxpbWluYXRlIGFueSBwcmVtYWRlCisgICAgICAgICAgICAgKiBvZmZzZXQsIGFuZCBhbHNvIGdpdmVzIHRoZSB1c2VyIHRoZSBzdGFjayBzcGFjZSB0aGV5IHJlcXVlc3RlZCBmb3IgYWxsIHRocmVhZHMgKi8KKyAgICAgICAgICAgIHN0YWNrX3NpemUgKz0gZ3RpZCAqIF9fa21wX3N0a29mZnNldCAqIDI7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX3dvcmtlcjogVCMlZCwgZGVmYXVsdCBzdGFja3NpemUgPSAlbHUgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfc3Rrc2l6ZSA9ICVsdSBieXRlcywgZmluYWwgc3RhY2tzaXplID0gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9ERUZBVUxUX1NUS1NJWkUsIF9fa21wX3N0a3NpemUsIHN0YWNrX3NpemUgKSApOworCisjIGlmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmIHRocmVhZF9hdHRyLCBzdGFja19zaXplICk7CisjICBpZmRlZiBLTVBfQkFDS1VQX1NUS1NJWkUKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhIF9fa21wX2Vudl9zdGtzaXplICkgeworICAgICAgICAgICAgICAgICAgICBzdGFja19zaXplID0gS01QX0JBQ0tVUF9TVEtTSVpFICsgZ3RpZCAqIF9fa21wX3N0a29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3Rrc2l6ZSA9IEtNUF9CQUNLVVBfU1RLU0laRTsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IFQjJWQsIGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9zdGtzaXplID0gJWx1IGJ5dGVzLCAoYmFja3VwKSBmaW5hbCBzdGFja3NpemUgPSAlbHUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9ERUZBVUxUX1NUS1NJWkUsIF9fa21wX3N0a3NpemUsIHN0YWNrX3NpemUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJnRocmVhZF9hdHRyLCBzdGFja19zaXplICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIH07IC8vIGlmCisjICBlbmRpZiAvKiBLTVBfQkFDS1VQX1NUS1NJWkUgKi8KKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIENoYW5nZVdvcmtlclN0YWNrU2l6ZSAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisjIGVuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCAmIGhhbmRsZSwgJiB0aHJlYWRfYXR0ciwgX19rbXBfbGF1bmNoX3dvcmtlciwgKHZvaWQgKikgdGggKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgfHwgISBoYW5kbGUgKSB7IC8vID8/PyBXaHkgZG8gd2UgY2hlY2sgaGFuZGxlPz8KKyNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUlOVkFMICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0V29ya2VyU3RhY2tTaXplLCBzdGFja19zaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIEluY3JlYXNlV29ya2VyU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVOT01FTSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFdvcmtlclN0YWNrU2l6ZSwgc3RhY2tfc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBEZWNyZWFzZVdvcmtlclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUFHQUlOICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBOb1Jlc291cmNlc0ZvcldvcmtlclRocmVhZCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBEZWNyZWFzZV9OVU1fVEhSRUFEUyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY3JlYXRlIiwgc3RhdHVzICk7CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisgICAgICAgIH0KKworI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZGVzdHJveSggJiB0aHJlYWRfYXR0ciApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudERlc3Ryb3lUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfVEhSRUFEX0FUVFIgKi8KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IGRvbmUgY3JlYXRpbmcgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworCit9IC8vIF9fa21wX2NyZWF0ZV93b3JrZXIKKworCit2b2lkCitfX2ttcF9jcmVhdGVfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIHB0aHJlYWRfdCAgICAgICAgICAgaGFuZGxlOworICAgIHB0aHJlYWRfYXR0cl90ICAgICAgdGhyZWFkX2F0dHI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGludCAgICAgICAgICAgICAgICAgYXV0b19hZGpfc2l6ZSA9IEZBTFNFOworCisgICAgaWYoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAvLyBXZSBkb24ndCBuZWVkIG1vbml0b3IgdGhyZWFkIGluIGNhc2Ugb2YgTUFYX0JMT0NLVElNRQorICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHNraXBwaW5nIG1vbml0b3IgdGhyZWFkIGJlY2F1c2Ugb2YgTUFYIGJsb2NrdGltZVxuIiApICk7CisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSAwOyAvLyB0aGlzIG1ha2VzIHJlYXBfbW9uaXRvciBuby1vcAorICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHRyeSB0byBjcmVhdGUgbW9uaXRvclxuIiApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSBLTVBfR1RJRF9NT05JVE9SOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworICAgICNpZiBLTVBfUkVBTF9USU1FX0ZJWAorICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIC0xICk7IC8vIFdpbGwgdXNlIGl0IGZvciBzeW5jaHJvbml6YXRpb24gYSBiaXQgbGF0ZXIuCisgICAgI2Vsc2UKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwICk7CisgICAgI2VuZGlmIC8vIEtNUF9SRUFMX1RJTUVfRklYCisKKyAgICAjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkU7CisgICAgICAgICAgICBhdXRvX2Fkal9zaXplID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfaW5pdCggJnRocmVhZF9hdHRyICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRJbml0VGhyZWFkQXR0cnMgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCAmIHRocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YXRlICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRzdGFja3NpemUoICYgdGhyZWFkX2F0dHIsICYgc2l6ZSApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfZ2V0c3RhY2tzaXplIiwgc3RhdHVzICk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgICAgICAjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworICAgICNlbmRpZiAvKiBLTVBfVEhSRUFEX0FUVFIgKi8KKworICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplID09IDAgKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPCBfX2ttcF9zeXNfbWluX3N0a3NpemUgKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywiCisgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0ZWQgc3RhY2tzaXplID0gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICBzaXplLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSApOworCisgICAgcmV0cnk6CisKKyAgICAvKiBTZXQgc3RhY2sgc2l6ZSBmb3IgdGhpcyB0aHJlYWQgbm93LiAqLworCisgICAgI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfbW9uaXRvcjogc2V0dGluZyBzdGFja3NpemUgPSAlbHUgYnl0ZXMsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICYgdGhyZWFkX2F0dHIsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgaWYgKCBhdXRvX2Fkal9zaXplICkgeworICAgICAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSAqPSAyOworICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsICAvLyBzaG91bGQgdGhpcyBiZSBmYXRhbD8gIEJCCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGFja1NpemUsIChsb25nIGludCkgX19rbXBfbW9uaXRvcl9zdGtzaXplICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggQ2hhbmdlTW9uaXRvclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSggJmhhbmRsZSwgJiB0aHJlYWRfYXR0ciwgX19rbXBfbGF1bmNoX21vbml0b3IsICh2b2lkICopIHRoICk7CisKKyAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUlOVkFMICkgeworICAgICAgICAgICAgICAgIGlmICggYXV0b19hZGpfc2l6ZSAgJiYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPCAoc2l6ZV90KTB4NDAwMDAwMDAgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICo9IDI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBJbmNyZWFzZU1vbml0b3JTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVOT01FTSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGFja1NpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRGVjcmVhc2VNb25pdG9yU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgICAgIGlmICggc3RhdHVzID09IEVBR0FJTiApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggTm9SZXNvdXJjZXNGb3JNb25pdG9yVGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggRGVjcmVhc2VOdW1iZXJPZlRocmVhZHNJblVzZSApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY3JlYXRlIiwgc3RhdHVzICk7CisgICAgfTsgLy8gaWYKKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKworICAgICNpZiBLTVBfUkVBTF9USU1FX0ZJWAorICAgICAgICAvLyBXYWl0IGZvciB0aGUgbW9uaXRvciB0aHJlYWQgaXMgcmVhbGx5IHN0YXJ0ZWQgYW5kIHNldCBpdHMgKnByaW9yaXR5Ki4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfdWludDMyICkgPT0gc2l6ZW9mKCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICk7CisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNCgKKyAgICAgICAgICAgIChrbXBfdWludDMyIHZvbGF0aWxlICopICYgX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIC0xLCAmIF9fa21wX25lcV80LCBOVUxMCisgICAgICAgICk7CisgICAgI2VuZGlmIC8vIEtNUF9SRUFMX1RJTUVfRklYCisKKyAgICAjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCAmIHRocmVhZF9hdHRyICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coICAgIC8vCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudERlc3Ryb3lUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBtb25pdG9yIGNyZWF0ZWQgJSMuOGx4XG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCit9IC8vIF9fa21wX2NyZWF0ZV9tb25pdG9yCisKK3ZvaWQKK19fa21wX2V4aXRfdGhyZWFkKAorICAgIGludCBleGl0X3N0YXR1cworKSB7CisgICAgcHRocmVhZF9leGl0KCAodm9pZCAqKShpbnRwdHJfdCkgZXhpdF9zdGF0dXMgKTsKK30gLy8gX19rbXBfZXhpdF90aHJlYWQKKwordm9pZCBfX2ttcF9yZXN1bWVfbW9uaXRvcigpOworCit2b2lkCitfX2ttcF9yZWFwX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgICAgICAgICAgc3RhdHVzOworICAgIHZvaWQgICAgICAgICpleGl0X3ZhbDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IHRyeSB0byByZWFwIG1vbml0b3IgdGhyZWFkIHdpdGggaGFuZGxlICUjLjhseFxuIiwKKyAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCisgICAgLy8gSWYgbW9uaXRvciBoYXMgYmVlbiBjcmVhdGVkLCBpdHMgdGlkIGFuZCBndGlkIHNob3VsZCBiZSBLTVBfR1RJRF9NT05JVE9SLgorICAgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSAwLCBpdCBtZWFucyB0aGUgbW9uaXRvciBkaWQgbm90IGV2ZXIgc3RhcnQuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIEtNUF9HVElEX0RORSwgdGhlIG1vbml0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9PSB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICk7CisgICAgaWYgKCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICE9IEtNUF9HVElEX01PTklUT1IgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IG1vbml0b3IgZGlkIG5vdCBzdGFydCwgcmV0dXJuaW5nXG4iKSApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisKKyAgICAvKiBGaXJzdCwgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIG1vbml0b3IgdGhyZWFkIGV4aXN0cy4gIFRoaXMgY291bGQgcHJldmVudCBhIGhhbmcsCisgICAgICAgYnV0IGlmIHRoZSBtb25pdG9yIGRpZXMgYWZ0ZXIgdGhlIHB0aHJlYWRfa2lsbCBjYWxsIGFuZCBiZWZvcmUgdGhlIHB0aHJlYWRfam9pbgorICAgICAgIGNhbGwsIGl0IHdpbGwgc3RpbGwgaGFuZy4gKi8KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfa2lsbCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAwICk7CisgICAgaWYgKHN0YXR1cyA9PSBFU1JDSCkgeworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IG1vbml0b3IgZG9lcyBub3QgZXhpc3QsIHJldHVybmluZ1xuIikgKTsKKworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgX19rbXBfcmVzdW1lX21vbml0b3IoKTsgICAvLyBXYWtlIHVwIHRoZSBtb25pdG9yIHRocmVhZAorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2pvaW4oIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgJiBleGl0X3ZhbCk7CisgICAgICAgIGlmIChleGl0X3ZhbCAhPSB0aCkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBSZWFwTW9uaXRvckVycm9yICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gS01QX0dUSURfRE5FOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiBkb25lIHJlYXBpbmcgbW9uaXRvciB0aHJlYWQgd2l0aCBoYW5kbGUgJSMuOGx4XG4iLAorICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworfQorCit2b2lkCitfX2ttcF9yZWFwX3dvcmtlcigga21wX2luZm9fdCAqdGggKQoreworICAgIGludCAgICAgICAgICBzdGF0dXM7CisgICAgdm9pZCAgICAgICAgKmV4aXRfdmFsOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IHRyeSB0byByZWFwIFQjJWRcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgLyogRmlyc3QsIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSB3b3JrZXIgdGhyZWFkIGV4aXN0cy4gIFRoaXMgY291bGQgcHJldmVudCBhIGhhbmcsCisgICAgICAgYnV0IGlmIHRoZSB3b3JrZXIgZGllcyBhZnRlciB0aGUgcHRocmVhZF9raWxsIGNhbGwgYW5kIGJlZm9yZSB0aGUgcHRocmVhZF9qb2luCisgICAgICAgY2FsbCwgaXQgd2lsbCBzdGlsbCBoYW5nLiAqLworCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfa2lsbCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAwICk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVTUkNIKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiB3b3JrZXIgVCMlZCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiB0cnkgdG8gam9pbiB3aXRoIHdvcmtlciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9qb2luKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsICYgZXhpdF92YWwpOworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgIC8qIERvbid0IGV4cG9zZSB0aGVzZSB0byB0aGUgdXNlciB1bnRpbCB3ZSB1bmRlcnN0YW5kIHdoZW4gdGhleSB0cmlnZ2VyICovCisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggUmVhcFdvcmtlckVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIGV4aXRfdmFsICE9IHRoICkgeworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfd29ya2VyOiB3b3JrZXIgVCMlZCBkaWQgbm90IHJlYXAgcHJvcGVybHksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGl0X3ZhbCA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgZXhpdF92YWwgKSApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiBkb25lIHJlYXBpbmcgVCMlZFxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKKworc3RhdGljIHZvaWQKK19fa21wX251bGxfaGFuZGxlciggaW50IHNpZ25vICkKK3sKKyAgICAvLyAgRG8gbm90aGluZywgZm9yIGRvaW5nIFNJR19JR04tdHlwZSBhY3Rpb25zLgorfSAvLyBfX2ttcF9udWxsX2hhbmRsZXIKKworCitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9PSAwICkgeworICAgICAgICAvKiBTdGFnZSAxIHNpZ25hbCBoYW5kbGVyLCBsZXQncyBzaHV0IGRvd24gYWxsIG9mIHRoZSB0aHJlYWRzICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIl9fa21wX3RlYW1faGFuZGxlcjogY2F1Z2h0IHNpZ25hbCA9ICVkXG4iLCBzaWdubyApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgc3dpdGNoICggc2lnbm8gKSB7CisgICAgICAgICAgICBjYXNlIFNJR0hVUCAgOgorICAgICAgICAgICAgY2FzZSBTSUdJTlQgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHUVVJVCA6CisgICAgICAgICAgICBjYXNlIFNJR0lMTCAgOgorICAgICAgICAgICAgY2FzZSBTSUdBQlJUIDoKKyAgICAgICAgICAgIGNhc2UgU0lHRlBFICA6CisgICAgICAgICAgICBjYXNlIFNJR0JVUyAgOgorICAgICAgICAgICAgY2FzZSBTSUdTRUdWIDoKKyAgICAgICAgICAgICNpZmRlZiBTSUdTWVMKKyAgICAgICAgICAgICAgICBjYXNlIFNJR1NZUyA6CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgU0lHVEVSTSA6CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCwgc2lnbm8gKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUgKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIl9fa21wX3RlYW1faGFuZGxlcjogdW5rbm93biBzaWduYWwgdHlwZSIgKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfdGVhbV9oYW5kbGVyCisKKworc3RhdGljCit2b2lkIF9fa21wX3NpZ2FjdGlvbiggaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqIGFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqIG9sZGFjdCApIHsKKyAgICBpbnQgcmMgPSBzaWdhY3Rpb24oIHNpZ251bSwgYWN0LCBvbGRhY3QgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggInNpZ2FjdGlvbiIsIHJjICk7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIGludCBzaWcsIHNpZ19mdW5jX3QgaGFuZGxlcl9mdW5jLCBpbnQgcGFyYWxsZWxfaW5pdCApCit7CisgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoICVkLCAuLi4sICVkIClcbiIsIHNpZywgcGFyYWxsZWxfaW5pdCApICk7CisgICAgaWYgKCBwYXJhbGxlbF9pbml0ICkgeworICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIG5ld19hY3Rpb247CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkX2FjdGlvbjsKKyAgICAgICAgbmV3X2FjdGlvbi5zYV9oYW5kbGVyID0gaGFuZGxlcl9mdW5jOworICAgICAgICBuZXdfYWN0aW9uLnNhX2ZsYWdzICAgPSAwOworICAgICAgICBzaWdmaWxsc2V0KCAmIG5ld19hY3Rpb24uc2FfbWFzayApOworICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBuZXdfYWN0aW9uLCAmIG9sZF9hY3Rpb24gKTsKKyAgICAgICAgaWYgKCBvbGRfYWN0aW9uLnNhX2hhbmRsZXIgPT0gX19rbXBfc2lnaGxkcnNbIHNpZyBdLnNhX2hhbmRsZXIgKSB7CisgICAgICAgICAgICBzaWdhZGRzZXQoICYgX19rbXBfc2lnc2V0LCBzaWcgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUva2VlcCB1c2VyJ3MgaGFuZGxlciBpZiBvbmUgcHJldmlvdXNseSBpbnN0YWxsZWQuCisgICAgICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBvbGRfYWN0aW9uLCBOVUxMICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2F2ZSBpbml0aWFsL3N5c3RlbSBzaWduYWwgaGFuZGxlcnMgdG8gc2VlIGlmIHVzZXIgaGFuZGxlcnMgaW5zdGFsbGVkLgorICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgTlVMTCwgJiBfX2ttcF9zaWdobGRyc1sgc2lnIF0gKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCit9IC8vIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIKKworCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBpbnQgc2lnICkKK3sKKyAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggJWQgKVxuIiwgc2lnICkgKTsKKyAgICBpZiAoIHNpZ2lzbWVtYmVyKCAmIF9fa21wX3NpZ3NldCwgc2lnICkgKSB7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBfX2ttcF9zaWdobGRyc1sgc2lnIF0sICYgb2xkICk7CisgICAgICAgIGlmICggKCBvbGQuc2FfaGFuZGxlciAhPSBfX2ttcF90ZWFtX2hhbmRsZXIgKSAmJiAoIG9sZC5zYV9oYW5kbGVyICE9IF9fa21wX251bGxfaGFuZGxlciApICkgeworICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgdXNlcnMgc2lnbmFsIGhhbmRsZXIuCisgICAgICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogb29wcywgbm90IG91ciBoYW5kbGVyLCByZXN0b3Jpbmc6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIG9sZCwgTlVMTCApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzaWdkZWxzZXQoICYgX19rbXBfc2lnc2V0LCBzaWcgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIKKworCit2b2lkCitfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIGludCBwYXJhbGxlbF9pbml0ICkKK3sKKyAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX2luc3RhbGxfc2lnbmFscyggJWQgKVxuIiwgcGFyYWxsZWxfaW5pdCApICk7CisgICAgaWYgKCBfX2ttcF9oYW5kbGVfc2lnbmFscyB8fCAhIHBhcmFsbGVsX2luaXQgKSB7CisgICAgICAgIC8vIElmICEgcGFyYWxsZWxfaW5pdCwgd2UgZG8gbm90IGluc3RhbGwgaGFuZGxlcnMsIGp1c3Qgc2F2ZSBvcmlnaW5hbCBoYW5kbGVycy4KKyAgICAgICAgLy8gTGV0IHVzIGRvIGl0IGV2ZW4gX19oYW5kbGVfc2lnbmFscyBpcyAwLgorICAgICAgICBzaWdlbXB0eXNldCggJiBfX2ttcF9zaWdzZXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSFVQLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lOVCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdRVUlULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSUxMLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdGUEUsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHQlVTLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NFR1YsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjaWZkZWYgU0lHU1lTCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdTWVMsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2VuZGlmIC8vIFNJR1NZUworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdURVJNLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2lmZGVmIFNJR1BJUEUKKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1BJUEUsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjZW5kaWYgLy8gU0lHUElQRQorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX2luc3RhbGxfc2lnbmFscworCisKK3ZvaWQKK19fa21wX3JlbW92ZV9zaWduYWxzKCB2b2lkICkKK3sKKyAgICBpbnQgICAgc2lnOworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVtb3ZlX3NpZ25hbHMoKVxuIiApICk7CisgICAgZm9yICggc2lnID0gMTsgc2lnIDwgTlNJRzsgKysgc2lnICkgeworICAgICAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIHNpZyApOworICAgIH07IC8vIGZvciBzaWcKK30gLy8gX19rbXBfcmVtb3ZlX3NpZ25hbHMKKworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2VuYWJsZSggaW50IG5ld19zdGF0ZSApCit7CisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBpbnQgc3RhdHVzLCBvbGRfc3RhdGU7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIG5ld19zdGF0ZSwgJiBvbGRfc3RhdGUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9sZF9zdGF0ZSA9PSBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2Rpc2FibGUoIGludCAqIG9sZF9zdGF0ZSApCit7CisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKCBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFLCBvbGRfc3RhdGUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisgICAgI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdGZvcmtfcHJlcGFyZSAodm9pZCkKK3sKKyAgICAvKiAgbm90aGluZyB0byBkbyAgKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX2F0Zm9ya19wYXJlbnQgKHZvaWQpCit7CisgICAgLyogIG5vdGhpbmcgdG8gZG8gICovCit9CisKKy8qCisgICAgUmVzZXQgdGhlIGxpYnJhcnkgc28gZXhlY3V0aW9uIGluIHRoZSBjaGlsZCBzdGFydHMgImFsbCBvdmVyIGFnYWluIiB3aXRoCisgICAgY2xlYW4gZGF0YSBzdHJ1Y3R1cmVzIGluIGluaXRpYWwgc3RhdGVzLiAgRG9uJ3Qgd29ycnkgYWJvdXQgZnJlZWluZyBtZW1vcnkKKyAgICBhbGxvY2F0ZWQgYnkgcGFyZW50LCBqdXN0IGFiYW5kb24gaXQgdG8gYmUgc2FmZS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfYXRmb3JrX2NoaWxkICh2b2lkKQoreworICAgIC8qIFRPRE8gbWFrZSBzdXJlIHRoaXMgaXMgZG9uZSByaWdodCBmb3IgbmVzdGVkL3NpYmxpbmcgKi8KKyAgICAvLyBBVFQ6ICBNZW1vcnkgbGVha3MgYXJlIGhlcmU/IFRPRE86IENoZWNrIGl0IGFuZCBmaXguCisgICAgLyogS01QX0FTU0VSVCggMCApOyAqLworCisgICAgKytfX2ttcF9mb3JrX2NvdW50OworCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7CisgICAgX19rbXBfaW5pdF9tb25pdG9yID0gMDsKKyAgICBfX2ttcF9pbml0X3BhcmFsbGVsID0gRkFMU0U7CisgICAgX19rbXBfaW5pdF9taWRkbGUgPSBGQUxTRTsKKyAgICBfX2ttcF9pbml0X3NlcmlhbCA9IEZBTFNFOworICAgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgRkFMU0UpOworICAgIF9fa21wX2luaXRfY29tbW9uID0gRkFMU0U7CisKKyAgICBUQ1dfNChfX2ttcF9pbml0X3VzZXJfbG9ja3MsIEZBTFNFKTsKKyNpZiAhIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgPSAxOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSAwOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IE5VTEw7CisgICAgX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworI2VuZGlmCisKKyAgICBfX2ttcF9hbGxfbnRoID0gMDsKKyAgICBUQ1dfNChfX2ttcF9udGgsIDApOworCisgICAgLyogTXVzdCBhY3R1YWxseSB6ZXJvIGFsbCB0aGUgKmNhY2hlIGFyZ3VtZW50cyBwYXNzZWQgdG8gX19rbXBjX3RocmVhZHByaXZhdGUgaGVyZQorICAgICAgIHNvIHRocmVhZHByaXZhdGUgZG9lc24ndCB1c2Ugc3RhbGUgZGF0YSAqLworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfYXRmb3JrX2NoaWxkOiBjaGVja2luZyBjYWNoZSBhZGRyZXNzIGxpc3QgJXBcbiIsCisgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCApICk7CisKKyAgICB3aGlsZSAoIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAhPSBOVUxMICkgeworCisgICAgICAgIGlmICggKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBhZGRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggNTAsICggIl9fa21wX2F0Zm9ya19jaGlsZDogemVyb2luZyBjYWNoZSBhdCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgJigqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIpICkgKTsKKworICAgICAgICAgICAgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBhZGRyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgLT4gbmV4dDsKKyAgICB9CisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKKworICAgIC8qIHJlc2V0IHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgbG9ja3MgKi8KKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9zdGRpb19sb2NrICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworCisgICAgLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIG5vIHN0YWxlIGRhdGEgaXMgbGVmdCBhcm91bmQgKi8KKyAgICAvKiBBQzogY3VzdG9tZXJzIGNvbXBsYWluIHRoYXQgd2UgdXNlIHVuc2FmZSByb3V0aW5lcyBpbiB0aGUgYXRmb3JrCisgICAgICAgaGFuZGxlci4gTWF0aHdvcmtzOiBkbHN5bSgpIGlzIHVuc2FmZS4gV2UgY2FsbCBkbHN5bSBhbmQgZGxvcGVuCisgICAgICAgaW4gZHluYW1pY19saW5rIHdoZW4gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHNoYXJlZCB0YmJtYWxsb2MgbGlicmFyeS4KKyAgICAgICBTdWdnZXN0aW9uIGlzIHRvIG1ha2UgdGhlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gbGF6aWVyLCBzaW1pbGFyCisgICAgICAgdG8gd2hhdCBkb25lIGZvciBfX2ttcGNfYmVnaW4oKS4gKi8KKyAgICAvLyBUT0RPOiBzeW5jaHJvbml6ZSBhbGwgc3RhdGljIGluaXRpYWxpemF0aW9ucyB3aXRoIHJlZ3VsYXIgbGlicmFyeQorICAgIC8vICAgICAgIHN0YXJ0dXA7IGxvb2sgYXQga21wX2dsb2JhbC5jIGFuZCBldGMuCisgICAgLy9fX2ttcF9pbnRlcm5hbF9iZWdpbiAoKTsKKworfQorCit2b2lkCitfX2ttcF9yZWdpc3Rlcl9hdGZvcmsodm9pZCkgeworICAgIGlmICggX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmsgKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX2F0Zm9yayggX19rbXBfYXRmb3JrX3ByZXBhcmUsIF9fa21wX2F0Zm9ya19wYXJlbnQsIF9fa21wX2F0Zm9ya19jaGlsZCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXRmb3JrIiwgc3RhdHVzICk7CisgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrID0gRkFMU0U7CisgICAgfQorfQorCit2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCggJl9fa21wX3N1c3BlbmRfbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZGF0dHJfaW5pdCggJl9fa21wX3N1c3BlbmRfY29uZF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRhdHRyX2luaXQiLCBzdGF0dXMgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpZiAoIHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPD0gX19rbXBfZm9ya19jb3VudCApIHsKKyAgICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBpbnQgICAgIHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsICZfX2ttcF9zdXNwZW5kX2NvbmRfYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9pbml0Iiwgc3RhdHVzICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXgsICYgX19rbXBfc3VzcGVuZF9tdXRleF9hdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9pbml0Iiwgc3RhdHVzICk7CisgICAgICAgICoodm9sYXRpbGUgaW50KikmdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA9IF9fa21wX2ZvcmtfY291bnQgKyAxOworICAgIH07Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPiBfX2ttcF9mb3JrX2NvdW50KSB7CisgICAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZSBpbml0aWFsaXplIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHN0YXR1cyApOworICAgICAgICB9OworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICAgICAgfTsKKyAgICAgICAgLS10aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50OworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPT0gX19rbXBfZm9ya19jb3VudCk7CisgICAgfQorfQorCisvKiBUaGlzIHJvdXRpbmUgcHV0cyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gc2xlZXAgYWZ0ZXIgc2V0dGluZyB0aGUKKyAqIHNsZWVwIGJpdCBmb3IgdGhlIGluZGljYXRlZCBmbGFnIHZhcmlhYmxlIHRvIHRydWUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoIGludCB0aF9ndGlkLCBDICpmbGFnICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soVVNFUl9zdXNwZW5kKTsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbdGhfZ3RpZF07CisgICAgaW50IHN0YXR1czsKKyAgICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW47CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBlbnRlciBmb3IgZmxhZyA9ICVwXG4iLCB0aF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCB0aCApOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc2V0dGluZyBzbGVlcCBiaXQgZm9yIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKyAgICAvKiBUT0RPOiBzaG91bGRuJ3QgdGhpcyB1c2UgcmVsZWFzZSBzZW1hbnRpY3MgdG8gZW5zdXJlIHRoYXQgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZAorICAgICAgIGdldHMgY2FsbGVkIGZpcnN0PworICAgICovCisgICAgb2xkX3NwaW4gPSBmbGFnLT5zZXRfc2xlZXBpbmcoKTsKKworICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApPT0leCwgd2FzICV4XG4iLAorICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpLCAqKGZsYWctPmdldCgpKSwgb2xkX3NwaW4gKSApOworCisgICAgaWYgKCBmbGFnLT5kb25lX2NoZWNrX3ZhbChvbGRfc3BpbikgKSB7CisgICAgICAgIG9sZF9zcGluID0gZmxhZy0+dW5zZXRfc2xlZXBpbmcoKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZmFsc2UgYWxhcm0sIHJlc2V0IHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICAgKiAid2l0aCBsb3cgcHJvYmFiaWxpdHkiIHJldHVybiB3aGVuIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHNpZ25hbGVkIG9yIGJyb2FkY2FzdAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGRlYWN0aXZhdGVkID0gRkFMU0U7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgKHZvaWQgKilmbGFnKTsKKyAgICAgICAgd2hpbGUgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgICAgICBfX2ttcF9zdXNwZW5kX2NvdW50Kys7CisgICAgICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogc3VzcGVuZGluZyBUIyVkOiAlc1xuIiwgdGhfZ3RpZCwgYnVmZmVyICk7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBubyBsb25nZXIgYWN0aXZlIChvbmx5IGluIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3ApLgorICAgICAgICAgICAgaWYgKCAhIGRlYWN0aXZhdGVkICkgeworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVkID0gVFJVRTsKKworCisgICAgICAgICAgICB9CisKKyNpZiBVU0VfU1VTUEVORF9USU1FT1VUCisgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgIG5vdzsKKyAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICAgdHZhbDsKKyAgICAgICAgICAgIGludCBtc2VjczsKKworICAgICAgICAgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmdHZhbCwgTlVMTCApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmbm93ICk7CisKKyAgICAgICAgICAgIG1zZWNzID0gKDQqX19rbXBfZGZsdF9ibG9ja3RpbWUpICsgMjAwOworICAgICAgICAgICAgbm93LnR2X3NlYyAgKz0gbXNlY3MgLyAxMDAwOworICAgICAgICAgICAgbm93LnR2X25zZWMgKz0gKG1zZWNzICUgMTAwMCkqMTAwMDsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHBlcmZvcm0gcHRocmVhZF9jb25kX3RpbWVkd2FpdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4LCAmIG5vdyApOworI2Vsc2UKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxNSwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBhYm91dCB0byBwZXJmb3JtIHB0aHJlYWRfY29uZF93YWl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQgKSApOworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKCAoc3RhdHVzICE9IDApICYmIChzdGF0dXMgIT0gRUlOVFIpICYmIChzdGF0dXMgIT0gRVRJTUVET1VUKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF93YWl0Iiwgc3RhdHVzICk7CisgICAgICAgICAgICB9CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAgIGlmICggZmxhZy0+aXNfc2xlZXBpbmcoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwMCwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCB0aW1lb3V0IHdha2V1cFxuIiwgdGhfZ3RpZCApICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDIsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgdGltZW91dCB3YWtldXAsIHNsZWVwIGJpdCBub3Qgc2V0IVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICggZmxhZy0+aXNfc2xlZXBpbmcoKSApIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNwdXJpb3VzIHdha2V1cFxuIiwgdGhfZ3RpZCApICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSAvLyB3aGlsZQorCisgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBhY3RpdmUgYWdhaW4gKGlmIGl0IHdhcyBwcmV2aW91cyBtYXJrZWQgYXMgaW5hY3RpdmUpCisgICAgICAgIGlmICggZGVhY3RpdmF0ZWQgKSB7CisgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIGlmICggVENSXzQodGgtPnRoLnRoX2luX3Bvb2wpICkgeworICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgREVCVUdfU1VTUEVORAorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICAgICAgX19rbXBfcHJpbnRfY29uZCggYnVmZmVyLCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YpOworICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGhhcyBhd2FrZW5lZDogJXNcbiIsIHRoX2d0aWQsIGJ1ZmZlciApOworICAgIH0KKyNlbmRpZgorCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBleGl0XG4iLCB0aF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9zdXNwZW5kXzMyKGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3N1c3BlbmRfNjQoaW50IHRoX2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF9vbmNvcmUoaW50IHRoX2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9CisKKworLyogVGhpcyByb3V0aW5lIHNpZ25hbHMgdGhlIHRocmVhZCBzcGVjaWZpZWQgYnkgdGFyZ2V0X2d0aWQgdG8gd2FrZSB1cAorICogYWZ0ZXIgc2V0dGluZyB0aGUgc2xlZXAgYml0IGluZGljYXRlZCBieSB0aGUgZmxhZyBhcmd1bWVudCB0byBGQUxTRS4KKyAqIFRoZSB0YXJnZXQgdGhyZWFkIG11c3QgYWxyZWFkeSBoYXZlIGNhbGxlZCBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKCkKKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVzdW1lX3RlbXBsYXRlKCBpbnQgdGFyZ2V0X2d0aWQsIEMgKmZsYWcgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhVU0VSX3Jlc3VtZSk7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RhcmdldF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgIT0gdGFyZ2V0X2d0aWQgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKworICAgIGlmICghZmxhZykgeyAvLyBjb21pbmcgZnJvbSBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyCisgICAgICAgIGZsYWcgPSAoQyAqKXRoLT50aC50aF9zbGVlcF9sb2M7CisgICAgfQorCisgICAgLy8gRmlyc3QsIGNoZWNrIGlmIHRoZSBmbGFnIGlzIG51bGwgb3IgaXRzIHR5cGUgaGFzIGNoYW5nZWQuIElmIHNvLCBzb21lb25lIGVsc2Ugd29rZSBpdCB1cC4KKyAgICBpZiAoIWZsYWcgfHwgZmxhZy0+Z2V0X3R5cGUoKSAhPSBmbGFnLT5nZXRfcHRyX3R5cGUoKSkgeyAvLyBnZXRfcHRyX3R5cGUgc2ltcGx5IHNob3dzIHdoYXQgZmxhZyB3YXMgY2FzdCB0bworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2U6IGZsYWcoJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgTlVMTCApICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSB7IC8vIGlmIG11bHRpcGxlIHRocmVhZHMgYXJlIHNsZWVwaW5nLCBmbGFnIHNob3VsZCBiZSBpbnRlcm5hbGx5IHJlZmVycmluZyB0byBhIHNwZWNpZmljIHRocmVhZCBoZXJlCisgICAgICAgIHR5cGVuYW1lIEM6OmZsYWdfdCBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgICAgIGlmICggISBmbGFnLT5pc19zbGVlcGluZ192YWwob2xkX3NwaW4pICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlOiBmbGFnKCVwKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpLCBvbGRfc3BpbiwgKmZsYWctPmdldCgpICkgKTsKKworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBhYm91dCB0byB3YWtldXAgVCMlZCwgcmVzZXQgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKTogIgorICAgICAgICAgICAgICAgICAgICAgICAiJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBmbGFnLT5nZXQoKSwgb2xkX3NwaW4sICpmbGFnLT5nZXQoKSApICk7CisgICAgfQorICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgTlVMTCk7CisKKworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgIF9fa21wX3ByaW50X2NvbmQoIGJ1ZmZlciwgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCByZXN1bWluZyBUIyVkOiAlc1xuIiwgZ3RpZCwgdGFyZ2V0X2d0aWQsIGJ1ZmZlciApOworICAgIH0KKyNlbmRpZgorCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfc2lnbmFsIiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcgYWZ0ZXIgc2lnbmFsaW5nIHdha2UgdXAgZm9yIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9yZXN1bWVfMzIoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV82NChpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lX29uY29yZShpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9CisKK3ZvaWQKK19fa21wX3Jlc3VtZV9tb25pdG9yKCkKK3sKKyAgICBpbnQgc3RhdHVzOworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBndGlkID0gVENSXzQoX19rbXBfaW5pdF9ndGlkKSA/IF9fa21wX2dldF9ndGlkKCkgOiAtMTsKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV9tb25pdG9yOiBUIyVkIHdhbnRzIHRvIHdha2V1cCBUIyVkIGVudGVyXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBLTVBfR1RJRF9NT05JVE9SICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkICE9IEtNUF9HVElEX01PTklUT1IgKTsKKyNlbmRpZgorICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jayggJl9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9sb2NrIiwgc3RhdHVzICk7CisjaWZkZWYgREVCVUdfU1VTUEVORAorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICAgICAgX19rbXBfcHJpbnRfY29uZCggYnVmZmVyLCAmX19rbXBfd2FpdF9jdi5jX2NvbmQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfcmVzdW1lX21vbml0b3I6IFQjJWQgcmVzdW1pbmcgVCMlZDogJXNcbiIsIGd0aWQsIEtNUF9HVElEX01PTklUT1IsIGJ1ZmZlciApOworICAgIH0KKyNlbmRpZgorICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoICZfX2ttcF93YWl0X2N2LmNfY29uZCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kX3NpZ25hbCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX21vbml0b3I6IFQjJWQgZXhpdGluZyBhZnRlciBzaWduYWxpbmcgd2FrZSB1cCBmb3IgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgS01QX0dUSURfTU9OSVRPUiApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3lpZWxkKCBpbnQgY29uZCApCit7CisgICAgaWYgKGNvbmQgJiYgX19rbXBfeWllbGRpbmdfb24pIHsKKyAgICAgICAgc2NoZWRfeWllbGQoKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBpbnQgZ3RpZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9pbml0X3J1bnRpbWUgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NldHNwZWNpZmljKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCAodm9pZCopKGludHB0cl90KShndGlkKzEpICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldHNwZWNpZmljIiwgc3RhdHVzICk7Cit9CisKK2ludAorX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKQoreworICAgIGludCBndGlkOworICAgIGlmICggIV9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2dldF9zcGVjaWZpYzogcnVudGltZSBzaHV0ZG93biwgcmV0dXJuaW5nIEtNUF9HVElEX1NIVVRET1dOXG4iICkgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9HVElEX1NIVVRET1dOOworICAgIH0KKyAgICBndGlkID0gKGludCkoc2l6ZV90KXB0aHJlYWRfZ2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIGd0aWQgKSk7CisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2RvdWJsZQorX19rbXBfcmVhZF9jcHVfdGltZSggdm9pZCApCit7CisgICAgLypjbG9ja190ICAgdDsqLworICAgIHN0cnVjdCB0bXMgIGJ1ZmZlcjsKKworICAgIC8qdCA9Ki8gIHRpbWVzKCAmIGJ1ZmZlciApOworCisgICAgcmV0dXJuIChidWZmZXIudG1zX3V0aW1lICsgYnVmZmVyLnRtc19jdXRpbWUpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUM7Cit9CisKK2ludAorX19rbXBfcmVhZF9zeXN0ZW1faW5mbyggc3RydWN0IGttcF9zeXNfaW5mbyAqaW5mbyApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdHJ1Y3QgcnVzYWdlIHJfdXNhZ2U7CisKKyAgICBtZW1zZXQoIGluZm8sIDAsIHNpemVvZiggKmluZm8gKSApOworCisgICAgc3RhdHVzID0gZ2V0cnVzYWdlKCBSVVNBR0VfU0VMRiwgJnJfdXNhZ2UpOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0cnVzYWdlIiwgc3RhdHVzICk7CisKKyAgICBpbmZvLT5tYXhyc3MgID0gcl91c2FnZS5ydV9tYXhyc3M7ICAvKiB0aGUgbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSB1dGlsaXplZCAoaW4ga2lsb2J5dGVzKSAgICAgKi8KKyAgICBpbmZvLT5taW5mbHQgID0gcl91c2FnZS5ydV9taW5mbHQ7ICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHdpdGhvdXQgYW55IEkvTyAgICAgICAgKi8KKyAgICBpbmZvLT5tYWpmbHQgID0gcl91c2FnZS5ydV9tYWpmbHQ7ICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBpbmZvLT5uc3dhcCAgID0gcl91c2FnZS5ydV9uc3dhcDsgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkgKi8KKyAgICBpbmZvLT5pbmJsb2NrID0gcl91c2FnZS5ydV9pbmJsb2NrOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBpbnB1dCAgKi8KKyAgICBpbmZvLT5vdWJsb2NrID0gcl91c2FnZS5ydV9vdWJsb2NrOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBpbmZvLT5udmNzdyAgID0gcl91c2FnZS5ydV9udmNzdzsgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIHZvbHVudGFyaWx5ICAgICAgKi8KKyAgICBpbmZvLT5uaXZjc3cgID0gcl91c2FnZS5ydV9uaXZjc3c7ICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIGZvcmNlZCAgICAgICAgICAgKi8KKworICAgIHJldHVybiAoc3RhdHVzICE9IDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCBkb3VibGUgKmRlbHRhICkKK3sKKyAgICBkb3VibGUgICAgICAgICAgICAgIHRfbnM7CisgICAgc3RydWN0IHRpbWV2YWwgICAgICB0dmFsOworICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgc3RvcDsKKyAgICBpbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmdHZhbCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZzdG9wICk7CisgICAgdF9ucyA9IFRTMk5TKHN0b3ApIC0gVFMyTlMoX19rbXBfc3lzX3RpbWVyX2RhdGEuc3RhcnQpOworICAgICpkZWx0YSA9ICh0X25zICogMWUtOSk7Cit9CisKK3ZvaWQKK19fa21wX2NsZWFyX3N5c3RlbV90aW1lKCB2b2lkICkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0dmFsOworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmdHZhbCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZfX2ttcF9zeXNfdGltZXJfZGF0YS5zdGFydCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQlVJTERfVFYKKwordm9pZAorX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKmdsb2JhbF9hZGRyLCB2b2lkICp0aHJlYWRfYWRkciApCit7CisgICAgc3RydWN0IHR2X2RhdGEgKnA7CisKKyAgICBwID0gKHN0cnVjdCB0dl9kYXRhICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoICpwICkgKTsKKworICAgIHAtPnUudHAuZ2xvYmFsX2FkZHIgPSBnbG9iYWxfYWRkcjsKKyAgICBwLT51LnRwLnRocmVhZF9hZGRyID0gdGhyZWFkX2FkZHI7CisKKyAgICBwLT50eXBlID0gKHZvaWQgKikgMTsKKworICAgIHAtPm5leHQgPSAgdGgtPnRoLnRoX2xvY2FsLnR2X2RhdGE7CisgICAgdGgtPnRoLnRoX2xvY2FsLnR2X2RhdGEgPSBwOworCisgICAgaWYgKCBwLT5uZXh0ID09IDAgKSB7CisgICAgICAgIGludCByYyA9IHB0aHJlYWRfc2V0c3BlY2lmaWMoIF9fa21wX3R2X2tleSwgcCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0c3BlY2lmaWMiLCByYyApOworICAgIH0KK30KKworI2VuZGlmIC8qIEJVSUxEX1RWICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQKK19fa21wX2dldF94cHJvYyggdm9pZCApIHsKKworICAgIGludCByID0gMDsKKworICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorCisgICAgICAgIHIgPSBzeXNjb25mKCBfU0NfTlBST0NFU1NPUlNfT05MTiApOworCisgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgIC8vIEJ1ZyBDNzcwMTEgSGlnaCAiT3Blbk1QIFRocmVhZHMgYW5kIG51bWJlciBvZiBhY3RpdmUgY29yZXMiLgorCisgICAgICAgIC8vIEZpbmQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgQ1BVcy4KKyAgICAgICAga2Vybl9yZXR1cm5fdCAgICAgICAgICByYzsKKyAgICAgICAgaG9zdF9iYXNpY19pbmZvX2RhdGFfdCBpbmZvOworICAgICAgICBtYWNoX21zZ190eXBlX251bWJlcl90IG51bSA9IEhPU1RfQkFTSUNfSU5GT19DT1VOVDsKKyAgICAgICAgcmMgPSBob3N0X2luZm8oIG1hY2hfaG9zdF9zZWxmKCksIEhPU1RfQkFTSUNfSU5GTywgKGhvc3RfaW5mb190KSAmIGluZm8sICYgbnVtICk7CisgICAgICAgIGlmICggcmMgPT0gMCAmJiBudW0gPT0gSE9TVF9CQVNJQ19JTkZPX0NPVU5UICkgeworICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBLQV9UUkFDRSgpIGhlcmUgYmVjYXVzZSB0aGlzIGNvZGUgd29ya3MgYmVmb3JlIHRyYWNlIHN1cHBvcnQgaXMKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemVkLgorICAgICAgICAgICAgciA9IGluZm8uYXZhaWxfY3B1czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50R2V0TnVtQXZhaWxDUFUgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIEFzc3VtZWROdW1DUFUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICNlbHNlCisKKyAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLiIKKworICAgICNlbmRpZgorCisgICAgcmV0dXJuIHIgPiAwID8gciA6IDI7IC8qIGd1ZXNzIHZhbHVlIG9mIDIgaWYgT1MgdG9sZCB1cyAwICovCisKK30gLy8gX19rbXBfZ2V0X3hwcm9jCisKK2ludAorX19rbXBfcmVhZF9mcm9tX2ZpbGUoIGNoYXIgY29uc3QgKnBhdGgsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICkKK3sKKyAgICBpbnQgcmVzdWx0OworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgRklMRSAqZiA9IGZvcGVuKHBhdGgsICJyYiIpOworICAgIGlmICggZiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmVzdWx0ID0gdmZzY2FuZihmLCBmb3JtYXQsIGFyZ3MpOworICAgIGZjbG9zZShmKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK19fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4X2F0dHI7CisgICAgcHRocmVhZF9jb25kYXR0cl90ICBjb25kX2F0dHI7CisKKyAgICBpZiAoIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAjaWYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uaW5pdGlhbGl6ZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCggJl9fa21wX2NwdWluZm8gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgX19rbXBfeHByb2MgPSBfX2ttcF9nZXRfeHByb2MoKTsKKworICAgIGlmICggc3lzY29uZiggX1NDX1RIUkVBRFMgKSApIHsKKworICAgICAgICAvKiBRdWVyeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IHN5c2NvbmYoIF9TQ19USFJFQURfVEhSRUFEU19NQVggKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zeXNfbWF4X250aCA9PSAtMSApIHsKKyAgICAgICAgICAgIC8qIFVubGltaXRlZCB0aHJlYWRzIGZvciBOUFRMICovCisgICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IElOVF9NQVg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX3N5c19tYXhfbnRoIDw9IDEgKSB7CisgICAgICAgICAgICAvKiBDYW4ndCB0ZWxsLCBqdXN0IHVzZSBQVEhSRUFEX1RIUkVBRFNfTUFYICovCisgICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IEtNUF9NQVhfTlRIOworICAgICAgICB9CisKKyAgICAgICAgLyogUXVlcnkgdGhlIG1pbmltdW0gc3RhY2sgc2l6ZSAqLworICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBzeXNjb25mKCBfU0NfVEhSRUFEX1NUQUNLX01JTiApOworICAgICAgICBpZiAoIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA8PSAxICkgeworICAgICAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplID0gS01QX01JTl9TVEtTSVpFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHVwIG1pbmltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gc3dpdGNoIHRvIFRMUyBndGlkICovCisgICAgX19rbXBfdGxzX2d0aWRfbWluID0gS01QX1RMU19HVElEX01JTjsKKworICAgICNpZmRlZiBCVUlMRF9UVgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmMgPSBwdGhyZWFkX2tleV9jcmVhdGUoICYgX19rbXBfdHZfa2V5LCAwICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfa2V5X2NyZWF0ZSIsIHJjICk7CisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2NyZWF0ZSggJl9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIF9fa21wX2ludGVybmFsX2VuZF9kZXN0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCAmIG11dGV4X2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoICYgX19rbXBfd2FpdF9teC5tX211dGV4LCAmIG11dGV4X2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZGF0dHJfaW5pdCggJiBjb25kX2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCAmIF9fa21wX3dhaXRfY3YuY19jb25kLCAmIGNvbmRfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kX2luaXQiLCBzdGF0dXMgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2luaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBUUlVFOworfQorCit2b2lkCitfX2ttcF9ydW50aW1lX2Rlc3Ryb3koIHZvaWQgKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBpZiAoICEgX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uCisgICAgfTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfZGVzdHJveSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2RlbGV0ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfZGVsZXRlIiwgc3RhdHVzICk7CisgICAgI2lmZGVmIEJVSUxEX1RWCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2RlbGV0ZSggX19rbXBfdHZfa2V5ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfZGVsZXRlIiwgc3RhdHVzICk7CisgICAgI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICYgX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9tdXRleF9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgfQorICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmIF9fa21wX3dhaXRfY3YuY19jb25kICk7CisgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jb25kX2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKCk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK30KKworCisvKiBQdXQgdGhlIHRocmVhZCB0byBzbGVlcCBmb3IgYSB0aW1lIHBlcmlvZCAqLworLyogTk9URTogbm90IGN1cnJlbnRseSB1c2VkIGFueXdoZXJlICovCit2b2lkCitfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKQoreworICAgIHNsZWVwKCAgKCBtaWxsaXMgKyA1MDAgKSAvIDEwMDAgKTsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGltZSBmb3IgdGhlIHVzZXIgKi8KK3ZvaWQKK19fa21wX2VsYXBzZWQoIGRvdWJsZSAqdCApCit7CisgICAgaW50IHN0YXR1czsKKyMgaWZkZWYgRklYX1NHSV9DTE9DSworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICAgIHN0YXR1cyA9IGNsb2NrX2dldHRpbWUoIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJnRzICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJjbG9ja19nZXR0aW1lIiwgc3RhdHVzICk7CisgICAgKnQgPSAoZG91YmxlKSB0cy50dl9uc2VjICogKDEuMCAvIChkb3VibGUpIEtNUF9OU0VDX1BFUl9TRUMpICsKKyAgICAgICAgKGRvdWJsZSkgdHMudHZfc2VjOworIyBlbHNlCisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKyAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICYgdHYsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgICp0ID0gKGRvdWJsZSkgdHYudHZfdXNlYyAqICgxLjAgLyAoZG91YmxlKSBLTVBfVVNFQ19QRVJfU0VDKSArCisgICAgICAgIChkb3VibGUpIHR2LnR2X3NlYzsKKyMgZW5kaWYKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGljayBmb3IgdGhlIHVzZXIgKi8KK3ZvaWQKK19fa21wX2VsYXBzZWRfdGljayggZG91YmxlICp0ICkKK3sKKyAgICAqdCA9IDEgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQzsKK30KKworLyoKKyAgICBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBtYXBwZWQgaW50byB0aGUgY3VycmVudCBhZGRyZXNzIHNwYWNlLgorKi8KKworaW50CitfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqIGFkZHIgKSB7CisKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByYzsKKworICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QKKworICAgICAgICAvKgorICAgICAgICAgICAgT24gTGludXgqIE9TLCByZWFkIHRoZSAvcHJvYy88cGlkPi9tYXBzIHBzZXVkby1maWxlIHRvIGdldCBhbGwgdGhlIGFkZHJlc3MgcmFuZ2VzIG1hcHBlZAorICAgICAgICAgICAgaW50byB0aGUgYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgKi8KKworICAgICAgICBjaGFyICogbmFtZSA9IF9fa21wX3N0cl9mb3JtYXQoICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkgKTsKKyAgICAgICAgRklMRSAqIGZpbGUgID0gTlVMTDsKKworICAgICAgICBmaWxlID0gZm9wZW4oIG5hbWUsICJyIiApOworICAgICAgICBLTVBfQVNTRVJUKCBmaWxlICE9IE5VTEwgKTsKKworICAgICAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgICAgIHZvaWQgKiBiZWdpbm5pbmcgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqIGVuZGluZyAgICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyICAgcGVybXNbIDUgXTsKKworICAgICAgICAgICAgcmMgPSBmc2NhbmYoIGZpbGUsICIlcC0lcCAlNHMgJSpbXlxuXVxuIiwgJiBiZWdpbm5pbmcsICYgZW5kaW5nLCBwZXJtcyApOworICAgICAgICAgICAgaWYgKCByYyA9PSBFT0YgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgPT0gMyAmJiBLTVBfU1RSTEVOKCBwZXJtcyApID09IDQgKTsgLy8gTWFrZSBzdXJlIGFsbCBmaWVsZHMgYXJlIHJlYWQuCisKKyAgICAgICAgICAgIC8vIEVuZGluZyBhZGRyZXNzIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVnaW9uLCBidXQgYmVnaW5uaW5nIGlzLgorICAgICAgICAgICAgaWYgKCAoIGFkZHIgPj0gYmVnaW5uaW5nICkgJiYgKCBhZGRyIDwgZW5kaW5nICkgKSB7CisgICAgICAgICAgICAgICAgcGVybXNbIDIgXSA9IDA7ICAgIC8vIDN0aCBhbmQgNHRoIGNoYXJhY3RlciBkb2VzIG5vdCBtYXR0ZXIuCisgICAgICAgICAgICAgICAgaWYgKCBzdHJjbXAoIHBlcm1zLCAicnciICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5IHdlIGFyZSBsb29raW5nIGZvciBzaG91bGQgYmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlLgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgfTsgLy8gZm9yZXZlcgorCisgICAgICAgIC8vIEZyZWUgcmVzb3VyY2VzLgorICAgICAgICBmY2xvc2UoIGZpbGUgKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG5hbWUgKTsKKworICAgICNlbGlmIEtNUF9PU19EQVJXSU4KKworICAgICAgICAvKgorICAgICAgICAgICAgT24gT1MgWCosIC9wcm9jIHBzZXVkbyBmaWxlc3lzdGVtIGlzIG5vdCBhdmFpbGFibGUuIFRyeSB0byByZWFkIG1lbW9yeSB1c2luZyB2bQorICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgICAgICAqLworCisgICAgICAgIGludCAgICAgICBidWZmZXI7CisgICAgICAgIHZtX3NpemVfdCBjb3VudDsKKyAgICAgICAgcmMgPQorICAgICAgICAgICAgdm1fcmVhZF9vdmVyd3JpdGUoCisgICAgICAgICAgICAgICAgbWFjaF90YXNrX3NlbGYoKSwgICAgICAgICAgIC8vIFRhc2sgdG8gcmVhZCBtZW1vcnkgb2YuCisgICAgICAgICAgICAgICAgKHZtX2FkZHJlc3NfdCkoIGFkZHIgKSwgICAgIC8vIEFkZHJlc3MgdG8gcmVhZCBmcm9tLgorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAgICAgICAgICAgICAgICAodm1fYWRkcmVzc190KSggJiBidWZmZXIgKSwgLy8gQWRkcmVzcyBvZiBidWZmZXIgdG8gc2F2ZSByZWFkIGJ5dGVzIGluLgorICAgICAgICAgICAgICAgICYgY291bnQgICAgICAgICAgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIHZhciB0byBzYXZlIG51bWJlciBvZiByZWFkIGJ5dGVzIGluLgorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgLy8gTWVtb3J5IHN1Y2Nlc3NmdWxseSByZWFkLgorICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2VsaWYgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorCisgICAgICAgIC8vIEZJWE1FKEZyZWVCU0QsIE5ldEJTRCk6IEltcGxlbWVudCB0aGlzCisgICAgICAgIGZvdW5kID0gMTsKKworICAgICNlbHNlCisKKyAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorCisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gZm91bmQ7CisKK30gLy8gX19rbXBfaXNfYWRkcmVzc19tYXBwZWQKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworCisjIGlmIEtNUF9PU19EQVJXSU4KKworLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJvdW5kZWQgdmFsdWUgb2YgdGhlIHN5c3RlbSBsb2FkIGF2ZXJhZ2UKKy8vIGR1cmluZyBnaXZlbiB0aW1lIGludGVydmFsIHdoaWNoIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mCisvLyBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgdmFyaWFibGUgKGRlZmF1bHQgaXMgNjAgc2VjLCBvdGhlciB2YWx1ZXMKKy8vIG1heSBiZSAzMDAgc2VjIG9yIDkwMCBzZWMpLgorLy8gSXQgcmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yLgoraW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkKK3sKKyAgICBkb3VibGUgYXZlcmFnZXNbM107CisgICAgaW50IHJldF9hdmcgPSAwOworCisgICAgaW50IHJlcyA9IGdldGxvYWRhdmcoIGF2ZXJhZ2VzLCAzICk7CisKKyAgICAvL0NoZWNrIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgYXZlcmFnZXMgdG8gdXNlLgorICAgIC8vIGdldGxvYWRhdmcoKSBtYXkgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBsZXNzIHRoYW4gcmVxdWVzdGVkIHRoYXQgaXMKKyAgICAvLyBsZXNzIHRoYW4gMy4KKyAgICBpZiAoIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA8IDE4MCAmJiAoIHJlcyA+PSAxICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1swXTsvLyAxIG1pbgorICAgIH0gZWxzZSBpZiAoICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDE4MAorICAgICAgICAgICAgICAgICAgJiYgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIDwgNjAwICkgJiYgKCByZXMgPj0gMiApICkgeworICAgICAgICByZXRfYXZnID0gYXZlcmFnZXNbMV07Ly8gNSBtaW4KKyAgICB9IGVsc2UgaWYgKCAoIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA+PSA2MDAgKSAmJiAoIHJlcyA9PSAzICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1syXTsvLyAxNSBtaW4KKyAgICB9IGVsc2Ugey8vIEVycm9yIG9jY3VycmVkCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0X2F2ZzsKK30KKworIyBlbHNlIC8vIExpbnV4KiBPUworCisvLyBUaGUgZnVjdGlvbiByZXR1cm5zIG51bWJlciBvZiBydW5uaW5nIChub3Qgc2xlZXBpbmcpIHRocmVhZHMsIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisvLyBFcnJvciBjb3VsZCBiZSByZXBvcnRlZCBpZiBMaW51eCogT1Mga2VybmVsIHRvbyBvbGQgKHdpdGhvdXQgIi9wcm9jIiBzdXBwb3J0KS4KKy8vIENvdW50aW5nIHJ1bm5pbmcgdGhyZWFkcyBzdG9wcyBpZiBtYXggcnVubmluZyB0aHJlYWRzIGVuY291bnRlcmVkLgoraW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkKK3sKKyAgICBzdGF0aWMgaW50IHBlcm1hbmVudF9lcnJvciA9IDA7CisKKyAgICBzdGF0aWMgaW50ICAgICBnbGJfcnVubmluZ190aHJlYWRzICAgICAgICAgID0gMDsgIC8qIFNhdmVkIGNvdW50IG9mIHRoZSBydW5uaW5nIHRocmVhZHMgZm9yIHRoZSB0aHJlYWQgYmFsYW5jZSBhbGdvcnRpaG0gKi8KKyAgICBzdGF0aWMgZG91YmxlICBnbGJfY2FsbF90aW1lID0gMDsgIC8qIFRocmVhZCBiYWxhbmNlIGFsZ29yaXRobSBjYWxsIHRpbWUgKi8KKworICAgIGludCBydW5uaW5nX3RocmVhZHMgPSAwOyAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLgorCisgICAgRElSICAqICAgICAgICAgIHByb2NfZGlyICAgPSBOVUxMOyAgICAvLyBIYW5kbGUgb2YgIi9wcm9jLyIgZGlyZWN0b3J5LgorICAgIHN0cnVjdCBkaXJlbnQgKiBwcm9jX2VudHJ5ID0gTlVMTDsKKworICAgIGttcF9zdHJfYnVmX3QgICB0YXNrX3BhdGg7ICAgICAgICAgICAgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vIiBwYXRoLgorICAgIERJUiAgKiAgICAgICAgICB0YXNrX2RpciAgID0gTlVMTDsgICAgLy8gSGFuZGxlIG9mICIvcHJvYy88cGlkPi90YXNrLzx0aWQ+LyIgZGlyZWN0b3J5LgorICAgIHN0cnVjdCBkaXJlbnQgKiB0YXNrX2VudHJ5ID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgdGFza19wYXRoX2ZpeGVkX2xlbjsKKworICAgIGttcF9zdHJfYnVmX3QgICBzdGF0X3BhdGg7ICAgICAgICAgICAgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vc3RhdCIgcGF0aC4KKyAgICBpbnQgICAgICAgICAgICAgc3RhdF9maWxlID0gLTE7CisgICAgaW50ICAgICAgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW47CisKKyAgICBpbnQgdG90YWxfcHJvY2Vzc2VzID0gMDsgICAgICAgICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiBwcm9jZXNzZXMgaW4gc3lzdGVtLgorICAgIGludCB0b3RhbF90aHJlYWRzICAgPSAwOyAgICAgICAgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHRocmVhZHMgaW4gc3lzdGVtLgorCisgICAgZG91YmxlIGNhbGxfdGltZSA9IDAuMDsKKworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiB0YXNrX3BhdGggKTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgc3RhdF9wYXRoICk7CisKKyAgICAgX19rbXBfZWxhcHNlZCggJiBjYWxsX3RpbWUgKTsKKworICAgIGlmICggZ2xiX2NhbGxfdGltZSAmJgorICAgICAgICAgICAgKCBjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICkgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIGdsYl9jYWxsX3RpbWUgPSBjYWxsX3RpbWU7CisKKyAgICAvLyBEbyBub3Qgc3BlbmQgdGltZSBvbiBzY2FubmluZyAiL3Byb2MvIiBpZiB3ZSBoYXZlIGEgcGVybWFuZW50IGVycm9yLgorICAgIGlmICggcGVybWFuZW50X2Vycm9yICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggbWF4IDw9IDAgKSB7CisgICAgICAgIG1heCA9IElOVF9NQVg7CisgICAgfTsgLy8gaWYKKworICAgIC8vIE9wZW4gIi9wcm9jLyIgZGlyZWN0b3J5LgorICAgIHByb2NfZGlyID0gb3BlbmRpciggIi9wcm9jIiApOworICAgIGlmICggcHJvY19kaXIgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gQ2Fubm90IG9wZW4gIi9wcnJvYy8iLiBQcm9iYWJseSB0aGUga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgaXQuIFJldHVybiBhbiBlcnJvciBub3cgYW5kCisgICAgICAgIC8vIGluIHN1YnNlcXVlbnQgY2FsbHMuCisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBwZXJtYW5lbnRfZXJyb3IgPSAxOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gSW5pdGlhbGl6ZSBmaXhlZCBwYXJ0IG9mIHRhc2tfcGF0aC4gVGhpcyBwYXJ0IHdpbGwgbm90IGNoYW5nZS4KKyAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsICIvcHJvYy8iLCA2ICk7CisgICAgdGFza19wYXRoX2ZpeGVkX2xlbiA9IHRhc2tfcGF0aC51c2VkOyAgICAvLyBSZW1lbWJlciBudW1iZXIgb2YgdXNlZCBjaGFyYWN0ZXJzLgorCisgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgd2hpbGUgKCBwcm9jX2VudHJ5ICE9IE5VTEwgKSB7CisgICAgICAgIC8vIFByb2MgZW50cnkgaXMgYSBkaXJlY3RvcnkgYW5kIG5hbWUgc3RhcnRzIHdpdGggYSBkaWdpdC4gQXNzdW1lIGl0IGlzIGEgcHJvY2VzcycKKyAgICAgICAgLy8gZGlyZWN0b3J5LgorICAgICAgICBpZiAoIHByb2NfZW50cnktPmRfdHlwZSA9PSBEVF9ESVIgJiYgaXNkaWdpdCggcHJvY19lbnRyeS0+ZF9uYW1lWyAwIF0gKSApIHsKKworICAgICAgICAgICAgKysgdG90YWxfcHJvY2Vzc2VzOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGluaXQgcHJvY2VzcyBpcyB0aGUgdmVyeSBmaXJzdCBpbiAiL3Byb2MiLCBzbyB3ZSBjYW4gcmVwbGFjZQorICAgICAgICAgICAgLy8gc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgd2l0aCBzaW1wbGVyIHRvdGFsX3Byb2Nlc3NlcyA9PSAxLgorICAgICAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHRoYXQgdG90YWxfcHJvY2Vzc2VzID09IDEgPT4gZF9uYW1lID09ICIxIiBpcyB0cnVlICh3aGVyZQorICAgICAgICAgICAgLy8gIj0+IiBpcyBpbXBsaWNhdGlvbikuIFNpbmNlIEMrKyBkb2VzIG5vdCBoYXZlID0+IG9wZXJhdG9yLCBsZXQgdXMgcmVwbGFjZSBpdCB3aXRoIGl0cworICAgICAgICAgICAgLy8gZXF1aXZhbGVudDogYSA9PiBiID09ICEgYSB8fCBiLgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWxfcHJvY2Vzc2VzICE9IDEgfHwgc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgKTsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRhc2tfcGF0aC4KKyAgICAgICAgICAgIHRhc2tfcGF0aC51c2VkID0gdGFza19wYXRoX2ZpeGVkX2xlbjsgICAgLy8gUmVzZXQgdGFza19wYXRoIHRvICIvcHJvYy8iLgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgdGFza19wYXRoLCBwcm9jX2VudHJ5LT5kX25hbWUsIEtNUF9TVFJMRU4oIHByb2NfZW50cnktPmRfbmFtZSApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsICIvdGFzayIsIDUgKTsKKworICAgICAgICAgICAgdGFza19kaXIgPSBvcGVuZGlyKCB0YXNrX3BhdGguc3RyICk7CisgICAgICAgICAgICBpZiAoIHRhc2tfZGlyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBjYW4gZmluaXNoIGJldHdlZW4gcmVhZGluZyAiL3Byb2MvIiBkaXJlY3RvcnkgZW50cnkgYW5kIG9wZW5pbmcgcHJvY2VzcycKKyAgICAgICAgICAgICAgICAvLyAidGFzay8iIGRpcmVjdG9yeS4gU28sIGluIGdlbmVyYWwgY2FzZSB3ZSBzaG91bGQgbm90IGNvbXBsYWluLCBidXQgaGF2ZSB0byBza2lwCisgICAgICAgICAgICAgICAgLy8gdGhpcyBwcm9jZXNzIGFuZCByZWFkIHRoZSBuZXh0IG9uZS4KKyAgICAgICAgICAgICAgICAvLyBCdXQgb24gc3lzdGVtcyB3aXRoIG5vICJ0YXNrLyIgc3VwcG9ydCB3ZSB3aWxsIHNwZW5kIGxvdCBvZiB0aW1lIHRvIHNjYW4gIi9wcm9jLyIKKyAgICAgICAgICAgICAgICAvLyB0cmVlIGFnYWluIGFuZCBhZ2FpbiB3aXRob3V0IGFueSBiZW5lZml0LiAiaW5pdCIgcHJvY2VzcyAoaXRzIHBpZCBpcyAxKSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyBleGlzdCBhbHdheXMsIHNvLCBpZiB3ZSBjYW5ub3Qgb3BlbiAiL3Byb2MvMS90YXNrLyIgZGlyZWN0b3J5LCBpdCBtZWFucyAidGFzay8iCisgICAgICAgICAgICAgICAgLy8gaXMgbm90IHN1cHBvcnRlZCBieSBrZXJuZWwuIFJlcG9ydCBhbiBlcnJvciBub3cgYW5kIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICAgICAgaWYgKCBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIHBlcm1hbmVudF9lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgZml4ZWQgcGFydCBvZiBzdGF0IGZpbGUgcGF0aC4KKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmIHN0YXRfcGF0aCApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgdGFza19wYXRoLnN0ciwgdGFza19wYXRoLnVzZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBzdGF0X3BhdGgsICIvIiwgMSApOworICAgICAgICAgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW4gPSBzdGF0X3BhdGgudXNlZDsKKworICAgICAgICAgICAgICAgIHRhc2tfZW50cnkgPSByZWFkZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIHdoaWxlICggdGFza19lbnRyeSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBhIGRpcmVjdG9yeSBhbmQgbmFtZSBzdGFydHMgd2l0aCBhIGRpZ2l0LgorICAgICAgICAgICAgICAgICAgICBpZiAoIHByb2NfZW50cnktPmRfdHlwZSA9PSBEVF9ESVIgJiYgaXNkaWdpdCggdGFza19lbnRyeS0+ZF9uYW1lWyAwIF0gKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgKysgdG90YWxfdGhyZWFkczsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3J1Y3QgY29tcGxldGUgc3RhdCBmaWxlIHBhdGguIEVhc2llc3Qgd2F5IHdvdWxkIGJlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIF9fa21wX3N0cl9idWZfcHJpbnQoICYgc3RhdF9wYXRoLCAiJXMvJXMvc3RhdCIsIHRhc2tfcGF0aC5zdHIsIHRhc2tfZW50cnktPmRfbmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHNlcmlhZSBvZiBfX2ttcF9zdHJfYnVmX2NhdCB3b3JrcyBhIGJpdCBmYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X3BhdGgudXNlZCA9IHN0YXRfcGF0aF9maXhlZF9sZW47ICAgIC8vIFJlc2V0IHN0YXQgcGF0aCB0byBpdHMgZml4ZWQgcGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgdGFza19lbnRyeS0+ZF9uYW1lLCBLTVBfU1RSTEVOKCB0YXNrX2VudHJ5LT5kX25hbWUgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCAiL3N0YXQiLCA1ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IExvdy1sZXZlbCBBUEkgKG9wZW4vcmVhZC9jbG9zZSkgaXMgdXNlZC4gSGlnaC1sZXZlbCBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3Blbi9mY2xvc2UpICB3b3JrcyB+IDMwICUgc2xvd2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF9maWxlID0gb3Blbiggc3RhdF9wYXRoLnN0ciwgT19SRE9OTFkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdF9maWxlID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCByZXBvcnQgYW4gZXJyb3IgYmVjYXVzZSB0YXNrICh0aHJlYWQpIGNhbiB0ZXJtaW5hdGUganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFkaW5nIHRoaXMgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCBvZiAic3RhdCIgZmlsZSBsb29rcyBsaWtlOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDI4NSAocHJvZ3JhbSkgUyAuLi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpbmdsZSBsaW5lIChpZiBwcm9ncmFtIG5hbWUgZG9lcyBub3QgaW5jbHVkZSBmYW5ueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKS4gRmlyc3QgbnVtYmVyIGlzIGEgdGhyZWFkIGlkLCB0aGVuIG5hbWUgb2YgZXhlY3V0YWJsZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gcGFyZXRoZXNlcywgdGhlbiBzdGF0ZSBvZiB0aGUgdGhyZWFkLiBXZSBuZWVkIGp1c3QgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2QgbmV3czogTGVuZ3RoIG9mIHByb2dyYW0gbmFtZSBpcyAxNSBjaGFyYWN0ZXJzIG1heC4gTG9uZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGh1cywgd2UgbmVlZCByYXRoZXIgc2hvcnQgYnVmZmVyOiAxNSBjaGFycyBmb3IgcHJvZ3JhbSBuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBwYXJlbnRoZXNpcywgKyAzIHNwYWNlcyArIH43IGRpZ2l0cyBvZiBwaWQgPSAzNy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWQgbmV3czogUHJvZ3JhbSBuYW1lIG1heSBjb250YWluIHNwZWNpYWwgc3ltYm9scyBsaWtlIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nIHBhcmVudGhlc2lzLCBvciBldmVuIG5ldyBsaW5lLiBUaGlzIG1ha2VzIHBhcnNpbmcgInN0YXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbm90IDEwMCAlIHJlbGlhYmxlLiBJbiBjYXNlIG9mIGZhbm55IHByb2dyYW0gbmFtZXMgcGFyc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZmFpbCAocmVwb3J0IGluY29ycmVjdCB0aHJlYWQgc3RhdGUpLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmcgInN0YXR1cyIgZmlsZSBsb29rcyBtb3JlIHByb21pc3NpbmcgKGR1ZSB0byBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzdHJ1Y3R1cmUgYW5kIGVzY2FwaW5nIHNwZWNpYWwgc3ltYm9scykgYnV0IHJlYWRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgb2YgInN0YXR1cyIgZmlsZSB3b3JrcyBzbG93ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWyA2NSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVhZCggc3RhdF9maWxlLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgLSAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyWyBsZW4gXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIHNjYW5mOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3NjYW5mKCBidWZmZXIsICIlKmQgKCUqcykgJWMgIiwgJiBzdGF0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyB2ZXJ5IG5pY2UsIGJ1dCBzZWFyY2hpbmcgZm9yIGEgY2xvc2luZyBwYXJlbnRoZXNpcyB3b3JrcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCBmYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBjbG9zZV9wYXJlbnQgPSBzdHJzdHIoIGJ1ZmZlciwgIikgIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNsb3NlX3BhcmVudCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzdGF0ZSA9ICogKCBjbG9zZV9wYXJlbnQgKyAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlID09ICdSJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyBydW5uaW5nX3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPj0gbWF4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X2ZpbGUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHRhc2tfZW50cnkgPSByZWFkZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgY2xvc2VkaXIoIHRhc2tfZGlyICk7CisgICAgICAgICAgICAgICAgdGFza19kaXIgPSBOVUxMOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vCisgICAgLy8gVGhlcmUgX21pZ2h0XyBiZSBhIHRpbWluZyBob2xlIHdoZXJlIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoaXMKKyAgICAvLyBjb2RlIGdldCBza2lwcGVkIGluIHRoZSBsb2FkIGJhbGFuY2UsIGFuZCBydW5uaW5nX3RocmVhZHMgaXMgMC4KKyAgICAvLyBBc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkcyBvbmx5ISEhCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBydW5uaW5nX3RocmVhZHMgPiAwICk7CisgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPD0gMCApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gMTsKKyAgICB9CisKKyAgICBmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorICAgICAgICBpZiAoIHByb2NfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggcHJvY19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHRhc2tfcGF0aCApOworICAgICAgICBpZiAoIHRhc2tfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggdGFza19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHN0YXRfcGF0aCApOworICAgICAgICBpZiAoIHN0YXRfZmlsZSAhPSAtMSApIHsKKyAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgPSBydW5uaW5nX3RocmVhZHM7CisKKyAgICByZXR1cm4gcnVubmluZ190aHJlYWRzOworCit9IC8vIF9fa21wX2dldF9sb2FkX2JhbGFuY2UKKworIyBlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisKKyNlbmRpZiAvLyBVU0VfTE9BRF9CQUxBTkNFCisKKyNpZiAhKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX01JQyB8fCBLTVBfQVJDSF9QUEM2NCkKKworLy8gd2UgcmVhbGx5IG9ubHkgbmVlZCB0aGUgY2FzZSB3aXRoIDEgYXJndW1lbnQsIGJlY2F1c2UgQ0xBTkcgYWx3YXlzIGJ1aWxkCisvLyBhIHN0cnVjdCBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIHJlZmVyZW5jZWQgaW4gdGhlIG91dGxpbmVkIGZ1bmN0aW9uCitpbnQKK19fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFza190IHBrZm4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSAKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdm9pZCAqKmV4aXRfZnJhbWVfcHRyCisjZW5kaWYKKykgCit7CisjaWYgT01QVF9TVVBQT1JUCisgICpleGl0X2ZyYW1lX3B0ciA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworI2VuZGlmCisKKyAgc3dpdGNoIChhcmdjKSB7CisgIGRlZmF1bHQ6CisgICAgZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBhcmdzIHRvIG1pY3JvdGFzazogJWQhXG4iLCBhcmdjKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KC0xKTsKKyAgY2FzZSAwOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdKTsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdKTsKKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0pOworICAgIGJyZWFrOworICBjYXNlIDQ6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdKTsKKyAgICBicmVhazsKKyAgY2FzZSA1OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdKTsKKyAgICBicmVhazsKKyAgY2FzZSA2OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdKTsKKyAgICBicmVhazsKKyAgY2FzZSA3OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0pOworICAgIGJyZWFrOworICBjYXNlIDg6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddKTsKKyAgICBicmVhazsKKyAgY2FzZSA5OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMDoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMjoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSk7CisgICAgYnJlYWs7CisgIGNhc2UgMTM6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0sIHBfYXJndls5XSwgcF9hcmd2WzEwXSwKKyAgICAgICAgICAgIHBfYXJndlsxMV0sIHBfYXJndlsxMl0pOworICAgIGJyZWFrOworICBjYXNlIDE0OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdLCBwX2FyZ3ZbMTJdLCBwX2FyZ3ZbMTNdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxNToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSwgcF9hcmd2WzEyXSwgcF9hcmd2WzEzXSwgcF9hcmd2WzE0XSk7CisgICAgYnJlYWs7CisgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAqZXhpdF9mcmFtZV9wdHIgPSAwOworI2VuZGlmCisKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20gYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmOWEzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbQpAQCAtMCwwICsxLDE0MDIgQEAKKzsgIHpfV2luZG93c19OVC01ODZfYXNtLmFzbTogIC0gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseQorOyAgICB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IHJ1bm5pbmcgV2luZG93cyogT1MKKworOworOy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCis7Ly8KKzsvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCis7Ly8KKzsvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCis7Ly8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCis7Ly8KKzsvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworOworCisgICAgICAgIFRJVExFICAgel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSUEtMzIgYXJjaGl0ZWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09CitpZmRlZiBfTV9JQTMyCisKKyAgICAgICAgLjU4NlAKKworaWYgQFZlcnNpb24gZ3QgNTEwCisgICAgICAgIC5tb2RlbCBIVUdFCitlbHNlCitfVEVYVCAgIFNFR01FTlQgUEFSQSBVU0UzMiBQVUJMSUMgJ0NPREUnCitfVEVYVCAgIEVORFMKK19EQVRBICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0RBVEEnCitfREFUQSAgIEVORFMKK0NPTlNUICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0NPTlNUJworQ09OU1QgICBFTkRTCitfQlNTICAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdCU1MnCitfQlNTICAgIEVORFMKKyQkU1lNQk9MUyAgICAgICBTRUdNRU5UIEJZVEUgVVNFMzIgJ0RFQlNZTScKKyQkU1lNQk9MUyAgICAgICBFTkRTCiskJFRZUEVTIFNFR01FTlQgQllURSBVU0UzMiAnREVCVFlQJworJCRUWVBFUyBFTkRTCitfVExTICAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdUTFMnCitfVExTICAgIEVORFMKK0ZMQVQgICAgR1JPVVAgX0RBVEEsIENPTlNULCBfQlNTCisgICAgICAgIEFTU1VNRSAgQ1M6IEZMQVQsIERTOiBGTEFULCBTUzogRkxBVAorZW5kaWYKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94ODZfcGF1c2UKKzsKKzsgdm9pZAorOyBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKQorOworCitQVUJMSUMgIF9fX2ttcF94ODZfcGF1c2UKK19wJCA9IDQKK19kJCA9IDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19fa21wX3g4Nl9wYXVzZSBQUk9DIE5FQVIKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIDs7IHBhdXNlCisgICAgICAgIHJldAorCitfX19rbXBfeDg2X3BhdXNlIEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94ODZfY3B1aWQKKzsKKzsgdm9pZAorOyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHN0cnVjdCBrbXBfY3B1aWQgKnAgKTsKKzsKKworUFVCTElDICBfX19rbXBfeDg2X2NwdWlkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19tb2RlJCAgPSA4CitfbW9kZTIkID0gMTIKK19wJCAgICAgPSAxNgorX2VheCQgICA9IDAKK19lYngkICAgPSA0CitfZWN4JCAgID0gOAorX2VkeCQgICA9IDEyCisKK19fX2ttcF94ODZfY3B1aWQgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICAgIGVicAorICAgICAgICBtb3YgICAgICAgZWJwLCBlc3AKKworICAgICAgICBwdXNoICAgICAgZWRpCisgICAgICAgIHB1c2ggICAgICBlYngKKyAgICAgICAgcHVzaCAgICAgIGVjeAorICAgICAgICBwdXNoICAgICAgZWR4CisKKyAgICAgICAgbW92CSAgZWF4LCBEV09SRCBQVFIgX21vZGUkW2VicF0KKyAgICAgICAgbW92CSAgZWN4LCBEV09SRCBQVFIgX21vZGUyJFtlYnBdCisJY3B1aWQJCQkJCTsgUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworICAgICAgICBtb3YgICAgICAgZWRpLCBEV09SRCBQVFIgX3AkW2VicF0KKwltb3YgCSAgRFdPUkQgUFRSIF9lYXgkWyBlZGkgXSwgZWF4CisJbW92IAkgIERXT1JEIFBUUiBfZWJ4JFsgZWRpIF0sIGVieAorCW1vdiAJICBEV09SRCBQVFIgX2VjeCRbIGVkaSBdLCBlY3gKKwltb3YgCSAgRFdPUkQgUFRSIF9lZHgkWyBlZGkgXSwgZWR4CisKKyAgICAgICAgcG9wICAgICAgIGVkeAorICAgICAgICBwb3AgICAgICAgZWN4CisgICAgICAgIHBvcCAgICAgICBlYngKKyAgICAgICAgcG9wICAgICAgIGVkaQorCisgICAgICAgIG1vdiAgICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfeDg2X2NwdWlkIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3Rlc3RfdGhlbl9hZGQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3Rlc3RfdGhlbl9hZGQzMgorX3AkID0gNAorX2QkID0gOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VzcF0KKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorbG9jayAgICB4YWRkICAgIERXT1JEIFBUUiBbZWN4XSwgZWF4CisgICAgICAgIHJldAorCitfX19rbXBfdGVzdF90aGVuX2FkZDMyIEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgQllURSBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkbCwgQllURSBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbZWN4XSwgZGwKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGFsID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCBXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGR4LCBXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtlY3hdLCBkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgYXggPT0gW2VjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBEV09SRCBQVFIgW2VjeF0sIGVkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgZWF4ID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDgKK19jdl9sb3ckID0gMTIKK19jdl9oaWdoJCA9IDE2Citfc3ZfbG93JCA9IDIwCitfc3ZfaGlnaCQgPSAyNAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgICAgZWJwCisgICAgICAgIG1vdiAgICAgICBlYnAsIGVzcAorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlZGkKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfY3ZfaGlnaCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWJ4LCBEV09SRCBQVFIgX3N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3N2X2hpZ2gkW2VicF0KK2xvY2sgICAgY21weGNoZzhiIFFXT1JEIFBUUiBbZWRpXQorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgZWR4OmVheCA9PSBbZWRpXSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcG9wICAgICAgIGVkaQorICAgICAgICBwb3AgICAgICAgZWJ4CisgICAgICAgIG1vdiAgICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkOAorOworOyBrbXBfaW50OAorOyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgIEJZVEUgUFRSIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBCWVRFIFBUUiBbZWN4XSwgYWwKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX2ZpeGVkOCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDE2IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYXgsICBXT1JEIFBUUiAgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIFdPUkQgUFRSIFtlY3hdLCBheAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIERXT1JEIFBUUiBbZWN4XSwgZWF4CisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19maXhlZDMyIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19yZWFsMzIKKzsKKzsga21wX3JlYWwzMgorOyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDgKK19kJCA9IDEyCitfb2xkX3ZhbHVlJCA9IC00CisKK19fX2ttcF94Y2hnX3JlYWwzMiBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgIGVicAorICAgICAgICBtb3YgICAgIGVicCwgZXNwCisgICAgICAgIHN1YiAgICAgZXNwLCA0CisgICAgICAgIHB1c2ggICAgZXNpCisgICAgICAgIG1vdiAgICAgZXNpLCBEV09SRCBQVFIgX3AkW2VicF0KKworICAgICAgICBmbGQgICAgIERXT1JEIFBUUiBbZXNpXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgbG9hZCA8YWRkcj4KKyAgICAgICAgZnN0ICAgICBEV09SRCBQVFIgX29sZF92YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgc3RvcmUgaW50byBvbGRfdmFsdWUKKworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlYnBdCisKK2xvY2sgICAgeGNoZyAgICBEV09SRCBQVFIgW2VzaV0sIGVheAorCisgICAgICAgIGZsZCAgICAgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IHJldHVybiBvbGRfdmFsdWUKKyAgICAgICAgcG9wICAgICBlc2kKKyAgICAgICAgbW92ICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfcmVhbDMyIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgQllURSBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkbCwgQllURSBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbZWN4XSwgZGwKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCBXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGR4LCBXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtlY3hdLCBkeAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBEV09SRCBQVFIgW2VjeF0sIGVkeAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0Cis7Cis7IGttcF9pbnQ2NAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfY3ZfbG93JCA9IDEyCitfY3ZfaGlnaCQgPSAxNgorX3N2X2xvdyQgPSAyMAorX3N2X2hpZ2gkID0gMjQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgICBlYnAKKyAgICAgICAgbW92ICAgICAgIGVicCwgZXNwCisgICAgICAgIHB1c2ggICAgICBlYngKKyAgICAgICAgcHVzaCAgICAgIGVkaQorICAgICAgICBtb3YgICAgICAgZWRpLCBEV09SRCBQVFIgX3AkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9jdl9oaWdoJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYngsIERXT1JEIFBUUiBfc3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfc3ZfaGlnaCRbZWJwXQorbG9jayAgICBjbXB4Y2hnOGIgUVdPUkQgUFRSIFtlZGldCisgICAgICAgIHBvcCAgICAgICBlZGkKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICAgcDogICAgICA0KCVlc3ApCisKK1BVQkxJQyAgX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorCitfX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgZmxkY3cgICAgIFdPUkQgUFRSIFtlYXhdCisgICAgICAgIHJldAorCitfX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICAgcDogICAgICA0KCVlc3ApCisKK1BVQkxJQyAgX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKKworX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBmc3RjdyAgICAgV09SRCBQVFIgW2VheF0KKyAgICAgICAgcmV0CisKK19fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCis7Cis7IHZvaWQKKzsgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworOworCitQVUJMSUMgIF9fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorCitfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkKKzsKKworUFVCTElDICBfX19rbXBfaW52b2tlX21pY3JvdGFzaworX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcGtmbiQgPSA4CitfZ3RpZCQgPSAxMgorX3RpZCQgPSAxNgorX2FyZ2MkID0gMjAKK19hcmd2JCA9IDI0CitpZiBPTVBUX1NVUFBPUlQKK19leGl0X2ZyYW1lJCA9IDI4CitlbmRpZgorX2kkID0gLTgKK19zdGtfYWRqJCA9IC0xNgorX3ZwdHIkID0gLTEyCitfcXB0ciQgPSAtNAorCitfX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIE5FQVIKKzsgTGluZSAxMDIKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDAwMDAwMDEwSAorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVkaQoraWYgT01QVF9TVVBQT1JUCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2V4aXRfZnJhbWUkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgW2VheF0sIGVicAorZW5kaWYKKzsgTGluZSAxMTQKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfYXJnYyRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgZWF4CisKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWxlYSAgICAgZWR4LCBEV09SRCBQVFIgW2VheCo0KzhdCisJbW92ICAgICBlY3gsIGVzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIGN1cnJlbnQgU1AgaW50byBFQ1gKKwltb3YJZWF4LGVkeAkJOyBTYXZlIHRoZSBzaXplIG9mIHRoZSBhcmdzIGluIGVheAorCXN1YgllY3gsZWR4CQk7IGVzcC0oKCNhcmdzKzIpKjQpIC0+IGVjeCAtLSB3aXRob3V0IG1vZHMsIHN0YWNrIHB0ciB3b3VsZCBiZSB0aGlzCisJbW92CWVkeCxlY3gJCTsgU2F2ZSB0byBlZHgKKwlhbmQJZWN4LC0xMjgJOyBNYXNrIG9mZiA3IGJpdHMKKwlzdWIJZWR4LGVjeAkJOyBBbW91bnQgdG8gc3VidHJhY3QgZnJvbSBlc3AKKwlzdWIJZXNwLGVkeAkJOyBQcmVwYXJlIHN0YWNrIHB0ci0tIE5vdyBpdCB3aWxsIGJlIGFsaWduZWQgb24gMTI4LWJ5dGUgYm91bmRhcnkgYXQgdGhlIGNhbGwKKworCWFkZAllZHgsZWF4CQk7IENhbGN1bGF0ZSB0b3RhbCBzaXplIG9mIHRoZSBzdGFjayBkZWNyZW1lbnQuCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9zdGtfYWRqJFtlYnBdLCBlZHgKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIGptcCAgICAgU0hPUlQgJEwyMjIzNworJEwyMjIzODoKKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBfaSRbZWJwXQorICAgICAgICBzdWIgICAgIGVjeCwgMQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgZWN4CiskTDIyMjM3OgorICAgICAgICBjbXAgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgMAorICAgICAgICBqbGUgICAgIFNIT1JUICRMMjIyMzkKKzsgTGluZSAxMTYKKyAgICAgICAgbW92ICAgICBlZHgsIERXT1JEIFBUUiBfaSRbZWJwXQorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9hcmd2JFtlYnBdCisgICAgICAgIG1vdiAgICAgZWN4LCBEV09SRCBQVFIgW2VheCtlZHgqNC00XQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfdnB0ciRbZWJwXSwgZWN4Cis7IExpbmUgMTIzCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX3ZwdHIkW2VicF0KKzsgTGluZSAxMjQKKyAgICAgICAgcHVzaCAgICBlYXgKKzsgTGluZSAxMjcKKyAgICAgICAgam1wICAgICBTSE9SVCAkTDIyMjM4CiskTDIyMjM5OgorOyBMaW5lIDEyOQorICAgICAgICBsZWEgICAgIGVkeCwgRFdPUkQgUFRSIF90aWQkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3ZwdHIkW2VicF0sIGVkeAorOyBMaW5lIDEzMAorICAgICAgICBsZWEgICAgIGVheCwgRFdPUkQgUFRSIF9ndGlkJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9xcHRyJFtlYnBdLCBlYXgKKzsgTGluZSAxNDMKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfdnB0ciRbZWJwXQorOyBMaW5lIDE0NAorICAgICAgICBwdXNoICAgIGVheAorOyBMaW5lIDE0NQorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9xcHRyJFtlYnBdCis7IExpbmUgMTQ2CisgICAgICAgIHB1c2ggICAgZWF4Cis7IExpbmUgMTQ3CisgICAgICAgIGNhbGwgICAgRFdPUkQgUFRSIF9wa2ZuJFtlYnBdCis7IExpbmUgMTQ4CisgICAgICAgIGFkZCAgICAgZXNwLCBEV09SRCBQVFIgX3N0a19hZGokW2VicF0KKzsgTGluZSAxNTIKKyAgICAgICAgbW92ICAgICBlYXgsIDEKKzsgTGluZSAxNTMKKyAgICAgICAgcG9wICAgICBlZGkKKyAgICAgICAgcG9wICAgICBlc2kKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgbW92ICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQgICAgIDAKK19fX2ttcF9pbnZva2VfbWljcm90YXNrIEVORFAKK19URVhUICAgRU5EUworCitlbmRpZgorCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbnRlbChSKSA2NCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZmRlZiBfTV9BTUQ2NAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorOworOyB2b2lkCis7IF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgc3RydWN0IGttcF9jcHVpZCAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOwltb2RlOgkJZWN4Cis7CW1vZGUyOgkJZWR4Cis7CWNwdWlkX2J1ZmZlcjogCXI4CisKK1BVQkxJQyAgX19rbXBfeDg2X2NwdWlkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfeDg2X2NwdWlkIFBST0MgRlJBTUUgO05FQVIKKworICAgICAgICBwdXNoICAgICAgcmJwCisgICAgICAgIC5wdXNocmVnICByYnAKKyAgICAgICAgbW92ICAgICAgIHJicCwgcnNwCisgICAgICAgIC5zZXRmcmFtZSByYnAsIDAKKyAgICAgICAgcHVzaCAgICAgIHJieAkJCQk7IGNhbGxlZS1zYXZlIHJlZ2lzdGVyCisgICAgICAgIC5wdXNocmVnICByYngKKyAgICAgICAgLkVORFBST0xPRworCisJbW92CSAgcjEwLCByOCAgICAgICAgICAgICAgICAgICAgICAgOyBwIHBhcmFtZXRlcgorICAgICAgICBtb3YJICBlYXgsIGVjeAkJCTsgbW9kZSBwYXJhbWV0ZXIKKyAgICAgICAgbW92CSAgZWN4LCBlZHggICAgICAgICAgICAgICAgICAgICAgOyBtb2RlMiBwYXJhbWV0ZXIKKwljcHVpZAkJCQkJOyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92IAkgIERXT1JEIFBUUiAwWyByMTAgXSwgZWF4CTsgc3RvcmUgcmVzdWx0cyBpbnRvIGJ1ZmZlcgorCW1vdiAJICBEV09SRCBQVFIgNFsgcjEwIF0sIGVieAorCW1vdiAJICBEV09SRCBQVFIgOFsgcjEwIF0sIGVjeAorCW1vdiAJICBEV09SRCBQVFIgMTJbIHIxMCBdLCBlZHgKKworICAgICAgICBwb3AgICAgICAgcmJ4CQkJCTsgY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92ICAgICAgIHJzcCwgcmJwCisgICAgICAgIHBvcCAgICAgICByYnAKKyAgICAgICAgcmV0CisKK19fa21wX3g4Nl9jcHVpZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWVkeAorOworOyByZXR1cm46IAllYXgKKworUFVCTElDICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhhZGQgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOglyZHgKKzsKKzsgcmV0dXJuOiAJcmF4CisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3Rlc3RfdGhlbl9hZGQ2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICByYXgsIHJkeAorbG9jayAgICB4YWRkICAgIFFXT1JEIFBUUiBbcmN4XSwgcmF4CisgICAgICAgIHJldAorCitfX2ttcF90ZXN0X3RoZW5fYWRkNjQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBhbCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIAk7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYXgsIGR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW3JjeF0sIGR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgYXggPT0gW3JjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIHJheCwgMSAgICAgICAJOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgZWF4ID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgCTsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OglyZHgKKzsJc3Y6CXI4Cis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIHJheCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkOAorOworOyBrbXBfaW50OAorOyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWRsCis7Cis7IHJldHVybjogCWFsCisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCAgZGwKK2xvY2sgICAgeGNoZyAgICAgIEJZVEUgUFRSIFtyY3hdLCBhbAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZHgKKzsKKzsgcmV0dXJuOiAJYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkMTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgIGR4Citsb2NrICAgIHhjaGcgICAgICBXT1JEIFBUUiBbcmN4XSwgYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOgllZHgKKzsKKzsgcmV0dXJuOiAJZWF4CisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICBlYXgsIGVkeAorbG9jayAgICB4Y2hnICAgIERXT1JEIFBUUiBbcmN4XSwgZWF4CisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX2ZpeGVkMzIgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDY0Cis7Cis7IGttcF9pbnQ2NAorOyBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CXJkeAorOworOyByZXR1cm46IAlyYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIHJheCwgcmR4Citsb2NrICAgIHhjaGcgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQ2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyA7TkVBUgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgZHgJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbcmN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJcmR4Cis7CXN2OglyOAorOworOyByZXR1cm46CXJheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJYWwKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4IFBST0MgO05FQVIKKyRfX2ttcF9sb29wOgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIGp6ICAgICAJU0hPUlQgJF9fa21wX3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9sb29wCisKKyRfX2ttcF9zdWNjZXNzOgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsgICAgICAgZDoJeG1tMSAobG93ZXIgNCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA0IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDMyIFBST0MgO05FQVIKKworCW1vdmQJZWF4LCB4bW0xCQk7IGxvYWQgZAorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKworCW1vdmQJeG1tMCwgZWF4CQk7IGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDY0Cis7Cis7IGttcF9yZWFsNjQKKzsgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJeG1tMSAobG93ZXIgOCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA4IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDY0IFBST0MgO05FQVIKKworCW1vdmQJcmF4LCB4bW0xCQk7IGxvYWQgImQiCisKK2xvY2sgICAgeGNoZyAgICBRV09SRCBQVFIgW3JjeF0sIHJheAorCisJbW92ZAl4bW0wLCByYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfcmVhbDY0IEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CisKK1BVQkxJQyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmbGRjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOworCitQVUJMSUMgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmc3RjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCkKKzsKKworUFVCTElDICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworOworOyAgICAgKCpwa2ZuKSAoICZndGlkLCAmdGlkLCBhcmd2WzBdLCAuLi4gKTsKKzsgICAgIHJldHVybiAxOworOyB9Cis7Cis7IG5vdGU6Cis7ICAgICAganVzdCBiZWZvcmUgY2FsbCB0byBwa2ZuIG11c3QgaGF2ZSByc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICByY3g6ICAgcGtmbgkxNltyYnBdCis7ICAgICAgZWR4OiAgIGd0aWQJMjRbcmJwXQorOyAgICAgIHI4ZDogICB0aWQJMzJbcmJwXQorOyAgICAgIHI5ZDogICBhcmdjCTQwW3JicF0KKzsgICAgICBbc3RdOiAgcF9hcmd2CTQ4W3JicF0KKzsKKzsgcmVnIHRlbXBzOgorOyAgICAgIHJheDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJkeDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJjeDogICB1c2VkIGFzIGFyZ3VtZW50IGNvdW50ZXIgZm9yIHB1c2ggcGFybXMgbG9vcAorOyAgICAgIHIxMDogICB1c2VkIHRvIGhvbGQgcGtmbiBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50Cis7Cis7IHJldHVybjogICAgICBlYXggICAgKGFsd2F5cyAxL1RSVUUpCis7CisKKyRfcGtmbiAgID0gMTYKKyRfZ3RpZCAgID0gMjQKKyRfdGlkICAgID0gMzIKKyRfYXJnYyAgID0gNDAKKyRfcF9hcmd2ID0gNDgKK2lmIE9NUFRfU1VQUE9SVAorJF9leGl0X2ZyYW1lID0gNTYKK2VuZGlmCisKK1BVQkxJQyAgX19rbXBfaW52b2tlX21pY3JvdGFzaworX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2ludm9rZV9taWNyb3Rhc2sgUFJPQyBGUkFNRSA7TkVBUgorCW1vdglRV09SRCBQVFIgMTZbcnNwXSwgcmR4CTsgaG9tZSBndGlkIHBhcmFtZXRlcgorCW1vdiAJUVdPUkQgUFRSIDI0W3JzcF0sIHI4CTsgaG9tZSB0aWQgcGFyYW1ldGVyCisgICAgICAgIHB1c2ggICAgcmJwCQk7IHNhdmUgYmFzZSBwb2ludGVyCisgICAgICAgIC5wdXNocmVnIHJicAorCXN1Yglyc3AsIDAJCTsgbm8gZml4ZWQgYWxsb2NhdGlvbiBuZWNlc3NhcnkgLSBlbmQgcHJvbG9nCisKKyAgICAgICAgbGVhICAgICByYnAsIFFXT1JEIFBUUiBbcnNwXSAgIAk7IGVzdGFibGlzaCB0aGUgYmFzZSBwb2ludGVyCisgICAgICAgIC5zZXRmcmFtZSByYnAsIDAKKyAgICAgICAgLkVORFBST0xPRworaWYgT01QVF9TVVBQT1JUCisgICAgICAgIG1vdiAgICAgcmF4LCBRV09SRCBQVFIgJF9leGl0X2ZyYW1lW3JicF0KKyAgICAgICAgbW92ICAgICBRV09SRCBQVFIgW3JheF0sIHJicAorZW5kaWYKKwltb3YJcjEwLCByY3gJOyBzYXZlIHBrZm4gcG9pbnRlciBmb3IgbGF0ZXIKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIG1vdiAgICAgcmF4LCByOQkJOyByYXggPD0gYXJnYworICAgICAgICBjbXAgICAgIHJheCwgMgorICAgICAgICBqZ2UgICAgIFNIT1JUICRfa21wX2ludm9rZV9zdGFja19hbGlnbgorICAgICAgICBtb3YgICAgIHJheCwgMiAgICAgICAgICA7IHNldCA0IGhvbWVzIGlmIGxlc3MgdGhhbiAyIHBhcm1zCiskX2ttcF9pbnZva2Vfc3RhY2tfYWxpZ246CisJbGVhICAgICByZHgsIFFXT1JEIFBUUiBbcmF4KjgrMTZdIDsgcmF4IDw9IChhcmdjICsgMikgKiA4CisJbW92ICAgICByYXgsIHJzcCAgICAgICAgOyBTYXZlIGN1cnJlbnQgU1AgaW50byByYXgKKwlzdWIJcmF4LCByZHgJOyByc3AgLSAoKGFyZ2MrMikqOCkgLT4gcmF4CisJCQkJOyB3aXRob3V0IGFsaWduLCByc3Agd291bGQgYmUgdGhpcworCWFuZCAgICAgcmF4LCAtMTI4ICAgICAgIDsgTWFzayBvZmYgNyBiaXRzICgxMjgtYnl0ZSBhbGlnbikKKwlhZGQgICAgIHJheCwgcmR4ICAgICAgICA7IGFkZCBzcGFjZSBmb3IgcHVzaCdzIGluIGEgbG9vcCBiZWxvdworCW1vdiAgICAgcnNwLCByYXggICAgICAgIDsgUHJlcGFyZSB0aGUgc3RhY2sgcHRyCisJCQkJOyBOb3cgaXQgd2lsbCBhbGlnbiB0byAxMjgtYnl0ZSBhdCB0aGUgY2FsbAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAkJCTsgc2V0dXAgcGtmbiBwYXJhbWV0ZXIgc3RhY2sKKwltb3YJcmF4LCByOQkJOyByYXggPD0gYXJnYworCXNobAlyYXgsIDMJCTsgcmF4IDw9IGFyZ2MqOAorCW1vdglyZHgsIFFXT1JEIFBUUiAkX3BfYXJndltyYnBdCTsgcmR4IDw9IHBfYXJndgorCWFkZAlyZHgsIHJheAk7IHJkeCA8PSAmcF9hcmd2W2FyZ2NdCisJbW92CXJjeCwgcjkJCTsgcmN4IDw9IGFyZ2MKKwlqZWN4eglTSE9SVCAkX2ttcF9pbnZva2VfcGFzc19wYXJtcwk7IG5vdGhpbmcgdG8gcHVzaCBpZiBhcmdjPTAKKwljbXAJZWN4LCAxCQk7IGlmIGFyZ2M9MSBicmFuY2ggYWhlYWQKKwlqZQlTSE9SVCAkX2ttcF9pbnZva2Vfb25lX3Bhcm0KKwlzdWIJZWN4LCAyCQk7IGlmIGFyZ2M9MiBicmFuY2ggYWhlYWQsIHN1YnRyYWN0IHR3byBmcm9tCisJamUJU0hPUlQgJF9rbXBfaW52b2tlX3R3b19wYXJtcworCiskX2ttcF9pbnZva2VfcHVzaF9wYXJtczoJOyBwdXNoIGxhc3QgLSA1dGggcGFybXMgdG8gcGtmbiBvbiBzdGFjaworCXN1YglyZHgsIDgJCTsgZGVjcmVtZW50IHBfYXJndiBwb2ludGVyIHRvIHByZXZpb3VzIHBhcm0KKwltb3YgCXI4LCBRV09SRCBQVFIgW3JkeF0gOyByOCA8PSBwX2FyZ3ZbcmN4LTFdCisJcHVzaAlyOAkJOyBwdXNoIHBfYXJndltyY3gtMV0gb250byBzdGFjayAocmV2ZXJzZSBvcmRlcikKKwlzdWIJZWN4LCAxCisJamVjeHoJU0hPUlQgJF9rbXBfaW52b2tlX3R3b19wYXJtcworCWptcAlTSE9SVCAkX2ttcF9pbnZva2VfcHVzaF9wYXJtcworCiskX2ttcF9pbnZva2VfdHdvX3Bhcm1zOgorCXN1YglyZHgsIDgJCTsgcHV0IDR0aCBwYXJtIHRvIHBrZm4gaW4gcjkKKwltb3YJcjksIFFXT1JEIFBUUiBbcmR4XSA7IHI5IDw9IHBfYXJndlsxXQorCiskX2ttcF9pbnZva2Vfb25lX3Bhcm06CisgICAgICAgIHN1YglyZHgsIDgJCTsgcHV0IDNyZCBwYXJtIHRvIHBrZm4gaW4gcjgKKwltb3YJcjgsIFFXT1JEIFBUUiBbcmR4XSA7IHI4IDw9IHBfYXJndlswXQorCiskX2ttcF9pbnZva2VfcGFzc19wYXJtczoJOyBwdXQgMXN0ICYgMm5kIHBhcm1zIHRvIHBrZm4gaW4gcmVnaXN0ZXJzCisJbGVhCXJkeCwgUVdPUkQgUFRSICRfdGlkW3JicF0gIDsgcmR4IDw9ICZ0aWQgKDJuZCBwYXJtIHRvIHBrZm4pCisJbGVhCXJjeCwgUVdPUkQgUFRSICRfZ3RpZFtyYnBdIDsgcmN4IDw9ICZndGlkICgxc3QgcGFybSB0byBwa2ZuKQorICAgICAgICBzdWIgICAgIHJzcCwgMzIgICAgICAgICA7IGFkZCBzdGFjayBzcGFjZSBmb3IgZmlyc3QgZm91ciBwYXJtcworCW1vdglyYXgsIHIxMAk7IHJheCA8PSBwa2ZuCisJY2FsbAlyYXgJCTsgY2FsbCAoKnBrZm4pKCkKKwltb3YJcmF4LCAxCQk7IG1vdmUgMSBpbnRvIHJldHVybiByZWdpc3RlcjsKKworICAgICAgICBsZWEgICAgIHJzcCwgUVdPUkQgUFRSIFtyYnBdCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisKKzsJYWRkCXJzcCwgMAkJOyBubyBmaXhlZCBhbGxvY2F0aW9uIG5lY2Vzc2FyeSAtIHN0YXJ0IGVwaWxvZworICAgICAgICBwb3AgICAgIHJicAkJOyByZXN0b3JlIGZyYW1lIHBvaW50ZXIKKyAgICAgICAgcmV0CitfX2ttcF9pbnZva2VfbWljcm90YXNrIEVORFAKK19URVhUICAgRU5EUworCitlbmRpZgorCitFTkQKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jIGIvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlYWZhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogel9XaW5kb3dzX05ULTU4Nl91dGlsLmMgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorLyogT25seSAzMi1iaXQgImFkZC1leGNoYW5nZSIgaW5zdHJ1Y3Rpb24gb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGNhdXNlcyB1cyB0bworICogdXNlIGNvbXBhcmVfYW5kX3N0b3JlIGZvciB0aGVzZSByb3V0aW5lcworICovCisKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApCit7CisgICAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDgKK19fa21wX3Rlc3RfdGhlbl9hbmQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApCit7CisgICAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDMyCitfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX2FkZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNpZiBLTVBfQVJDSF9YODYKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKworICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKworICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVF91dGlsLmMgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzNlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jCkBAIC0wLDAgKzEsMTk0MSBAQAorLyoKKyAqIHpfV2luZG93c19OVF91dGlsLmMgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBjb2RlIGlzIHJlbGF0ZWQgdG8gTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCkgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24KKyAgIGlzIHVzZWQgaW4gdGhlIExvYWQgYmFsYW5jZSBhbGdvcml0aG0gZm9yIE9NUF9EWU5BTUlDPXRydWUgdG8gZmluZCB0aGUKKyAgIG51bWJlciBvZiBydW5uaW5nIHRocmVhZHMgaW4gdGhlIHN5c3RlbS4gKi8KKworI2luY2x1ZGUgPG50c3RhdHVzLmg+CisjaW5jbHVkZSA8bnRzZWNhcGkuaD4gICAvLyBVTklDT0RFX1NUUklORworCitlbnVtIFNZU1RFTV9JTkZPUk1BVElPTl9DTEFTUyB7CisgICAgU3lzdGVtUHJvY2Vzc0luZm9ybWF0aW9uID0gNQorfTsgLy8gU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTCisKK3N0cnVjdCBDTElFTlRfSUQgeworICAgIEhBTkRMRSBVbmlxdWVQcm9jZXNzOworICAgIEhBTkRMRSBVbmlxdWVUaHJlYWQ7Cit9OyAvLyBzdHJ1Y3QgQ0xJRU5UX0lECisKK2VudW0gVEhSRUFEX1NUQVRFIHsKKyAgICBTdGF0ZUluaXRpYWxpemVkLAorICAgIFN0YXRlUmVhZHksCisgICAgU3RhdGVSdW5uaW5nLAorICAgIFN0YXRlU3RhbmRieSwKKyAgICBTdGF0ZVRlcm1pbmF0ZWQsCisgICAgU3RhdGVXYWl0LAorICAgIFN0YXRlVHJhbnNpdGlvbiwKKyAgICBTdGF0ZVVua25vd24KK307IC8vIGVudW0gVEhSRUFEX1NUQVRFCisKK3N0cnVjdCBWTV9DT1VOVEVSUyB7CisgICAgU0laRV9UICAgICAgICBQZWFrVmlydHVhbFNpemU7CisgICAgU0laRV9UICAgICAgICBWaXJ0dWFsU2l6ZTsKKyAgICBVTE9ORyAgICAgICAgIFBhZ2VGYXVsdENvdW50OworICAgIFNJWkVfVCAgICAgICAgUGVha1dvcmtpbmdTZXRTaXplOworICAgIFNJWkVfVCAgICAgICAgV29ya2luZ1NldFNpemU7CisgICAgU0laRV9UICAgICAgICBRdW90YVBlYWtQYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGFnZWRQb29sVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBRdW90YVBlYWtOb25QYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhTm9uUGFnZWRQb29sVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBQYWdlZmlsZVVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUGVha1BhZ2VmaWxlVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBQcml2YXRlUGFnZUNvdW50OworfTsgLy8gc3RydWN0IFZNX0NPVU5URVJTCisKK3N0cnVjdCBTWVNURU1fVEhSRUFEIHsKKyAgTEFSR0VfSU5URUdFUiAgIEtlcm5lbFRpbWU7CisgIExBUkdFX0lOVEVHRVIgICBVc2VyVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIENyZWF0ZVRpbWU7CisgIFVMT05HICAgICAgICAgICBXYWl0VGltZTsKKyAgTFBWT0lEICAgICAgICAgIFN0YXJ0QWRkcmVzczsKKyAgQ0xJRU5UX0lEICAgICAgIENsaWVudElkOworICBEV09SRCAgICAgICAgICAgUHJpb3JpdHk7CisgIExPTkcgICAgICAgICAgICBCYXNlUHJpb3JpdHk7CisgIFVMT05HICAgICAgICAgICBDb250ZXh0U3dpdGNoQ291bnQ7CisgIFRIUkVBRF9TVEFURSAgICBTdGF0ZTsKKyAgVUxPTkcgICAgICAgICAgIFdhaXRSZWFzb247Cit9OyAvLyBTWVNURU1fVEhSRUFECisKK0tNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBLZXJuZWxUaW1lICkgPT0gMCApOworI2lmIEtNUF9BUkNIX1g4NgorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGFydEFkZHJlc3MgKSA9PSAyOCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGF0ZSAgICAgICAgKSA9PSA1MiApOworI2Vsc2UKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1RIUkVBRCwgU3RhcnRBZGRyZXNzICkgPT0gMzIgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1RIUkVBRCwgU3RhdGUgICAgICAgICkgPT0gNjggKTsKKyNlbmRpZgorCitzdHJ1Y3QgU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04geworICBVTE9ORyAgICAgICAgICAgTmV4dEVudHJ5T2Zmc2V0OworICBVTE9ORyAgICAgICAgICAgTnVtYmVyT2ZUaHJlYWRzOworICBMQVJHRV9JTlRFR0VSICAgUmVzZXJ2ZWRbIDMgXTsKKyAgTEFSR0VfSU5URUdFUiAgIENyZWF0ZVRpbWU7CisgIExBUkdFX0lOVEVHRVIgICBVc2VyVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIEtlcm5lbFRpbWU7CisgIFVOSUNPREVfU1RSSU5HICBJbWFnZU5hbWU7CisgIERXT1JEICAgICAgICAgICBCYXNlUHJpb3JpdHk7CisgIEhBTkRMRSAgICAgICAgICBQcm9jZXNzSWQ7CisgIEhBTkRMRSAgICAgICAgICBQYXJlbnRQcm9jZXNzSWQ7CisgIFVMT05HICAgICAgICAgICBIYW5kbGVDb3VudDsKKyAgVUxPTkcgICAgICAgICAgIFJlc2VydmVkMlsgMiBdOworICBWTV9DT1VOVEVSUyAgICAgVk1Db3VudGVyczsKKyAgSU9fQ09VTlRFUlMgICAgIElPQ291bnRlcnM7CisgIFNZU1RFTV9USFJFQUQgICBUaHJlYWRzWyAxIF07Cit9OyAvLyBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTgordHlwZWRlZiBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiAqIFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTjsKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBOZXh0RW50cnlPZmZzZXQgKSA9PSAgMCApOworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBDcmVhdGVUaW1lICAgICAgKSA9PSAzMiApOworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBJbWFnZU5hbWUgICAgICAgKSA9PSA1NiApOworI2lmIEtNUF9BUkNIX1g4NgorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgUHJvY2Vzc0lkICAgICAgICkgPT0gIDY4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBIYW5kbGVDb3VudCAgICAgKSA9PSAgNzYgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFZNQ291bnRlcnMgICAgICApID09ICA4OCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSU9Db3VudGVycyAgICAgICkgPT0gMTM2ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBUaHJlYWRzICAgICAgICAgKSA9PSAxODQgKTsKKyNlbHNlCisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBQcm9jZXNzSWQgICAgICAgKSA9PSAgODAgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEhhbmRsZUNvdW50ICAgICApID09ICA5NiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVk1Db3VudGVycyAgICAgICkgPT0gMTEyICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBJT0NvdW50ZXJzICAgICAgKSA9PSAyMDggKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFRocmVhZHMgICAgICAgICApID09IDI1NiApOworI2VuZGlmCisKK3R5cGVkZWYgTlRTVEFUVVMgKE5UQVBJICpOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb25fdCkoIFNZU1RFTV9JTkZPUk1BVElPTl9DTEFTUywgUFZPSUQsIFVMT05HLCBQVUxPTkcgKTsKK050UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90IE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9IE5VTEw7CisKK0hNT0RVTEUgbnRkbGwgPSBOVUxMOworCisvKiBFbmQgb2YgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCktcmVsYXRlZCBjb2RlICovCisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKK3N0YXRpYyBITU9EVUxFIGtlcm5lbDMyID0gTlVMTDsKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICB0eXBlZGVmIHZvaWQgICAgKCogc2lnX2Z1bmNfdCApKCBpbnQgKTsKKyAgICBzdGF0aWMgc2lnX2Z1bmNfdCAgX19rbXBfc2lnaGxkcnNbIE5TSUcgXTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgX19rbXBfc2lnaW5zdGFsbGVkWyBOU0lHIF07CisjZW5kaWYKKworc3RhdGljIEhBTkRMRSAgIF9fa21wX21vbml0b3JfZXY7CitzdGF0aWMga21wX2ludDY0IF9fa21wX3dpbjMyX3RpbWU7Citkb3VibGUgX19rbXBfd2luMzJfdGljazsKKworaW50IF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworQ1JJVElDQUxfU0VDVElPTiBfX2ttcF93aW4zMl9zZWN0aW9uOworCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF9pbml0KCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICYgbXgtPmNzICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoICYgbXgtPmNzLCAiQ3JpdGljYWwgU2VjdGlvbiIgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKK3ZvaWQKK19fa21wX3dpbjMyX211dGV4X2Rlc3Ryb3koIGttcF93aW4zMl9tdXRleF90ICpteCApCit7CisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF9sb2NrKCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF91bmxvY2soIGttcF93aW4zMl9tdXRleF90ICpteCApCit7CisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICYgbXgtPmNzICk7Cit9CisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfaW5pdCgga21wX3dpbjMyX2NvbmRfdCAqY3YgKQoreworICAgIGN2LT53YWl0ZXJzX2NvdW50XyAgICAgICAgID0gMDsKKyAgICBjdi0+d2FpdF9nZW5lcmF0aW9uX2NvdW50XyA9IDA7CisgICAgY3YtPnJlbGVhc2VfY291bnRfICAgICAgICAgPSAwOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIF9fa21wX3dpbjMyX211dGV4X2luaXQoICYgY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIC8qIENyZWF0ZSBhIG1hbnVhbC1yZXNldCBldmVudC4gKi8KKyAgICBjdi0+ZXZlbnRfID0gQ3JlYXRlRXZlbnQoIE5VTEwsICAgICAvLyBubyBzZWN1cml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgICAgIC8vIG1hbnVhbC1yZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAgIC8vIG5vbi1zaWduYWxlZCBpbml0aWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgKTsgICAvLyB1bm5hbWVkCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoIGN2LT5ldmVudF8sICJFdmVudCIgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfZGVzdHJveSgga21wX3dpbjMyX2NvbmRfdCAqY3YgKQoreworICAgIF9fa21wX3dpbjMyX211dGV4X2Rlc3Ryb3koICYgY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggY3YtPmV2ZW50XyApOworICAgIG1lbXNldCggY3YsICdcMCcsIHNpemVvZiggKmN2ICkgKTsKK30KKworLyogVE9ETyBhc3NvY2lhdGUgY3Ygd2l0aCBhIHRlYW0gaW5zdGVhZCBvZiBhIHRocmVhZCBzbyBhcyB0byBvcHRpbWl6ZQorICogdGhlIGNhc2Ugd2hlcmUgd2Ugd2FrZSB1cCBhIHdob2xlIHRlYW0gKi8KKwordm9pZAorX19rbXBfd2luMzJfY29uZF93YWl0KCBrbXBfd2luMzJfY29uZF90ICpjdiwga21wX3dpbjMyX211dGV4X3QgKm14LCBrbXBfaW5mb190ICp0aCwgaW50IG5lZWRfZGVjcmVhc2VfbG9hZCApCit7CisgICAgaW50IG15X2dlbmVyYXRpb247CisgICAgaW50IGxhc3Rfd2FpdGVyOworCisgICAgLyogQXZvaWQgcmFjZSBjb25kaXRpb25zICovCisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICAvKiBJbmNyZW1lbnQgY291bnQgb2Ygd2FpdGVycyAqLworICAgIGN2LT53YWl0ZXJzX2NvdW50XysrOworCisgICAgLyogU3RvcmUgY3VycmVudCBnZW5lcmF0aW9uIGluIG91ciBhY3RpdmF0aW9uIHJlY29yZC4gKi8KKyAgICBteV9nZW5lcmF0aW9uID0gY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF87CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggbXggKTsKKworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgd2FpdF9kb25lOworCisgICAgICAgIC8qIFdhaXQgdW50aWwgdGhlIGV2ZW50IGlzIHNpZ25hbGVkICovCisgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoIGN2LT5ldmVudF8sIElORklOSVRFICk7CisKKyAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICAgICAgLyogRXhpdCB0aGUgbG9vcCB3aGVuIHRoZSA8Y3YtPmV2ZW50Xz4gaXMgc2lnbmFsZWQgYW5kCisgICAgICAgICAqIHRoZXJlIGFyZSBzdGlsbCB3YWl0aW5nIHRocmVhZHMgZnJvbSB0aGlzIDx3YWl0X2dlbmVyYXRpb24+CisgICAgICAgICAqIHRoYXQgaGF2ZW4ndCBiZWVuIHJlbGVhc2VkIGZyb20gdGhpcyB3YWl0IHlldC4gICAgICAgICAgICAgICovCisgICAgICAgIHdhaXRfZG9uZSA9ICggY3YtPnJlbGVhc2VfY291bnRfID4gMCApICYmCisgICAgICAgICAgICAgICAgICAgICggY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF8gIT0gbXlfZ2VuZXJhdGlvbiApOworCisgICAgICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfKTsKKworICAgICAgICAvKiB0aGVyZSB1c2VkIHRvIGJlIGEgc2VtaWNvbG9uIGFmdGVyIHRoZSBpZiBzdGF0ZW1lbnQsCisgICAgICAgICAqIGl0IGxvb2tlZCBsaWtlIGEgYnVnLCBzbyBpIHJlbW92ZWQgaXQgKi8KKyAgICAgICAgaWYoIHdhaXRfZG9uZSApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCBteCApOworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgY3YtPndhaXRlcnNfY291bnRfLS07CisgICAgY3YtPnJlbGVhc2VfY291bnRfLS07CisKKyAgICBsYXN0X3dhaXRlciA9ICAoIGN2LT5yZWxlYXNlX2NvdW50XyA9PSAwICk7CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgaWYoIGxhc3Rfd2FpdGVyICkgeworICAgICAgICAvKiBXZSdyZSB0aGUgbGFzdCB3YWl0ZXIgdG8gYmUgbm90aWZpZWQsIHNvIHJlc2V0IHRoZSBtYW51YWwgZXZlbnQuICovCisgICAgICAgIFJlc2V0RXZlbnQoIGN2LT5ldmVudF8gKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfYnJvYWRjYXN0KCBrbXBfd2luMzJfY29uZF90ICpjdiApCit7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICBpZiggY3YtPndhaXRlcnNfY291bnRfID4gMCApIHsKKyAgICAgICAgU2V0RXZlbnQoIGN2LT5ldmVudF8gKTsKKyAgICAgICAgLyogUmVsZWFzZSBhbGwgdGhlIHRocmVhZHMgaW4gdGhpcyBnZW5lcmF0aW9uLiAqLworCisgICAgICAgIGN2LT5yZWxlYXNlX2NvdW50XyA9IGN2LT53YWl0ZXJzX2NvdW50XzsKKworICAgICAgICAvKiBTdGFydCBhIG5ldyBnZW5lcmF0aW9uLiAqLworICAgICAgICBjdi0+d2FpdF9nZW5lcmF0aW9uX2NvdW50XysrOworICAgIH0KKworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7Cit9CisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfc2lnbmFsKCBrbXBfd2luMzJfY29uZF90ICpjdiApCit7CisgICAgX19rbXBfd2luMzJfY29uZF9icm9hZGNhc3QoIGN2ICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2VuYWJsZSggaW50IG5ld19zdGF0ZSApCit7CisgICAgaWYgKF9fa21wX2luaXRfcnVudGltZSkKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworfQorCit2b2lkCitfX2ttcF9kaXNhYmxlKCBpbnQgKm9sZF9zdGF0ZSApCit7CisgICAgKm9sZF9zdGF0ZSA9IDA7CisKKyAgICBpZiAoX19rbXBfaW5pdF9ydW50aW1lKQorICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgLyogZG8gbm90aGluZyAqLworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmICggISBUQ1JfNCggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdCApICkgeworICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgX19rbXBfd2luMzJfY29uZF9pbml0KCAgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgICAgIF9fa21wX3dpbjMyX211dGV4X2luaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICBUQ1dfNCggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdCwgVFJVRSApOworICAgIH0KK30KKwordm9pZAorX19rbXBfc3VzcGVuZF91bmluaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaWYgKCBUQ1JfNCggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdCApICkgeworICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlIGluaXRpYWxpemUgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzIHRocmVhZAorICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgX19rbXBfd2luMzJfY29uZF9kZXN0cm95KCAmIHRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgICBfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCAmIHRoLT50aC50aF9zdXNwZW5kX214ICk7CisgICAgICBUQ1dfNCggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdCwgRkFMU0UgKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgcm91dGluZSBwdXRzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcCBhZnRlciBzZXR0aW5nIHRoZQorICogc2xlZXAgYml0IGZvciB0aGUgaW5kaWNhdGVkIGZsYWcgdmFyaWFibGUgdG8gdHJ1ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSggaW50IHRoX2d0aWQsIEMgKmZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0aF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworICAgIHR5cGVuYW1lIEM6OmZsYWdfdCBvbGRfc3BpbjsKKworICAgIEtGX1RSQUNFKCAzMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGVudGVyIGZvciBmbGFnJ3MgbG9jKCVwKVxuIiwgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkgKSApOworCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCggdGggKTsKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBzZXR0aW5nIHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpICkgKTsKKworICAgIC8qIFRPRE86IHNob3VsZG4ndCB0aGlzIHVzZSByZWxlYXNlIHNlbWFudGljcyB0byBlbnN1cmUgdGhhdCBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkCisgICAgICAgZ2V0cyBjYWxsZWQgZmlyc3Q/CisgICAgKi8KKyAgICBvbGRfc3BpbiA9IGZsYWctPnNldF9zbGVlcGluZygpOworCisgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc2V0IHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcCk9PSVkXG4iLAorICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpLCAqKGZsYWctPmdldCgpKSApICk7CisKKyAgICBpZiAoIGZsYWctPmRvbmVfY2hlY2tfdmFsKG9sZF9zcGluKSApIHsKKyAgICAgICAgb2xkX3NwaW4gPSBmbGFnLT51bnNldF9zbGVlcGluZygpOworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBmYWxzZSBhbGFybSwgcmVzZXQgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkpICk7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQrKzsKKyNlbmRpZgorICAgICAgICAvKiBFbmNhcHN1bGF0ZSBpbiBhIGxvb3AgYXMgdGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhpcyBtYXkKKyAgICAgICAgICogIndpdGggbG93IHByb2JhYmlsaXR5IiByZXR1cm4gd2hlbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGhhcworICAgICAgICAgKiBub3QgYmVlbiBzaWduYWxlZCBvciBicm9hZGNhc3QKKyAgICAgICAgICovCisgICAgICAgIGludCBkZWFjdGl2YXRlZCA9IEZBTFNFOworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsICh2b2lkICopZmxhZyk7CisgICAgICAgIHdoaWxlICggZmxhZy0+aXNfc2xlZXBpbmcoKSApIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxNSwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHBlcmZvcm0ga21wX3dpbjMyX2NvbmRfd2FpdCgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICAvLyBNYXJrIHRoZSB0aHJlYWQgYXMgbm8gbG9uZ2VyIGFjdGl2ZSAob25seSBpbiB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wKS4KKyAgICAgICAgICAgIGlmICggISBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZCA9IFRSVUU7CisKKworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoIGZsYWctPmlzX3NsZWVwaW5nKCkgKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNwdXJpb3VzIHdha2V1cFxuIiwgdGhfZ3RpZCApKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgICAgICB9IC8vIHdoaWxlCisKKyAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIGFjdGl2ZSBhZ2FpbiAoaWYgaXQgd2FzIHByZXZpb3VzIG1hcmtlZCBhcyBpbmFjdGl2ZSkKKyAgICAgICAgaWYgKCBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBUQ1JfNCh0aC0+dGgudGhfaW5fcG9vbCkgKSB7CisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigKKyAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworCisgICAgS0ZfVFJBQ0UoIDMwLCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZXhpdFxuIiwgdGhfZ3RpZCApICk7Cit9CisKK3ZvaWQgX19rbXBfc3VzcGVuZF8zMihpbnQgdGhfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcpIHsKKyAgICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9zdXNwZW5kXzY0KGludCB0aF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3N1c3BlbmRfb25jb3JlKGludCB0aF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcpIHsKKyAgICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQorCisKKy8qIFRoaXMgcm91dGluZSBzaWduYWxzIHRoZSB0aHJlYWQgc3BlY2lmaWVkIGJ5IHRhcmdldF9ndGlkIHRvIHdha2UgdXAKKyAqIGFmdGVyIHNldHRpbmcgdGhlIHNsZWVwIGJpdCBpbmRpY2F0ZWQgYnkgdGhlIGZsYWcgYXJndW1lbnQgdG8gRkFMU0UKKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVzdW1lX3RlbXBsYXRlKCBpbnQgdGFyZ2V0X2d0aWQsIEMgKmZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0YXJnZXRfZ3RpZF07CisgICAgaW50IHN0YXR1czsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBndGlkID0gVENSXzQoX19rbXBfaW5pdF9ndGlkKSA/IF9fa21wX2dldF9ndGlkKCkgOiAtMTsKKyNlbmRpZgorCisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgd2FudHMgdG8gd2FrZXVwIFQjJWQgZW50ZXJcbiIsIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisKKyAgICBpZiAoIWZsYWcpIHsgLy8gY29taW5nIGZyb20gX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcgorICAgICAgICBmbGFnID0gKEMgKil0aC0+dGgudGhfc2xlZXBfbG9jOworICAgIH0KKworICAgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGUgZmxhZyBpcyBudWxsIG9yIGl0cyB0eXBlIGhhcyBjaGFuZ2VkLiBJZiBzbywgc29tZW9uZSBlbHNlIHdva2UgaXQgdXAuCisgICAgaWYgKCFmbGFnIHx8IGZsYWctPmdldF90eXBlKCkgIT0gZmxhZy0+Z2V0X3B0cl90eXBlKCkpIHsgLy8gZ2V0X3B0cl90eXBlIHNpbXBseSBzaG93cyB3aGF0IGZsYWcgd2FzIGNhc3QgdG8KKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlOiBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIE5VTEwgKSApOworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW4gPSBmbGFnLT51bnNldF9zbGVlcGluZygpOworICAgICAgICBpZiAoICFmbGFnLT5pc19zbGVlcGluZ192YWwob2xkX3NwaW4pICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlOiBmbGFnJ3MgbG9jKCVwKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpLCBvbGRfc3BpbiwgKihmbGFnLT5nZXQoKSkgKSApOworICAgICAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBhYm91dCB0byB3YWtldXAgVCMlZCwgcmVzZXQgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCkgKSApOworCisKKyAgICBfX2ttcF93aW4zMl9jb25kX3NpZ25hbCggICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nIGFmdGVyIHNpZ25hbGluZyB3YWtlIHVwIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCApICk7Cit9CisKK3ZvaWQgX19rbXBfcmVzdW1lXzMyKGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9yZXN1bWVfNjQoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV9vbmNvcmUoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3lpZWxkKCBpbnQgY29uZCApCit7CisgICAgaWYgKGNvbmQpCisgICAgICAgIFNsZWVwKDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKQoreworICAgIEtBX1RSQUNFKCA1MCwgKCJfX2ttcF9ndGlkX3NldF9zcGVjaWZpYzogVCMlZCBrZXk6JWRcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKTsKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9pbml0X3J1bnRpbWUgKTsKKyAgICBpZiggISBUbHNTZXRWYWx1ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgKExQVk9JRCkoZ3RpZCsxKSkgKQorICAgICAgICBLTVBfRkFUQUwoIFRMU1NldFZhbHVlRmFpbGVkICk7Cit9CisKK2ludAorX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKQoreworICAgIGludCBndGlkOworICAgIGlmKCAhX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCBndGlkICkpOworICAgIHJldHVybiBndGlkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisKKy8vCisvLyBPbmx5IDEgRFdPUkQgaW4gdGhlIG1hc2sgc2hvdWxkIGhhdmUgYW55IHByb2NzIHNldC4KKy8vIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kZXgsIG9yIC0xIGZvciBhbiBpbnZhbGlkIG1hc2suCisvLworaW50CitfX2ttcF9nZXRfcHJvY19ncm91cCgga21wX2FmZmluX21hc2tfdCBjb25zdCAqbWFzayApCit7CisgICAgaW50IGk7CisgICAgaW50IGdyb3VwID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgaSsrKSB7CisgICAgICAgIGlmIChtYXNrW2ldID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChncm91cCA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZ3JvdXAgPSBpOworICAgIH0KKyAgICByZXR1cm4gZ3JvdXA7Cit9CisKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworaW50CitfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IgKQoreworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBmb3IgYSB2YWxpZCBtYXNrLgorICAgICAgICAvLworICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgaW50IGdyb3VwID0gX19rbXBfZ2V0X3Byb2NfZ3JvdXAoIG1hc2sgKTsKKyAgICAgICAgaWYgKGdyb3VwIDwgMCkgeworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGJpdCB2ZWN0b3IgaW50byBhIEdST1VQX0FGRklOSVRZIHN0cnVjdAorICAgICAgICAvLyBhbmQgbWFrZSB0aGUgc3lzdGVtIGNhbGwgdG8gc2V0IGFmZmluaXR5LgorICAgICAgICAvLworICAgICAgICBnYS5Hcm91cCA9IGdyb3VwOworICAgICAgICBnYS5NYXNrID0gbWFza1tncm91cF07CisgICAgICAgIGdhLlJlc2VydmVkWzBdID0gZ2EuUmVzZXJ2ZWRbMV0gPSBnYS5SZXNlcnZlZFsyXSA9IDA7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICBpZiAoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSwgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICB7CisgICAgICAgIGlmICghU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCBHZXRDdXJyZW50VGhyZWFkKCksICptYXNrICkpIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFRocmVhZEFmZk1hc2sgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK19fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICAgICAgR1JPVVBfQUZGSU5JVFkgZ2E7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMKTsKKworICAgICAgICBpZiAoX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJHZXRUaHJlYWRHcm91cEFmZmluaXR5KCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZ2EuR3JvdXAgPCAwKSB8fCAoZ2EuR3JvdXAgPiBfX2ttcF9udW1fcHJvY19ncm91cHMpCisgICAgICAgICAgfHwgKGdhLk1hc2sgPT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIG1hc2tbZ2EuR3JvdXBdID0gZ2EuTWFzazsKKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgbmV3TWFzaywgc3lzTWFzaywgcmV0dmFsOworCisgICAgICAgIGlmICghR2V0UHJvY2Vzc0FmZmluaXR5TWFzayhHZXRDdXJyZW50UHJvY2VzcygpLCAmbmV3TWFzaywgJnN5c01hc2spKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIkdldFByb2Nlc3NBZmZpbml0eU1hc2soKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IFNldFRocmVhZEFmZmluaXR5TWFzayhHZXRDdXJyZW50VGhyZWFkKCksIG5ld01hc2spOworICAgICAgICBpZiAoISByZXR2YWwpIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBuZXdNYXNrID0gU2V0VGhyZWFkQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRUaHJlYWQoKSwgcmV0dmFsKTsKKyAgICAgICAgaWYgKCEgbmV3TWFzaykgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJTZXRUaHJlYWRBZmZpbml0eU1hc2soKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICptYXNrID0gcmV0dmFsOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoIGludCBwcm9jICkKK3sKKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9ybSB0aGUgR1JPVVBfQUZGSU5JVFkgc3RydWN0IGRpcmVjdGx5LCByYXRoZXIgdGhhbiBmaWxsaW5nCisgICAgICAgIC8vIG91dCBhIGJpdCB2ZWN0b3IgYW5kIGNhbGxpbmcgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLgorICAgICAgICAvLworICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgocHJvYyA+PSAwKSAmJiAocHJvYyA8IChfX2ttcF9udW1fcHJvY19ncm91cHMKKyAgICAgICAgICAgKiBDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKSkpOworICAgICAgICBnYS5Hcm91cCA9IHByb2MgLyAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgIGdhLk1hc2sgPSAodW5zaWduZWQgbG9uZyBsb25nKTEgPDwgKHByb2MgJSAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSkpOworICAgICAgICBnYS5SZXNlcnZlZFswXSA9IGdhLlJlc2VydmVkWzFdID0gZ2EuUmVzZXJ2ZWRbMl0gPSAwOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkoR2V0Q3VycmVudFRocmVhZCgpLCAmZ2EsIE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeyAvLyBBQzogY29udGludWUgc2lsZW50bHkgaWYgbm90IHZlcmJvc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgbWFzazsKKyAgICAgICAgS01QX0NQVV9aRVJPKCZtYXNrKTsKKyAgICAgICAgS01QX0NQVV9TRVQocHJvYywgJm1hc2spOworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCZtYXNrLCBUUlVFKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCBjb25zdCBjaGFyICplbnZfdmFyICkKK3sKKyAgICAvLworICAgIC8vIEFsbCB2ZXJzaW9ucyBvZiBXaW5kb3dzKiBPUyAoc2luY2UgV2luICc5NSkgc3VwcG9ydCBTZXRUaHJlYWRBZmZpbml0eU1hc2soKS4KKyAgICAvLworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgS01QX0FGRklOSVRZX0VOQUJMRShfX2ttcF9udW1fcHJvY19ncm91cHMqc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKTsKKyNlbHNlCisgICAgS01QX0FGRklOSVRZX0VOQUJMRShzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAsICgKKyAgICAgICAgIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAiV2luZG93cyogT1MgYWZmaW5pdHkgaW50ZXJmYWNlIGZ1bmN0aW9uYWwgKG1hc2sgc2l6ZSA9ICUiIEtNUF9TSVpFX1RfU1BFQyAiKS5cbiIsCisgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZQorICAgICkgKTsKK30KKworZG91YmxlCitfX2ttcF9yZWFkX2NwdV90aW1lKCB2b2lkICkKK3sKKyAgICBGSUxFVElNRSAgICBDcmVhdGlvblRpbWUsIEV4aXRUaW1lLCBLZXJuZWxUaW1lLCBVc2VyVGltZTsKKyAgICBpbnQgICAgICAgICBzdGF0dXM7CisgICAgZG91YmxlICAgICAgY3B1X3RpbWU7CisKKyAgICBjcHVfdGltZSA9IDA7CisKKyAgICBzdGF0dXMgPSBHZXRQcm9jZXNzVGltZXMoIEdldEN1cnJlbnRQcm9jZXNzKCksICZDcmVhdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXhpdFRpbWUsICZLZXJuZWxUaW1lLCAmVXNlclRpbWUgKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgZG91YmxlICBzZWMgPSAwOworCisgICAgICAgIHNlYyArPSBLZXJuZWxUaW1lLmR3SGlnaERhdGVUaW1lOworICAgICAgICBzZWMgKz0gVXNlclRpbWUuZHdIaWdoRGF0ZVRpbWU7CisKKyAgICAgICAgLyogU2hpZnQgbGVmdCBieSAzMiBiaXRzICovCisgICAgICAgIHNlYyAqPSAoZG91YmxlKSAoMSA8PCAxNikgKiAoZG91YmxlKSAoMSA8PCAxNik7CisKKyAgICAgICAgc2VjICs9IEtlcm5lbFRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICAgICAgc2VjICs9IFVzZXJUaW1lLmR3TG93RGF0ZVRpbWU7CisKKyAgICAgICAgY3B1X3RpbWUgKz0gKHNlYyAqIDEwMC4wKSAvIEtNUF9OU0VDX1BFUl9TRUM7CisgICAgfQorCisgICAgcmV0dXJuIGNwdV90aW1lOworfQorCitpbnQKK19fa21wX3JlYWRfc3lzdGVtX2luZm8oIHN0cnVjdCBrbXBfc3lzX2luZm8gKmluZm8gKQoreworICAgIGluZm8tPm1heHJzcyAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSB1dGlsaXplZCAoaW4ga2lsb2J5dGVzKSAgICAgKi8KKyAgICBpbmZvLT5taW5mbHQgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB3aXRob3V0IGFueSBJL08gICAgICAgICovCisgICAgaW5mby0+bWFqZmx0ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gICAgICAqLworICAgIGluZm8tPm5zd2FwICAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkgKi8KKyAgICBpbmZvLT5pbmJsb2NrID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gaW5wdXQgICovCisgICAgaW5mby0+b3VibG9jayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIG91dHB1dCAqLworICAgIGluZm8tPm52Y3N3ICAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIHZvbHVudGFyaWx5ICAgICAgKi8KKyAgICBpbmZvLT5uaXZjc3cgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyBmb3JjZWQgICAgICAgICAgICovCisKKyAgICByZXR1cm4gMTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCit2b2lkCitfX2ttcF9ydW50aW1lX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIFNZU1RFTV9JTkZPIGluZm87CisgICAga21wX3N0cl9idWZfdCBwYXRoOworICAgIFVJTlQgcGF0aF9zaXplOworCisgICAgaWYgKCBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OworCisjaWYgS01QX0RZTkFNSUNfTElCCisgICAgLyogUGluIGR5bmFtaWMgbGlicmFyeSBmb3IgdGhlIGxpZmV0aW1lIG9mIGFwcGxpY2F0aW9uICovCisgICAgeworICAgICAgICAvLyBGaXJzdCwgdHVybiBvZmYgZXJyb3IgbWVzc2FnZSBib3hlcworICAgICAgICBVSU5UIGVycl9tb2RlID0gU2V0RXJyb3JNb2RlIChTRU1fRkFJTENSSVRJQ0FMRVJST1JTKTsKKyAgICAgICAgSE1PRFVMRSBoOworICAgICAgICBCT09MIHJldCA9IEdldE1vZHVsZUhhbmRsZUV4KCBHRVRfTU9EVUxFX0hBTkRMRV9FWF9GTEFHX0ZST01fQUREUkVTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxHRVRfTU9EVUxFX0hBTkRMRV9FWF9GTEFHX1BJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBDVFNUUikmX19rbXBfc2VyaWFsX2luaXRpYWxpemUsICZoKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVDIoaCAmJiByZXQsICJPcGVuTVAgUlRMIGNhbm5vdCBmaW5kIGl0c2VsZiBsb2FkZWQiKTsKKyAgICAgICAgU2V0RXJyb3JNb2RlIChlcnJfbW9kZSk7ICAgLy8gUmVzdG9yZSBlcnJvciBtb2RlCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IGR5bmFtaWMgbGlicmFyeSBwaW5uZWRcbiIpICk7CisgICAgfQorI2VuZGlmCisKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggJiBfX2ttcF93aW4zMl9zZWN0aW9uLCAiQ3JpdGljYWwgU2VjdGlvbiIgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljaygpOworCisgICAgI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorICAgICAgICBpZiAoICEgX19rbXBfY3B1aW5mby5pbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgIF9fa21wX3F1ZXJ5X2NwdWlkKCAmIF9fa21wX2NwdWluZm8gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgLyogU2V0IHVwIG1pbmltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gc3dpdGNoIHRvIFRMUyBndGlkICovCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmICEgZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyAgICAgICAgLy8gV2luZG93cyogT1MsIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgICAvKgorICAgICAgICAgICAgTmV3IHRocmVhZCBtYXkgdXNlIHN0YWNrIHNwYWNlIHByZXZpb3VzbHkgdXNlZCBieSBhbm90aGVyIHRocmVhZCwgY3VycmVudGx5IHRlcm1pbmF0ZWQuCisgICAgICAgICAgICBPbiBXaW5kb3dzKiBPUywgaW4gY2FzZSBvZiBzdGF0aWMgbGlua2luZywgd2UgZG8gbm90IGtub3cgdGhlIG1vbWVudCBvZiB0aHJlYWQgdGVybWluYXRpb24sCisgICAgICAgICAgICBhbmQgb3VyIHN0cnVjdHVyZXMgKF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QgYXJyYXlzKSBhcmUgc3RpbGwga2VlcCBpbmZvIGFib3V0IGRlYWQKKyAgICAgICAgICAgIHRocmVhZHMuIFRoaXMgbGVhZHMgdG8gcHJvYmxlbSBpbiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpIGZ1bmN0aW9uOiBpdCB3cm9uZ2x5CisgICAgICAgICAgICBmaW5kcyBndGlkIChieSBzZWFyY2hpbmcgdGhyb3VnaCBzdGFjayBhZGRyZXNzZXMgb2YgYWxsIGtub3duIHRocmVhZHMpIGZvciB1bnJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGZvcmVpZ24gdHJlYWQuCisKKyAgICAgICAgICAgIFNldHRpbmcgX19rbXBfdGxzX2d0aWRfbWluIHRvIDAgd29ya2Fyb3VuZHMgdGhpcyBwcm9ibGVtOiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpCisgICAgICAgICAgICBkb2VzIG5vdCBzZWFyY2ggdGhyb3VnaCBzdGFja3MsIGJ1dCBnZXQgZ3RpZCBmcm9tIFRMUyBpbW1lZGlhdGVseS4KKworICAgICAgICAgICAgLS1sbgorICAgICAgICAqLworICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW4gPSAwOworICAgICNlbHNlCisgICAgICAgIF9fa21wX3Rsc19ndGlkX21pbiA9IEtNUF9UTFNfR1RJRF9NSU47CisgICAgI2VuZGlmCisKKyAgICAvKiBmb3IgdGhlIHN0YXRpYyBsaWJyYXJ5ICovCisgICAgaWYgKCAhX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApIHsKKyAgICAgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSA9IFRsc0FsbG9jKCk7CisgICAgICAgIGlmKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ID09IFRMU19PVVRfT0ZfSU5ERVhFUyApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggVExTT3V0T2ZJbmRleGVzICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vCisgICAgLy8gTG9hZCBudGRsbC5kbGwuCisgICAgLy8KKyAgICAvKgorICAgICAgICBTaW1wbGUKKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZSggIm50ZGxsLmRsIiApCisgICAgICAgIGlzIG5vdCBzdWl0YWJsZSBkdWUgdG8gc2VjdXJpdHkgaXNzdWUgKHNlZQorICAgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdGVjaG5ldC9zZWN1cml0eS9hZHZpc29yeS8yMjY5NjM3Lm1zcHgpLiBXZSBoYXZlIHRvIHNwZWNpZnkgZnVsbAorICAgICAgICBwYXRoIHRvIHRoZSBsaWJyYXJ5LgorICAgICovCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHBhdGggKTsKKyAgICBwYXRoX3NpemUgPSBHZXRTeXN0ZW1EaXJlY3RvcnkoIHBhdGguc3RyLCBwYXRoLnNpemUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwYXRoX3NpemUgPiAwICk7CisgICAgaWYgKCBwYXRoX3NpemUgPj0gcGF0aC5zaXplICkgeworICAgICAgICAvLworICAgICAgICAvLyBCdWZmZXIgaXMgdG9vIHNob3J0LiAgRXhwYW5kIHRoZSBidWZmZXIgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCAmIHBhdGgsIHBhdGhfc2l6ZSApOworICAgICAgICBwYXRoX3NpemUgPSBHZXRTeXN0ZW1EaXJlY3RvcnkoIHBhdGguc3RyLCBwYXRoLnNpemUgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcGF0aF9zaXplID4gMCApOworICAgIH07IC8vIGlmCisgICAgaWYgKCBwYXRoX3NpemUgPiAwICYmIHBhdGhfc2l6ZSA8IHBhdGguc2l6ZSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm93IHdlIGhhdmUgc3lzdGVtIGRpcmVjdG9yeSBuYW1lIGluIHRoZSBidWZmZXIuCisgICAgICAgIC8vIEFwcGVuZCBiYWNrc2xhc2ggYW5kIG5hbWUgb2YgZGxsIHRvIGZvcm0gZnVsbCBwYXRoLAorICAgICAgICAvLworICAgICAgICBwYXRoLnVzZWQgPSBwYXRoX3NpemU7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgcGF0aCwgIlxcJXMiLCAibnRkbGwuZGxsIiApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdyBsb2FkIG50ZGxsIHVzaW5nIGZ1bGwgcGF0aC4KKyAgICAgICAgLy8KKyAgICAgICAgbnRkbGwgPSBHZXRNb2R1bGVIYW5kbGUoIHBhdGguc3RyICk7CisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggbnRkbGwgIT0gTlVMTCApOworICAgIGlmICggbnRkbGwgIT0gTlVMTCApIHsKKyAgICAgICAgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gKE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90KSBHZXRQcm9jQWRkcmVzcyggbnRkbGwsICJOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24iICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiAhPSBOVUxMICk7CisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAvLworICAgIC8vIExvYWQga2VybmVsMzIuZGxsLgorICAgIC8vIFNhbWUgY2F2ZWF0IC0gbXVzdCB1c2UgZnVsbCBzeXN0ZW0gcGF0aCBuYW1lLgorICAgIC8vCisgICAgaWYgKCBwYXRoX3NpemUgPiAwICYmIHBhdGhfc2l6ZSA8IHBhdGguc2l6ZSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVHJ1bmNhdGUgdGhlIGJ1ZmZlciBiYWNrIHRvIGp1c3QgdGhlIHN5c3RlbSBwYXRoIGxlbmd0aCwKKyAgICAgICAgLy8gZGlzY2FyZGluZyAiXFxudGRsbC5kbGwiLCBhbmQgcmVwbGFjaW5nIGl0IHdpdGggImtlcm5lbDMyLmRsbCIuCisgICAgICAgIC8vCisgICAgICAgIHBhdGgudXNlZCA9IHBhdGhfc2l6ZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiXFwlcyIsICJrZXJuZWwzMi5kbGwiICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTG9hZCBrZXJuZWwzMi5kbGwgdXNpbmcgZnVsbCBwYXRoLgorICAgICAgICAvLworICAgICAgICBrZXJuZWwzMiA9IEdldE1vZHVsZUhhbmRsZSggcGF0aC5zdHIgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZToga2VybmVsMzIuZGxsID0gJXNcbiIsIHBhdGguc3RyICkgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBMb2FkIHRoZSBmdW5jdGlvbiBwb2ludGVycyB0byBrZXJuZWwzMi5kbGwgcm91dGluZXMKKyAgICAgICAgLy8gdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdCBvbiB0aGlzIHN5c3RlbS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBrZXJuZWwzMiAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgPSAoa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIkdldEFjdGl2ZVByb2Nlc3NvckNvdW50IiApOworICAgICAgICAgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCA9IChrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90KSBHZXRQcm9jQWRkcmVzcygga2VybmVsMzIsICJHZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50IiApOworICAgICAgICAgICAgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IChrbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KSBHZXRQcm9jQWRkcmVzcygga2VybmVsMzIsICJHZXRUaHJlYWRHcm91cEFmZmluaXR5IiApOworICAgICAgICAgICAgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IChrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KSBHZXRQcm9jQWRkcmVzcygga2VybmVsMzIsICJTZXRUaHJlYWRHcm91cEFmZmluaXR5IiApOworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9ICVwXG4iLCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCApICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gJXBcbiIsIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgKSApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTpfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gJXBcbiIsIF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgKSApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9ICVwXG4iLCBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICkgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IHNpemVvZihrbXBfYWZmaW5fbWFza190KSA9ICVkXG4iLCBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkgKSApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2VlIGlmIGdyb3VwIGFmZmluaXR5IGlzIHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbS4KKyAgICAgICAgICAgIC8vIElmIHNvLCBjYWxjdWxhdGUgdGhlICNncm91cHMgYW5kICNwcm9jcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBHcm91cCBhZmZpbml0eSB3YXMgaW50cm9kdWNlZCB3aXRoIFdpbmRvd3MqIDcgT1MgYW5kCisgICAgICAgICAgICAvLyBXaW5kb3dzKiBTZXJ2ZXIgMjAwOCBSMiBPUy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICggX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggKCBfX2ttcF9udW1fcHJvY19ncm91cHMKKyAgICAgICAgICAgICAgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50KCkgKSA+IDEgKSApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBPUyBwcm9jcy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogJWQgcHJvY2Vzc29yIGdyb3VwcyBkZXRlY3RlZFxuIiwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzICkgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3hwcm9jID0gMDsKKworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIHNpemUgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCggaSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF94cHJvYyArPSBzaXplOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBwcm9jIGdyb3VwICVkIHNpemUgPSAlZFxuIiwgaSwgc2l6ZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6ICVkIHByb2Nlc3NvciBncm91cHMgZGV0ZWN0ZWRcbiIsIF9fa21wX251bV9wcm9jX2dyb3VwcyApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBfX2ttcF9udW1fcHJvY19ncm91cHMgPD0gMSApIHsKKyAgICAgICAgR2V0U3lzdGVtSW5mbyggJiBpbmZvICk7CisgICAgICAgIF9fa21wX3hwcm9jID0gaW5mby5kd051bWJlck9mUHJvY2Vzc29yczsKKyAgICB9CisjZWxzZQorICAgIEdldFN5c3RlbUluZm8oICYgaW5mbyApOworICAgIF9fa21wX3hwcm9jID0gaW5mby5kd051bWJlck9mUHJvY2Vzc29yczsKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgIC8vCisgICAgLy8gSWYgdGhlIE9TIHNhaWQgdGhlcmUgd2VyZSAwIHByb2NzLCB0YWtlIGEgZ3Vlc3MgYW5kIHVzZSBhIHZhbHVlIG9mIDIuCisgICAgLy8gVGhpcyBpcyBkb25lIGZvciBMaW51eCogT1MsIGFsc28uICBEbyB3ZSBuZWVkIGVycm9yIC8gd2FybmluZz8KKyAgICAvLworICAgIGlmICggX19rbXBfeHByb2MgPD0gMCApIHsKKyAgICAgICAgX19rbXBfeHByb2MgPSAyOworICAgIH0KKworICAgIEtBX1RSQUNFKCA1LCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogdG90YWwgcHJvY2Vzc29ycyA9ICVkXG4iLCBfX2ttcF94cHJvYykgKTsKKworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBwYXRoICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2luaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBUUlVFOworfSAvLyBfX2ttcF9ydW50aW1lX2luaXRpYWxpemUKKwordm9pZAorX19rbXBfcnVudGltZV9kZXN0cm95KCB2b2lkICkKK3sKKyAgICBpZiAoICEgX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9kZXN0cm95KCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLyogd2UgY2FuJ3QgRGVsZXRlQ3JpdGljYWxzZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsgKi8KKyAgICAvKiBkdWUgdG8gdGhlIEtYX1RSQUNFKCkgY29tbWFuZHMgKi8KKyAgICBLQV9UUkFDRSggNDAsICgiX19rbXBfcnVudGltZV9kZXN0cm95XG4iICkpOworCisgICAgaWYoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSB7CisgICAgICAgIFRsc0ZyZWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICAgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSA9IDA7CisgICAgfQorCisgICAgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKCk7CisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsKKworICAgIG50ZGxsID0gTlVMTDsKKyAgICBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gPSBOVUxMOworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAga2VybmVsMzIgPSBOVUxMOworICAgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ID0gTlVMTDsKKyAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gTlVMTDsKKyAgICBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKKyAgICBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworfQorCisKK3ZvaWQKK19fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiggIXRoICkgcmV0dXJuOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3Rlcm1pbmF0ZV90aHJlYWQ6IGtpbGwgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICBpZiAoVGVybWluYXRlVGhyZWFkKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIChEV09SRCkgLTEpID09IEZBTFNFKSB7CisgICAgICAgIC8qIEl0J3MgT0ssIHRoZSB0aHJlYWQgbWF5IGhhdmUgZXhpdGVkIGFscmVhZHkgKi8KKyAgICB9CisgICAgX19rbXBfZnJlZV9oYW5kbGUoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSggdm9pZCApCit7CisgICAgQk9PTCBzdGF0dXM7CisgICAgTEFSR0VfSU5URUdFUiB0aW1lOworICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIHRpbWUgKTsKKyAgICBfX2ttcF93aW4zMl90aW1lID0gKGttcF9pbnQ2NCkgdGltZS5RdWFkUGFydDsKK30KKwordm9pZAorX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljayggdm9pZCApCit7CisgICAgeworICBCT09MIHN0YXR1czsKKyAgTEFSR0VfSU5URUdFUiBmcmVxOworCisgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koICYgZnJlcSApOworICBpZiAoISBzdGF0dXMpIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgIlF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKSIgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworCisgIH0KKyAgZWxzZSB7CisgICAgICBfX2ttcF93aW4zMl90aWNrID0gKChkb3VibGUpIDEuMCkgLyAoZG91YmxlKSBmcmVxLlF1YWRQYXJ0OworICB9CisgICAgfQorfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIGZvciB0aGUgdXNlciAqLworCit2b2lkCitfX2ttcF9lbGFwc2VkKCBkb3VibGUgKnQgKQoreworICAgIEJPT0wgc3RhdHVzOworICAgIExBUkdFX0lOVEVHRVIgbm93OworICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIG5vdyApOworICAgICp0ID0gKChkb3VibGUpIG5vdy5RdWFkUGFydCkgKiBfX2ttcF93aW4zMl90aWNrOworfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aWNrIGZvciB0aGUgdXNlciAqLworCit2b2lkCitfX2ttcF9lbGFwc2VkX3RpY2soIGRvdWJsZSAqdCApCit7CisgICAgKnQgPSBfX2ttcF93aW4zMl90aWNrOworfQorCit2b2lkCitfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCBkb3VibGUgKmRlbHRhICkKK3sKKworICAgIGlmIChkZWx0YSAhPSBOVUxMKSB7CisgICAgICAgIEJPT0wgc3RhdHVzOworICAgICAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKworICAgICAgICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJiBub3cgKTsKKworICAgICAgICAqZGVsdGEgPSAoKGRvdWJsZSkgKCgoa21wX2ludDY0KSBub3cuUXVhZFBhcnQpIC0gX19rbXBfd2luMzJfdGltZSkpCisgICAgKiBfX2ttcF93aW4zMl90aWNrOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqIF9fc3RkY2FsbAorX19rbXBfbGF1bmNoX3dvcmtlciggdm9pZCAqYXJnICkKK3sKKyAgICB2b2xhdGlsZSB2b2lkICpzdGFja19kYXRhOworICAgIHZvaWQgKmV4aXRfdmFsOworICAgIHZvaWQgKnBhZGRpbmcgPSAwOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gKGttcF9pbmZvX3QgKikgYXJnOworICAgIGludCBndGlkOworCisgICAgZ3RpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICNlcnJvciAiVGhpcyBkZWZpbmUgY2F1c2VzIHByb2JsZW1zIHdpdGggTG9hZExpYnJhcnkoKSArIGRlY2xzcGVjKHRocmVhZCkgIiBcCisgICAgICAgICJvbiBXaW5kb3dzKiBPUy4gIFNlZSBDUTUwNTY0LCB0ZXN0cyBrbXBfbG9hZF9saWJyYXJ5Ki5jIGFuZCB0aGlzIE1TRE4gIiBcCisgICAgICAgICJyZWZlcmVuY2U6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTE4ODE2IgorICAgIC8vX19rbXBfZ3RpZCA9IGd0aWQ7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBndGlkLCBGQUxTRSApOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIC8vCisgICAgLy8gU2V0IHRoZSBGUCBjb250cm9sIHJlZ3MgdG8gYmUgYSBjb3B5IG9mCisgICAgLy8gdGhlIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uIHRocmVhZCdzLgorICAgIC8vCisgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgX19rbXBfbG9hZF9teGNzciggJl9fa21wX2luaXRfbXhjc3IgKTsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBpZiAoIF9fa21wX3N0a29mZnNldCA+IDAgJiYgZ3RpZCA+IDAgKSB7CisgICAgICAgIHBhZGRpbmcgPSBLTVBfQUxMT0NBKCBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICk7CisgICAgfQorCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggJnRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIFRDV180KCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBUUlVFICk7CisKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPCAyICkgeyAvLyBjaGVjayBzdGFjayBvbmx5IGlmIGl0IGlzIHVzZWQgdG8gZ2V0IGd0aWQKKyAgICAgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICAgICAgS01QX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cgPT0gRkFMU0UgKTsKKyAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGhpc190aHIgKTsKKyAgICB9CisgICAgS01QX01CKCk7CisgICAgZXhpdF92YWwgPSBfX2ttcF9sYXVuY2hfdGhyZWFkKCB0aGlzX3RociApOworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoICZ0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlICk7CisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIEZBTFNFICk7CisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIGV4aXRfdmFsOworfQorCisKKy8qIFRoZSBtb25pdG9yIHRocmVhZCBjb250cm9scyBhbGwgb2YgdGhlIHRocmVhZHMgaW4gdGhlIGNvbXBsZXggKi8KKwordm9pZCAqIF9fc3RkY2FsbAorX19rbXBfbGF1bmNoX21vbml0b3IoIHZvaWQgKmFyZyApCit7CisgICAgRFdPUkQgICAgICAgIHdhaXRfc3RhdHVzOworICAgIGttcF90aHJlYWRfdCBtb25pdG9yOworICAgIGludCAgICAgICAgICBzdGF0dXM7CisgICAgaW50ICAgICAgICAgIGludGVydmFsOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gKGttcF9pbmZvX3QgKikgYXJnOworCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X21vbml0b3IpOworICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDIgKTsgICAgLy8gQUM6IFNpZ25hbCB0aGUgbGlicmFyeSB0aGF0IG1vbml0b3IgaGFzIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhpZGUgIjIiIGluIGVudW0gKGxpa2Uge3RydWUsZmFsc2Usc3RhcnRlZH0pCisgICAgdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc190aHJlYWRfaWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgVFJVRSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiBsYXVuY2hlZFxuIiApICk7CisKKyAgICBtb25pdG9yID0gR2V0Q3VycmVudFRocmVhZCgpOworCisgICAgLyogc2V0IHRocmVhZCBwcmlvcml0eSAqLworICAgIHN0YXR1cyA9IFNldFRocmVhZFByaW9yaXR5KCBtb25pdG9yLCBUSFJFQURfUFJJT1JJVFlfSElHSEVTVCApOworICAgIGlmICghIHN0YXR1cykgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkUHJpb3JpdHkgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKworICAgIC8qIHJlZ2lzdGVyIHVzIGFzIG1vbml0b3IgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggS01QX0dUSURfTU9OSVRPUiApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgI2Vycm9yICJUaGlzIGRlZmluZSBjYXVzZXMgcHJvYmxlbXMgd2l0aCBMb2FkTGlicmFyeSgpICsgZGVjbHNwZWModGhyZWFkKSAiIFwKKyAgICAgICAgIm9uIFdpbmRvd3MqIE9TLiAgU2VlIENRNTA1NjQsIHRlc3RzIGttcF9sb2FkX2xpYnJhcnkqLmMgYW5kIHRoaXMgTVNETiAiIFwKKyAgICAgICAgInJlZmVyZW5jZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg4MTYiCisgICAgLy9fX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfaWdub3JlKCk7ICAgIC8vIEluc3RydWN0IEludGVsKFIpIFRocmVhZGluZyBUb29scyB0byBpZ25vcmUgbW9uaXRvciB0aHJlYWQuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBpbnRlcnZhbCA9ICggMTAwMCAvIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKworICAgIHdoaWxlICghIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICAgICAgLyogIFRoaXMgdGhyZWFkIG1vbml0b3JzIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdXBkYXRlXG4iICkgKTsKKworICAgICAgICB3YWl0X3N0YXR1cyA9IFdhaXRGb3JTaW5nbGVPYmplY3QoIF9fa21wX21vbml0b3JfZXYsIGludGVydmFsICk7CisKKyAgICAgICAgaWYgKHdhaXRfc3RhdHVzID09IFdBSVRfVElNRU9VVCkgeworICAgICAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLAorICAgICAgICAgICAgICBUQ1JfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUgKSArIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogZmluaXNoZWRcbiIgKSApOworCisgICAgc3RhdHVzID0gU2V0VGhyZWFkUHJpb3JpdHkoIG1vbml0b3IsIFRIUkVBRF9QUklPUklUWV9OT1JNQUwgKTsKKyAgICBpZiAoISBzdGF0dXMpIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFRocmVhZFByaW9yaXR5ICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCAhPSAwKSB7CisgICAgICAgIC8qIG5vdyB3ZSBuZWVkIHRvIHRlcm1pbmF0ZSB0aGUgd29ya2VyIHRocmVhZHMgICAqLworICAgICAgICAvKiB0aGUgdmFsdWUgb2YgdF9hYm9ydCBpcyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworCisgICAgICAgIGludCBndGlkOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdGVybWluYXRlIHNpZz0lZFxuIiwgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpICkgKTsKKworICAgICAgICAvKiB0ZXJtaW5hdGUgdGhlIE9wZW5NUCB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICAvKiBUT0RPIHRoaXMgaXMgbm90IHZhbGlkIGZvciBzaWJsaW5nIHRocmVhZHMhIQorICAgICAgICAgKiB0aGUgdWJlciBtYXN0ZXIgbWlnaHQgbm90IGJlIDAgYW55bW9yZS4uICovCisgICAgICAgIGZvciAoZ3RpZCA9IDE7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2d0aWQpCisgICAgICAgICAgICBfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBndGlkICk7CisKKyAgICAgICAgX19rbXBfY2xlYW51cCgpOworCisgICAgICAgIFNsZWVwKCAwICk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiByYWlzZSBzaWc9JWRcbiIsIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KSApICk7CisKKyAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPiAwKSB7CisgICAgICAgICAgICByYWlzZSggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApOworICAgICAgICB9CisgICAgfQorCisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIEZBTFNFICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gYXJnOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICkKK3sKKyAgICBrbXBfdGhyZWFkX3QgICBoYW5kbGU7CisgICAgRFdPUkQgICAgICAgICAgaWRUaHJlYWQ7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworICAgIGlmICggS01QX1VCRVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgaW50ICAgICBzdGFja19kYXRhOworCisgICAgICAgIC8qIFRPRE86IEdldEN1cnJlbnRUaHJlYWQoKSByZXR1cm5zIGEgcHNldWRvLWhhbmRsZSB0aGF0IGlzIHVuc3VpdGFibGUgZm9yIG90aGVyIHRocmVhZHMgdG8gdXNlLgorICAgICAgICAgICBJcyBpdCBhcHByb3ByaWF0ZSB0byBqdXN0IHVzZSBHZXRDdXJyZW50VGhyZWFkPyAgV2hlbiBzaG91bGQgd2UgY2xvc2UgdGhpcyBoYW5kbGU/ICBXaGVuCisgICAgICAgICAgIHVucmVnaXN0ZXJpbmcgdGhlIHJvb3Q/CisgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT0wgcmM7CisgICAgICAgICAgICByYyA9IER1cGxpY2F0ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50VGhyZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIHJjICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiIF9fa21wX2NyZWF0ZV93b3JrZXI6IFJPT1QgSGFuZGxlIGR1cGxpY2F0ZWQsIHRoID0gJXAsIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpIDwgMiApIHsgLy8gY2hlY2sgc3RhY2sgb25seSBpZiBpdCBpcyB1c2VkIHRvIGdldCBndGlkCisgICAgICAgICAgICAvKiB3ZSB3aWxsIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgc3RhY2sgcmFuZ2UgaWYgZ3RpZF9tb2RlID09IDEgKi8KKyAgICAgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgMCk7CisgICAgICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIFRSVUUpOworICAgICAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGggKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gKi8KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfd29ya2VyOiBzdGFja19zaXplID0gJSIgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzXG4iLCBzdGFja19zaXplICkgKTsKKworICAgICAgICBzdGFja19zaXplICs9IGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQ7CisKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX3NpemUpOworICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIEZBTFNFKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChiZWZvcmUpIHN0YWNrX3NpemUgPSAlIgorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCAmX19rbXBfbGF1bmNoX3dvcmtlciA9ICVwLCB0aCA9ICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJmlkVGhyZWFkID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCAmaWRUaHJlYWQgKSApOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlID0gQ3JlYXRlVGhyZWFkKCBOVUxMLCAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpIF9fa21wX2xhdW5jaF93b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKSB0aCwgU1RBQ0tfU0laRV9QQVJBTV9JU19BX1JFU0VSVkFUSU9OLCAmaWRUaHJlYWQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChhZnRlcikgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZFRocmVhZCA9ICV1LCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBpZFRocmVhZCwgaGFuZGxlICkgKTsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaGFuZGxlID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7Cit9CisKK2ludAorX19rbXBfc3RpbGxfcnVubmluZyhrbXBfaW5mb190ICp0aCkgeworICAgIHJldHVybiAoV0FJVF9USU1FT1VUID09IFdhaXRGb3JTaW5nbGVPYmplY3QoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCkpOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIGttcF90aHJlYWRfdCAgICAgICAgaGFuZGxlOworICAgIERXT1JEICAgICAgICAgICAgICAgaWRUaHJlYWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBpZGVhbCwgbmV3X2lkZWFsOworCisgICAgaWYoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAvLyBXZSBkb24ndCBuZWVkIG1vbml0b3IgdGhyZWFkIGluIGNhc2Ugb2YgTUFYX0JMT0NLVElNRQorICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHNraXBwaW5nIG1vbml0b3IgdGhyZWFkIGJlY2F1c2Ugb2YgTUFYIGJsb2NrdGltZVxuIiApICk7CisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSAwOyAvLyB0aGlzIG1ha2VzIHJlYXBfbW9uaXRvciBuby1vcAorICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gMDsKKyAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMiApOyAvLyBTaWduYWwgdG8gc3RvcCB3YWl0aW5nIGZvciBtb25pdG9yIGNyZWF0aW9uCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiB0cnkgdG8gY3JlYXRlIG1vbml0b3JcbiIgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBfX2ttcF9tb25pdG9yX2V2ID0gQ3JlYXRlRXZlbnQoIE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMICk7CisgICAgaWYgKCBfX2ttcF9tb25pdG9yX2V2ID09IE5VTEwgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVFdmVudCApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggX19rbXBfbW9uaXRvcl9ldiwgIkV2ZW50IiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSBLTVBfR1RJRF9NT05JVE9SOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworCisgICAgLy8gRklYTUUgLSBvbiBXaW5kb3dzKiBPUywgaWYgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gMCwgZmlndXJlIG91dCBob3cKKyAgICAvLyB0byBhdXRvbWF0aWNhbGx5IGV4cGFuZCBzdGFja3NpemUgYmFzZWQgb24gQ3JlYXRlVGhyZWFkIGVycm9yIGNvZGUuCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgIH0KKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogcmVxdWVzdGVkIHN0YWNrc2l6ZSA9ICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgIChpbnQpIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisKKyAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIDAgKTsKKworICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgKFNJWkVfVCkgX19rbXBfbW9uaXRvcl9zdGtzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpIF9fa21wX2xhdW5jaF9tb25pdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsIFNUQUNLX1NJWkVfUEFSQU1fSVNfQV9SRVNFUlZBVElPTiwgJmlkVGhyZWFkICk7CisgICAgaWYgKGhhbmRsZSA9PSAwKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVUaHJlYWQgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBtb25pdG9yIGNyZWF0ZWQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKK30KKworLyoKKyAgQ2hlY2sgdG8gc2VlIGlmIHRocmVhZCBpcyBzdGlsbCBhbGl2ZS4KKworICBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgICAgICAgIHdpdGggYSBleGl0X3ZhbCA9IGNvZGUuICBCZWNhdXNlIG9mIHRoaXMgd2UgY2FuIG5vdCByZWx5IG9uCisgICAgICAgICBleGl0X3ZhbCBoYXZpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuICBTbyB0aGlzIHJvdXRpbmUgbWF5CisgICAgICAgICByZXR1cm4gU1RJTExfQUxJVkUgaW4gZXhpdF92YWwgZXZlbiBhZnRlciB0aGUgdGhyZWFkIGlzIGRlYWQuCisqLworCitpbnQKK19fa21wX2lzX3RocmVhZF9hbGl2ZSgga21wX2luZm9fdCAqIHRoLCBEV09SRCAqZXhpdF92YWwgKQoreworICAgIERXT1JEIHJjOworICAgIHJjID0gR2V0RXhpdENvZGVUaHJlYWQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgZXhpdF92YWwgKTsKKyAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJHZXRFeGl0Q29kZVRocmVhZCgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gKCAqZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICk7Cit9CisKKwordm9pZAorX19rbXBfZXhpdF90aHJlYWQoCisgICAgaW50IGV4aXRfc3RhdHVzCispIHsKKyAgICBFeGl0VGhyZWFkKCBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCisvKgorICAgIFRoaXMgaXMgYSBjb21tb24gcGFydCBmb3IgYm90aCBfX2ttcF9yZWFwX3dvcmtlcigpIGFuZCBfX2ttcF9yZWFwX21vbml0b3IoKS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfcmVhcF9jb21tb24oIGttcF9pbmZvX3QgKiB0aCApCit7CisgICAgRFdPUkQgZXhpdF92YWw7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF9jb21tb246IHRyeSB0byByZWFwICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgLyoKKyAgICAgICAgMjAwNi0xMC0xOToKKworICAgICAgICBUaGVyZSBhcmUgdHdvIG9wcG9zaXRlIHNpdHVhdGlvbnM6CisKKyAgICAgICAgICAgIDEuIFdpbmRvd3MqIE9TIGtlZXAgdGhyZWFkIGFsaXZlIGFmdGVyIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnIGFuZCBleGl0cyBmcm9tIHRocmVhZAorICAgICAgICAgICAgICAgZnVuY3Rpb24uIChGb3IgZXhhbXBsZSwgc2VlIEM3MDc3MC9RMzk0MjgxICJ1bmxvYWRpbmcgb2YgZGxsIGJhc2VkIG9uIE9NUCBpcyB2ZXJ5CisgICAgICAgICAgICAgICBzbG93Ii4pCisgICAgICAgICAgICAyLiBXaW5kb3dzKiBPUyBtYXkga2lsbCB0aHJlYWQgYmVmb3JlIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnLgorCisgICAgICAgIFJpZ2h0IHNvbHV0aW9uIHNlZW1zIHRvIGJlIHdhaXRpbmcgZm9yICplaXRoZXIqIHRocmVhZCB0ZXJtaW5hdGlvbiAqb3IqIGRzX2FsaXZlIHJlc2V0dGluZy4KKworICAgICovCisKKyAgICB7CisgICAgICAgIC8vIFRPRE86IFRoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gS01QX1dBSVRfWUlFTEQuIE5lZWQgdG8gZ2VuZXJhbGl6ZSBLTVBfV0FJVF9ZSUVMRCB0bworICAgICAgICAvLyBjb3ZlciB0aGlzIHVzYWdlIGFsc28uCisgICAgICAgIHZvaWQgKiBvYmogPSBOVUxMOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIHNwaW5zOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopICYgdGgtPnRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgICAgICBkbyB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICAgICAgfSB3aGlsZSAoIGV4aXRfdmFsID09IFNUSUxMX0FDVElWRSAmJiBUQ1JfNCggdGgtPnRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKSApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUgKSB7CisgICAgICAgICAgICBLTVBfRlNZTkNfQ0FOQ0VMKCBvYmogKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKTsKKyAgICAgICAgfTsgLy8gaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfQorCisgICAgX19rbXBfZnJlZV9oYW5kbGUoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworCisgICAgLyoKKyAgICAgKiBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgICAgKiAgICAgICAgd2l0aCBhIGV4aXRfdmFsID0gY29kZS4gIEJlY2F1c2Ugb2YgdGhpcyB3ZSBjYW4gbm90IHJlbHkgb24KKyAgICAgKiAgICAgICAgZXhpdF92YWwgaGF2aW5nIGFueSBwYXJ0aWN1bGFyIHZhbHVlLgorICAgICAqLworICAgIGlmICggZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICkgeworICAgICAgICBLQV9UUkFDRSggMSwgKCAiX19rbXBfcmVhcF9jb21tb246IHRocmVhZCBzdGlsbCBhY3RpdmUuXG4iICkgKTsKKyAgICB9IGVsc2UgaWYgKCAodm9pZCAqKSBleGl0X3ZhbCAhPSAodm9pZCAqKSB0aCkgeworICAgICAgICBLQV9UUkFDRSggMSwgKCAiX19rbXBfcmVhcF9jb21tb246IEV4aXRQcm9jZXNzIC8gVGVybWluYXRlVGhyZWFkIHVzZWQ/XG4iICkgKTsKKyAgICB9OyAvLyBpZgorCisgICAgS0FfVFJBQ0UoIDEwLAorICAgICAgICAoCisgICAgICAgICAgICAiX19rbXBfcmVhcF9jb21tb246IGRvbmUgcmVhcGluZyAoJWQpLCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLAorICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkCisgICAgICAgICkKKyAgICApOworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICAgID0gMDsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgICAgICAgPSBLTVBfR1RJRF9ETkU7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCAgICAgID0gS01QX0dUSURfRE5FOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IDA7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKwordm9pZAorX19rbXBfcmVhcF9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IHN0YXR1czsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IHRyeSB0byByZWFwICVwXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKKyAgICAvLyBJZiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIGl0cyB0aWQgYW5kIGd0aWQgc2hvdWxkIGJlIEtNUF9HVElEX01PTklUT1IuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIDAsIGl0IG1lYW5zIHRoZSBtb25pdG9yIGRpZCBub3QgZXZlciBzdGFydC4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgS01QX0dUSURfRE5FLCB0aGUgbW9uaXRvciBoYXMgYmVlbiBzaHV0IGRvd24uCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID09IHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKTsKKyAgICBpZiAoIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgIT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkaWQgbm90IHN0YXJ0LCByZXR1cm5pbmdcbiIpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBzdGF0dXMgPSBTZXRFdmVudCggX19rbXBfbW9uaXRvcl9ldiApOworICAgIGlmICggc3RhdHVzID09IEZBTFNFICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RXZlbnQgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfbW9uaXRvcjogcmVhcGluZyB0aHJlYWQgKCVkKVxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgX19rbXBfcmVhcF9jb21tb24oIHRoICk7CisKKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggX19rbXBfbW9uaXRvcl9ldiApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisKK3ZvaWQKK19fa21wX3JlYXBfd29ya2VyKCBrbXBfaW5mb190ICogdGggKQoreworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF93b3JrZXI6IHJlYXBpbmcgdGhyZWFkICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworICAgIF9fa21wX3JlYXBfY29tbW9uKCB0aCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKKworc3RhdGljIHZvaWQKK19fa21wX3RlYW1faGFuZGxlciggaW50IHNpZ25vICkKK3sKKyAgICBpZiAoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPT0gMCApIHsKKyAgICAgICAgLy8gU3RhZ2UgMSBzaWduYWwgaGFuZGxlciwgbGV0J3Mgc2h1dCBkb3duIGFsbCBvZiB0aGUgdGhyZWFkcy4KKyAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCwgc2lnbm8gKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSApOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KK30gLy8gX19rbXBfdGVhbV9oYW5kbGVyCisKKworCitzdGF0aWMKK3NpZ19mdW5jX3QgX19rbXBfc2lnbmFsKCBpbnQgc2lnbnVtLCBzaWdfZnVuY190IGhhbmRsZXIgKSB7CisgICAgc2lnX2Z1bmNfdCBvbGQgPSBzaWduYWwoIHNpZ251bSwgaGFuZGxlciApOworICAgIGlmICggb2xkID09IFNJR19FUlIgKSB7CisgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgS01QX01TRyggRnVuY3Rpb25FcnJvciwgInNpZ25hbCIgKSwgS01QX0VSUiggZXJyb3IgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBvbGQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKAorICAgIGludCAgICAgICAgICAgc2lnLAorICAgIHNpZ19mdW5jX3QgICAgaGFuZGxlciwKKyAgICBpbnQgICAgICAgICAgIHBhcmFsbGVsX2luaXQKKykgeworICAgIHNpZ19mdW5jX3Qgb2xkOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIEtCX1RSQUNFKCA2MCwgKCJfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyOiBjYWxsZWQ6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICBpZiAoIHBhcmFsbGVsX2luaXQgKSB7CisgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBoYW5kbGVyICk7CisgICAgICAgIC8vIFNJR19ERkwgb24gV2luZG93cyogT1MgaW4gTlVMTCBvciAwLgorICAgICAgICBpZiAoIG9sZCA9PSBfX2ttcF9zaWdobGRyc1sgc2lnIF0gKSB7CisgICAgICAgICAgICBfX2ttcF9zaWdpbnN0YWxsZWRbIHNpZyBdID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUva2VlcCB1c2VyJ3MgaGFuZGxlciBpZiBvbmUgcHJldmlvdXNseSBpbnN0YWxsZWQuCisgICAgICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgb2xkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2F2ZSBpbml0aWFsL3N5c3RlbSBzaWduYWwgaGFuZGxlcnMgdG8gc2VlIGlmIHVzZXIgaGFuZGxlcnMgaW5zdGFsbGVkLgorICAgICAgICAvLyAyMDA5LTA5LTIzOiBJdCBpcyBhIGRlYWQgY29kZS4gT24gV2luZG93cyogT1MgX19rbXBfaW5zdGFsbF9zaWduYWxzIGNhbGxlZCBvbmNlIHdpdGgKKyAgICAgICAgLy8gcGFyYWxsZWxfaW5pdCA9PSBUUlVFLgorICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgU0lHX0RGTCApOworICAgICAgICBfX2ttcF9zaWdobGRyc1sgc2lnIF0gPSBvbGQ7CisgICAgICAgIF9fa21wX3NpZ25hbCggc2lnLCBvbGQgKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfSAvLyBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIGludCBzaWcgKSB7CisgICAgaWYgKCBfX2ttcF9zaWdpbnN0YWxsZWRbIHNpZyBdICkgeworICAgICAgICBzaWdfZnVuY190IG9sZDsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgS0JfVFJBQ0UoIDYwLCAoICJfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXI6IGNhbGxlZDogc2lnPSVkXG4iLCBzaWcgKSApOworICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgX19rbXBfc2lnaGxkcnNbIHNpZyBdICk7CisgICAgICAgIGlmICggb2xkICE9IF9fa21wX3RlYW1faGFuZGxlciApIHsKKyAgICAgICAgICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyOiBvb3BzLCBub3Qgb3VyIGhhbmRsZXIsIHJlc3RvcmluZzogc2lnPSVkXG4iLCBzaWcgKSApOworICAgICAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIG9sZCApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9zaWdobGRyc1sgc2lnIF0gPSBOVUxMOworICAgICAgICBfX2ttcF9zaWdpbnN0YWxsZWRbIHNpZyBdID0gMDsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIKKworCit2b2lkCitfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIGludCBwYXJhbGxlbF9pbml0ICkKK3sKKyAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX2luc3RhbGxfc2lnbmFsczogY2FsbGVkXG4iICkgKTsKKyAgICBpZiAoICEgX19rbXBfaGFuZGxlX3NpZ25hbHMgKSB7CisgICAgICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5zdGFsbF9zaWduYWxzOiBLTVBfSEFORExFX1NJR05BTFMgaXMgZmFsc2UgLSBoYW5kbGVycyBub3QgaW5zdGFsbGVkXG4iICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSU5ULCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSUxMLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHQUJSVCwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHRlBFLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHU0VHViwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHVEVSTSwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7Cit9IC8vIF9fa21wX2luc3RhbGxfc2lnbmFscworCisKK3ZvaWQKK19fa21wX3JlbW92ZV9zaWduYWxzKCB2b2lkICkKK3sKKyAgICBpbnQgc2lnOworICAgIEtCX1RSQUNFKCAxMCwgKCJfX2ttcF9yZW1vdmVfc2lnbmFsczogY2FsbGVkXG4iICkgKTsKKyAgICBmb3IgKCBzaWcgPSAxOyBzaWcgPCBOU0lHOyArKyBzaWcgKSB7CisgICAgICAgIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggc2lnICk7CisgICAgfTsgLy8gZm9yIHNpZworfSAvLyBfX2ttcF9yZW1vdmVfc2lnbmFscworCisKKyNlbmRpZiAvLyBLTVBfSEFORExFX1NJR05BTFMKKworLyogUHV0IHRoZSB0aHJlYWQgdG8gc2xlZXAgZm9yIGEgdGltZSBwZXJpb2QgKi8KK3ZvaWQKK19fa21wX3RocmVhZF9zbGVlcCggaW50IG1pbGxpcyApCit7CisgICAgRFdPUkQgc3RhdHVzOworCisgICAgc3RhdHVzID0gU2xlZXBFeCggKERXT1JEKSBtaWxsaXMsIEZBTFNFICk7CisgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJTbGVlcEV4KCkiICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9Cit9CisKKy8qIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBhZGRyZXNzIGlzIG1hcHBlZCBpbnRvIHRoZSBjdXJyZW50IGFkZHJlc3Mgc3BhY2UuICovCitpbnQKK19fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCB2b2lkICogYWRkciApCit7CisgICAgRFdPUkQgc3RhdHVzOworICAgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBscEJ1ZmZlcjsKKyAgICBTSVpFX1QgZHdMZW5ndGg7CisKKyAgICBkd0xlbmd0aCA9IHNpemVvZihNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04pOworCisgICAgc3RhdHVzID0gVmlydHVhbFF1ZXJ5KCBhZGRyLCAmbHBCdWZmZXIsIGR3TGVuZ3RoICk7CisKKyAgICByZXR1cm4gISgoKCBscEJ1ZmZlci5TdGF0ZSA9PSBNRU1fUkVTRVJWRSkgfHwgKCBscEJ1ZmZlci5TdGF0ZSA9PSBNRU1fRlJFRSApKSB8fAorICAgICAgICgoIGxwQnVmZmVyLlByb3RlY3QgPT0gUEFHRV9OT0FDQ0VTUyApIHx8ICggbHBCdWZmZXIuUHJvdGVjdCA9PSBQQUdFX0VYRUNVVEUgKSkpOworfQorCitrbXBfdWludDY0CitfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCkKK3sKKyAgICBrbXBfdWludDY0IHIgPSAwOworCisgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSAmcik7CisgICAgcmV0dXJuIHI7Cit9CisKKy8qIEZyZWUgaGFuZGxlIGFuZCBjaGVjayB0aGUgZXJyb3IgY29kZSAqLwordm9pZAorX19rbXBfZnJlZV9oYW5kbGUoIGttcF90aHJlYWRfdCB0SGFuZGxlICkKK3sKKy8qIGNhbGxlZCB3aXRoIHBhcmFtZXRlciB0eXBlIEhBTkRMRSBhbHNvLCB0aHVzIHN1cHBvc2Uga21wX3RocmVhZF90IGRlZmluZWQgYXMgSEFORExFICovCisgICAgQk9PTCByYzsKKyAgICByYyA9IENsb3NlSGFuZGxlKCB0SGFuZGxlICk7CisgICAgaWYgKCAhcmMgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDbG9zZUhhbmRsZSApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorfQorCitpbnQKK19fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCBtYXggKSB7CisKKyAgICBzdGF0aWMgVUxPTkcgZ2xiX2J1ZmZfc2l6ZSA9IDEwMCAqIDEwMjQ7CisKKyAgICBzdGF0aWMgaW50ICAgICBnbGJfcnVubmluZ190aHJlYWRzICA9IDA7ICAvKiBTYXZlZCBjb3VudCBvZiB0aGUgcnVubmluZyB0aHJlYWRzIGZvciB0aGUgdGhyZWFkIGJhbGFuY2UgYWxnb3J0aWhtICovCisgICAgc3RhdGljIGRvdWJsZSAgZ2xiX2NhbGxfdGltZSAgICAgICAgPSAwOyAgLyogVGhyZWFkIGJhbGFuY2UgYWxnb3JpdGhtIGNhbGwgdGltZSAqLworCisgICAgaW50IHJ1bm5pbmdfdGhyZWFkcyA9IDA7ICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcnVubmluZyB0aHJlYWRzIGluIHRoZSBzeXN0ZW0uCisgICAgTlRTVEFUVVMgIHN0YXR1cyAgICAgICAgPSAwOworICAgIFVMT05HICAgICBidWZmX3NpemUgICAgID0gMDsKKyAgICBVTE9ORyAgICAgaW5mb19zaXplICAgICA9IDA7CisgICAgdm9pZCAqICAgIGJ1ZmZlciAgICAgICAgPSBOVUxMOworICAgIFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiBzcGkgPSBOVUxMOworICAgIGludCBmaXJzdF90aW1lICAgICAgICAgID0gMTsKKworICAgIGRvdWJsZSBjYWxsX3RpbWUgPSAwLjA7IC8vc3RhcnQsIGZpbmlzaDsKKworICAgIF9fa21wX2VsYXBzZWQoICYgY2FsbF90aW1lICk7CisKKyAgICBpZiAoIGdsYl9jYWxsX3RpbWUgJiYKKyAgICAgICAgICAgICggY2FsbF90aW1lIC0gZ2xiX2NhbGxfdGltZSA8IF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCApICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSBnbGJfcnVubmluZ190aHJlYWRzOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisgICAgZ2xiX2NhbGxfdGltZSA9IGNhbGxfdGltZTsKKworICAgIC8vIERvIG5vdCBzcGVuZCB0aW1lIG9uIHJ1bm5pbmcgYWxnb3JpdGhtIGlmIHdlIGhhdmUgYSBwZXJtYW5lbnQgZXJyb3IuCisgICAgaWYgKCBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gPT0gTlVMTCApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIG1heCA8PSAwICkgeworICAgICAgICBtYXggPSBJTlRfTUFYOworICAgIH07IC8vIGlmCisKKyAgICBkbyB7CisKKyAgICAgICAgaWYgKCBmaXJzdF90aW1lICkgeworICAgICAgICAgICAgYnVmZl9zaXplID0gZ2xiX2J1ZmZfc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZfc2l6ZSA9IDIgKiBidWZmX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIgPSBLTVBfSU5URVJOQUxfUkVBTExPQyggYnVmZmVyLCBidWZmX3NpemUgKTsKKyAgICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHN0YXR1cyA9IE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiggU3lzdGVtUHJvY2Vzc0luZm9ybWF0aW9uLCBidWZmZXIsIGJ1ZmZfc2l6ZSwgJiBpbmZvX3NpemUgKTsKKyAgICAgICAgZmlyc3RfdGltZSA9IDA7CisKKyAgICB9IHdoaWxlICggc3RhdHVzID09IFNUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSCApOworICAgIGdsYl9idWZmX3NpemUgPSBidWZmX3NpemU7CisKKyAgICAjZGVmaW5lIENIRUNLKCBjb25kICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNvbmQgKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggISAoIGNvbmQgKSApIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisgICAgQ0hFQ0soIGJ1ZmZfc2l6ZSA+PSBpbmZvX3NpemUgKTsKKyAgICBzcGkgPSBQU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04oIGJ1ZmZlciApOworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgcHRyZGlmZl90IG9mZnNldCA9IHVpbnRwdHJfdCggc3BpICkgLSB1aW50cHRyX3QoIGJ1ZmZlciApOworICAgICAgICBDSEVDSyggMCA8PSBvZmZzZXQgJiYgb2Zmc2V0ICsgc2l6ZW9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiApIDwgaW5mb19zaXplICk7CisgICAgICAgIEhBTkRMRSBwaWQgPSBzcGktPlByb2Nlc3NJZDsKKyAgICAgICAgVUxPTkcgbnVtID0gc3BpLT5OdW1iZXJPZlRocmVhZHM7CisgICAgICAgIENIRUNLKCBudW0gPj0gMSApOworICAgICAgICBzaXplX3Qgc3BpX3NpemUgPSBzaXplb2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OICkgKyBzaXplb2YoIFNZU1RFTV9USFJFQUQgKSAqICggbnVtIC0gMSApOworICAgICAgICBDSEVDSyggb2Zmc2V0ICsgc3BpX3NpemUgPCBpbmZvX3NpemUgKTsgICAgICAgICAgLy8gTWFrZSBzdXJlIHByb2Nlc3MgaW5mbyByZWNvcmQgZml0cyB0aGUgYnVmZmVyLgorICAgICAgICBpZiAoIHNwaS0+TmV4dEVudHJ5T2Zmc2V0ICE9IDAgKSB7CisgICAgICAgICAgICBDSEVDSyggc3BpX3NpemUgPD0gc3BpLT5OZXh0RW50cnlPZmZzZXQgKTsgICAvLyBBbmQgZG8gbm90IG92ZXJsYXAgd2l0aCB0aGUgbmV4dCByZWNvcmQuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIC8vIHBpZCA9PSAwIGNvcnJlc3BvbmRzIHRvIHRoZSBTeXN0ZW0gSWRsZSBQcm9jZXNzLiBJdCBhbHdheXMgaGFzIHJ1bm5pbmcgdGhyZWFkcworICAgICAgICAvLyBvbiBhbGwgY29yZXMuIFNvLCB3ZSBkb24ndCBjb25zaWRlciB0aGUgcnVubmluZyB0aHJlYWRzIG9mIHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgaWYgKCBwaWQgIT0gMCApIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG51bTsgKysgaSApIHsKKyAgICAgICAgICAgICAgICBUSFJFQURfU1RBVEUgc3RhdGUgPSBzcGktPlRocmVhZHNbIGkgXS5TdGF0ZTsKKyAgICAgICAgICAgICAgICAvLyBDb3VudCB0aHJlYWRzIHRoYXQgaGF2ZSBSZWFkeSBvciBSdW5uaW5nIHN0YXRlLgorICAgICAgICAgICAgICAgIC8vICEhISBUT0RPOiBXaHkgY29tbWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgY29kZT8/PworICAgICAgICAgICAgICAgIGlmICggc3RhdGUgPT0gU3RhdGVSdW5uaW5nICkgeworICAgICAgICAgICAgICAgICAgICArKyBydW5uaW5nX3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0b3AgY291bnRpbmcgcnVubmluZyB0aHJlYWRzIGlmIHRoZSBudW1iZXIgaXMgYWxyZWFkeSBncmVhdGVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29yZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPj0gbWF4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBmb3IgaQorICAgICAgICB9IC8vIGlmCisgICAgICAgIGlmICggc3BpLT5OZXh0RW50cnlPZmZzZXQgPT0gMCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzcGkgPSBQU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04oIHVpbnRwdHJfdCggc3BpICkgKyBzcGktPk5leHRFbnRyeU9mZnNldCApOworICAgIH07IC8vIGZvcmV2ZXIKKworICAgICN1bmRlZiBDSEVDSworCisgICAgZmluaXNoOiAvLyBDbGVhbiB1cCBhbmQgZXhpdC4KKworICAgICAgICBpZiAoIGJ1ZmZlciAhPSBOVUxMICkgeworICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgPSBydW5uaW5nX3RocmVhZHM7CisKKyAgICAgICAgcmV0dXJuIHJ1bm5pbmdfdGhyZWFkczsKKworfSAvL19fa21wX2dldF9sb2FkX2JhbGFuY2UoKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9maW5hbC9ydW50aW1lL3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2ZmM1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg1IEBACisjIENNYWtlTGlzdHMudHh0IGZpbGUgZm9yIHVuaXQgdGVzdGluZyBPcGVuTVAgTGlicmFyeQoraW5jbHVkZShGaW5kUHl0aG9uSW50ZXJwKQoraW5jbHVkZShDaGVja1R5cGVTaXplKQoraW5jbHVkZShDaGVja0xpYnJhcnlFeGlzdHMpCisKK2lmKE5PVCBQWVRIT05JTlRFUlBfRk9VTkQpCisgIGxpYm9tcF93YXJuaW5nX3NheSgiQ291bGQgbm90IGZpbmQgUHl0aG9uLiIpCisgIGxpYm9tcF93YXJuaW5nX3NheSgiVGhlIGNoZWNrLWxpYm9tcCB0YXJnZXQgd2lsbCBub3QgYmUgYXZhaWxhYmxlISIpCisgIHJldHVybigpCitlbmRpZigpCisKKyMgU29tZSB0ZXN0cyB1c2UgbWF0aCBmdW5jdGlvbnMKK2NoZWNrX2xpYnJhcnlfZXhpc3RzKG0gc3FydCAiIiBMSUJPTVBfSEFWRV9MSUJNKQorCittYWNybyhweXRob25pemVfYm9vbCB2YXIpCisgIGlmICgke3Zhcn0pCisgICAgc2V0KCR7dmFyfSBUcnVlKQorICBlbHNlKCkKKyAgICBzZXQoJHt2YXJ9IEZhbHNlKQorICBlbmRpZigpCitlbmRtYWNybygpCisKK3B5dGhvbml6ZV9ib29sKExJQk9NUF9VU0VfSFdMT0MpCitweXRob25pemVfYm9vbChMSUJPTVBfSEFWRV9MSUJNKQorCitzZXQoTElCT01QX1RFU1RfQ0ZMQUdTICIiIENBQ0hFIFNUUklORworICAiRXh0cmEgY29tcGlsZXIgZmxhZ3MgdG8gc2VuZCB0byB0aGUgdGVzdCBjb21waWxlciIpCisKK2lmKCR7TElCT01QX1NUQU5EQUxPTkVfQlVJTER9KQorICAjIE1ha2Ugc3VyZSB3ZSBjYW4gdXNlIHRoZSBjb25zb2xlIHBvb2wgZm9yIHJlY2VudCBjbWFrZSBhbmQgbmluamEgPiAxLjUKKyAgaWYoQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMy4xLjIwMTQxMTE3KQorICAgIHNldChjbWFrZV8zXzJfVVNFU19URVJNSU5BTCkKKyAgZWxzZSgpCisgICAgc2V0KGNtYWtlXzNfMl9VU0VTX1RFUk1JTkFMIFVTRVNfVEVSTUlOQUwpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUF9URVNUX0NPTVBJTEVSICR7Q01BS0VfQ19DT01QSUxFUn0gQ0FDSEUgU1RSSU5HCisgICAgIkNvbXBpbGVyIHRvIHVzZSBmb3IgdGVzdGluZyBPcGVuTVAgbGlicmFyeSIpCisgIHNldChMSUJPTVBfVEVTVF9PUEVOTVBfRkxBRyAtZm9wZW5tcCBDQUNIRSBTVFJJTkcKKyAgICAiT3Blbk1QIGNvbXBpbGVyIGZsYWcgdG8gdXNlIGZvciB0ZXN0aW5nIE9wZW5NUCBsaWJyYXJ5IikKKyAgc2V0KExJQk9NUF9MTFZNX0xJVF9FWEVDVVRBQkxFICIiIENBQ0hFIFNUUklORworICAgICJQYXRoIHRvIGxsdm0tbGl0IikKKyAgZmluZF9wcm9ncmFtKExJVF9FWEVDVVRBQkxFIE5BTUVTIGxsdm0tbGl0ICR7TElCT01QX0xMVk1fTElUX0VYRUNVVEFCTEV9KQorICBpZihOT1QgTElUX0VYRUNVVEFCTEUpCisgICAgbGlib21wX3NheSgiQ2Fubm90IGZpbmQgbGx2bS1saXQuIikKKyAgICBsaWJvbXBfc2F5KCJQbGVhc2UgcHV0IGxsdm0tbGl0IGluIHlvdXIgUEFUSCBvciBzZXQgTElCT01QX0xMVk1fTElUX0VYRUNVVEFCTEUgdG8gaXRzIGZ1bGwgcGF0aCIpCisgICAgbGlib21wX3dhcm5pbmdfc2F5KCJUaGUgY2hlY2stbGlib21wIHRhcmdldCB3aWxsIG5vdCBiZSBhdmFpbGFibGUhIikKKyAgICByZXR1cm4oKQorICBlbmRpZigpCisgICMgU2V0IGxpdCBhcmd1bWVudHMKKyAgIyBUaGUgLWogMSBsZXRzIHRoZSBhY3R1YWwgdGVzdHMgcnVuIHdpdGggdGhlIGVudGlyZSBtYWNoaW5lLgorICAjIFdlIGhhdmUgb25lIHRlc3QgdGhyZWFkIHRoYXQgc3Bhd25zIHRoZSB0ZXN0cyBzZXJpYWxseS4gIFRoaXMgYWxsb3dzCisgICMgRWFjaCB0ZXN0IHRvIHVzZSB0aGUgZW50aXJlIG1hY2hpbmUuCisgIHNldChMSUJPTVBfTElUX0FSR1NfREVGQVVMVCAiLXN2IC0tc2hvdy11bnN1cHBvcnRlZCAtLXNob3cteGZhaWwiKQorICBpZihNU1ZDIE9SIFhDT0RFKQorICAgIHNldChMSUJPTVBfTElUX0FSR1NfREVGQVVMVCAiJHtMSUJPTVBfTElUX0FSR1NfREVGQVVMVH0gLS1uby1wcm9ncmVzcy1iYXIiKQorICBlbmRpZigpCisgIHNldChMSUJPTVBfTElUX0FSR1MgIiR7TElCT01QX0xJVF9BUkdTX0RFRkFVTFR9IiBDQUNIRSBTVFJJTkcKKyAgICAiRGVmYXVsdCBvcHRpb25zIGZvciBsaXQiKQorICBzZXBhcmF0ZV9hcmd1bWVudHMoTElCT01QX0xJVF9BUkdTKQorICBhZGRfY3VzdG9tX3RhcmdldChjaGVjay1saWJvbXAKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7TElUX0VYRUNVVEFCTEV9ICR7TElCT01QX0xJVF9BUkdTfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIG9tcAorICAgIENPTU1FTlQgIlJ1bm5pbmcgbGlib21wIHRlc3RzIgorICAgICR7Y21ha2VfM18yX1VTRVNfVEVSTUlOQUx9CisgICkKK2Vsc2UoKQorICAjIExMVk0gc291cmNlIHRyZWUgYnVpbGQsIHRlc3QganVzdC1idWlsdCBjbGFuZworICBpZihOT1QgTVNWQykKKyAgICBzZXQoTElCT01QX1RFU1RfQ09NUElMRVIgJHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vY2xhbmcpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfVEVTVF9DT01QSUxFUiAke0xMVk1fUlVOVElNRV9PVVRQVVRfSU5URElSfS9jbGFuZy5leGUpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUF9URVNUX09QRU5NUF9GTEFHIC1mb3Blbm1wPWxpYm9tcCkKKyAgIyBVc2UgYWRkX2xpdF90ZXN0c3VpdGUoKSBmcm9tIExMVk0gQ01ha2UuCisgIGFkZF9saXRfdGVzdHN1aXRlKGNoZWNrLWxpYm9tcAorICAgICJSdW5uaW5nIGxpYm9tcCB0ZXN0cyIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIGNsYW5nIGNsYW5nLWhlYWRlcnMgRmlsZUNoZWNrIG9tcAorICApCitlbmRpZigpCisKKyMgQ29uZmlndXJlIHRoZSBsaXQuc2l0ZS5jZmcuaW4gZmlsZQorc2V0KEFVVE9fR0VOX0NPTU1FTlQgIiMjIEF1dG9nZW5lcmF0ZWQgYnkgbGlib21wIGNvbmZpZ3VyYXRpb24uXG4jIERvIG5vdCBlZGl0ISIpCitjb25maWd1cmVfZmlsZShsaXQuc2l0ZS5jZmcuaW4gbGl0LnNpdGUuY2ZnIEBPTkxZKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL2hhc19vcGVubXAuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvaGFzX29wZW5tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTVmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL2hhc19vcGVubXAuYwpAQCAtMCwwICsxLDIzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X2hhc19vcGVubXAoKQoreworICBpbnQgcnZhbHVlID0gMDsKKyNpZmRlZiBfT1BFTk1QCisgIHJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgcmV0dXJuIChydmFsdWUpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworICBpZighdGVzdF9oYXNfb3Blbm1wKCkpIHsKKyAgICBudW1fZmFpbGVkKys7CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfbnVtX3RocmVhZHMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF9udW1fdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTE0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDM5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoKQoreworICAvKiBjaGVja3MgdGhhdCBvbXBfZ2V0X251bV90aHJlYWRzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKKyAgICAgdGhyZWFkcyAqLworICBpbnQgbnRocmVhZHNfbGliOworICBpbnQgbnRocmVhZHMgPSAwOworCisgIG50aHJlYWRzX2xpYiA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBudGhyZWFkcysrOworICAgIH0gLyogZW5kIG9mIGNyaXRpY2FsICovCisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeyAKKyAgICAgIG50aHJlYWRzX2xpYiA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfSAgLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICByZXR1cm4gKG50aHJlYWRzID09IG50aHJlYWRzX2xpYik7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGljay5jIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X3d0aWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzNTIyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGljay5jCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX2dldF93dGljaygpCit7CisgIGRvdWJsZSB0aWNrOworICB0aWNrID0gLTEuOworICB0aWNrID0gb21wX2dldF93dGljayAoKTsKKyAgcmV0dXJuICgodGljayA+IDAuMCkgJiYgKHRpY2sgPCAwLjAxKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9nZXRfd3RpY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGltZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X3d0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkY2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGltZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX2dldF93dGltZSgpCit7CisgIGRvdWJsZSBzdGFydDsKKyAgZG91YmxlIGVuZDsKKyAgZG91YmxlIG1lYXN1cmVkX3RpbWU7CisgIGRvdWJsZSB3YWl0X3RpbWUgPSA1LjA7IAorICBzdGFydCA9IDA7CisgIGVuZCA9IDA7CisgIHN0YXJ0ID0gb21wX2dldF93dGltZSgpOworICBteV9zbGVlcCAod2FpdF90aW1lKTsgCisgIGVuZCA9IG9tcF9nZXRfd3RpbWUoKTsKKyAgbWVhc3VyZWRfdGltZSA9IGVuZC1zdGFydDsKKyAgcmV0dXJuICgobWVhc3VyZWRfdGltZSA+IDAuOTcgKiB3YWl0X3RpbWUpICYmIChtZWFzdXJlZF90aW1lIDwgMS4wMyAqIHdhaXRfdGltZSkpIDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2dldF93dGltZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2FwaS9vbXBfaW5fcGFyYWxsZWwuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2luX3BhcmFsbGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjYzM4NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2luX3BhcmFsbGVsLmMKQEAgLTAsMCArMSwzOSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKgorICogQ2hlY2tzIHRoYXQgZmFsc2UgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgZnJvbSBzZXJpYWwgcmVnaW9uCisgKiBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uLiAKKyAqLworaW50IHRlc3Rfb21wX2luX3BhcmFsbGVsKCkKK3sKKyAgaW50IHNlcmlhbDsKKyAgaW50IGlzcGFyYWxsZWw7CisKKyAgc2VyaWFsID0gMTsKKyAgaXNwYXJhbGxlbCA9IDA7CisgIHNlcmlhbCA9IG9tcF9pbl9wYXJhbGxlbCgpOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBpc3BhcmFsbGVsID0gb21wX2luX3BhcmFsbGVsKCk7CisgICAgfQorICB9CisgIHJldHVybiAoIShzZXJpYWwpICYmIGlzcGFyYWxsZWwpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfaW5fcGFyYWxsZWwoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9hdG9taWMvb21wX2F0b21pYy5jIGIvZmluYWwvcnVudGltZS90ZXN0L2F0b21pYy9vbXBfYXRvbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2NjYwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hdG9taWMvb21wX2F0b21pYy5jCkBAIC0wLDAgKzEsMzY2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAgIC8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAgIC8qIDEwISAqLworCitpbnQgdGVzdF9vbXBfYXRvbWljKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGRpZmY7CisgIGRvdWJsZSBkc3VtID0gMDsKKyAgZG91YmxlIGR0ID0gMC41OyAgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgZGRpZmY7CisgIGludCBwcm9kdWN0OworICBpbnQgeDsKKyAgaW50ICpsb2dpY3M7CisgIGludCBiaXRfYW5kID0gMTsKKyAgaW50IGJpdF9vciA9IDA7CisgIGludCBleGNsdXNpdl9iaXRfb3IgPSAwOworICBpbnQgajsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IGtub3duX2RpZmY7CisgIGludCBrbm93bl9wcm9kdWN0OworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGxvZ2ljX2FuZCA9IDE7CisgIGludCBsb2dpY19vciA9IDA7CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgcm91bmRpbmdfZXJyb3IgPSAxLkUtOTsKKyAgZG91YmxlIGRwdCwgZGl2OworICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKyAgbG9naWNzID0gbG9naWNzQXJyYXk7CisgIAorICBzdW0gPSAwOworICBkaWZmID0gMDsKKyAgcHJvZHVjdCA9IDE7CisKKyAgLy8gc3VtIG9mIGludGVnZXJzIHRlc3QKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgc3VtICs9IGk7CisgICAgfQorICAKKyAgfQorICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGlmIChrbm93bl9zdW0gIT0gc3VtKQorICB7CisgICAgZnByaW50ZihzdGRlcnIsIAorICAgICAgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCAKKyAgICAgIHN1bSwga25vd25fc3VtKTsKKyAgICByZXN1bHQrKzsKKyAgfQorICAKKyAgLy8gZGlmZmVyZW5jZSBvZiBpbnRlZ2VycyB0ZXN0CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZGlmZiAtPSBpOworICAgIH0KKyAgfQorICBrbm93bl9kaWZmID0gKChMT09QQ09VTlQgLSAxKSAqIExPT1BDT1VOVCkgLyAyICogLTE7CisgIGlmIChkaWZmICE9IGtub3duX2RpZmYpCisgIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsCisgICAgICBkaWZmKTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIHN1bSBvZiBkb3VibGVzIHRlc3QKKyAgZHN1bSA9IDA7CisgIGRwdCA9IDE7CisgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opIHsKKyAgICBkcHQgKj0gZHQ7CisgIH0KKyAgZGtub3duX3N1bSA9ICgxIC0gZHB0KSAvICgxIC1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGRzdW0gKz0gcG93IChkdCwgaSk7CisgICAgfQorICB9CisgIGlmIChkc3VtICE9IGRrbm93bl9zdW0gJiYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICBkc3VtLCBka25vd25fc3VtLCBkc3VtIC0gZGtub3duX3N1bSk7CisgICAgcmVzdWx0Kys7CisgIH0KKworICAvLyBkaWZmZXJlbmNlIG9mIGRvdWJsZXMgdGVzdAorICBkcHQgPSAxOworICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKSB7CisgICAgZHB0ICo9IGR0OworICB9CisgIGRkaWZmID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGRkaWZmIC09IHBvdyAoZHQsIGkpOworICAgIH0KKyAgfSAKKyAgaWYgKGZhYnMgKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLAorICAgICAgZGRpZmYpOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gcHJvZHVjdCBvZiBpbnRlZ2VycyB0ZXN0CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBwcm9kdWN0ICo9IGk7CisgICAgfQorICB9CisgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICBpZiAoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgIkVycm9yIGluIHByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLAorICAgICAgcHJvZHVjdCwga25vd25fcHJvZHVjdCk7CisgICAgcmVzdWx0Kys7CisgIH0KKworICAvLyBkaXZpc2lvbiBvZiBpbnRlZ2VycyB0ZXN0CisgIHByb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHByb2R1Y3QgLz0gaTsKKyAgICB9CisgIH0KKyAgaWYgKHByb2R1Y3QgIT0gMSkgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBwcm9kdWN0IGRpdmlzaW9uIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgMVxuIiwKKyAgICAgIHByb2R1Y3QpOworICAgIHJlc3VsdCsrOworICB9CisgIAorICAvLyBkaXZpc2lvbiBvZiBkb3VibGVzIHRlc3QKKyAgZGl2ID0gNS4wRSs1OworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZGl2IC89IGk7CisgICAgfQorICB9CisgIGlmIChmYWJzKGRpdi0wLjEzNzc4NykgPj0gMS4wRS00ICkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGRpdmlzaW9uIHdpdGggZG91YmxlOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuMTM3Nzg3XG4iLCBkaXYpOworICB9CisKKyAgLy8gKysgdGVzdAorICB4ID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICB4Kys7CisgICAgfQorICB9CisgIGlmICh4ICE9IExPT1BDT1VOVCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluICsrXG4iKTsKKyAgfQorCisgIC8vIC0tIHRlc3QKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICB4LS07CisgICAgfQorICB9CisgIGlmICh4ICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiAtLVxuIik7CisgIH0KKworICAvLyBiaXQtYW5kIHRlc3QgcGFydCAxCisgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgIGxvZ2ljc1tqXSA9IDE7CisgIH0KKyAgYml0X2FuZCA9IDE7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGJpdF9hbmQgJj0gbG9naWNzW2ldOworICAgIH0KKyAgfQorICBpZiAoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICAvLyBiaXQtYW5kIHRlc3QgcGFydCAyCisgIGJpdF9hbmQgPSAxOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGJpdF9hbmQgJj0gbG9naWNzW2ldOworICAgIH0KKyAgfQorICBpZiAoYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgfQorCisgIC8vIGJpdC1vciB0ZXN0IHBhcnQgMQorICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyBqKyspIHsKKyAgICBsb2dpY3Nbal0gPSAwOworICB9CisgIGJpdF9vciA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICB9CisgIH0KKyAgaWYgKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgLy8gYml0LW9yIHRlc3QgcGFydCAyCisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8vIGJpdC14b3IgdGVzdCBwYXJ0IDEKKyAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgaisrKSB7CisgICAgbG9naWNzW2pdID0gMDsKKyAgfQorICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGV4Y2x1c2l2X2JpdF9vciBePSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmIChleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIC8vIGJpdC14b3IgdGVzdCBwYXJ0IDIKKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgIH0KKyAgICAKKyAgfQorICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gbGVmdCBzaGlmdCB0ZXN0CisgIHggPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeCA8PD0gMTsKKyAgICB9CisgICAgCisgIH0KKyAgaWYgKCB4ICE9IDEwMjQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiA8PFxuIik7CisgICAgeCA9IDEwMjQ7CisgIH0KKworICAvLyByaWdodCBzaGlmdCB0ZXN0CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICB4ID4+PSAxOworICAgIH0KKyAgfQorICBpZiAoeCAhPSAxKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gPj5cbiIpOworICB9CisKKyAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9IC8vIHRlc3Rfb21wX2F0b21pYygpCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9hdG9taWMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9iYXJyaWVyL29tcF9iYXJyaWVyLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvYmFycmllci9vbXBfYmFycmllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmIwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYmFycmllci9vbXBfYmFycmllci5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX2JhcnJpZXIoKQoreworICBpbnQgcmVzdWx0MTsKKyAgaW50IHJlc3VsdDI7CisgIHJlc3VsdDEgPSAwOworICByZXN1bHQyID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IHJhbms7CisgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICBpZiAocmFuayA9PTEpIHsKKyAgICAgIG15X3NsZWVwKCgoZG91YmxlKVNMRUVQVElNRSkvUkVQRVRJVElPTlMpOyAvLyBnaXZlIDEgc2VjIHRvIHdob2xlIHRlc3QKKyAgICAgIHJlc3VsdDIgPSAzOworICAgIH0KKyAgICAjcHJhZ21hIG9tcCBiYXJyaWVyCisgICAgaWYgKHJhbmsgPT0gMikgeworICAgICAgcmVzdWx0MSA9IHJlc3VsdDI7CisgICAgfQorICB9CisgIHJldHVybiAocmVzdWx0MSA9PSAzKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworI2lmZGVmIF9PUEVOTVAKKyAgb21wX3NldF9keW5hbWljKDApOyAvLyBwcmV2ZW50IHJ1bnRpbWUgdG8gY2hhbmdlIG51bWJlciBvZiB0aHJlYWRzCisgIG9tcF9zZXRfbnVtX3RocmVhZHMoNCk7IC8vIHRoZSB0ZXN0IGV4cGVjdHMgYXQgbGVhc3QgMyB0aHJlYWRzCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfYmFycmllcigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvY3JpdGljYWwvb21wX2NyaXRpY2FsLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvY3JpdGljYWwvb21wX2NyaXRpY2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3ZGJjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9jcml0aWNhbC9vbXBfY3JpdGljYWwuYwpAQCAtMCwwICsxLDM3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9jcml0aWNhbCgpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtPTA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgbXlzdW09MDsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgbXlzdW0gPSBteXN1bSArIGk7CisKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHN1bSA9IG15c3VtICtzdW07CisgIH0KKyAga25vd25fc3VtID0gOTk5ICogMTAwMCAvIDI7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9jcml0aWNhbCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2ZsdXNoL29tcF9mbHVzaC5jIGIvZmluYWwvcnVudGltZS90ZXN0L2ZsdXNoL29tcF9mbHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDNjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvZmx1c2gvb21wX2ZsdXNoLmMKQEAgLTAsMCArMSw0NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfZmx1c2goKQoreworICBpbnQgcmVzdWx0MTsKKyAgaW50IHJlc3VsdDI7CisgIGludCBkdW1teTsKKworICByZXN1bHQxID0gMDsKKyAgcmVzdWx0MiA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCByYW5rOworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgI3ByYWdtYSBvbXAgYmFycmllcgorICAgIGlmIChyYW5rID09IDEpIHsKKyAgICAgIHJlc3VsdDIgPSAzOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2ggKHJlc3VsdDIpCisgICAgICBkdW1teSA9IHJlc3VsdDI7CisgICAgfQorICAgIGlmIChyYW5rID09IDApIHsKKyAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0MikKKyAgICAgIHJlc3VsdDEgPSByZXN1bHQyOworICAgIH0KKyAgfSAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiAoKHJlc3VsdDEgPT0gcmVzdWx0MikgJiYgKHJlc3VsdDIgPT0gZHVtbXkpICYmIChyZXN1bHQyID09IDMpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IgKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mbHVzaCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2xpdC5jZmcgYi9maW5hbC9ydW50aW1lL3Rlc3QvbGl0LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzlmZDVmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2xpdC5jZmcKQEAgLTAsMCArMSw4NSBAQAorIyAtKi0gUHl0aG9uIC0qLSB2aW06IHNldCBmdD1weXRob24gdHM9NCBzdz00IGV4cGFuZHRhYiB0dz03OToKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ2xpdCcgdGVzdCBydW5uZXIuCisKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBsaXQuZm9ybWF0cworCisjIFRlbGwgcHlsaW50IHRoYXQgd2Uga25vdyBjb25maWcgYW5kIGxpdF9jb25maWcgZXhpc3Qgc29tZXdoZXJlLgoraWYgJ1BZTElOVF9JTVBPUlQnIGluIG9zLmVudmlyb246CisgICAgY29uZmlnID0gb2JqZWN0KCkKKyAgICBsaXRfY29uZmlnID0gb2JqZWN0KCkKKworZGVmIGFwcGVuZF9keW5hbWljX2xpYnJhcnlfcGF0aChwYXRoKToKKyAgICBpZiBjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9PSAnV2luZG93cyc6CisgICAgICAgIG5hbWUgPSAnUEFUSCcKKyAgICAgICAgc2VwID0gJzsnCisgICAgZWxpZiBjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9PSAnRGFyd2luJzoKKyAgICAgICAgbmFtZSA9ICdEWUxEX0xJQlJBUllfUEFUSCcKKyAgICAgICAgc2VwID0gJzonCisgICAgZWxzZToKKyAgICAgICAgbmFtZSA9ICdMRF9MSUJSQVJZX1BBVEgnCisgICAgICAgIHNlcCA9ICc6JworICAgIGlmIG5hbWUgaW4gY29uZmlnLmVudmlyb25tZW50OgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSBwYXRoICsgc2VwICsgY29uZmlnLmVudmlyb25tZW50W25hbWVdCisgICAgZWxzZToKKyAgICAgICAgY29uZmlnLmVudmlyb25tZW50W25hbWVdID0gcGF0aAorCisjIG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZS4KK2NvbmZpZy5uYW1lID0gJ2xpYm9tcCcKKworIyBzdWZmaXhlczogQSBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byB0cmVhdCBhcyB0ZXN0IGZpbGVzLgorY29uZmlnLnN1ZmZpeGVzID0gWycuYyddCisKKyMgdGVzdF9zb3VyY2Vfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBhcmUgbG9jYXRlZC4KK2NvbmZpZy50ZXN0X3NvdXJjZV9yb290ID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCisjIHRlc3RfZXhlY19yb290OiBUaGUgcm9vdCBvYmplY3QgZGlyZWN0b3J5IHdoZXJlIG91dHB1dCBpcyBwbGFjZWQKK2NvbmZpZy50ZXN0X2V4ZWNfcm9vdCA9IGNvbmZpZy5saWJvbXBfb2JqX3Jvb3QKKworIyB0ZXN0IGZvcm1hdAorY29uZmlnLnRlc3RfZm9ybWF0ID0gbGl0LmZvcm1hdHMuU2hUZXN0KCkKKworIyBjb21waWxlciBmbGFncworY29uZmlnLnRlc3RfY2ZsYWdzID0gY29uZmlnLnRlc3Rfb3Blbm1wX2ZsYWcgKyBcCisgICAgIiAtSSAiICsgY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgKyBcCisgICAgIiAtSSAiICsgY29uZmlnLm9tcF9oZWFkZXJfZGlyZWN0b3J5ICsgXAorICAgICIgLUwgIiArIGNvbmZpZy5saWJyYXJ5X2RpciArIFwKKyAgICAiICIgKyBjb25maWcudGVzdF9leHRyYV9jZmxhZ3MKKworIyBleHRyYSBsaWJyYXJpZXMKK2xpYnMgPSAiIgoraWYgY29uZmlnLmhhc19saWJtOgorICAgIGxpYnMgKz0gIiAtbG0iCisKKyMgU2V0dXAgZW52aXJvbm1lbnQgdG8gZmluZCBkeW5hbWljIGxpYnJhcnkgYXQgcnVudGltZQorYXBwZW5kX2R5bmFtaWNfbGlicmFyeV9wYXRoKGNvbmZpZy5saWJyYXJ5X2RpcikKK2lmIGNvbmZpZy51c2luZ19od2xvYzoKKyAgICBhcHBlbmRfZHluYW1pY19saWJyYXJ5X3BhdGgoY29uZmlnLmh3bG9jX2xpYnJhcnlfZGlyKQorCisjIFJwYXRoIG1vZGlmaWNhdGlvbnMgZm9yIERhcndpbgoraWYgY29uZmlnLm9wZXJhdGluZ19zeXN0ZW0gPT0gJ0Rhcndpbic6CisgICAgY29uZmlnLnRlc3RfY2ZsYWdzICs9ICIgLVdsLC1ycGF0aCwiICsgY29uZmlnLmxpYnJhcnlfZGlyCisgICAgaWYgY29uZmlnLnVzaW5nX2h3bG9jOgorICAgICAgICBjb25maWcudGVzdF9jZmxhZ3MgKz0gIiAtV2wsLXJwYXRoLCIgKyBjb25maWcuaHdsb2NfbGlicmFyeV9kaXIKKworIyBGaW5kIHRoZSBTREsgb24gRGFyd2luCitpZiBjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9PSAnRGFyd2luJzoKKyAgY21kID0gc3VicHJvY2Vzcy5Qb3BlbihbJ3hjcnVuJywgJy0tc2hvdy1zZGstcGF0aCddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgIG91dCwgZXJyID0gY21kLmNvbW11bmljYXRlKCkKKyAgb3V0ID0gb3V0LnN0cmlwKCkKKyAgcmVzID0gY21kLndhaXQoKQorICBpZiByZXMgPT0gMCBhbmQgb3V0OgorICAgIGNvbmZpZy50ZXN0X2NmbGFncyArPSAiIC1pc3lzcm9vdCAiICsgb3V0CisKKyMgc3Vic3RpdHV0aW9ucworY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcC1jb21waWxlLWFuZC1ydW4iLCBcCisgICAgIiVsaWJvbXAtY29tcGlsZSAmJiAlbGlib21wLXJ1biIpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcC1jb21waWxlIiwgXAorICAgICIlY2xhbmcgJWNmbGFncyAlcyAtbyAldCIgKyBsaWJzKSkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVsaWJvbXAtcnVuIiwgIiV0IikpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlY2xhbmciLCBjb25maWcudGVzdF9jb21waWxlcikpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlb3Blbm1wX2ZsYWciLCBjb25maWcudGVzdF9vcGVubXBfZmxhZykpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlY2ZsYWdzIiwgY29uZmlnLnRlc3RfY2ZsYWdzKSkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2xpdC5zaXRlLmNmZy5pbiBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9saXQuc2l0ZS5jZmcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4MTlhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9saXQuc2l0ZS5jZmcuaW4KQEAgLTAsMCArMSwxNiBAQAorQEFVVE9fR0VOX0NPTU1FTlRACisKK2NvbmZpZy50ZXN0X2NvbXBpbGVyID0gIkBMSUJPTVBfVEVTVF9DT01QSUxFUkAiCitjb25maWcudGVzdF9vcGVubXBfZmxhZyA9ICJATElCT01QX1RFU1RfT1BFTk1QX0ZMQUdAIgorY29uZmlnLnRlc3RfZXh0cmFfY2ZsYWdzID0gIkBMSUJPTVBfVEVTVF9DRkxBR1NAIgorY29uZmlnLmxpYm9tcF9vYmpfcm9vdCA9ICJAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQCIKK2NvbmZpZy5saWJyYXJ5X2RpciA9ICJATElCT01QX0xJQlJBUllfRElSQCIKK2NvbmZpZy5vbXBfaGVhZGVyX2RpcmVjdG9yeSA9ICJATElCT01QX0JJTkFSWV9ESVJAL3NyYyIKK2NvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID0gIkBDTUFLRV9TWVNURU1fTkFNRUAiCitjb25maWcuaHdsb2NfbGlicmFyeV9kaXIgPSAiQExJQk9NUF9IV0xPQ19MSUJSQVJZX0RJUkAiCitjb25maWcudXNpbmdfaHdsb2MgPSBATElCT01QX1VTRV9IV0xPQ0AKK2NvbmZpZy5oYXNfbGlibSA9IEBMSUJPTVBfSEFWRV9MSUJNQAorCisjIExldCB0aGUgbWFpbiBjb25maWcgZG8gdGhlIHJlYWwgd29yay4KK2xpdF9jb25maWcubG9hZF9jb25maWcoY29uZmlnLCAiQExJQk9NUF9CQVNFX0RJUkAvdGVzdC9saXQuY2ZnIikKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX2xvY2suYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4YzQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbG9ja190IGxjazsKKworaW50IHRlc3Rfb21wX2xvY2soKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKworICBvbXBfaW5pdF9sb2NrKCZsY2spOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKQorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG9tcF9zZXRfbG9jaygmbGNrKTsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgCisgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBvbXBfdW5zZXRfbG9jaygmbGNrKTsKKyAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbG9jaygmbGNrKTsKKworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9sb2NrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbmVzdF9sb2NrLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljZjQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9uZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9uZXN0X2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF9uZXN0X2xvY2soKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKworICBvbXBfaW5pdF9uZXN0X2xvY2soJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvcihpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBvbXBfc2V0X25lc3RfbG9jaygmbGNrKTsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgCisgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrKCZsY2spOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9uZXN0X2xvY2soJmxjayk7CisKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbmVzdF9sb2NrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9sb2NrLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhYWUwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworCitpbnQgdGVzdF9vbXBfdGVzdF9sb2NrKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisKKyAgb21wX2luaXRfbG9jayAoJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgd2hpbGUgKCFvbXBfdGVzdF9sb2NrICgmbGNrKSkKKyAgICAgIHt9OworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAKKyAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisgICAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIG9tcF91bnNldF9sb2NrICgmbGNrKTsKKyAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbG9jaygmbGNrKTsKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGVzdF9sb2NrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9uZXN0X2xvY2suYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzVkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9uZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgdGVzdF9vbXBfdGVzdF9uZXN0X2xvY2soKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKworICBvbXBfaW5pdF9uZXN0X2xvY2sgKCZsY2spOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKSAKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAvKm9tcF9zZXRfbG9jaygmbGNrKTsqLworICAgICAgd2hpbGUoIW9tcF90ZXN0X25lc3RfbG9jayAoJmxjaykpCisgICAgICB7fTsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgCisgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTsKKyAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICgmbGNrKTsKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGVzdF9uZXN0X2xvY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlci5jIGIvZmluYWwvcnVudGltZS90ZXN0L21hc3Rlci9vbXBfbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNDJkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlci5jCkBAIC0wLDAgKzEsMzggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX21hc3RlcigpCit7CisgIGludCBudGhyZWFkczsKKyAgaW50IGV4ZWN1dGluZ190aHJlYWQ7CisKKyAgbnRocmVhZHMgPSAwOworICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlciAKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBudGhyZWFkcysrOworICAgICAgfQorICAgICAgZXhlY3V0aW5nX3RocmVhZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgIH0gLyogZW5kIG9mIG1hc3RlciovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8KKyAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbWFzdGVyKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXJfMy5jIGIvZmluYWwvcnVudGltZS90ZXN0L21hc3Rlci9vbXBfbWFzdGVyXzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDExMzJlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L21hc3Rlci9vbXBfbWFzdGVyXzMuYwpAQCAtMCwwICsxLDQ0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9tYXN0ZXJfMygpCit7CisgIGludCBudGhyZWFkczsKKyAgaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgIGludCB0aWRfcmVzdWx0ID0gMDsgLyogY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLiBmb3IKKyAgICAgICAgICAgICAgIHRoZSBtYXN0ZXIgdGhyZWFkLiAoTXVzdCBiZSAwKSAqLworICBudGhyZWFkcyA9IDA7CisgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyIAorICAgIHsKKyAgICAgIGludCB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgIGlmICh0aWQgIT0gMCkgeworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7IHRpZF9yZXN1bHQrKzsgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgbnRocmVhZHMrKzsKKyAgICAgIH0KKyAgICAgIGV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSAmJiAodGlkX3Jlc3VsdCA9PSAwKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9tYXN0ZXJfMygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcF9teV9zbGVlcC5oIGIvZmluYWwvcnVudGltZS90ZXN0L29tcF9teV9zbGVlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGQ5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wX215X3NsZWVwLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBNWV9TTEVFUF9ICisjZGVmaW5lIE1ZX1NMRUVQX0gKKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gaGF2ZSBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggYmV0dGVyIHJlc29sdXRpb24gYW5kCisgKiAgd2hpY2ggb25seSBzdG9wcyBvbmUgdGhyZWFkLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmIGRlZmluZWQoX1dJTjMyKQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisvLyBXaW5kb3dzIHZlcnNpb24gb2YgbXlfc2xlZXAoKSBmdW5jdGlvbgorc3RhdGljIHZvaWQgbXlfc2xlZXAoZG91YmxlIHNsZWVwdGltZSkgeworICBEV09SRCBtcyA9IChEV09SRCkgKHNsZWVwdGltZSAqIDEwMDAuMCk7CisgIFNsZWVwKG1zKTsKK30KKworCisjZWxzZSAvLyBfV0lOMzIKKworLy8gVW5pY2VzIHZlcnNpb24gb2YgbXlfc2xlZXAoKSBmdW5jdGlvbgorc3RhdGljIHZvaWQgbXlfc2xlZXAoZG91YmxlIHNsZWVwdGltZSkgeworICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgIHRzLnR2X3NlYyA9ICh0aW1lX3Qpc2xlZXB0aW1lOworICB0cy50dl9uc2VjID0gKGxvbmcpKChzbGVlcHRpbWUgLSAoZG91YmxlKXRzLnR2X3NlYykgKiAxRTkpOworICBuYW5vc2xlZXAoJnRzLCBOVUxMKTsKK30KKworI2VuZGlmIC8vIF9XSU4zMgorCisjZW5kaWYgLy8gTVlfU0xFRVBfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcF90ZXN0c3VpdGUuaCBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXBfdGVzdHN1aXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmNTQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXBfdGVzdHN1aXRlLmgKQEAgLTAsMCArMSw3OSBAQAorLyogR2xvYmFsIGhlYWRlcmZpbGUgb2YgdGhlIE9wZW5NUCBUZXN0c3VpdGUgKi8KKworI2lmbmRlZiBPTVBfVEVTVFNVSVRFX0gKKyNkZWZpbmUgT01QX1RFU1RTVUlURV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgMTAwMCAvKiBOdW1iZXIgb2YgaXRlcmF0aW9ucyB0byBzbGl0IGFtb25nc3QgdGhyZWFkcyAqLworI2RlZmluZSBSRVBFVElUSU9OUyAxMCAvKiBOdW1iZXIgb2YgdGltZXMgdG8gcnVuIGVhY2ggdGVzdCAqLworCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FIDEKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEIDUKKworI2lmZGVmICBfV0lOMzIKKy8vIFdpbmRvd3MgdmVyc2lvbnMgb2YgcHRocmVhZF9jcmVhdGUoKSBhbmQgcHRocmVhZF9qb2luKCkKKyMgaW5jbHVkZSA8d2luZG93cy5oPgordHlwZWRlZiBIQU5ETEUgcHRocmVhZF90OworCisvLyBlbmNhcHN1bGF0ZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcHRocmVhZC1jYWxsYWJsZSBmdW5jdGlvbgorc3RydWN0IHRocmVhZF9mdW5jX2luZm9fdCB7CisgIHZvaWQqICgqc3RhcnRfcm91dGluZSkodm9pZCopOworICB2b2lkKiBhcmc7Cit9OworCisvLyBjYWxsIHRoZSB2b2lkKiBzdGFydF9yb3V0aW5lKHZvaWQqKTsKK3N0YXRpYyBEV09SRCBfX3RocmVhZF9mdW5jX3dyYXBwZXIoTFBWT0lEIGxwUGFyYW1ldGVyKSB7CisgIHN0cnVjdCB0aHJlYWRfZnVuY19pbmZvX3QqIGZ1bmN0aW9uX2luZm9ybWF0aW9uOworICBmdW5jdGlvbl9pbmZvcm1hdGlvbiA9IChzdHJ1Y3QgdGhyZWFkX2Z1bmNfaW5mb190KilscFBhcmFtZXRlcjsKKyAgZnVuY3Rpb25faW5mb3JtYXRpb24tPnN0YXJ0X3JvdXRpbmUoZnVuY3Rpb25faW5mb3JtYXRpb24tPmFyZyk7CisgIGZyZWUoZnVuY3Rpb25faW5mb3JtYXRpb24pOworICByZXR1cm4gMDsKK30KKworLy8gYXR0ciBpcyBpZ25vcmVkCitzdGF0aWMgaW50IHB0aHJlYWRfY3JlYXRlKHB0aHJlYWRfdCAqdGhyZWFkLCB2b2lkICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICooKnN0YXJ0X3JvdXRpbmUpICh2b2lkICopLCB2b2lkICphcmcpIHsKKyAgcHRocmVhZF90IHB0aHJlYWQ7CisgIHN0cnVjdCB0aHJlYWRfZnVuY19pbmZvX3QqIGluZm87CisgIGluZm8gPSAoc3RydWN0IHRocmVhZF9mdW5jX2luZm9fdCopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2Z1bmNfaW5mb190KSk7CisgIGluZm8tPnN0YXJ0X3JvdXRpbmUgPSBzdGFydF9yb3V0aW5lOworICBpbmZvLT5hcmcgPSBhcmc7CisgIHB0aHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgX190aHJlYWRfZnVuY193cmFwcGVyLCBpbmZvLCAwLCBOVUxMKTsKKyAgaWYgKHB0aHJlYWQgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ3JlYXRlVGhyZWFkKCkgZmFpbGVkOiBFcnJvciAjJXUuXG4iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgZXhpdCgxKTsKKyAgfQorICAqdGhyZWFkID0gcHRocmVhZDsKKyAgcmV0dXJuIDA7Cit9CisvLyByZXR2YWwgaXMgaWdub3JlZCBmb3Igbm93CitzdGF0aWMgaW50IHB0aHJlYWRfam9pbihwdGhyZWFkX3QgdGhyZWFkLCB2b2lkICoqcmV0dmFsKSB7CisgIGludCByYzsKKyAgcmMgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZCwgSU5GSU5JVEUpOworICBpZiAocmMgPT0gV0FJVF9GQUlMRUQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhaXRGb3JTaW5nbGVPYmplY3QoKSBmYWlsZWQ6IEVycm9yICMldS5cbiIsCisgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgZXhpdCgxKTsKKyAgfQorICByYyA9IENsb3NlSGFuZGxlKHRocmVhZCk7CisgIGlmIChyYyA9PSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDbG9zZUhhbmRsZSgpIGZhaWxlZDogRXJyb3IgIyV1LlxuIiwgR2V0TGFzdEVycm9yKCkpOworICAgIGV4aXQoMSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZWxzZQorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9uZXN0ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNlMDcyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9uZXN0ZWQuYwpAQCAtMCwwICsxLDQxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qCisgKiBUZXN0IGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBuZXN0ZWQgcGFyYWxsZWxpc20KKyAqIEJ5IENodW5odWEgTGlhbywgVW5pdmVyc2l0eSBvZiBIb3VzdG9uCisgKiBPY3QuIDIwMDUKKyAqLworaW50IHRlc3Rfb21wX25lc3RlZCgpCit7CisgIGludCBjb3VudGVyID0gMDsKKyNpZmRlZiBfT1BFTk1QCisgIG9tcF9zZXRfbmVzdGVkKDEpOworI2VuZGlmCisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGNvdW50ZXIpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIGNvdW50ZXIrKzsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICBjb3VudGVyLS07CisgICAgfQorICB9CisgIHJldHVybiAoY291bnRlciAhPSAwKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX25lc3RlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9jb3B5aW4uYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfY29weWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0OTMzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfY29weWluLmMKQEAgLTAsMCArMSw0NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IHN1bTEgPSA3ODk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9jb3B5aW4oKQoreworICBpbnQgc3VtLCBudW1fdGhyZWFkczsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPSAwOworICBzdW0xID0gNzsKKyAgbnVtX3RocmVhZHMgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGNvcHlpbihzdW0xKQorICB7CisgICAgLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IgCisgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykgeworICAgICAgc3VtMSA9IHN1bTEgKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICBudW1fdGhyZWFkcysrOworICAgIH0gLyplbmQgb2YgY3JpdGljYWwqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAKKyAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzFkMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMKQEAgLTAsMCArMSw0MyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdCgpCit7CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQgbXlzdW07CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9MDsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBkZWZhdWx0KHNoYXJlZCkgcHJpdmF0ZShpKSBwcml2YXRlKG15c3VtKQorICB7CisgICAgbXlzdW0gPSAwOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG15c3VtID0gbXlzdW0gKyBpOworICAgIH0gCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBteXN1bTsKKyAgICB9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9kZWZhdWx0KCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTVhOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8vc3RhdGljIGludCBzdW0xID0gNzg5OworCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPSAwOworICBzdW0xPTc7CisgIG51bV90aHJlYWRzID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMSkKKyAgeworICAgIC8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yIAorICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgIHN1bTEgPSBzdW0xICsgaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgbnVtX3RocmVhZHMrKzsKKyAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgCisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfaWYuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjUyZjExCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9pZi5jCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2lmKCkKK3sKKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGludCBteXN1bTsKKyAgaW50IGNvbnRyb2w9MTsKKworICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgaWYoY29udHJvbD09MCkKKyAgeworICAgIG15c3VtID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBteXN1bSA9IG15c3VtICsgaTsKKyAgICB9IAorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgbXlzdW07CisgICAgfQorICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9pZigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZjFmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoKQoreworICBpbnQgbnVtX2ZhaWxlZDsKKyAgaW50IHRocmVhZHM7CisgIGludCBudGhyZWFkczsKKyAgaW50IG1heF90aHJlYWRzID0gMDsKKworICBudW1fZmFpbGVkID0gMDsKKworICAvKiBmaXJzdCB3ZSBjaGVjayBob3cgbWFueSB0aHJlYWRzIGFyZSBhdmFpbGFibGUgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlcgorICAgIG1heF90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgfQorCisgIC8qIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmcm9tIG9uZSB0byBtYXhpbXVtOiovCisgIGZvcih0aHJlYWRzID0gMTsgdGhyZWFkcyA8PSBtYXhfdGhyZWFkczsgdGhyZWFkcysrKSB7CisgICAgbnRocmVhZHMgPSAwOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHJlZHVjdGlvbigrOm51bV9mYWlsZWQpIG51bV90aHJlYWRzKHRocmVhZHMpCisgICAgeworICAgICAgbnVtX2ZhaWxlZCA9IG51bV9mYWlsZWQgKyAhKHRocmVhZHMgPT0gb21wX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgbnRocmVhZHMgKz0gMTsKKyAgICB9CisgICAgbnVtX2ZhaWxlZCA9IG51bV9mYWlsZWQgKyAhKG50aHJlYWRzID09IHRocmVhZHMpOworICB9CisgIHJldHVybiAoIW51bV9mYWlsZWQpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhNDdhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9wcml2YXRlKCkKK3sKKyAgaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPSAwOworICBudW1fdGhyZWFkcyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShzdW0xKQorICB7CisgICAgaW50IGk7CisgICAgc3VtMSA9IDc7CisgICAgLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKyAgICAjcHJhZ21hIG9tcCBmb3IgCisgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykgeworICAgICAgc3VtMSA9IHN1bTEgKyBpOworICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICBudW1fdGhyZWFkcysrOworICAgIH0KKyAgfQorICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ODNmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMCAgICAvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwICAvKiAxMCEgKi8KKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbigpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGRvdWJsZSBkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBsb2dpY19vcjsKKyAgaW50IGJpdF9hbmQ7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbTE9PUENPVU5UXTsKKyAgaW50IGk7CisgIGRvdWJsZSBkcHQ7CisgIGludCByZXN1bHQ7CisKKyAgc3VtID0wOworICBkc3VtPTA7CisgIHByb2R1Y3Q9MTsKKyAgbG9naWNfYW5kPTE7CisgIGxvZ2ljX29yPTA7CisgIGJpdF9hbmQ9MTsKKyAgYml0X29yPTA7CisgIGV4Y2x1c2l2X2JpdF9vcj0wOworICByZXN1bHQ9MDsKKyAgZHQgPSAxLi8zLjsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworCisgIC8qIFRlc3RzIGZvciBpbnRlZ2VycyAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigrOnN1bSkKKyAgZm9yIChpPTE7aTw9TE9PUENPVU5UO2krKykgeworICAgIHN1bT1zdW0raTsKKyAgfQorCisgIGlmKGtub3duX3N1bSE9c3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsc3VtLGtub3duX3N1bSk7IAorICB9CisKKyAgZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkaWZmKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKSB7CisgICAgZGlmZj1kaWZmLWk7CisgIH0KKworICBpZihkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworICBkc3VtPTA7CisgIGRwdD0xOworICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6ZHN1bSkKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRzdW0gKz0gcG93KGR0LGkpOworICB9CisKKyAgaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkgeworICAgIHJlc3VsdCsrOyAKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICB9CisKKyAgZHB0PTE7CisKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGRpZmYpCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgIH0KKyAgaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIHByb2R1Y3Qgb2YgaW50ZWdlcnMgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICBmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKSB7CisgICAgcHJvZHVjdCAqPSBpOworICB9CisKKyAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICAvKiBUZXN0cyBmb3IgbG9naWNhbCBhbmQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxLlxuIik7CisgIH0KKworICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpY2FsIG9yICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZihsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKyAgfQorICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBhbmQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICB9CisgIGlmKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyLlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2Ugb3IgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2UgeG9yICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgfQorICBpZihleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBleGNsdXNpdl9iaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfc2hhcmVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3NoYXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTM3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZCgpCit7CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSBzaGFyZWQoc3VtKSAKKyAgeworCisgICAgaW50IG15c3VtID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBteXN1bSA9IG15c3VtICsgaTsKKyAgICB9IAorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgbXlzdW07CisgICAgfQorCisKKyAgfQorICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiS05PV05fU1VNID0gJWQ7IFNVTSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlMjhhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrLmMKQEAgLTAsMCArMSw1MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX3Rhc2soKQoreworICBpbnQgdGlkc1tOVU1fVEFTS1NdOworICBpbnQgaTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgKi8KKyAgICAgICAgaW50IG15aTsKKyAgICAgICAgbXlpID0gaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzaworICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuICovCisgIGZvciAoaSA9IDE7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgIGlmICh0aWRzWzBdICE9IHRpZHNbaV0pCisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maW5hbC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmluYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk2YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmluYWwuYwpAQCAtMCwwICsxLDY1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFza19maW5hbCgpCit7CisgIGludCB0aWRzW05VTV9UQVNLU107CisgIGludCBpbmNsdWRlZHRpZHNbTlVNX1RBU0tTXTsKKyAgaW50IGk7CisgIGludCBlcnJvciA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAqLworICAgICAgICBpbnQgbXlpOworICAgICAgICBteWkgPSBpOworCisgICAgICAgICNwcmFnbWEgb21wIHRhc2sgZmluYWwoaT49MTApCisgICAgICAgIHsKKyAgICAgICAgICB0aWRzW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAvKiB3ZSBnZW5lcmF0ZSBpbmNsdWRlZCB0YXNrcyBmb3IgZmluYWwgdGFza3MgKi8KKyAgICAgICAgICBpZihteWkgPj0gMTApIHsKKyAgICAgICAgICAgIGludCBpbmNsdWRlZCA9IG15aTsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgICAgIGluY2x1ZGVkdGlkc1tpbmNsdWRlZF0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCBpbmNsdWRlZCB0YXNrIG9mIHRoZSBmaW5hbCB0YXNrICovCisgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgICB9IC8qIGVuZCBvZiBpZiBpdCBpcyBhIGZpbmFsIHRhc2sqLworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKiBOb3cgd2UgY2tlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIGZpbmFsIHRhc2sgYW5kIGl0cyBpbmNsdWRlZCB0YXNrLiAqLworICBmb3IgKGkgPSAxMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgaWYgKHRpZHNbaV0gIT0gaW5jbHVkZWR0aWRzW2ldKSB7CisgICAgICBlcnJvcisrOworICAgIH0KKyAgfQorICByZXR1cm4gKGVycm9yPT0wKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsZWxfZm9yX3ByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfZmluYWwoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY0ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3Rhc2tfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IGk7CisgIGludCBzdW0gPSAxMjM0OworICBpbnQga25vd25fc3VtOworICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKworICBrbm93bl9zdW0gPSAxMjM0ICsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBmaXJzdHByaXZhdGUoc3VtKQorICAgICAgICB7CisgICAgICAgICAgaW50IGo7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMT09QQ09VTlQ7IGorKykgeworICAgICAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIGNoZWNrIGlmIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodCAqLworICAgICAgICAgIGlmIChzdW0gIT0ga25vd25fc3VtKSB7CisgICAgICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbCAKKyAgICAgICAgICAgIHsgcmVzdWx0Kys7IH0KKyAgICAgICAgICB9CisgICAgICAgIH0gLyogb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZm9yIGxvb3AgKi8KKyAgICB9IC8qIG9tcCBzaW5nbGUgKi8KKyAgfSAvKiBvbXAgcGFyYWxsZWwgKi8KKyAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfaWYuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiNzUyNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2lmLmMKQEAgLTAsMCArMSw0MyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX3Rhc2tfaWYoKQoreworICBpbnQgY29uZGl0aW9uX2ZhbHNlOworICBpbnQgY291bnQ7CisgIGludCByZXN1bHQ7CisKKyAgY291bnQ9MDsKKyAgY29uZGl0aW9uX2ZhbHNlID0gKGNvdW50ID09IDEpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHRhc2sgaWYgKGNvbmRpdGlvbl9mYWxzZSkgc2hhcmVkKGNvdW50LCByZXN1bHQpCisgICAgICB7CisgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICByZXN1bHQgPSAoMCA9PSBjb3VudCk7CisgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIGNvdW50ID0gMTsKKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGFza19pZigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWFiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw0NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgdGVzdF9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IGk9NTsKKyAgaW50IGsgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IHRhc2tfcmVzdWx0ID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGkpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgTlVNX1RBU0tTOyBrKyspIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBzaGFyZWQocmVzdWx0ICwgdGFza19yZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAvL2NoZWNrIGlmIGkgaXMgcHJpdmF0ZQorICAgICAgICAgIGlmKGkgIT0gNSkKKyAgICAgICAgICAgIHRhc2tfcmVzdWx0ID0gMDsKKyAgICAgICAgICBmb3IoaiA9IDA7IGogPCBOVU1fVEFTS1M7IGorKykKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIGZpcnN0cHJpdmF0ZSBpbXBsaWNpdGx5CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHRhc2t3YWl0CisgICAgICByZXN1bHQgPSAodGFza19yZXN1bHQgJiYgaT09NSk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3ByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE2NDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IHRlc3Rfb21wX3Rhc2tfcHJpdmF0ZSgpCit7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworICBpbnQgc3VtID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7IC8qIGNvdW50cyB0aGUgd3Jvbmcgc3VtcyBmcm9tIHRhc2tzICovCisKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBwcml2YXRlKHN1bSkgc2hhcmVkKHJlc3VsdCwga25vd25fc3VtKQorICAgICAgICB7CisgICAgICAgICAgaW50IGo7CisgICAgICAgICAgLy9pZiBzdW0gaXMgcHJpdmF0ZSwgaW5pdGlhbGl6ZSB0byAwCisgICAgICAgICAgc3VtID0gMDsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisgICAgICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICAgICAgc3VtICs9IGo7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGNoZWNrIGlmIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodCAqLworICAgICAgICAgIGlmIChzdW0gIT0ga25vd25fc3VtKSB7CisgICAgICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbCAKKyAgICAgICAgICAgIHJlc3VsdCsrOworICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIHJldHVybiAocmVzdWx0ID09IDApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGFza19wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19zaGFyZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3NoYXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDQwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19zaGFyZWQuYwpAQCAtMCwwICsxLDQxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoKQoreworICBpbnQgaTsKKyAgaW50IGsgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaT0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICBmb3IgKGsgPSAwOyBrIDwgTlVNX1RBU0tTOyBrKyspIHsKKyAgICAgICNwcmFnbWEgb21wIHRhc2sgc2hhcmVkKGkpCisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICBpKys7CisgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgc2hhcmVkIGltcGxpY2l0bHkKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmVzdWx0ID0gaTsKKyAgcmV0dXJuICgocmVzdWx0ID09IE5VTV9UQVNLUykpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGFza19pbXBfc2hhcmVkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza3dhaXQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2FhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza3dhaXQuYwpAQCAtMCwwICsxLDc0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFza3dhaXQoKQoreworICBpbnQgcmVzdWx0MSA9IDA7ICAgLyogU3RvcmVzIG51bWJlciBvZiBub3QgZmluaXNoZWQgdGFza3MgYWZ0ZXIgdGhlIHRhc2t3YWl0ICovCisgIGludCByZXN1bHQyID0gMDsgICAvKiBTdG9yZXMgbnVtYmVyIG9mIHdyb25nIGFycmF5IGVsZW1lbnRzIGF0IHRoZSBlbmQgKi8KKyAgaW50IGFycmF5W05VTV9UQVNLU107CisgIGludCBpOworCisgIC8qIGZpbGwgYXJyYXkgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSAKKyAgICBhcnJheVtpXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICovCisgICAgICAgIGludCBteWk7CisgICAgICAgIG15aSA9IGk7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sKKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICAgIGFycmF5W215aV0gPSAxOworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgICAjcHJhZ21hIG9tcCB0YXNrd2FpdAorICAgICAgLyogY2hlY2sgaWYgYWxsIHRhc2tzIHdlcmUgZmluaXNoZWQgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgIGlmIChhcnJheVtpXSAhPSAxKQorICAgICAgICAgIHJlc3VsdDErKzsKKworICAgICAgLyogZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgCisgICAgICAgKiB0aGUgdmFsdWVzIGluIHRoZSB0aWRzIGFycmF5ICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaW50IG15aTsKKyAgICAgICAgbXlpID0gaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzaworICAgICAgICB7CisgICAgICAgICAgYXJyYXlbbXlpXSA9IDI7CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qIGZpbmFsIGNoZWNrLCBpZiBhbGwgYXJyYXkgZWxlbWVudHMgY29udGFpbiB0aGUgcmlnaHQgdmFsdWVzOiAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICBpZiAoYXJyYXlbaV0gIT0gMikKKyAgICAgIHJlc3VsdDIrKzsKKyAgfQorICByZXR1cm4gKChyZXN1bHQxID09IDApICYmIChyZXN1bHQyID09IDApKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2t3YWl0KCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza3lpZWxkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza3lpZWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiNjk4NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNreWllbGQuYwpAQCAtMCwwICsxLDU4IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFza3lpZWxkKCkKK3sKKyAgaW50IGk7CisgIGludCBjb3VudCA9IDA7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisKKyAgZm9yIChpPTA7IGk8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgc3RhcnRfdGlkW2ldPTA7CisgICAgY3VycmVudF90aWRbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaW50IG15aSA9IGk7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sgdW50aWVkCisgICAgICAgIHsKKyAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgIHN0YXJ0X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgI3ByYWdtYSBvbXAgdGFza3lpZWxkCisgICAgICAgICAgaWYoKHN0YXJ0X3RpZFtteWldICUyKSA9PTApeworICAgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICB9IC8qZW5kIG9mIGlmKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBmb3IgKGk9MDtpPE5VTV9UQVNLUzsgaSsrKSB7CisgICAgLy9wcmludGYoInN0YXJ0X3RpZFslZF09JWQsIGN1cnJlbnRfdGlkWyVkXT0lZFxuIiwKKyAgICAgIC8vaSwgc3RhcnRfdGlkW2ldLCBpICwgY3VycmVudF90aWRbaV0pOworICAgIGlmIChjdXJyZW50X3RpZFtpXSA9PSBzdGFydF90aWRbaV0pCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiAoY291bnQ8TlVNX1RBU0tTKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2t5aWVsZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90aHJlYWRwcml2YXRlL29tcF90aHJlYWRwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhYmFkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90aHJlYWRwcml2YXRlL29tcF90aHJlYWRwcml2YXRlLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKy8qCisgKiBUaHJlYWRwcml2YXRlIGlzIHRlc3RlZCBpbiAyIHdheXM6CisgKiAxLiBUaGUgZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmVkIGFzIHRocmVhZHByaXZhdGUgc2hvdWxkIGhhdmUKKyAqICBsb2NhbCBjb3B5IGZvciBlYWNoIHRocmVhZC4gT3RoZXJ3aXNlIHJhY2UgY29uZGl0aW9uIGFuZCAKKyAqICB3cm9uZyByZXN1bHQuCisgKiAyLiBJZiB0aGUgdmFsdWUgb2YgbG9jYWwgY29weSBpcyByZXRhaW5lZCBmb3IgdGhlIHR3byBhZGphY2VudAorICogIHBhcmFsbGVsIHJlZ2lvbnMKKyAqLworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IHN1bTA9MDsKK3N0YXRpYyBpbnQgbXl2YWx1ZSA9IDA7CisKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCkKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXl2YWx1ZSkKKworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGUoKQoreworICBpbnQgc3VtID0gMDsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IGk7IAorICBpbnQgaXRlcjsKKyAgaW50ICpkYXRhOworICBpbnQgc2l6ZTsKKyAgaW50IG51bV9mYWlsZWQgPSAwOworICBpbnQgbXlfcmFuZG9tOworICBvbXBfc2V0X2R5bmFtaWMoMCk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSAKKyAgeworICAgIHN1bTAgPSAwOworICAgICNwcmFnbWEgb21wIGZvciAKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgfSAvKmVuZCBvZiBmb3IqLworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICB9IC8qZW5kIG9mIGNyaXRpY2FsICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovICAKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICBpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICIga25vd25fc3VtID0gJWQsIHN1bSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKworICAvKiB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24gaXMganVzdCB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMqLworICBvbXBfc2V0X2R5bmFtaWMoMCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKyAgICB7CisgICAgICBzaXplPW9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICAgIGRhdGE9KGludCopIG1hbGxvYyhzaXplKnNpemVvZihpbnQpKTsKKyAgICB9CisgIH0vKiBlbmQgcGFyYWxsZWwqLworCisgIHNyYW5kKDQ1KTsKKyAgZm9yIChpdGVyID0gMDsgaXRlciA8IDEwMDsgaXRlcisrKSB7CisgICAgbXlfcmFuZG9tID0gcmFuZCgpOyAvKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyAKKyAgICAgICAgICAgICAgICAgY2FsbGVkIGluc2lkZSBzZXJpYWwgcmVnaW9uKi8KKworICAgIC8qIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gaXMgdXNlZCB0byBpbml0aWFsaXllIG15dmFsdWUKKyAgICAgICBhbmQgdGhlIGFycmF5IHdpdGggbXlfcmFuZG9tK3JhbmsgKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgIGludCByYW5rOworICAgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAgIG15dmFsdWUgPSBkYXRhW3JhbmtdID0gbXlfcmFuZG9tICsgcmFuazsKKyAgICB9CisKKyAgICAvKiB0aGUgc2Vjb25kIHBhcmFsbGVsIHJlZ2lvbiB2ZXJpZmllcyB0aGF0IHRoZSAKKyAgICAgICB2YWx1ZSBvZiAibXl2YWx1ZSIgaXMgcmV0YWluZWQgKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24oKzpudW1fZmFpbGVkKQorICAgIHsKKyAgICAgIGludCByYW5rOworICAgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAgIG51bV9mYWlsZWQgPSBudW1fZmFpbGVkICsgKG15dmFsdWUgIT0gZGF0YVtyYW5rXSk7CisgICAgICBpZihteXZhbHVlICE9IGRhdGFbcmFua10pIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIG15dmFsdWUgPSAlZCwgZGF0YVtyYW5rXT0gJWRcbiIsCisgICAgICAgICAgbXl2YWx1ZSwgZGF0YVtyYW5rXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZyZWUgKGRhdGEpOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pICYmICFudW1fZmFpbGVkOworfSAvKiBlbmQgb2YgY2hlY2tfdGhyZWFkcHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90aHJlYWRwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGhyZWFkcHJpdmF0ZS9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90aHJlYWRwcml2YXRlL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjNhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGhyZWFkcHJpdmF0ZS9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYwpAQCAtMCwwICsxLDQ4IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgaTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSkKKworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKCkKK3sKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IHN1bTsKKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHN1bSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBzdW0wID0gMCwgaTA7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpMCA9IDE7IGkwIDw9IExPT1BDT1VOVDsgaTArKykgeworICAgICAgaSA9IGkwOworICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgfQorICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgCisKKyAgaWYgKGtub3duX3N1bSAhPSBzdW0gKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIga25vd25fc3VtID0gJWQsIHN1bSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3IvYnVnX3NldF9zY2hlZHVsZV8wLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2J1Z19zZXRfc2NoZWR1bGVfMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDY0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2J1Z19zZXRfc2NoZWR1bGVfMC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVGVzdCB0aGF0IHRoZSBjaHVuayBzaXplIGlzIHNldCB0byBkZWZhdWx0ICgxKSB3aGVuCisgICBjaHVuayBzaXplIDw9IDAgaXMgc3BlY2lmaWVkICovCitpbnQgYSA9IDA7CisKK2ludCB0ZXN0X3NldF9zY2hlZHVsZV8wKCkKK3sKKyAgaW50IGk7CisgIGEgPSAwOworICBvbXBfc2V0X3NjaGVkdWxlKG9tcF9zY2hlZF9keW5hbWljLDApOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUocnVudGltZSkKKyAgICBmb3IoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGErKzsKKyAgICAgIGlmKGEgPiAxMCkKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgIH0gICAgCisgIHJldHVybiBhPT0xMDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfc2V0X3NjaGVkdWxlXzAoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9jb2xsYXBzZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2NvbGxhcHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3OWU0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9jb2xsYXBzZS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICBzdGF0aWMgaW50IGxhc3RfaTsKKyAgaW50IGlzbGFyZ2VyOworICBpZiAoaT09MSkKKyAgICBsYXN0X2k9MDsKKyAgaXNsYXJnZXIgPSAoKGkgPj0gbGFzdF9pKSYmKGkgLSBsYXN0X2k8PTEpKTsKKyAgbGFzdF9pID0gaTsKKyAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCB0ZXN0X29tcF9mb3JfY29sbGFwc2UoKQoreworICBpbnQgaXNfbGFyZ2VyID0gMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGksajsKKyAgICBpbnQgbXlfaXNsYXJnZXIgPSAxOworICAgICNwcmFnbWEgb21wIGZvciBwcml2YXRlKGksaikgc2NoZWR1bGUoc3RhdGljLDEpIGNvbGxhcHNlKDIpIG9yZGVyZWQKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgIGZvciAoaiA9MTsgaiA8MTAwOyBqKyspIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorICAgICAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkmJm15X2lzbGFyZ2VyOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIGlzX2xhcmdlciA9IGlzX2xhcmdlciAmJiBteV9pc2xhcmdlcjsKKyAgfQorICByZXR1cm4gKGlzX2xhcmdlcik7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3JfY29sbGFwc2UoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWNlYjUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQga25vd25fc3VtOworICBpbnQgdGhyZWFkc251bTsKKworICBzdW0gPSAwOworICBzdW0wID0gMTIzNDU7CisgIHN1bTEgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzbnVtPW9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICB9CisgICAgLyogc3VtMCA9IDA7ICovCisgIAorICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvciBmaXJzdHByaXZhdGUoc3VtMCkKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICBzdW0xID0gc3VtMDsKKyAgICB9ICAvKiBlbmQgb2YgZm9yICovCisgIAorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICB9ICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgfSAgLyogZW5kIG9mIHBhcmFsbGVsICovICAKKyAga25vd25fc3VtID0gMTIzNDUqIHRocmVhZHNudW0rIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4OTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTIgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0wOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0wKQorCitpbnQgdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bSA9IDA7CisgIGludCBrbm93bl9zdW07CisgIGludCBpMDsKKyAgCisgIGkwID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIHN1bTAgPSAwOworICAgIHsgIC8qIEJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisgICAgICBpbnQgaTsKKyAgICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsNykgbGFzdHByaXZhdGUoaTApCisgICAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgaTAgPSBpOworICAgICAgfSAgLyogZW5kIG9mIGZvciAqLworICAgIH0gIC8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgIH0gIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8gIAorCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgZnByaW50ZihzdGRlcnIsICJrbm93bl9zdW0gPSAlZCAsIHN1bSA9ICVkXG4iLGtub3duX3N1bSxzdW0pOworICBmcHJpbnRmKHN0ZGVyciwgIkxPT1BDT1VOVCA9ICVkICwgaTAgPSAlZFxuIixMT09QQ09VTlQsaTApOworICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yIChpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfbm93YWl0LmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4NWYxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9ub3dhaXQuYwpAQCAtMCwwICsxLDUzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9mb3Jfbm93YWl0KCkKK3sKKyAgaW50IHJlc3VsdDsKKyAgaW50IGNvdW50OworICBpbnQgajsKKyAgaW50IG15YXJyYXlbTE9PUENPVU5UXTsKKworICByZXN1bHQgPSAwOworICBjb3VudCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgcmFuazsKKyAgICBpbnQgaTsKKworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworICAgICNwcmFnbWEgb21wIGZvciBub3dhaXQgCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisgICAgICB9CisgICAgfQorICAgIAorICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisgICAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9ub3dhaXQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9vcmRlcmVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZjBlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfb3JkZXJlZC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGF0IGkgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IAorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgIGludCBpc2xhcmdlcjsKKyAgaXNsYXJnZXIgPSAoaSA+IGxhc3RfaSk7CisgIGxhc3RfaSA9IGk7CisgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgdGVzdF9vbXBfZm9yX29yZGVyZWQoKQoreworICBpbnQgc3VtOworICBpbnQgaXNfbGFyZ2VyID0gMTsKKyAgaW50IGtub3duX3N1bTsKKworICBsYXN0X2kgPSAwOworICBzdW0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgbXlfaXNsYXJnZXIgPSAxOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgb3JkZXJlZAorICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorICAgICAgeworICAgICAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkgJiYgbXlfaXNsYXJnZXI7CisgICAgICAgIHN1bSA9IHN1bSArIGk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworICAgIH0KKyAgfQorCisgIGtub3duX3N1bT0oOTkgKiAxMDApIC8gMjsKKyAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9vcmRlcmVkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODE2OThlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3ByaXZhdGUuYwpAQCAtMCwwICsxLDYzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yaygpCit7CisgIGludCBpOworICBkb3VibGUgc3VtID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKyAgc3VtICs9IHNxcnQgKChkb3VibGUpIGkpOworICB9Cit9CisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgdGVzdF9vbXBfZm9yX3ByaXZhdGUoKQoreworICBpbnQgc3VtID0gMDsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtMCA9IDA7ICAvKiBzZXR0aW5nIChnbG9iYWwpIHN1bTAgPSAwICovCisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIHN1bTEgPSAwOyAgLyogc2V0dGluZyBzdW0xIGluIGVhY2ggdGhyZWFkIHRvIDAgKi8KKyAgICB7ICAvKiBiZWdpbiBvZiBvcnBoYW5lZCBibG9jayAqLworICAgICAgaW50IGk7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgcHJpdmF0ZShzdW0wKSBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICAgc3VtMCA9IHN1bTE7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgZG9fc29tZV93b3JrICgpOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBzdW0xID0gc3VtMDsKKyAgICAgIH0KKyAgICB9ICAvKiBlbmQgb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICB9ICAvKmVuZCBvZiBjcml0aWNhbCovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCovICAKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAgICAgICAgICAgICAgICAKKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcmVkdWN0aW9uLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2OTBiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDMzOSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwICAvKiAxMCEgKi8KKworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24gKCkKK3sKKyAgZG91YmxlIGR0OworICBpbnQgc3VtOworICBpbnQgZGlmZjsKKyAgaW50IHByb2R1Y3QgPSAxOworICBkb3VibGUgZHN1bTsKKyAgZG91YmxlIGRrbm93bl9zdW07CisgIGRvdWJsZSBkZGlmZjsKKyAgaW50IGxvZ2ljX2FuZDsKKyAgaW50IGxvZ2ljX29yOworICBpbnQgYml0X2FuZDsKKyAgaW50IGJpdF9vcjsKKyAgaW50IGV4Y2x1c2l2X2JpdF9vcjsKKyAgaW50ICpsb2dpY3M7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworICBpbnQga25vd25fcHJvZHVjdDsKKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7IC8qIG92ZXIgYWxsIHJvdW5kaW5nIGVycm9yIHRvIGJlCisgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQgaW4gdGhlIGRvdWJsZSB0ZXN0cyAqLworICBkb3VibGUgZHB0OworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGxvZ2ljc0FycmF5W0xPT1BDT1VOVF07CisKKyAgLyogVmFyaWFibGVzIGZvciBpbnRlZ2VyIHRlc3RzICovCisgIHN1bSA9IDA7CisgIHByb2R1Y3QgPSAxOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIC8qIHZhcmlhYmVscyBmb3IgZG91YmxlIHRlc3RzICovCisgIGR0ID0gMS4gLyAzLjsgIC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZHN1bSA9IDAuOworICAvKiBWYXJpYWJlbGVzIGZvciBsb2dpYyAgdGVzdHMgKi8KKyAgbG9naWNzID0gbG9naWNzQXJyYXk7CisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljX29yID0gMDsKKyAgLyogVmFyaWFiZWxlcyBmb3IgYml0IG9wZXJhdG9ycyB0ZXN0cyAqLworICBiaXRfYW5kID0gMTsKKyAgYml0X29yID0gMDsKKyAgLyogVmFyaWFibGVzIGZvciBleGNsdXNpdiBiaXQgb3IgKi8KKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiogVGVzdHMgZm9yIGludGVnZXJzICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqIFRlc3RpbmcgaW50ZWdlciBhZGRpdGlvbiAqKioqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigrOnN1bSkKKyAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisgICAgICBzdW0gPSBzdW0gKyBqOworICAgIH0KKyAgfQorICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkLlxuIiwgc3VtLCBrbm93bl9zdW0pOyAKKyAgfQorCisgIC8qKioqIFRlc3RpbmcgaW50ZWdlciBzdWJ0cmFjdG9uICoqKiovCisgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisgICAgICBkaWZmID0gZGlmZiAtIGo7CisgICAgfQorICB9CisgIGlmIChkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgMC5cbiIsIGRpZmYpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uICoqKiovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCo6cHJvZHVjdCkKKyAgICBmb3IgKGogPSAxOyBqIDw9IE1BWF9GQUNUT1I7IGorKykgeworICAgICAgcHJvZHVjdCAqPSBqOworICAgIH0KKyAgfQorICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiBUZXN0cyBmb3IgZG91YmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKiogVGVzdGluZyBkb3VibGUgYWRkaXRpb24gKioqKi8KKyAgZHN1bSA9IDAuOworICBkcHQgPSAxLjsKKyAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkgeworICAgIGRwdCAqPSBkdDsKKyAgfQorICBka25vd25fc3VtID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCs6ZHN1bSkKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgaisrKSB7ICAKKyAgICAgIGRzdW0gKz0gcG93IChkdCwgaik7CisgICAgfQorICB9CisgIGlmIChmYWJzIChkc3VtIC0gZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOyAKKyAgICBmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICBkc3VtLCBka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICB9CisKKyAgLyoqKiogVGVzdGluZyBkb3VibGUgc3VidHJhY3Rpb24gKioqKi8KKyAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKSB7CisgICAgICBkZGlmZiAtPSBwb3cgKGR0LCBqKTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMgKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUiCisgICAgICAiIGluc3RlYWQgb2YgMC4wXG4iLCBkZGlmZik7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiBUZXN0cyBmb3IgbG9naWNhbCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICoqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqIFRlc3RpbmcgbG9naWMgYW5kICoqKiovCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgIGxvZ2ljc1tpXSA9IDE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tqXSk7CisgICAgfQorICB9CisgIGlmKCFsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgfQorCisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGxvZ2ljIG9yICoqKiovCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgIGxvZ2ljc1tpXSA9IDA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbih8fDpsb2dpY19vcikgIAorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3Nbal07CisgICAgfQorICB9CisgIGlmIChsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiBUZXN0cyBmb3IgYml0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKiBUZXN0aW5nIGJpdCBhbmQgKioqKi8KKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgbG9naWNzW2ldID0gMTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkgIAorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2pdKTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3Nbal07CisgICAgfQorICB9CisgIGlmIChiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBiaXQgb3IgKioqKi8KKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgbG9naWNzW2ldID0gMDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAoIWJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBleGNsdXNpdmUgYml0IG9yICoqKiovCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgIGxvZ2ljc1tpXSA9IDA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYgKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYgKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIHJldHVybiAocmVzdWx0ID09IDApOworICBmcmVlIChsb2dpY3MpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3JlZHVjdGlvbigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkMDNjNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMKQEAgLTAsMCArMSw2OSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCB0ZXN0X29tcF9mb3JfYXV0bygpCit7CisgIGludCBqOworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IHRocmVhZHNudW07CisKKyAgc3VtID0gMDsKKyAgc3VtMCA9IDEyMzQ1OworCisgIC8vIGFycmF5IHdoaWNoIGtlZXBzIHRyYWNrIG9mIHdoaWNoIHRocmVhZHMgcGFydGljaXBhdGVkIGluIHRoZSBmb3IgbG9vcAorICAvLyBlLmcuLCBnaXZlbiA0IHRocmVhZHMsIFsgMCB8IDEgfCAxIHwgMCBdIGltcGxpZXMKKyAgLy8gICAgICAgdGhyZWFkcyAwIGFuZCAzIGRpZCBub3QsIHRocmVhZHMgMSBhbmQgMiBkaWQKKyAgaW50IG1heF90aHJlYWRzID0gb21wX2dldF9tYXhfdGhyZWFkcygpOworICBpbnQqIGFjdGl2ZV90aHJlYWRzID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heF90aHJlYWRzKTsKKyAgZm9yKGogPSAwOyBqIDwgbWF4X3RocmVhZHM7IGorKykgCisgICAgYWN0aXZlX3RocmVhZHNbal0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBzdW0xID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmb3IgZmlyc3Rwcml2YXRlKHN1bTApIHNjaGVkdWxlKGF1dG8pCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgYWN0aXZlX3RocmVhZHNbb21wX2dldF90aHJlYWRfbnVtKCldID0gMTsKKyAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgIHN1bTEgPSBzdW0wOworICAgIH0KKyAgCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgIH0KKyAgfQorCisgIC8vIGNvdW50IHRoZSB0aHJlYWRzIHRoYXQgcGFydGljaXBhdGVkIChzdW0gaXMgc3RvcmVkIGluIHRocmVhZHNudW0pCisgIHRocmVhZHNudW09MDsKKyAgZm9yKGogPSAwOyBqIDwgbWF4X3RocmVhZHM7IGorKykgeworICAgIGlmKGFjdGl2ZV90aHJlYWRzW2pdKQorICAgICAgdGhyZWFkc251bSsrOworICB9CisgIGZyZWUoYWN0aXZlX3RocmVhZHMpOworCisgIGtub3duX3N1bSA9IDEyMzQ1ICogdGhyZWFkc251bSArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9hdXRvKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmE2ZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpAQCAtMCwwICsxLDkwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisvKgorICogVGVzdCBmb3IgZHluYW1pYyBzY2hlZHVsaW5nIHdpdGggY2h1bmsgc2l6ZQorICogTWV0aG9kOiBjYWN1bGF0ZSBob3cgbWFueSB0aW1lcyB0aGUgaXRlcmF0aW9uIHNwYWNlIGlzIGRpc3BhdGNoZWQKKyAqICAgICBhbmQganVkZ2UgaWYgZWFjaCBkaXNwYXRjaCBoYXMgdGhlIHJlcXVlc3RlZCBjaHVuayBzaXplCisgKiAgICAgdW5sZXNzIGl0IGlzIHRoZSBsYXN0IG9uZS4KKyAqIEl0IGlzIHBvc3NpYmxlIGZvciB0d28gYWRqYWNlbnQgY2h1bmtzIGFyZSBhc3NpZ25lZCB0byB0aGUgc2FtZSB0aHJlYWQKKyAqIE1vZGlmaWVkIGJ5IENodW5odWEgTGlhbworICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKyNkZWZpbmUgQ0ZETUFYX1NJWkUgMTAwCitjb25zdCBpbnQgY2h1bmtfc2l6ZSA9IDc7CisKK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYygpCit7CisgIGludCB0aWQ7CisgIGludCAqdGlkczsKKyAgaW50IGk7CisgIGludCB0aWRzQXJyYXlbQ0ZETUFYX1NJWkVdOworICBpbnQgY291bnQgPSAwOworICBpbnQgdG1wX2NvdW50ID0gMDsgLypkaXNwYXRjaCB0aW1lcyovCisgIGludCAqdG1wOyAgLypzdG9yZSBjaHVuayBzaXplIGZvciBlYWNoIGRpc3BhdGNoKi8KKyAgaW50IHJlc3VsdCA9IDA7CisgIAorICB0aWRzID0gdGlkc0FycmF5OworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKSBzaGFyZWQodGlkcykKKyAgeyAgICAgICAgLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICBpbnQgdGlkOworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYyxjaHVua19zaXplKQorICAgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRTsgaSsrKSB7CisgICAgICB0aWRzW2ldID0gdGlkOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRSAtIDE7ICsraSkgeworICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKSB7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorCisgIHRtcCA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoY291bnQgKyAxKSk7CisgIHRtcFswXSA9IDE7CisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKSB7CisgICAgaWYgKHRtcF9jb3VudCA+IGNvdW50KSB7CisgICAgICBwcmludGYgKCItLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGVzdGludGVybmFsIEVycm9yOiBMaXN0IHRvbyBzbWFsbCEhIVxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAgLyogRXJyb3IgaGFuZGxpbmcgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAodGlkc1tpXSAhPSB0aWRzW2kgKyAxXSkgeworICAgICAgdG1wX2NvdW50Kys7CisgICAgICB0bXBbdG1wX2NvdW50XSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcFt0bXBfY291bnRdKys7CisgICAgfQorICB9CisgIC8qIGlzIGR5bmFtaWMgc3RhdGVtZW50IHdvcmtpbmc/ICovCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKCh0bXBbaV0lY2h1bmtfc2l6ZSkhPTApIHsKKyAgICAgIC8qIGl0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkICovCisgICAgICByZXN1bHQrKzsKKyAgICAgIGZwcmludGYoc3RkZXJyLCJUaGUgaW50ZXJtZWRpYXRlIGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKyAgICAgIC8qIHJlc3VsdCArPSAoKHRtcFtpXSAvIGNodW5rX3NpemUpIC0gMSk7ICovCisgICAgfQorICB9CisgIGlmICgodG1wW2NvdW50XSVjaHVua19zaXplKSE9KENGRE1BWF9TSVpFJWNodW5rX3NpemUpKSB7IAorICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJ0aGUgbGFzdCBkaXNwYXRjaCBoYXMgd3JvbmcgY2h1bmtzaXplLlxuIik7CisgIH0KKyAgLyogZm9yIChpbnQgaT0wO2k8Y291bnQrMTsrK2kpIHByaW50ZigiJWRcdDo9XHQlZFxuIixpKzEsdG1wW2ldKTsgKi8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQoraW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjMmI0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYwpAQCAtMCwwICsxLDIxOCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorCisvKiBUZXN0IGZvciBndWlkZWQgc2NoZWR1bGluZworICogRW5zdXJlIHRocmVhZHMgZ2V0IGNodW5rcyBpbnRlcmxlYXZlbHkgZmlyc3QKKyAqIFRoZW4ganVkZ2UgdGhlIGNodW5rIHNpemVzIGFyZSBkZWNyZWFzaW5nIHRvIGEgc3RhYmxlIHZhbHVlCisgKiBNb2RpZmllZCBieSBDaHVuaHVhIExpYW8KKyAqIEZvciBleGFtcGxlLCAxMDAgaXRlcmF0aW9uIG9uIDIgdGhyZWFkcywgY2h1bmtzaXplIDcKKyAqIG9uZSBsaW5lIGZvciBlYWNoIGRpc3BhdGNoLCAwLzEgbWVhbnMgdGhyZWFkIGlkCisgKiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgMjQKKyAqIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAxOAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgMTQKKyAqIDEgMSAxIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgMTAKKyAqIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICA4CisgKiAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgIDcKKyAqIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgNworICogMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICA3CisgKiAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgICA1CisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgIDAuMDA1CisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwMQorI2VuZGlmCisKK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkKCkKK3sKKyAgaW50ICogdGlkczsKKyAgaW50ICogY2h1bmtzaXplczsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCB0aHJlYWRzOworICBpbnQgaTsKKyAgaW50IHJlc3VsdDsKKworICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKyAgbWF4aXRlciA9IDA7CisgIHJlc3VsdCA9IDE7CisgIG5vdG91dCA9IDE7CisKKyAgLyogVGVzdGluZyBpZiBlbm91Z2ggdGhyZWFkcyBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGNoZWNrLiAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICB9CisgIH0KKworICAvKiBlbnN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byB0aHJlYWRzICovCisgIGlmICh0aHJlYWRzIDwgMikgeworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMoMik7CisgICAgdGhyZWFkcyA9IDI7CisgIH0KKworICAvKiBOb3cgdGhlIHJlYWwgcGFyYWxsZWwgd29yazogIAorICAgKiBFYWNoIHRocmVhZCB3aWxsIHN0YXJ0IGltbWVkaWF0ZWx5IHdpdGggdGhlIGZpcnN0IGNodW5rLgorICAgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsbWF4aXRlcikKKyAgeyAgLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICBkb3VibGUgY291bnQ7CisgICAgaW50IHRpZDsKKyAgICBpbnQgajsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworICAgICNwcmFnbWEgb21wIGZvciBub3dhaXQgc2NoZWR1bGUoZ3VpZGVkKQorICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opIHsKKyAgICAgIGNvdW50ID0gMC47CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorICAgICAgaWYgKGogPiBtYXhpdGVyKSB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBtYXhpdGVyID0gajsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KSAgCisgICAgICB3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkgeworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgIGNvdW50ICs9IFNMRUVQVElNRTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigiLiIpOworI2VuZGlmCisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworICAgICAgdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIG5vdG91dCA9IDA7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWVzICAgICAgICAgICAgICAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB7CisgICAgaW50IGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKyAgICBpbnQgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07CisgICAgaW50IGdsb2JhbF9jaHVua25yID0gMDsKKyAgICBpbnQgb3BlbndvcmsgPSBDRlNNQVhfU0laRTsKKyAgICBpbnQgZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKyAgICBpbnQqIGxvY2FsX2NodW5rbnIgPSAoaW50KiltYWxsb2ModGhyZWFkcyAqIHNpemVvZihpbnQpKTsKKyAgICBkb3VibGUgYyA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGhyZWFkczsgaSsrKQorICAgICAgbG9jYWxfY2h1bmtucltpXSA9IDA7CisKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOworCisgICAgLyoKKyAgICAgKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBnbG9iYWwgY2h1bmtzCisgICAgICovCisgICAgLy8gZnByaW50ZihzdGRlcnIsIiMgZ2xvYmFsX2NodW5rbnIgdGhyZWFkIGxvY2FsX2NodW5rbnIgY2h1bmtzaXplXG4iKTsKKyAgICBmb3IoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkgeworICAgICAgaWYgKGxhc3RfdGhyZWFkbnI9PXRpZHNbaV0pIHsgCisgICAgICAgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZnByaW50ZihzdGRlcnIsICIlZFx0JWRcdCVkXHQlZFxuIiwgZ2xvYmFsX2NodW5rbnIsCisgICAgICAgICAgIGxhc3RfdGhyZWFkbnIsIGxvY2FsX2NodW5rbnJbbGFzdF90aHJlYWRucl0sIG0pOyAqLworICAgICAgICBnbG9iYWxfY2h1bmtucisrOworICAgICAgICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisgICAgICAgIGxhc3RfdGhyZWFkbnIgPSB0aWRzW2ldOworICAgICAgICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisgICAgICB9CisgICAgfQorICAgIC8qIG5vdyBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBzYXZpbmcgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzICovCisgICAgY2h1bmtzaXplcyA9IChpbnQqKW1hbGxvYyhnbG9iYWxfY2h1bmtuciAqIHNpemVvZihpbnQpKTsKKworICAgIC8qCisgICAgKiBFdmFsdWF0ZSB0aGUgc2l6ZXMgb2YgdGhlIGdsb2JhbCBjaHVua3MKKyAgICAqLworICAgIGdsb2JhbF9jaHVua25yID0gMDsKKyAgICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisgICAgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07ICAgIAorICAgIGZvciAoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkgeworICAgICAgLyogSWYgdGhlIHRocmVhZG51bWJlciB3YXMgdGhlIHNhbWUgYXMgYmVmb3JlIGluY3JlYXNlIHRoZQorICAgICAgICogZGV0ZWN0ZWQgY2h1bmtzaXplIGZvciB0aGlzIGNodW5rIG90aGVyd2lzZSBzZXQgdGhlIGRldGVjdGVkIAorICAgICAgICogY2h1bmtzaXplIGFnYWluIHRvIG9uZSBhbmQgc2F2ZSB0aGUgbnVtYmVyIG9mIHRoZSBuZXh0IAorICAgICAgICogdGhyZWFkIGluIGxhc3RfdGhyZWFkbnIuIAorICAgICAgICovCisgICAgICBpZiAobGFzdF90aHJlYWRuciA9PSB0aWRzW2ldKSB7IAorICAgICAgICBkZXRlcm1pbmVkX2NodW5rc2l6ZSsrOyAKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNodW5rc2l6ZXNbZ2xvYmFsX2NodW5rbnJdID0gZGV0ZXJtaW5lZF9jaHVua3NpemU7CisgICAgICAgIGdsb2JhbF9jaHVua25yKys7CisgICAgICAgIGxvY2FsX2NodW5rbnJbbGFzdF90aHJlYWRucl0rKzsKKyAgICAgICAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisgICAgICAgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKyAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBWRVJCT1NFCisgICAgZnByaW50ZihzdGRlcnIsICJmb3VuZFx0ZXhwZWN0ZWRcdGNvbnN0YW50XG4iKTsKKyNlbmRpZgorCisgICAgLyogaWRlbnRpZnkgdGhlIGNvbnN0YW50IGMgZm9yIHRoZSBleHBvbmVudGlhbCAKKyAgICAgICBkZWNyZWFzZSBvZiB0aGUgY2h1bmtzaXplICovCisgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IG9wZW53b3JrIC8gdGhyZWFkczsKKyAgICBjID0gKGRvdWJsZSkgY2h1bmtzaXplc1swXSAvIGV4cGVjdGVkX2NodW5rX3NpemU7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IGdsb2JhbF9jaHVua25yOyBpKyspIHsKKyAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgbmV3IGV4cGVjdGVkIGNodW5rc2l6ZSAqLworICAgICAgaWYgKGV4cGVjdGVkX2NodW5rX3NpemUgPiAxKSAKKyAgICAgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IGMgKiBvcGVud29yayAvIHRocmVhZHM7CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZihzdGRlcnIsICIlOGRcdCU4ZFx0JWxmXG4iLCBjaHVua3NpemVzW2ldLAorICAgICAgICBleHBlY3RlZF9jaHVua19zaXplLCBjICogY2h1bmtzaXplc1tpXS9leHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorICAgICAgLyogY2hlY2sgaWYgY2h1bmtzaXplIGlzIGluc2lkZSB0aGUgcm91bmRpbmcgZXJyb3JzICovCisgICAgICBpZiAoYWJzIChjaHVua3NpemVzW2ldIC0gZXhwZWN0ZWRfY2h1bmtfc2l6ZSkgPj0gMikgeworICAgICAgICByZXN1bHQgPSAwOworI2lmbmRlZiBWRVJCT1NFCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2h1bmtzaXplIGRpZmZlcmVkIGZyb20gZXhwZWN0ZWQgIgorICAgICAgICAgICJ2YWx1ZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSwKKyAgICAgICAgICBleHBlY3RlZF9jaHVua19zaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAgIH0gLyogZW5kIGlmICovCisKKyNpZm5kZWYgVkVSQk9TRQorICAgICAgaWYgKGV4cGVjdGVkX2NodW5rX3NpemUgLSBjaHVua3NpemVzW2ldIDwgMCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogJWQiCisgICAgICAgICAgIiBpbnN0ZWFkIG9mICVkXG4iLCBjaHVua3NpemVzW2ldLGV4cGVjdGVkX2NodW5rX3NpemUpOworI2VuZGlmCisKKyAgICAgIC8qIGNhbGN1bGF0aW5nIHRoZSByZW1haW5pbmcgYW1vdW50IG9mIHdvcmsgKi8KKyAgICAgIG9wZW53b3JrIC09IGNodW5rc2l6ZXNbaV07CisgICAgfSAgCisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGI4YmZmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCkBAIC0wLDAgKzEsMTU1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAwLjAxCisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwNQorI2VuZGlmCisKK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKCkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisgIGludCAqIHRpZHM7CisgIGludCBub3RvdXQ7CisgIGludCBtYXhpdGVyOworICBpbnQgY2h1bmtfc2l6ZTsKKyAgaW50IGNvdW50ZXIgPSAwOworICBpbnQgdG1wX2NvdW50PTE7CisgIGludCBsYXN0dGhyZWFkc3N0YXJ0dGlkID0gLTE7CisgIGludCByZXN1bHQgPSAxOworCisgIGNodW5rX3NpemUgPSA3OworICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKyAgbm90b3V0ID0gMTsKKyAgbWF4aXRlciA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgeyAgLyogYmVnaW4gb2YgcGFyYWxsZWwqLworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0gIC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAgLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgaWYgKHRocmVhZHMgPCAyKSB7CisgICAgb21wX3NldF9udW1fdGhyZWFkcygyKTsKKyAgICB0aHJlYWRzID0gMjsKKyAgfQorICBmcHJpbnRmIChzdGRlcnIsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIHNwZWNpZmllZCIKKyAgICAiIGNodW5rc2l6ZSBvZiAlZFxuIiwgQ0ZTTUFYX1NJWkUsIGNodW5rX3NpemUpOworICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOyAgLyogc2V0dGluZyBlbmRmbGFnICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzKQorICB7IC8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgZG91YmxlIGNvdW50OworICAgIGludCB0aWQ7CisgICAgaW50IGo7CisKKyAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyAgICAjcHJhZ21hIG9tcCBmb3Igbm93YWl0IHNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKQorICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opIHsKKyAgICAgIGNvdW50ID0gMC47CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorICAgICAgaWYgKGogPiBtYXhpdGVyKSB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBtYXhpdGVyID0gajsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKyAgICAgIHdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKSB7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgY291bnQgKz0gU0xFRVBUSU1FOworICAgICAgICBwcmludGYoIi4iKTsKKyAgICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgICBpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKyAgICAgIC8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisgICAgICB0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIHByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgbm90b3V0ID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKioqKiBhbmFseXNpbmcgdGhlIGRhdGEgaW4gYXJyYXkgdGlkcyAqKioqLworCisgIGxhc3R0aWQgPSB0aWRzWzBdOworICB0bXBfY291bnQgPSAwOyAKKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZTTUFYX1NJWkUgKyAxOyArK2kpIHsKKyAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgaWYgKHRpZHNbaV0gPT0gbGFzdHRpZCkgeworICAgICAgdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcgCisgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAqLyAgICAKKyAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisgICAgICAvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKyAgICAgIGlmICh0bXBfY291bnQgPT0gY2h1bmtfc2l6ZSkgeworICAgICAgICB0bXBfY291bnQgPSAxOworICAgICAgICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9LXG4iKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSWYgdGhlIGNodW5rIHNpemUgd2FzIHdyb25nLCBjaGVjayBpZiB0aGUgZW5kIHdhcyByZWFjaGVkICovCisgICAgICAgIGlmICh0aWRzW2ldID09IC0xKSB7CisgICAgICAgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLAorICAgICAgICAgICAgICB0bXBfY291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGgiCisgICAgICAgICAgICAgICIgbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIgorICAgICAgICAgICAgIiB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogRm91bmQgdGhyZWFkIHdpdGggbnVtYmVyICVkIChzaG91bGQgYmUiCisgICAgICAgICIgaW5iZXR3ZWVuIDAgYW5kICVkKS4iLCB0aWRzW2ldLCB0aHJlYWRzIC0gMSk7CisgICAgICByZXN1bHQgPSAwOworICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTgwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYwpAQCAtMCwwICsxLDIwMyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0UgMAorCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKCkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisKKyAgaW50ICogdGlkczsKKyAgaW50ICogdGlkczI7CisgIGludCBub3RvdXQ7CisgIGludCBtYXhpdGVyOworICBpbnQgY2h1bmtfc2l6ZTsKKworICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7ICAvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfSAgLyogZW5kIG9mIHNpbmdsZSAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKiBFbnN1cmUgdGhhdCBhdCBsZWFzdCB0d28gdGhyZWFkcyBhcmUgY3JlYXRlZCAqLworICBpZiAodGhyZWFkcyA8IDIpIHsKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDIpOworICAgIHRocmVhZHMgPSAyOworICB9IAorICBmcHJpbnRmIChzdGRlcnIsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIgorICAgICIgc3BlY2lmaWVkIGNodW5rc2l6ZSBvZiAlZFxuIiwgQ0ZTTUFYX1NJWkUsIGNodW5rX3NpemUpOworICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOyAgLyogc2V0dGluZyBlbmRmbGFnICovCisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMpCisgIHsgIC8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgZG91YmxlIGNvdW50OworICAgIGludCB0aWQ7CisgICAgaW50IGo7CisKKyAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyAgICAjcHJhZ21hIG9tcCBmb3Igbm93YWl0IHNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKQorICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opIHsKKyAgICAgIGNvdW50ID0gMC47CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorICAgICAgaWYgKGogPiBtYXhpdGVyKSB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBtYXhpdGVyID0gajsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKyAgICAgIHdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKSB7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgY291bnQgKz0gU0xFRVBUSU1FOworICAgICAgICBwcmludGYoIi4iKTsKKyAgICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgICBpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKyAgICAgIC8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisgICAgICB0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIHByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgfSAvKiBlbmQgb2Ygb21wIHBhcmFsbGVsIGZvciAqLworCisgICAgbm90b3V0ID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKioqKiBhbmFseXNpbmcgdGhlIGRhdGEgaW4gYXJyYXkgdGlkcyAqKioqLworCisgIGxhc3R0aWQgPSB0aWRzWzBdOworICB0bXBfY291bnQgPSAwOyAKKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZTTUFYX1NJWkUgKyAxOyArK2kpIHsKKyAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIAorICAgICAgIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgaWYgKHRpZHNbaV0gPT0gbGFzdHRpZCkgeworICAgICAgdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiAKKyAgICAgKiBXaGVuIGZpbmRpbmcgdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAqLyAgICAKKyAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisgICAgICAvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKyAgICAgIGlmICh0bXBfY291bnQgPT0gY2h1bmtfc2l6ZSkgeworICAgICAgICB0bXBfY291bnQgPSAxOworICAgICAgICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9LXG4iKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSWYgdGhlIGNodW5rIHNpemUgd2FzIHdyb25nLCBjaGVjayBpZiB0aGUgZW5kIHdhcyByZWFjaGVkICovCisgICAgICAgIGlmICh0aWRzW2ldID09IC0xKSB7CisgICAgICAgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLAorICAgICAgICAgICAgICB0bXBfY291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGgiCisgICAgICAgICAgICAgICIgbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIgorICAgICAgICAgICAgIiB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogRm91bmQgdGhyZWFkIHdpdGggbnVtYmVyICVkIChzaG91bGQgYmUiCisgICAgICAgICIgaW5iZXR3ZWVuIDAgYW5kICVkKS4iLCB0aWRzW2ldLCB0aHJlYWRzIC0gMSk7CisgICAgICByZXN1bHQgPSAwOworICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgfQorCisgIC8qIE5vdyB3ZSBjaGVjayBpZiBzZXZlcmFsIGxvb3AgcmVnaW9ucyBpbiBvbmUgcGFyYWxsZWwgcmVnaW9uIGhhdmUgdGhlCisgICAqIHNhbWUgbG9naWNhbCBhc3NpZ25lbWVudCBvZiBjaHVua3MgdG8gdGhyZWFkcy4gV2UgdXNlIHRoZSBub3dhaXQgCisgICAqIGNsYXVzZSB0byBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgdG8gZ2V0IGFuIGVycm9yLiAqLworCisgIC8qIEZpcnN0IHdlIGFsbG9jYXRlIHNvbWUgbW9yZSBtZW1tb3J5ICovCisgIGZyZWUgKHRpZHMpOworICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIExPT1BDT1VOVCk7CisgIHRpZHMyID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIExPT1BDT1VOVCk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICB7CisgICAgICBpbnQgbjsKKyAgICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMpIG5vd2FpdAorICAgICAgZm9yIChuID0gMDsgbiA8IExPT1BDT1VOVDsgbisrKSB7CisgICAgICAgIGlmIChMT09QQ09VTlQgPT0gbiArIDEgKQorICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisKKyAgICAgICAgdGlkc1tuXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICBpbnQgbTsKKyAgICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMpIG5vd2FpdAorICAgICAgZm9yIChtID0gMTsgbSA8PSBMT09QQ09VTlQ7IG0rKykgeworICAgICAgICB0aWRzMlttLTFdID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICBpZiAodGlkc1tpXSAhPSB0aWRzMltpXSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIkNodW5rIG5vLiAlZCB3YXMgYXNzaWduZWQgb25jZSB0byB0aHJlYWQgJWQgYW5kIgorICAgICAgIiBsYXRlciB0byB0aHJlYWQgJWQuXG4iLCBpLCB0aWRzW2ldLHRpZHMyW2ldKTsKKyAgICByZXN1bHQgPSAwOworICB9CisKKyAgZnJlZSAodGlkcyk7CisgIGZyZWUgKHRpZHMyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IgKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNiZjdkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUoKQoreworICBpbnQgc3VtIDsKKyAgaW50IGkyOworICBpbnQgaTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW09MDsKKyAgaTI9MzsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBwcml2YXRlKGkpIGZpcnN0cHJpdmF0ZShpMikKKyAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgIHN1bSA9IHN1bSArIChpICsgaTIpOworICB9CisKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyICsgaTIgKiBMT09QQ09VTlQ7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfZmlzdHByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9pZi5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmZTQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9pZi5jCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfaWYoKQoreworICBpbnQga25vd25fc3VtOworICBpbnQgbnVtX3RocmVhZHM7CisgIGludCBzdW0sIHN1bTI7CisgIGludCBpOworICBpbnQgY29udHJvbDsKKworICBjb250cm9sID0gMDsKKyAgbnVtX3RocmVhZHM9MDsKKyAgc3VtID0gMDsKKyAgc3VtMiA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUoaSkgaWYgKGNvbnRyb2w9PTEpCisgIGZvciAoaT0wOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgc3VtID0gc3VtICsgaTsKKyAgfQorCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgZnByaW50ZihzdGRlcnIsICJOdW1iZXIgb2YgdGhyZWFkcyBkZXRlcm1pbmVkIGJ5IgorICAgICIgb21wX2dldF9udW1fdGhyZWFkczogJWRcbiIsIG51bV90aHJlYWRzKTsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtICYmIG51bV90aHJlYWRzID09IDEpOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTNjZmIyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGk7CisgIGludCBpMDsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPTA7CisgIGkwID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgXAorICAgIHNjaGVkdWxlKHN0YXRpYyw3KSBwcml2YXRlKGkpIGxhc3Rwcml2YXRlKGkwKQorICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgc3VtID0gc3VtICsgaTsKKyAgICBpMCA9IGk7CisgIH0gLyogZW5kIG9mIHBhcmFsbGVsIGZvciAqLworCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2M5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBsYXN0X2kgPSAwOworCitpbnQgaTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSkKKworLyogVmFyaWFibGUgaWkgaXMgdXNlZCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGEgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZSB1c2VkIGFzIGEgbG9vcAorICogaW5kZXguIFNlZSB0ZXN0IG9tcF90aHJlYWRwcml2YXRlX2Zvci4KKyAqLworc3RhdGljIGludCBpaTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaWkpCisKKy8qISAKKyAgVXRpbGl0eSBmdW5jdGlvbjogcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgbGFyZ2VyIHRoYW4gCisgIHRoZSBhcmd1bWVudCBvZiB0aGUgbGFzdCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlcjIoaW50IGkpCit7CisgIGludCBpc2xhcmdlcjsKKyAgaXNsYXJnZXIgPSAoaSA+IGxhc3RfaSk7CisgIGxhc3RfaSA9IGk7CisgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoKQoreworICBpbnQgc3VtOworICBpbnQgaXNfbGFyZ2VyOworICBpbnQga25vd25fc3VtOworICBpbnQgaTsKKworICBzdW0gPSAwOworICBpc19sYXJnZXIgPSAxOworICBsYXN0X2kgPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgb3JkZXJlZAorICBmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspIHsKKyAgICBpaSA9IGk7CisgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorICAgIHsKKyAgICAgIGlzX2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIyIChpaSkgJiYgaXNfbGFyZ2VyOworICAgICAgc3VtICA9IHN1bSArIGlpOworICAgIH0KKyAgfQorICBrbm93bl9zdW0gPSAoOTkgKiAxMDApIC8gMjsKKyAgZnByaW50ZiAoc3RkZXJyLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgZnByaW50ZiAoc3RkZXJyLCIgaXNfbGFyZ2VyID0gJWRcbiIsIGlzX2xhcmdlcik7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzFkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yayAodm9pZCkKK3sKKyAgaW50IGk7CisgIGRvdWJsZSBzdW0gPSAwOworICBmb3IoaSA9IDA7IGkgPCAxMDAwOyBpKyspeworICAgIHN1bSArPSBzcXJ0IChpKTsKKyAgfQorfQorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgaTsKKyAgaW50IGkyOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9MDsKKyAgaTI9MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSBwcml2YXRlKGkyKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKQorICB7CisgICAgaTIgPSBpOworICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgZG9fc29tZV93b3JrICgpOworICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgc3VtID0gc3VtICsgaTI7CisgIH0gLyplbmQgb2YgZm9yKi8KKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmODU1NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI2NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAgIC8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAgIC8qIDEwISAqLworCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbigpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGRvdWJsZSBkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgIC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyAgaW50IGRpZmY7CisgIGRvdWJsZSBkZGlmZjsKKyAgaW50IHByb2R1Y3Q7CisgIGludCBrbm93bl9wcm9kdWN0OworICBpbnQgbG9naWNfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfYW5kOworICBpbnQgYml0X29yOworICBpbnQgZXhjbHVzaXZfYml0X29yOworICBpbnQgbG9naWNzW0xPT1BDT1VOVF07CisgIGludCBpOworICBkb3VibGUgZHB0OworICBpbnQgcmVzdWx0OworCisgIHN1bSA9MDsKKyAgZHN1bT0wOworICBkdCA9IDEuLzMuOworICByZXN1bHQgPSAwOworICBwcm9kdWN0ID0gMTsKKyAgbG9naWNfYW5kPTE7CisgIGxvZ2ljX29yPTA7CisgIGJpdF9hbmQ9MTsKKyAgYml0X29yPTA7CisgIGV4Y2x1c2l2X2JpdF9vcj0wOworCisgIC8qIFRlc3RzIGZvciBpbnRlZ2VycyAqLworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKSB7CisgICAgc3VtPXN1bStpOworICB9CisgIGlmKGtub3duX3N1bSE9c3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOyAKKyAgfQorCisgIGRpZmYgPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgZm9yIChpPTE7aTw9TE9PUENPVU5UOysraSkgeworICAgIGRpZmY9ZGlmZi1pOworICB9CisgIGlmKGRpZmYgIT0gMCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworICBkc3VtPTA7CisgIGRwdD0xOworICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6ZHN1bSkKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRzdW0gKz0gcG93KGR0LGkpOworICB9CisgIGlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApIHsKKyAgICByZXN1bHQrKzsgCisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgIH0KKworICBkcHQ9MTsKKworICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgfQorICBpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCo6cHJvZHVjdCkKKyAgZm9yKGk9MTtpPD1NQVhfRkFDVE9SO2krKykgeworICAgIHByb2R1Y3QgKj0gaTsKKyAgfQorICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICAvKiBUZXN0cyBmb3IgbG9naWMgQU5EICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgfQorICBpZighbG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKyAgfQorCisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpYyBPUiAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworICB9CisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBBTkQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgfQorICBpZighYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMS5cbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBiaXR3aXNlIE9SICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKHw6Yml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2UgWE9SICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRhNWQwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDU0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPTc7CisgIHN1bTA9MTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlKHN1bTApCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfSAgCisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0gICAgICAgICAKKyAgfQorCisgIGtub3duX3N1bT0xMSozKzc7CisgIHJldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjczNWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw3MSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBpMDsKKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBzdW0wID0gMDsKKyAgaTAgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGksc3VtMCkgbGFzdHByaXZhdGUoaTApCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uICAKKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IgKGk9MTtpPDQwMDtpKyspIHsKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAgIGkwPWk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTQwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAgIGkwPWk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgICBpMD1pOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBrbm93bl9zdW09KDk5OSoxMDAwKS8yOworICByZXR1cm4gKChrbm93bl9zdW09PXN1bSkgJiYgKGkwPT05OTkpICk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRkNjFlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMKQEAgLTAsMCArMSw2NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQgaTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPSA3OworICBzdW0wPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShzdW0wLCBpKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IgKGk9MTtpPDQwMDtpKyspCisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTQwMDtpPDcwMDtpKyspCisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7aSsrKQorICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICB9CisKKyAga25vd25fc3VtPSg5OTkqMTAwMCkvMis3OworICByZXR1cm4gKGtub3duX3N1bT09c3VtKTsgCit9IC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX3ByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkNWNlMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw1MDggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oKQoreworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOyAgCisgIGRvdWJsZSBkcHQ7CisgIGRvdWJsZSBkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS01OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBiaXRfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbMTAwMF07CisgIGludCBpOworICBpbnQgcmVzdWx0OworCisgIHN1bSA9IDc7CisgIGRzdW09MDsKKyAgcHJvZHVjdCA9MTsKKyAgZHB0ID0gMTsKKyAgbG9naWNfYW5kPTE7CisgIGJpdF9hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X29yPTA7CisgIGV4Y2x1c2l2X2JpdF9vcj0wOworICByZXN1bHQgPTA7CisgIC8qICBpbnQgbXlfaXNsYXJnZXI7Ki8KKyAgLyppbnQgaXNfbGFyZ2VyPTE7Ki8KKworICAvLyBUZXN0IHN1bW1hdGlvbiBvZiBpbnRlZ2VycworICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpzdW0pCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIHN1bT1zdW0raTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgIHN1bT1zdW0raTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBzdW09c3VtK2k7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGtub3duX3N1bSE9c3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkLlxuIixzdW0sIGtub3duX3N1bSk7CisgIH0KKworICAvLyBUZXN0IGRpZmZlcmVuY2VzIG9mIGludGVnZXJzCisgIGRpZmYgPSAoOTk5KjEwMDApLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZGlmZiAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKyAgfQorCisgIC8vIFRlc3Qgc3VtbWF0aW9uIG9mIGRvdWJsZXMKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpkc3VtKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgZHN1bSArPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xMjtpPDIwOysraSkgeworICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkgeworICAgIHJlc3VsdCsrOyAKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgfQorCisgIC8vIFRlc3QgZGlmZmVyZW5jZXMgb2YgZG91YmxlcworICBkcHQ9MTsKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICBkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRkaWZmKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTY7aTwxMjsrK2kpIHsKKyAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTEyO2k8MjA7KytpKSB7CisgICAgICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUiCisgICAgICAiIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKyAgfQorCisgIC8vIFRlc3QgcHJvZHVjdCBvZiBpbnRlZ2VycworICBrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsgIAorICAgICAgZm9yKGk9MTtpPDM7aSsrKSB7CisgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTM7aTw3O2krKykgeworICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03O2k8MTE7aSsrKSB7CisgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICB9CisKKyAgLy8gVGVzdCBsb2dpY2FsIEFORAorICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgfQorICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbNTAxXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMiIpOworICB9CisKKyAgLy8gVGVzdCBsb2dpY2FsIE9SCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gVGVzdCBiaXR3aXNlIEFORAorICBmb3IoaT0wO2k8MTAwMDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7ICAKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7ICAKKyAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsgIAorICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1s1MDFdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyIik7CisgIH0KKworICAvLyBUZXN0IGJpdHdpc2UgT1IKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBUZXN0IGJpdHdpc2UgWE9SCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeyAgCisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7ICAKKyAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeyAgCisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQyMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtMCA9IDExOworICBzdW0gPSA3OworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZShzdW0wKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9ICAKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0gICAgICAgICAKKyAgICB9CisgIH0KKyAga25vd25fc3VtID0gMTEgKiAzICsgNzsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsgCit9IC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX2ZpcnN0cHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGViZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw3NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZSgpCit7CisgIGludCBpMCA9IC0xOworICBpbnQgc3VtID0gMDsKKyAgaW50IGk7CisgIGludCBzdW0wID0gMDsKKyAgaW50IGtub3duX3N1bTsKKworICBpMCA9IC0xOworICBzdW0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBsYXN0cHJpdmF0ZShpMCkgcHJpdmF0ZShpLHN1bTApCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbiAgCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICAgaTAgPSBpOworICAgICAgICB9CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0gLyogZW5kIG9mIHNlY3Rpb24gKi8KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IoaSA9IDQwMDsgaSA8IDcwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAgIGkwID0gaTsKKyAgICAgICAgfQorICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfSAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgZm9yKGkgPSA3MDA7IGkgPCAxMDAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICAgaTAgPSBpOworICAgICAgICB9CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0gLyogZW5kIG9mIHNlY3Rpb24gKi8KKyAgICB9IC8qIGVuZCBvZiBzZWN0aW9ucyovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gIAorICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyOworICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gOTk5KSApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX3ByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmM2YxYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9wcml2YXRlLmMKQEAgLTAsMCArMSw2NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDc7CisgIHN1bTAgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKHN1bTAsaSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0gIAorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgZm9yIChpID0gNDAwOyBpIDwgNzAwOyBpKyspCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgZm9yIChpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0gICAgICAgICAKKyAgICB9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDc7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7IAorfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9wcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NlY3Rpb25fcHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uc19ub3dhaXQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4Mjk4OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKQEAgLTAsMCArMSw2OSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfbm93YWl0KCkKK3sKKyAgaW50IHJlc3VsdDsKKyAgaW50IGNvdW50OworICBpbnQgajsKKworICByZXN1bHQgPSAwOworICBjb3VudCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgcmFuazsKKyAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIG5vd2FpdAorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgZW50ZXJzIGZpcnN0IHNlY3Rpb24iCisgICAgICAgICAgIiBhbmQgZ2V0cyBzbGVlcGluZy5cbiIsIHJhbmspOworICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICBjb3VudCA9IDE7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIHdva2UgdXAgYW4gc2V0IgorICAgICAgICAgICIgY291bnQgdG8gMS5cbiIsIHJhbmspOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUiCisgICAgICAgICAgIiBmaXJzdCBzZWN0aW9uLlxuIiwgcmFuayk7CisgICAgICB9CisgICAgfQorICAgIC8qIEJlZ2luIG9mIHNlY29uZCBzZWN0aW9ucyBlbnZpcm9ubWVudCAqLworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSIKKyAgICAgICAgICAiIHNlY29uZCBzZWN0aW9uLlxuIiwgcmFuayk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIgorICAgICAgICAgICIgc2Vjb25kIHNlY3Rpb24gYW5kIGNvbnRyb2xzIHRoZSB2YWx1ZSBvZiBjb3VudFxuIiwgcmFuayk7CisgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bnQgd2FzICVkXG4iLCBjb3VudCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZTkyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNTQzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRwdCxkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBiaXRfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbMTAwMF07CisgIGludCBpOworICBpbnQgcmVzdWx0OworICAvKiBpbnQgbXlfaXNsYXJnZXI7ICovCisgIC8qaW50IGlzX2xhcmdlcj0xOyovCisgIHN1bSA9NzsKKyAgZHB0ID0xOworICBkc3VtPTA7CisgIHByb2R1Y3QgPTE7CisgIGxvZ2ljX2FuZD0xOworICBiaXRfYW5kPTE7CisgIGxvZ2ljX29yPTA7CisgIGJpdF9vcj0wOworICBleGNsdXNpdl9iaXRfb3I9MDsKKyAgcmVzdWx0ID0gMDsKKyAgZHQgPSAxLi8zLjsKKworICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgc3VtPXN1bStpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgc3VtPXN1bStpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICAgIHN1bT1zdW0raTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihrbm93bl9zdW0hPXN1bSkgeworICAgICsrcmVzdWx0OworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIiwgc3VtLGtub3duX3N1bSk7CisgIH0KKworICBkaWZmID0gKDk5OSoxMDAwKS8yOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkaWZmKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworICB9CisKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6ZHN1bSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xMjtpPDIwOysraSkgeworICAgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApIHsKKyAgICByZXN1bHQrKzsgCisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgIH0KKworICBkcHQ9MTsKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICBkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTY7aTwxMjsrK2kpIHsKKyAgICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTEyO2k8MjA7KytpKSB7CisgICAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYoZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAga25vd25fcHJvZHVjdCA9IDM2Mjg4MDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigqOnByb2R1Y3QpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeyAgCisgICAgICAgIGZvcihpPTE7aTwzO2krKykgeworICAgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zO2k8NztpKyspIHsKKyAgICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NztpPDExO2krKykgeworICAgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbNTAxXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworICB9CisKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJcbkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsgIAorICAgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICAgIGJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsgIAorICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeyAgCisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzWzUwMV09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorICBiaXRfb3IgPSAwOworICBsb2dpY3NbNTAxXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeyAgCisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7ICAKKyAgICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeyAgCisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uc19yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzYzM0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZS5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3NpbmdsZSgpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgaW50IHJlc3VsdDsKKyAgaW50IG5yX2l0ZXJhdGlvbnM7CisgIGludCBpOworCisgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgcmVzdWx0ID0gMDsKKyAgbnJfaXRlcmF0aW9ucyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICB7CisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUgCisgICAgICB7ICAKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgICAgCisgICAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1Y2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKyNkZWZpbmUgREVCVUdfVEVTVCAwCisKK2ludCBqOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShqKQorCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKCkKK3sKKyAgaW50IHJlc3VsdDsKKyAgaW50IG5yX2l0ZXJhdGlvbnM7CisKKyAgcmVzdWx0ID0gMDsKKyAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgIGludCB0aHJlYWQ7CisgICAgICAgICB0aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisjZW5kaWYKKyAgICAgICNwcmFnbWEgb21wIHNpbmdsZSBjb3B5cHJpdmF0ZShqKQorICAgICAgeworICAgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICAgIGogPSBpOworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgcHJpbnRmICgidGhyZWFkICVkIGFzc2lnbnMsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOworI2VuZGlmCisgICAgICB9CisjaWYgREVCVUdfVEVTVAorICAgICAgI3ByYWdtYSBvbXAgYmFycmllcgorI2VuZGlmCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgcHJpbnRmICgidGhyZWFkID0gJWQsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOworI2VuZGlmCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGogLSBpOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgYmFycmllcgorICAgIH0gLyogZW5kIG9mIGZvciAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGVfY29weXByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9ub3dhaXQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODM3NDhkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX25vd2FpdC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15X2l0ZXJhdGlvbnM7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15X2l0ZXJhdGlvbnMpCisKK2ludCB0ZXN0X29tcF9zaW5nbGVfbm93YWl0KCkKK3sKKyAgaW50IG5yX2l0ZXJhdGlvbnM7CisgIGludCB0b3RhbF9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisKKyAgbnJfaXRlcmF0aW9ucyA9IDA7CisgIG15X2l0ZXJhdGlvbnMgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgeworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdAorICAgICAgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMgIAorICAgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSAKKyAgeworICAgIG15X2l0ZXJhdGlvbnMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdAorICAgICAgeworICAgICAgICBteV9pdGVyYXRpb25zKys7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgdG90YWxfaXRlcmF0aW9ucyArPSBteV9pdGVyYXRpb25zOworICAgIH0KKworICB9CisgIHJldHVybiAoKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSAmJiAodG90YWxfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZV9ub3dhaXQqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2luZ2xlX25vd2FpdCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX3ByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1NTZjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9wcml2YXRlLmMKQEAgLTAsMCArMSw1NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgbXlpdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15aXQpCitpbnQgbXlyZXN1bHQgPSAwOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteXJlc3VsdCkKKworaW50IHRlc3Rfb21wX3NpbmdsZV9wcml2YXRlKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworICBpbnQgcmVzdWx0OworICBpbnQgbnJfaXRlcmF0aW9uczsKKyAgaW50IGk7CisKKyAgbXlpdCA9IDA7CisgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgbnJfaXRlcmF0aW9ucyA9IDA7CisgIHJlc3VsdCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICB7CisgICAgbXlyZXN1bHQgPSAwOworICAgIG15aXQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlIHByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpIG5vd2FpdAorICAgICAgeyAgCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgICAgCisgICAgICAgIG15aXQrKzsKKyAgICAgICAgbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHJlc3VsdCArPSBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIG5yX2l0ZXJhdGlvbnMgKz0gbXlpdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlIHByaXZhdGUgKi8gCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9jaGVjay1kZXBlbmRzLnBsIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1kZXBlbmRzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAyYTdkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwKQEAgLTAsMCArMSw1MDIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNSI7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3VwdXQgcGFyc2UgZXJyb3IuCisjICAgICAkdG9vbCAtLSBOYW1lIG9mIHRvb2wuCisjICAgICBAYnVsayAtLSBPdXRwdXQgb2YgdGhlIHRvb2wuCisjICAgICAkbiAgICAtLSBOdW1iZXIgb2YgbGluZSBjYXVzZWQgcGFyc2UgZXJyb3IuCitzdWIgcGFyc2VfZXJyb3IoJFxAJCkgeworICAgIG15ICggJHRvb2wsICRidWxrLCAkbiApID0gQF87CisgICAgbXkgQGJ1bGs7CisgICAgZm9yICggbXkgJGkgPSAwOyAkaSA8IEAkYnVsazsgKysgJGkgKSB7CisgICAgICAgIHB1c2goIEBidWxrLCAoICRpID09ICRuID8gIj4+PiAiIDogIiAgICAiICkgLiAkYnVsay0+WyAkaSBdICk7CisgICAgfTsgIyBmb3IgJGkKKyAgICBydW50aW1lX2Vycm9yKCAiRmFpbCB0byBwYXJzZSAkdG9vbCBvdXRwdXQ6IiwgQGJ1bGssICIoZW9mKSIgKTsKK307ICMgc3ViIHBhcnNlX2Vycm9yCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaW51eCogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgbGRkOgorIworIyAkIGxkZCBsaWJuYW1lLnNvCisjICAgbGliYy5zby42ID0+IC9saWI2NC9saWJjLnNvLjYgKDB4MDAwMDJiNjBmZWRkODAwMCkKKyMgICBsaWJkbC5zby4yID0+IC9saWI2NC9saWJkbC5zby4yICgweDAwMDAyYjYwZmYxMmIwMDApCisjICAgbGlicHRocmVhZC5zby4wID0+IC9saWI2NC9saWJwdGhyZWFkLnNvLjAgKDB4MDAwMDJiNjBmZjMyZjAwMCkKKyMgICAvbGliNjQvbGQtbGludXgteDg2LTY0LnNvLjIgKDB4MDAwMDAwMzg3OTQwMDAwMCkKKyMKKyMgTm90ZTogbGRkIHByaW50ZCBhbGwgdGhlIGRlcGVuZGVuY2llcywgZGlyZWN0IGFuZCBpbmRpcmVjdC4gKEZvciBleGFtcGxlLCBpZiBzcGVjaWZpZWQgbGlicmFyeQorIyByZXF1aXJlcyBsaWJkbC5zbywgYW5kIGxpYmRsLnNvIHJlcXVpcmVzIC9saWIvbGQtbGludXguc28sIGxkZCBwcmludHMgYm90aCBsaWJkbC5zbyBhbmQKKyMgL2xpYi9sZC1saW51eC5zbykuIElmIHlvdSBkbyBub3Qgd2FudCBpbmRpcmVjdCBkZXBlbmRlbmNpZXMsIGxvb2sgYXQgcmVhZGVsZiB0b29sLgorIworc3ViIGdldF9kZXBzX2xkZCgkKSB7CisKKyAgICBteSAkbGliID0gc2hpZnQgKCBAXyApOworICAgIG15ICR0b29sID0gImxkZCI7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgQGRlcHM7CisKKyAgICBleGVjdXRlKCBbICR0b29sLCAkbGliIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBmb3JlYWNoIG15ICRpICggMCAuLiBAYnVsayAtIDEgKSB7CisgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgIGlmICggJGxpbmUgIX4gbXteXHMqKD86KFtfYS16MC05ListL10qKVxzKz0+XHMrKT8oW19hLXowLTkuKy0vXSopXHMrXCgweFswLTlhLXpdKlwpJH1pICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAkZGVwID0gKCBkZWZpbmVkKCAkMSApID8gJDEgOiAkMiApOworICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgIH07ICMgZm9yZWFjaCAkaQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19sZGQKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFub3RoZXIgTGludXgqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIHJlYWRlbGY6CisjCisjICQgcmVhZGVsZiAtZCBleHBvcnRzL2xpbl8zMmUvbGliL2xpYm9tcC5zbworIworIyBEeW5hbWljIHNlZ21lbnQgYXQgb2Zmc2V0IDB4ODcwMDggY29udGFpbnMgMjQgZW50cmllczoKKyMgICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZQorIyAgMHgwMDAwMDAwMDAwMDAwMDAxIChORUVERUQpICAgICAgICAgICAgIFNoYXJlZCBsaWJyYXJ5OiBbbGliYy5zby42XQorIyAgMHgwMDAwMDAwMDAwMDAwMDAxIChORUVERUQpICAgICAgICAgICAgIFNoYXJlZCBsaWJyYXJ5OiBbbGliZGwuc28uMl0KKyMgIDB4MDAwMDAwMDAwMDAwMDAwMSAoTkVFREVEKSAgICAgICAgICAgICBTaGFyZWQgbGlicmFyeTogW2xpYnB0aHJlYWQuc28uMF0KKyMgIDB4MDAwMDAwMDAwMDAwMDAwZSAoU09OQU1FKSAgICAgICAgICAgICBMaWJyYXJ5IHNvbmFtZTogW2xpYm9tcC5zb10KKyMgIDB4MDAwMDAwMDAwMDAwMDAwZCAoRklOSSkgICAgICAgICAgICAgICAweDUxY2FhCisjICAweDAwMDAwMDAwMDAwMDAwMDQgKEhBU0gpICAgICAgICAgICAgICAgMHgxNTgKKyMgIDB4MDAwMDAwMDAwMDAwMDAwNSAoU1RSVEFCKSAgICAgICAgICAgICAweDkzNTAKKyMgIC4uLgorIworIyBOb3RlOiBJbiBjb250cmFzdCB0byBsZGQsIHJlYWRsZWYgc2hvd3Mgb25seSBkaXJlY3QgZGVwZW5kZW5jaWVzLgorIworc3ViIGdldF9kZXBzX3JlYWRlbGYoJCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCAoIEBfICk7CisgICAgbXkgJHRvb2w7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgQGRlcHM7CisKKyAgICBpZigkdGFyZ2V0X2FyY2ggZXEgIm1pYyIpIHsKKyAgICAgICAgJHRvb2wgPSAieDg2XzY0LWsxb20tbGludXgtcmVhZGVsZiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJHRvb2wgPSAicmVhZGVsZiI7CisgICAgfQorCisgICAgIyBGb3JjZSB0aGUgcmVhZGVsZiBjYWxsIHRvIGJlIGluIEVuZ2xpc2guIEZvciBleGFtcGxlLCB3aGVuIHJlYWRlbGYKKyAgICAjIGlzIGNhbGxlZCBvbiBhIGZyZW5jaCBsb2NhbGl6YXRpb24sIGl0IHdpbGwgZmluZCAiTGlicmFpcmllIHBhcnRhZ2VlcyIKKyAgICAjIGluc3RlYWQgb2Ygc2hhcmVkIGxpYnJhcnkKKyAgICAkRU5WeyBMQU5HIH0gPSAiQyI7CisKKyAgICBleGVjdXRlKCBbICR0b29sLCAiLWQiLCAkZmlsZSBdLCAtc3Rkb3V0ID0+IFxAYnVsayApOworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgbXkgJGkgPSAwOworICAgICMgUGFyc2UgaGVhZGVyLgorICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgIGlmICggJGkgPT0gQGJ1bGsgLSAxIGFuZCAkYnVsa1sgJGkgXSA9fiBte15UaGVyZSBpcyBubyBkeW5hbWljIHNlY3Rpb24gaW4gdGhpcyBmaWxlXC5ccyokfSApIHsKKyAgICAgICAgIyBUaGlzIGlzIG5vdCBkeW5hbWljIGV4ZWN1dGFibGUgPT4gbm8gZGVwZW5kZW5jaWVzLgorICAgICAgICByZXR1cm4gQGRlcHM7CisgICAgfTsgIyBpZgorICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRHluYW1pYyAoPzpzZWdtZW50fHNlY3Rpb24pIGF0IG9mZnNldCAweFswLTlhLWZdKyBjb250YWlucyBcZCsgZW50cmllczpccyokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccypUYWdccytUeXBlXHMrTmFtZS9WYWx1ZVxzKiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICAjIFBhcnNlIGJvZHkuCisgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG17XlxzKjB4WzAtOWEtZl0rXHMrXCgoW19BLVowLTldKylcKVxzKyguKilccyokfWkgKSB7CisgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIG15ICggJHR5cGUsICR2YWx1ZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgaWYgKCAkdHlwZSBlcSAiTkVFREVEIiApIHsKKyAgICAgICAgICAgIGlmICggJHZhbHVlICF+IG17XEFTaGFyZWQgbGlicmFyeTogXFsoLiopXF1cen0gKSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIG15ICRkZXAgPSAkMTsKKyAgICAgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyBmb3JlYWNoICRpCisKKyAgICByZXR1cm4gQGRlcHM7CisKK307ICMgc3ViIGdldF9kZXBzX3JlYWRlbGYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9TIFgqIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIG90b29sOgorIworIyAkIG90b29sIC1MIGxpYm5hbWUuZHlsaWIKKyMgZXhwb3J0cy9tYWNfMzIvbGliLnRoaW4vbGlib21wLmR5bGliOgorIyAgICAgICAgbGlib21wLmR5bGliIChjb21wYXRpYmlsaXR5IHZlcnNpb24gNS4wLjAsIGN1cnJlbnQgdmVyc2lvbiA1LjAuMCkKKyMgICAgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliIChjb21wYXRpYmlsaXR5IHZlcnNpb24gMS4wLjAsIGN1cnJlbnQgdmVyc2lvbiA4OC4xLjMpCisjCitzdWIgZ2V0X2RlcHNfb3Rvb2woJCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCAoIEBfICk7CisgICAgbXkgJG5hbWUgPSBnZXRfZmlsZSggJGZpbGUgKTsKKyAgICBteSAkdG9vbCA9ICJvdG9vbCI7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgQGRlcHM7CisKKyAgICBpZiAoICR0YXJnZXRfYXJjaCBlcSAiMzJlIiApIHsKKyAgICAgICAgIyBPbiBvbGRlciAoVGlnZXIpIHN5c3RlbXMgb3Rvb2wgZG9lcyBub3QgcmVjb2duaXplIDY0LWJpdCBiaW5hcmllcywgc28gdHJ5IHRvIGxvY2F0ZQorICAgICAgICAjIG90b29sNjQuCisgICAgICAgIG15ICRwYXRoID0gd2hpY2goICJvdG9vbDY0IiApOworICAgICAgICBpZiAoIGRlZmluZWQgKCAkcGF0aCApICkgeworICAgICAgICAgICAgJHRvb2wgPSAib3Rvb2w2NCI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICR0b29sLCAiLUwiLCAkZmlsZSBdLCAtc3Rkb3V0ID0+IFxAYnVsayApOworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgbXkgJGkgPSAwOworICAgICMgUGFyc2UgdGhlIGZpcnN0IG9uZSBvciB0d28gbGluZXMgc2VwYXJhdGVseS4KKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxRJGZpbGVcRTokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgaWYgKCAkbmFtZSA9fiBte1wuZHlsaWJcen0gKSB7CisgICAgICAgICMgSW4gY2FzZSBvZiBkeW5hbWljIGxpYnJhcnkgb3Rvb2wgcHJpbnQgdGhlIGxpYnJhcnkgaXRzZWxmIGFzIGEgZGVwZW5kZW50IGxpYnJhcnkuCisgICAgICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMrXFEkbmFtZVxFXHMrXChjb21wYXRpYmlsaXR5IHZlcnNpb24uKlwpJH0gKQorICAgICAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyBpZgorCisgICAgIyBUaGVuIHBhcnNlIHRoZSByZXN0LgorICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBtL15ccyooLiopXHMrXChjb21wYXRpYmlsaXR5IHZlcnNpb25ccy4qXCkkLyApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgKCAkZGVwICkgPSAoICQxICk7CisgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgICAgICsrICRpOworICAgIH07ICMgd2hpbGUKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfb3Rvb2wKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdpbmRvd3MqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIGxpbms6CisjCisjID4gbGluayAtZHVtcCAtZGVwZW5kZW50cyBsaWJuYW1lLmRsbAorIyBNaWNyb3NvZnQgKFIpIENPRkYvUEUgRHVtcGVyIFZlcnNpb24gOC4wMC40MDMxMC4zOQorIyBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIER1bXAgb2YgZmlsZSBTOlxQcm9qZWN0cy5PTVBcdXNlcnNcb21hbHlzaGVcb21wXGxpYm9tcFxleHBvcnRzXHdpbl82NFxsaWJcbGlib21wbWQuZGxsCisjIEZpbGUgVHlwZTogRExMCisjICAgSW1hZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzOgorIyAgICAgS0VSTkVMMzIuZGxsCisjICAgU3VtbWFyeQorIyAgICAgICAgIEMwMDAgLmRhdGEKKyMgICAgICAgICA2MDAwIC5wZGF0YQorIyAgICAgICAgMTgwMDAgLnJkYXRhCisjICAgICAgICAuLi4KKyMKKyMgPiBsaW5rIC1kdW1wIC1kaXJlY3RpdmVzIGxpYm5hbWUubGliCisjIE1pY3Jvc29mdCAoUikgQ09GRi9QRSBEdW1wZXIgVmVyc2lvbiA4LjAwLjQwMzEwLjM5CisjIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRHVtcCBvZiBmaWxlIFM6XFByb2plY3RzLk9NUFx1c2Vyc1xvbWFseXNoZVxvbXBcbGlib21wXGV4cG9ydHNcd2luXzMyZVxsaWJcbGliaW1wNW10LmxpYgorIyBGaWxlIFR5cGU6IExJQlJBUlkKKyMgICBMaW5rZXIgRGlyZWN0aXZlcworIyAgIC0tLS0tLS0tLS0tLS0tLS0tCisjICAgLWRlZmF1bHRsaWI6InV1aWQubGliIgorIyAgIC1kZWZhdWx0bGliOiJ1dWlkLmxpYiIKKyMgICAuLi4uLgorIyAgIFN1bW1hcnkKKyMgICAgICAgMzI1MCAuYnNzCisjICAgICAgIDNGQkMgLmRhdGEKKyMgICAgICAgICAzNCAuZGF0YTEKKyMgICAgICAgLi4uLgorc3ViIGdldF9kZXBzX2xpbmsoJCkgeworCisgICAgbXkgKCAkbGliICkgPSBAXzsKKyAgICBteSAkdG9vbCA9ICJsaW5rIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIG15ICRleHQgPSBsYyggZ2V0X2V4dCggJGxpYiApICk7CisgICAgaWYgKCAkZXh0ICF+IG17XEFcLig/OmxpYnxkbGx8ZXhlKVx6fWkgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJJbmNvcnJlY3QgZmlsZSBpcyBzcGVjaWZpZWQ6IGAkbGliJzsgb25seSBgbGliJywgYGRsbCcgb3IgYGV4ZScgZmlsZSBleHBlY3RlZCIgKTsKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKAorICAgICAgICBbICR0b29sLCAiL2R1bXAiLCAoICRleHQgZXEgIi5saWIiID8gIi9kaXJlY3RpdmVzIiA6ICIvZGVwZW5kZW50cyIgKSwgJGxpYiBdLAorICAgICAgICAtc3Rkb3V0ID0+IFxAYnVsaworICAgICk7CisKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIG15ICRpID0gMDsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17Xk1pY3Jvc29mdCBcKFJcKSBDT0ZGXC9QRSBEdW1wZXIgVmVyc2lvbi4qJH0gKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkNvcHlyaWdodCBcKENcKSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cLi4qJH0gKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkR1bXAgb2YgZmlsZVxzXFEkbGliXEUkfSAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkZpbGUgVHlwZTpccyguKikkfSAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKworICAgIGlmICggJGV4dCBlcSAiLmxpYiIgKSB7CisKKyAgICAgICAgbXkgJWRlcHM7CisgICAgICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqWy0vXWRlZmF1bHRsaWJcOiguKilccyokfWkgKSB7CisgICAgICAgICAgICAgICAgbXkgJGRlcCA9ICQxOworICAgICAgICAgICAgICAgICMgTm9ybWFsaXplIGxpYnJhcnkgbmFtZToKKyAgICAgICAgICAgICAgICAkZGVwID0gbGMoICQxICk7ICAgICAgICAgICAgICAjIENvbnZlcnQgdG8gbG93ZXIgY2FzZS4KKyAgICAgICAgICAgICAgICAkZGVwID1+IHN7XEEiKC4qKSJcen17JDF9OyAgICAjIERyb3Agc3Vycm91bmRpbmcgcXVvdGVzIChpZiBhbnkpLgorICAgICAgICAgICAgICAgICRkZXAgPX4gc3tcLmxpYlx6fXt9OyAgICAgICAgICMgRHJvcCAubGliIHN1ZmZpeCAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICAkZGVwc3sgJGRlcCB9ID0gMTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypMaW5rZXIgRGlyZWN0aXZlc1xzKiR9ICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKi0rXHMqJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqL2FsdGVybmF0ZW5hbWVcOi4qJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqL0ZBSUxJRk1JU01BVENIXDouKiR9ICkgeworICAgICAgICAgICAgICAgICMgVGhpcyBkaXJlY3RpdmUgaXMgcHJvZHVjZWQgb25seSBieSBfTVNDX1ZFUj0xNjAwCisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqU3VtbWFyeVxzKiR9ICkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICArKyAkaTsKKyAgICAgICAgfSAjIHdoaWxlCisgICAgICAgIEBkZXBzID0ga2V5cyggJWRlcHMgKTsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte1xzKkltYWdlIGhhcyB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY2llc1w6JH0gKQorICAgICAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgKysgJGk7CisgICAgICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJH0gKSB7CisgICAgICAgICAgICAgICAgIyBJZ25vcmUgZW1wdHkgbGluZXMuCisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKC4qXC5kbGwpJH1pICkgeworICAgICAgICAgICAgICAgIG15ICRkZXAgPSBsYyggJDEgKTsKKyAgICAgICAgICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlN1bW1hcnkkfSApIHsKKyAgICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgKysgJGk7CisgICAgICAgIH07ICMgd2hpbGUKKworICAgIH07ICMgaWYKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfbGluaworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTWFpbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBQYXJzZSBjb21tYW5kIGxpbmUuCitteSAkZXhwZWN0ZWQ7CitteSAkYmFyZTsKK0dldG9wdDo6TG9uZzo6Q29uZmlndXJlKCAicGVybXV0ZSIgKTsKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJiYXJlIiAgICAgICA9PiBcJGJhcmUsCisgICAgImV4cGVjdGVkPXMiID0+IFwkZXhwZWN0ZWQsCispOworbXkgQGV4cGVjdGVkOworaWYgKCBkZWZpbmVkKCAkZXhwZWN0ZWQgKSApIHsKKyAgICBpZiAoICRleHBlY3RlZCBuZSAibm9uZSIgKSB7CisgICAgICAgIEBleHBlY3RlZCA9IHNvcnQoIHNwbGl0KCAiLCIsICRleHBlY3RlZCApICk7CisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgICAgIEBleHBlY3RlZCA9IG1hcCggbGMoICRfICksIEBleHBlY3RlZCApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorfTsgIyBpZgoraWYgKCBAQVJHViA8IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlNwZWNpZnkgYSBsaWJyYXJ5IG5hbWUgdG8gY2hlY2sgZm9yIGRlcGVuZGVuY2llcyIgKTsKK307ICMgaWYKK2lmICggQEFSR1YgPiAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJUb28gbWFueSBhcmd1bWVudHMiICk7Cit9OyAjIGlmCitteSAkbGliID0gc2hpZnQoIEBBUkdWICk7CitpZiAoIG5vdCAtZSAkbGliICl7CisgICAgcnVudGltZV9lcnJvciggIlNwZWNpZmllZCBmaWxlIGRvZXMgbm90IGV4aXN0OiBcIiRsaWJcIiIgKTsKK307ICMgaWYKKworIyBTZWxlY3QgYXBwcm9wcmlhdGUgZ2V0X2RlcHMgaW1wbGVtZW50YXRpb24uCitpZiAoIDAgKSB7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibGluIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX3JlYWRlbGY7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX290b29sOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19saW5rOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KK215IEBkZXBzID0gc29ydCggZ2V0X2RlcHMoICRsaWIgKSApOworaWYgKCAkYmFyZSApIHsKKyAgICBwcmludCggbWFwKCAiJF9cbiIsIEBkZXBzICkgKTsKK30gZWxzZSB7CisgICAgaW5mbyggIkRlcGVuZGVuY2llczoiLCBAZGVwcyA/IG1hcCggIiAgICAkXyIsIEBkZXBzICkgOiAiKG5vbmUpIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZXhwZWN0ZWQgKSApIHsKKyAgICBteSAlZGVwcyA9IG1hcCggKCAkXyA9PiAxICksIEBkZXBzICk7CisgICAgZm9yZWFjaCBteSAkZGVwICggQGV4cGVjdGVkICkgeworICAgICAgICBkZWxldGUoICRkZXBzeyAkZGVwIH0gKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICBteSBAdW5leHBlY3RlZCA9IHNvcnQoIGtleXMoICVkZXBzICkgKTsKKyAgICBpZiAoIEB1bmV4cGVjdGVkICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiVW5leHBlY3RlZCBkZXBlbmRlbmNpZXM6IiwgbWFwKCAiICAgICRfIiwgQHVuZXhwZWN0ZWQgKSApOworICAgIH07ICMgaWYKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1kZXBlbmRzLnBsPiAtLSBDaGVjayBkZXBlbmRlbmNpZXMgZm9yIGEgc3BlY2lmaWVkIGxpYnJhcnkuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWRlcGVuZHMucGw+IEk8T1BUSU9OUz4uLi4gSTxsaWJyYXJ5PgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQzxjaGVjay1kZXBlbmRzLnBsPiBmaW5kcyBkaXJlY3QgZGVwZW5kZW5jaWVzIGZvciBhIHNwZWNpZmllZCBsaWJyYXJ5LiBMaXN0IG9mIGFjdHVhbCBkZXBlbmRlbmNpZXMKK2lzIHNvcnRlZCBhbHBoYWJldGljYWxseSBhbmQgcHJpbnRlZC4gSWYgbGlzdCBvZiBleHBlY3RlZCBkZXBlbmRlbmNpZXMgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0cworY2hlY2tzIHRoZSBsaWJyYXJ5IGhhcyBvbmx5IGFsbG93ZWQgZGVwZW5kZW5jaWVzLiBJbiBjYXNlIG9mIG5vdCBleHBlY3RlZCBkZXBuZGVuY2llcyB0aGUgc2NyaXB0Citpc3N1ZXMgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdHMgd2l0aCBub24temVybyBjb2RlLgorCitMaW51eCogT1MgYW5kIE9TIFgqOiBUaGUgc2NyaXB0IGZpbmRzIGRlcGVuZGVuY2llcyBvbmx5IGZvciBkeW1hbWljIGxpYnJhcmllcy4gV2luZG93cyogT1M6IFRoZSBzY3JpcHQKK2ZpbmRzIGRlcGVuZGVuY2llcyBmb3IgZWl0aGVyIHN0YXRpYyBvciBkeW1hbWljIGxpYnJhcmllcy4KKworVGhlIHNjcmlwdCB1c2VzIGV4dGVybmFsIHRvb2xzLiBPbiBMaW51eCogT1MsIGl0IHJ1bnMgRjxyZWFkZWxmPiwgb24gT1MgWCogLS0gRjxvdG9vbD4gKG9yIEY8b3Rvb2w2ND4pLAorb24gV2luZG93cyogT1MgLS0gRjxsaW5rPi4KKworT24gV2luZG93cyogT1MgZGVwZW5kZW5jaWVzIGFyZSBwcmludGVkIGluIGxvd2VyIGNhc2UsIGNhc2Ugb2YgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIGlnbm9yZWQuCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1iYXJlPgorCitEbyBub3QgdXNlIGZhbmN5IGZvcm1hdHRpbmc7IHByb2R1Y2UgcGxhaW4sIGJhcmUgb3V0cHV0OiBqdXN0IGEgbGlzdCBvZiBsaWJyYXJpZXMsCithIGxpYnJhcnkgcGVyIGxpbmUuCisKKz1pdGVtIEI8LS1leHBlY3RlZD0+STxsaXN0PgorCitJPGxpc3Q+IGlzIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cGVjdGVkIGRlcGVuZGVuY2llcyAob3IgQzxub25lPikuCitJZiBDPC0tZXhwZWN0ZWQ+IG9wdGlvbiBzcGVjaWZpZWQsIEM8Y2hlY2stZGVwZW5kcy5wbD4gY2hlY2tzIHRoZSBzcGVjaWZpZWQgbGlicmFyeQoraGFzIG9ubHkgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzLgorCis9aXRlbSBCPC0tb3M9Pkk8c3RyPgorCitTcGVjaWZ5IHRhcmdldCBPUyAodG9vbCB0byB1c2UpIG1hbnVhbGx5LgorVXNlZnVsIGZvciBjcm9zcy1idWlsZCwgd2hlbiBob3N0IE9TIGlzIG5vdCB0aGUgc2FtZSBhcyB0YXJnZXQgT1MuCitJPHN0cj4gc2hvdWxkIGJlIGVpdGhlciBDPGxpbj4sIEM8bWFjPiwgb3IgQzx3aW4+LgorCis9YmFjaworCis9aGVhZDIgU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworRG8gbm90IG91dHB1dCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGxpYnJhcnk+CisKK0EgbmFtZSBvZiBsaWJyYXJ5IHRvIGZpbmQgb3IgY2hlY2sgZGVwZW5kZW5jaWVzLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworSnVzdCBwcmludCBsaWJyYXJ5IGRlcGVuZGVuY2llcyAoV2luZG93cyogT1MpOgorCisgICAgPiBjaGVjay1kZXBlbmRzLnBsIGV4cG9ydHMvd2luXzMyL2xpYi9saWJvbXBtZC5kbGwKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgRGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSAgICAga2VybmVsMzIuZGxsCisKK1ByaW50IGxpYnJhcnkgZGVwZW5kZW5jaWVzLCB1c2UgYmFyZSBvdXRwdXQgKExpbnV4KiBPUyk6CisKKyAgICAkIGNoZWNrLWRlcGVuZHMucGwgLS1iYXJlIGV4cG9ydHMvbGluXzMyZS9saWIvbGlib21wX2RiLnNvCisgICAgbGliYy5zby42CisgICAgbGliZGwuc28uMgorICAgIGxpYnB0aHJlYWQuc28uMAorCitDaGVjayB0aGUgbGlicmFyeSBkb2VzIG5vdCBoYXZlIGFueSBkZXBlbmRlbmNpZXMgKE9TIFgqKToKKworICAgICQgY2hlY2stZGVwZW5kcy5wbCAtLWV4cGVjdGVkPW5vbmUgZXhwb3J0cy9tYWNfMzIvbGliL2xpYm9tcC5keWxpYgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSBEZXBlbmRlbmNpZXM6CisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpICAgICAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYgorICAgIGNoZWNrLWRlcGVuZHMucGw6ICh4KSBVbmV4cGVjdGVkIGRlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoeCkgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliCisgICAgJCBlY2hvICQ/CisgICAgMgorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzYzJiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbApAQCAtMCwwICsxLDE0NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDIiOworCitzdWIgZXhlY3N0YWNrKCQpIHsKKyAgICBteSAoICRmaWxlICkgPSBAXzsKKyAgICBteSBAb3V0cHV0OworICAgIG15IEBzdGFjazsKKyAgICBteSAkdG9vbDsKKyAgICBpZigkdGFyZ2V0X2FyY2ggZXEgIm1pYyIpIHsKKyAgICAgICAgJHRvb2wgPSAieDg2XzY0LWsxb20tbGludXgtcmVhZGVsZiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJHRvb2wgPSAicmVhZGVsZiI7CisgICAgfQorICAgIGV4ZWN1dGUoIFsgJHRvb2wsICItbCIsICItVyIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBvdXRwdXQgKTsKKyAgICBAc3RhY2sgPSBncmVwKCAkXyA9fiBte1xBXHMqKD86R05VXyk/U1RBQ0tccyt9LCBAb3V0cHV0ICk7CisgICAgaWYgKCBub3QgQHN0YWNrICkgeworICAgICAgICAjIEludGVycHJldCBtaXNzZWQgIlNUQUNLIiBsaW5lIGFzIGVycm9yLgorICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IE5vIHN0YWNrIHNlZ21lbnQgZm91bmQ7IGxvb2tzIGxpa2Ugc3RhY2sgd291bGQgYmUgZXhlY3V0YWJsZS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggQHN0YWNrID4gMSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBNb3JlIHRoYW4gb25lIHN0YWNrIHNlZ21lbnQgZm91bmQuIiwgInJlYWRlbGYgb3V0cHV0OiIsIEBvdXRwdXQsICIoZW9mKSIgKTsKKyAgICB9OyAjIGlmCisgICAgIyBUeXBpY2FsIHN0YWNrIGxpbmVzIGFyZToKKyAgICAjIExpbnV4KiBPUyBJQS0zMiBhcmNoaXRlY3R1cmU6CisgICAgIyAgICBHTlVfU1RBQ0sgICAgICAweDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMCAweDAwMDAwIFJXRSAweDQKKyAgICAjIExpbnV4KiBPUyBJbnRlbChSKSA2NDoKKyAgICAjICAgIEdOVV9TVEFDSyAgICAgIDB4MDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAgMHgwMDAwMDAgUldFIDB4OAorICAgIGlmICggJHN0YWNrWyAwIF0gIX4gbXtcQVxzKig/OkdOVV8pP1NUQUNLKD86XHMrMHhbMC05YS1mXSspezV9XHMrKFtSIF1bVyBdW0UgXSlccysweFswLTlhLWZdK1xzKlx6fSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBDYW5ub3QgcGFyc2Ugc3RhY2sgc2VnbWVudCBsaW5lOiIsICI+Pj4gJHN0YWNrWyAwIF0iICk7CisgICAgfTsgIyBpZgorICAgIG15ICRhdHRycyA9ICQxOworICAgIGlmICggJGF0dHJzID1+IG17RX0gKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogU3RhY2sgaXMgZXhlY3V0YWJsZSIgKTsKKyAgICB9OyAjIGlmCit9OyAjIHN1YiBleGVjc3RhY2sKKworZ2V0X29wdGlvbnMoCisgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksCispOworCitmb3JlYWNoIG15ICRmaWxlICggQEFSR1YgKSB7CisgICAgZXhlY3N0YWNrKCAkZmlsZSApOworfTsgIyBmb3JlYWNoICRmaWxlCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2stZXhlY3N0YWNrLnBsPiAtLSBDaGVjayB3aGV0aGVyIHN0YWNrIGlzIGV4ZWN1dGFibGUsIGlzc3VlIGFuIGVycm9yIGlmIHNvLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1leGVjc3RhY2sucGw+IEk8b3B0aWlvbj4uLi4gSTxmaWxlPi4uLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBjaGVja3Mgd2hldGhlciBzdGFjayBvZiBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLCBhbmQgaXNzdWVzIGVycm9yIGlmIHN0YWNrIGlzCitleGVjdXRhYmxlLiBJZiBzdGFjayBpcyBub3QgZXhlY3V0YWJsZSwgdGhlIHNjcmlwdCBleGl0cyBzaWxlbnRseSB3aXRoIHplcm8gZXhpdCBjb2RlLgorCitUaGUgc2NyaXB0IHJ1bnMgQzxyZWFkZWxmPiB1dGlsaXR5IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLiBTbywgdGhlCitzY3JpcHQgZmFpbHMgaWYgQzxyZWFkZWxmPiBpcyBub3QgYXZhaWxhYmxlLiBFZmZlY3RpdmVseSBpdCBtZWFucyB0aGUgc2NyaXB0IHdvcmtzIG9ubHkgb24gTGludXgqIE9TCisoYW5kLCBwcm9iYWJseSwgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlKS4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCB0byBjaGVjay4gTXVsdGlwbGUgZmlsZXMgbWF5IGJlIHNwZWNpZmllZC4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKK0NoZWNrIGxpYm9tcC5zbyBsaWJyYXJ5OgorCisgICAgJCBjaGVjay1leGVjc3RhY2sucGwgbGlib21wLnNvCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjc3ZTIwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCkBAIC0wLDAgKzEsMzE2IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIFBsYXRmb3JtICI6dmFycyI7Cit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNCI7CisKK215ICRoZXggPSBxcntbMC05YS1mXX1pOyAgICAjIGhleCBkaWdpdC4KKworIyBtaWMtc3BlY2lmaWMgZGV0YWlscy4KKworc3ViIGJhZF9taWNfZm10KCQpIHsKKyAgICAjIEJlZm9yZSB3ZSBhbGxvd2VkIGJvdGggZWxmNjQteDg2LTY0LWZyZWVic2QgYW5kIGVsZi1sMW9tLWZyZWVic2QuCisgICAgIyBOb3cgdGhlIGZpcnN0IG9uZSBpcyBvYnNvbGV0ZSwgb25seSBlbGY2NC1sMW9tLWZyZWVic2QgaXMgYWxsb3dlZC4KKyAgICBteSAoICRmbXQgKSA9IEBfOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggIiR0YXJnZXRfbWljX2FyY2giIGVxICJrbmYiICkgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQtbDFvbT9cen07CisgICAgfSBlbHNpZiAoICIkdGFyZ2V0X21pY19hcmNoIiBlcSAia25jIiApIHsKKwkgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjY0LWsxb20/XHp9OworCX0gZWxzZSB7CisJICAgIHJldHVybiAxOworCX07Cit9OyAjIHN1YiBiYWRfbWljX2ZtdAorCisjIFVuZGVzaXJlZCBpbnN0cnVjdGlvbnMgZm9yIG1pYzogYWxsIHg4NyBhbmQgc29tZSBvdGhlci4KKyMgQUM6IFNpbmNlIGNvbXBpbGVyIDIwMTAtMDYtMzAgeDg3IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLCByZW1vdmVkIHRoZSBjaGVjayBvZiB4ODcuCitteSAkbWljX2JhZF9yZTsKK3N1YiBiYWRfbWljX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyAgICBpZiAoICIkdGFyZ2V0X21pY19hcmNoIiBlcSAia25jIiApIHsKKwkjIHdvcmthcm91bmQgb2YgYmFkIGNvZGUgZ2VuZXJhdGlvbiBvbiBLTkYgTGludXgqIE9TOgorCXJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJG1pY19iYWRfcmUgKTsKKyAgICB9IGVsc2UgeworCXJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJG1pY19iYWRfcmUgb3IgZGVmaW5lZCggJGFyZ3MgKSBhbmQgJGFyZ3MgPX4gbXt4bW19aSApOworICAgIH0KK307ICMgc3ViIGJhZF9taWNfaW5zdHIKKworIyBsaW5fMzItc3BlY2lmaWMgZGV0YWlscy4KKworc3ViIGJhZF9pYTMyX2ZtdCgkKSB7CisgICAgbXkgKCAkZm10ICkgPSBAXzsKKyAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmMzItaTM4Nlx6fTsKK307ICMgc3ViIGJhZF9pYTMyX2ZtdAorCitteSBAc3NlMiA9CisgICAgcXd7CisgICAgICAgIG1vdmFwZCBtb3Z1cGQgbW92aHBkIG1vdmxwZCBtb3Ztc2twZCBtb3ZzZAorICAgICAgICBhZGRwZCBhZGRzZCBzdWJwZCBzdWJzZCBtdWxwZCBtdWxzZCBkaXZwZCBkaXZzZCBzcXJ0cGQgc3FydHNkIG1heHBkIG1heHNkIG1pbnBkIG1pbnNkCisgICAgICAgIGFuZHBkIGFuZG5wZCBvcnBkIHhvcnBkCisgICAgICAgIGNtcHBkIGNtcHNkIGNvbWlzZCB1Y29taXNkCisgICAgICAgIHNodWZwZCB1bnBja2hwZCB1bnBja2xwZAorICAgICAgICBjdnRwZDJwaSBjdnR0cGQycGkgY3Z0cGkycGQgY3Z0cGQyZHEgY3Z0dHBkMmRxIGN2dGRxMnBkIGN2dHBzMnBkIGN2dHBkMnBzIGN2dHNzMnNkIGN2dHNkMnNzCisgICAgICAgIGN2dHNkMnNpIGN2dHRzZDJzaSBjdnRzaTJzZCBjdnRkcTJwcyBjdnRwczJkcSBjdnR0cHMyZHEgbW92ZHFhIG1vdmRxdSBtb3ZxMmRxIG1vdmRxMnEKKyAgICAgICAgcG11bHVkcSBwYWRkcSBwc3VicSBwc2h1Zmx3IHBzaHVmaHcgcHNodWZkIHBzbGxkcSBwc3JsZHEgcHVucGNraHFkcSBwdW5wY2tscWRxIGNsZmx1c2gKKyAgICAgICAgbGZlbmNlIG1mZW5jZSBtYXNrbW92ZHF1IG1vdm50cGQgbW92bnRkcSBtb3ZudGkKKyAgICB9OworbXkgQHNzZTMgPQorICAgIHF3eworICAgICAgICBmaXN0dHAgbGRkcXUgYWRkc3VicHMgYWRkc3VicGQgaGFkZHBzIGhzdWJwcyBoYWRkcGQgaHN1YnBkIG1vdnNoZHVwIG1vdnNsZHVwIG1vdmRkdXAgbW9uaXRvcgorICAgICAgICBtd2FpdAorICAgIH07CitteSBAc3NzZTMgPQorICAgIHF3eworICAgICAgICBwaGFkZHcgcGhhZGRzdyBwaGFkZGQgcGhzdWJ3IHBoc3Vic3cgcGhzdWJkIHBhYnNiIHBhYnN3IHBhYnNkIHBtYWRkdWJzdyBwbXVsaHJzdyBwc2h1ZmIKKyAgICAgICAgcHNpZ25iIHBzaWdudyBwc2lnbmQgcGFsaWducgorICAgIH07CitteSBAc3NlNCA9CisgICAgKAorICAgICAgICAjIFNTRTQuMQorICAgICAgICBxd3sKKyAgICAgICAgICAgIHBtdWxsZCBwbXVsZHEgZHBwZCBkcHBzIG1vdm50ZHFhIGJsZW5kcGQgYmxlbmRwcyBibGVuZHZwZCBibGVuZHZwcyBwYmxlbmR2YiBwYmxlbmR3IHBtaW51dworICAgICAgICAgICAgcG1pbnVkIHBtaW5zYiBwbWluc2QgcG1heHV3IHBtYXh1ZCBwbWF4c2IgcG1heHNkIHJvdW5kcHMgcm91bmRwZCByb3VuZHNzIHJvdW5kc2QgZXh0cmFjdHBzCisgICAgICAgICAgICBpbnNlcnRwcyBwaW5zcmIgcGluc3JkIHBpbnNycSBwZXh0cmIgcGV4dHJ3IHBleHRyZCBwZXh0cnEgcG1vdnN4YncgcG1vdnp4YncgcG1vdnN4YmQKKyAgICAgICAgICAgIHBtb3Z6eGJkIHBtb3ZzeHdkIHBtb3Z6eHdkIHBtb3ZzeGJxIHBtb3Z6eGJxIHBtb3ZzeHdxIHBtb3Z6eHdxIHBtb3ZzeGRxIHBtb3Z6eGRxIG1wc2FkYncKKyAgICAgICAgICAgIHBobWlucG9zdXcgcHRlc3QgcGNtcGVxcSBwYWNrdXNkdworICAgICAgICB9LAorICAgICAgICAjIFNTRTQuMgorICAgICAgICBxd3sKKyAgICAgICAgICAgIHBjbXBlc3RyaSBwY21wZXN0cm0gcGNtcGlzdHJpIHBjbXBpc3RybSBwY21wZ3RxIGNyYzMyIHBvcGNudAorICAgICAgICB9CisgICAgKTsKKworIyBVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGZvciBJQS0zMiBhcmNoaXRlY3R1cmU6IFBlbnRpdW0gNCAoU1NFMikgYW5kIG5ld2VyLgorIyBUT0RPOiBJdCB3b3VsZCBiZSBtdWNoIG1vcmUgcmVsaWFibGUgdG8gbGlzdCAqYWxsb3dlZCogaW5zdHJ1Y3Rpb25zIHJhdGhlciB0aGFuIGxpc3QgdW5kZXNpcmVkCisjIGluc3RydWN0aW9ucy4gSW4gc3VjaCBhIGNhc2UgdGhlIGxpc3Qgd2lsbCBiZSBzdGFibGUgYW5kIG5vdCByZXF1aXJlIHVwZGF0ZSB3aGVuIFNTRTUgaXMgcmVsZWFzZWQuCitteSBAaWEzMl9iYWRfbGlzdCA9ICggQHNzZTIsIEBzc2UzLCBAc3NzZTMsIEBzc2U0ICk7CisKK215ICRpYTMyX2JhZF9yZSA9IHFye0B7WyAiXig/OiIgLiBqb2luKCAifCIsIEBpYTMyX2JhZF9saXN0ICkgLiAiKSIgXX19aTsKKworc3ViIGJhZF9pYTMyX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyAgICByZXR1cm4gKCBkZWZpbmVkKCAkaW5zdHIgKSBhbmQgJGluc3RyID1+ICRpYTMyX2JhZF9yZSApOworfTsgIyBzdWIgYmFkX2lhMzJfaW5zdHIKKworc3ViIGNoZWNrX2ZpbGUoJDskJCkgeworCisgICAgbXkgKCAkZmlsZSwgJHNob3dfaW5zdHJ1Y3Rpb25zLCAkbWF4X2luc3RydWN0aW9ucyApID0gQF87CisgICAgbXkgQGJ1bGs7CisKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWF4X2luc3RydWN0aW9ucyApICkgeworICAgICAgICAkbWF4X2luc3RydWN0aW9ucyA9IDEwMDsKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICJ4ODZfNjQtazFvbS1saW51eC1vYmpkdW1wIiwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKworICAgIG15ICRuID0gMDsKKyAgICBteSAkZXJyb3JzID0gMDsKKyAgICBteSAkY3VycmVudF9mdW5jICA9ICIiOyAgICAjIE5hbWUgb2YgY3VycmVudCBmdWN0aW9uLgorICAgIG15ICRyZXBvcnRlZF9mdW5jID0gIiI7ICAgICMgbmFtZSBvZiBsYXN0IHJlcG9ydGVkIGZ1bmN0aW9uLgorICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgKysgJG47CisgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiR9ICkgeworICAgICAgICAgICAgIyBFbXB0eSBsaW5lLgorICAgICAgICAgICAgIyBJZ25vcmUuCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15JbiBhcmNoaXZlICguKj8pOlxzKiR9ICkgeworICAgICAgICAgICAgIyBJbiBhcmNoaXZlIGxpYm9tcC5hOgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteKD86Lio/KTpccypmaWxlIGZvcm1hdCAoLio/KVxzKiR9ICkgeworICAgICAgICAgICAgIyBsaWJvbXAuc286ICAgICBmaWxlIGZvcm1hdCBlbGY2NC14ODYtNjQtZnJlZWJzZAorICAgICAgICAgICAgIyBrbXBfZnRuX2NkZWNsLm86ICAgICBmaWxlIGZvcm1hdCBlbGY2NC14ODYtNjQKKyAgICAgICAgICAgIG15ICRmbXQgPSAkMTsKKyAgICAgICAgICAgIGlmICggYmFkX2ZtdCggJGZtdCApICkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJJbnZhbGlkIGZpbGUgZm9ybWF0OiAkZm10LiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gKC4qPyk6XHMqJH0gKSB7CisgICAgICAgICAgICAjIERpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnBsdDoKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XiRoZXgrIDwoW14+XSspPjpccyokfSApIHsKKyAgICAgICAgICAgICMgMDAwMDAwMDAwMDAxN2U5OCA8X19rbXBfc3RyX2Zvcm1hdEBwbHQtMHgxMD46CisgICAgICAgICAgICAkY3VycmVudF9mdW5jID0gJDE7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypcLnszfVxzKiR9ICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKCRoZXgrKTpccysoJGhleCRoZXgoPzogJGhleCRoZXgpKilccysoPzpsb2NrXHMrfHJleFsuYS16XSpccyspPyhbXiBdKykoPzpccysoW14jXSs/KSk/XHMqKD86I3wkKX0gKSB7CisgICAgICAgICAgICAjICAgMTdlOTg6ICAgICAgIGZmIDM1IGZhIDdkIDI2IDAwICAgICAgIHB1c2hxICAweDI2N2RmYSglcmlwKSAgICAgICAgIyAyN2ZjOTggPF9HTE9CQUxfT0ZGU0VUX1RBQkxFPgorICAgICAgICAgICAgbXkgKCAkYWRkciwgJGR1bXAsICRpbnN0ciwgJGFyZ3MgKSA9ICggJDEsICQyLCAkMywgJDQgKTsKKyAgICAgICAgICAgICMgQ2hlY2sgdGhpcyBpcyBub3QgYSBiYWQgaW5zdHJ1Y3Rpb24gYW5kIHhtbSByZWdpc3RlcnMgYXJlIG5vdCB1c2VkLgorICAgICAgICAgICAgaWYgKCBiYWRfaW5zdHIoICRpbnN0ciwgJGFyZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRlcnJvcnMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIkludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIGAkZmlsZSc6IiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICBpZiAoICRjdXJyZW50X2Z1bmMgbmUgJHJlcG9ydGVkX2Z1bmMgKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICIgICAgJGN1cnJlbnRfZnVuYyIgKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlcG9ydGVkX2Z1bmMgPSAkY3VycmVudF9mdW5jOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICArKyAkZXJyb3JzOworICAgICAgICAgICAgICAgIGlmICggJHNob3dfaW5zdHJ1Y3Rpb25zICkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiICAgICAgICAkbGluZSIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCAkZXJyb3JzID49ICRtYXhfaW5zdHJ1Y3Rpb25zICkgeworICAgICAgICAgICAgICAgICAgICBpbmZvKCAiJGVycm9ycyBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZDsgc2Nhbm5pbmcgc3RvcHBlZC4iICk7CisgICAgICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkVycm9yIHBhcnNpbmcgb2JqZHVtcCBvdXRwdXQgbGluZSAkbjpcbj4+Pj4gJGxpbmVcbiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkbGluZQorCisgICAgcmV0dXJuICRlcnJvcnM7CisKK307ICMgc3ViIGNoZWNrX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KK215ICRtYXhfaW5zdHJ1Y3Rpb25zOworbXkgJHNob3dfaW5zdHJ1Y3Rpb25zOworZ2V0X29wdGlvbnMoCisgICAgIm1heC1pbnN0cnVjdGlvbnM9aSIgPT4gXCRtYXhfaW5zdHJ1Y3Rpb25zLAorICAgICJzaG93LWluc3RydWN0aW9ucyEiID0+IFwkc2hvd19pbnN0cnVjdGlvbnMsCisgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksCispOworaWYgKCAiJHRhcmdldF9vcyIgZXEgImxpbiIgYW5kICIkdGFyZ2V0X21pY19hcmNoIiBlcSAia25mIiApIHsKKyAgICAkbWljX2JhZF9yZSA9IHFye14oPzpwYXVzZXxbc2xtXWZlbmNlfHNjYXR0ZXJ8Z2F0aGVyfGNtcHhjaGcxNmJ8Y2xldmljdFsxMl0pfWk7Cit9IGVsc2UgeworICAgICRtaWNfYmFkX3JlID0gcXJ7Xig/OnBhdXNlfFtzbG1dZmVuY2V8c2NhdHRlcnxnYXRoZXJ8Y21vdnxjbXB4Y2hnMTZifGNsZXZpY3RbMTJdKX1pOworfTsKK2lmICggMCApIHsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJsaW4iIGFuZCAkdGFyZ2V0X2FyY2ggZXEgIm1pYyIgKSB7CisgICAgKmJhZF9pbnN0ciA9IFwqYmFkX21pY19pbnN0cjsKKyAgICAqYmFkX2ZtdCAgID0gXCpiYWRfbWljX2ZtdDsKK30gZWxzaWYgKCAkdGFyZ2V0X3BsYXRmb3JtIGVxICJsaW5fMzIiICkgeworICAgICpiYWRfaW5zdHIgPSBcKmJhZF9pYTMyX2luc3RyOworICAgICpiYWRfZm10ICAgPSBcKmJhZF9pYTMyX2ZtdDsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9ubHkgd29ya3Mgb24gbGluXzMyIGFuZCBsaW5fbWljIHBsYXRmb3Jtcy4iICk7Cit9OyAjIGlmCisKKyMgRG8gdGhlIHdvcmsuCitteSAkcmMgPSAwOworaWYgKCBub3QgQEFSR1YgKSB7CisgICAgaW5mbyggIk5vIGFyZ3VtZW50cyBzcGVjaWZpZWQgLS0gbm90aGluZyB0byBkby4iICk7Cit9IGVsc2UgeworICAgIGZvcmVhY2ggbXkgJGFyZyAoIEBBUkdWICkgeworICAgICAgICBteSAkZXJycyA9IGNoZWNrX2ZpbGUoICRhcmcsICRzaG93X2luc3RydWN0aW9ucywgJG1heF9pbnN0cnVjdGlvbnMgKTsKKyAgICAgICAgaWYgKCAkZXJycyA+IDAgKSB7CisgICAgICAgICAgICAkcmMgPSAzOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRhcmcKK307ICMgaWYKKworZXhpdCggJHJjICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGNoZWNrLWluc3RydWN0aW9uLXNldC5wbD4gLS0gTWFrZSBzdXJlIGJpbmFyeSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdW5kZXNpcmVkIGluc3RydWN0aW9ucy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Y2hlY2staW5zdHJ1Y3Rpb25zLnBsPiBJPG9wdGlvbj4uLi4gSTxmaWxlPi4uLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYXJjaGl0ZWN0dXJlPT5JPGFyY2g+CisKK1NwZWNpZnkgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwtLW1heC1pbnN0cnVjdGlvbnM9Pkk8bnVtYmVyPgorCitTdG9wIHNjYW5uaW5nIGlmIEk8bnVtYmVyPiBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZC4gMTAwIGJ5IGRlZmF1bHQuCisKKz1pdGVtIEI8LS1vcz0+STxvcz4KKworU3BlY2lmeSB0YXJnZXQgT1MuCisKKz1pdGVtIEI8LS0+W0I8bm8tPl1CPHNob3ctaW5zdHJ1Y3Rpb25zPgorCitTaG93IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIHRoZSBmaWxlLiBCdSBkZWZhdWx0LCBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzaG93bi4KKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworRmlsZSAob2JqZWN0IGZpbGUgb3IgbGlicmFyeSwgZWl0aGVyIHN0YXRpYyBvciBkeW5hbWljKSB0byBjaGVjay4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgcnVucyBGPG9iamR1bXA+IHV0aWxpdHkgdG8gZ2V0IGRpc2Fzc2VtYmxlciBsaXN0aW5nIGFuZCBjaGVja3MgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbgordW53YW50ZWQgaW5zdHJ1Y3Rpb25zLgorCitDdXJyZW50bHkgdGhlIHNjcmlwdCB3b3JrcyBvbmx5IGZvcjoKKworPW92ZXIKKworPWl0ZW0gQzxsaW5fbWljPgorCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgdGFyZ2V0IE9TLiBVbmRlc2lyZWQgdW5zdHJ1Y3Rpb25zIGFyZTogYWxsIHg4NyBpbnN0cnVjdGlvbnMgYW5kIHNvbWUgb3RoZXJzLgorCis9aXRlbSBDPGxpbl8zMj4KKworVW5kZXNpcmVkIGluc3RydWN0aW9ucyBhcmUgaW5zdHJ1Y3Rpb25zIG5vdCB2YWxpZCBmb3IgUGVudGl1bSAzIHByb2Nlc3NvciAoU1NFMiBhbmQgbmV3ZXIpLgorCis9YmFjaworCis9Y3V0CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZ2VuZXJhdGUtZGVmLnBsIGIvZmluYWwvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MyYjBmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZ2VuZXJhdGUtZGVmLnBsCkBAIC0wLDAgKzEsMzIxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBTb21lIHByYWdtYXMuCit1c2Ugc3RyaWN0OyAgICAgICAgICAjIFJlc3RyaWN0IHVuc2FmZSBjb25zdHJ1Y3RzLgordXNlIHdhcm5pbmdzOyAgICAgICAgIyBFbmFibGUgYWxsIHdhcm5pbmdzLgorCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDQiOworCisjCisjIFN1YnJvdXRpbmVzLgorIworCitzdWIgcGFyc2VfaW5wdXQoJFwlKSB7CisKKyAgICBteSAoICRpbnB1dCwgJGRlZnMgKSA9IEBfOworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCAkaW5wdXQgKTsKKyAgICBteSAlZW50cmllczsKKyAgICBteSAlb3JkaW5hbHM7CisgICAgbXkgQGRpcnM7CisgICAgbXkgJHZhbHVlID0gMTsKKworICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRtc2csICRsLCAkbGluZSApID0gQF87CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGZpbGUgXCIkaW5wdXRcIiBsaW5lICRsOlxuIiAuCisgICAgICAgICAgICAgICAgIiAgICAkbGluZSIgLgorICAgICAgICAgICAgICAgICggJG1zZyA/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+LCBhbmQgQzxMSUJPTVBfVE1QPiBlbnZpcm9ubWVudHMgdmFyaWFibGVzLgorSWYgYSB2YXJpYWJsZSBzZXQsIHRoZSBtb2R1bGUgbWFrZXMgc3VyZSBpdCBpcyBhYnNvbHV0ZS4gSWYgYSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgdGhlIG1vZHVsZQorc2V0cyBpdCB0byBkZWZhdWx0IHZhbHVlLgorCitEZWZhdWx0IHZhbHVlIGZvciBDPExJQk9NUF9FWFBPUlRTPiBpcyBDPCRMSUJPTVBfV09SSy9leHBvcnRzPiwgZm9yIEM8TElCT01QX1RNUD4gLS0KK0M8JExJQk9NUF9XT1JLL3RtcD4uCisKK1ZhbHVlIGZvciBDPExJQk9NUF9XT1JLPiBpcyBndWVzc2VkLiBUaGUgbW9kdWxlIGFzc3VtZXMgdGhlIHNjcmlwdCAod2hpY2ggdXNlcyB0aGUgbW9kdWxlKSBpcworbG9jYXRlZCBpbiBDPHRvb2xzLz4gZGlyZWN0b3J5IG9mIGxpYm9tcCBkaXJlY3RvcnkgdHJlZSwgYW5kIHVzZXMgcGF0aCBvZiB0aGUgc2NyaXB0IHRvIGNhbGN1bGF0ZQorQzxMSUJPTVBfV09SSz4sCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1BsYXRmb3JtLnBtIGIvZmluYWwvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4ODJkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1BsYXRmb3JtLnBtCkBAIC0wLDAgKzEsNDczIEBACisjCisjIFRoaXMgaXMgbm90IGEgcnVubmFibGUgc2NyaXB0LCBpdCBpcyBhIFBlcmwgbW9kdWxlLCBhIGNvbGxlY3Rpb24gb2YgdmFyaWFibGVzLCBzdWJyb3V0aW5lcywgZXRjLgorIyB0byBiZSB1c2VkIGluIFBlcmwgc2NyaXB0cy4KKyMKKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIFBsYXRmb3JtLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBpbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3BhY2thZ2UgUGxhdGZvcm07CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBiYXNlICJFeHBvcnRlciI7CisKK3VzZSBVbmFtZTsKKworbXkgQHZhcnM7CisKK0JFR0lOIHsKKyAgICBAdmFycyA9IHF3eyAkaG9zdF9hcmNoICRob3N0X29zICRob3N0X3BsYXRmb3JtICR0YXJnZXRfYXJjaCAkdGFyZ2V0X21pY19hcmNoICR0YXJnZXRfb3MgJHRhcmdldF9wbGF0Zm9ybSB9OworfQorCitvdXIgJFZFUlNJT04gICAgID0gIjAuMDE0IjsKK291ciBARVhQT1JUICAgICAgPSBxd3t9Oworb3VyIEBFWFBPUlRfT0sgICA9ICggcXd7IGNhbm9uX2FyY2ggY2Fub25fb3MgY2Fub25fbWljX2FyY2ggbGVnYWxfYXJjaCBhcmNoX29wdCB9LCBAdmFycyApOworb3VyICVFWFBPUlRfVEFHUyA9ICggYWxsID0+IFsgQEVYUE9SVF9PSyBdLCB2YXJzID0+IFxAdmFycyApOworCisjIENhbm9uaXplIGFyY2hpdGVjdHVyZSBuYW1lLgorc3ViIGNhbm9uX2FyY2goJCkgeworICAgIG15ICggJGFyY2ggKSA9IEBfOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgaWYgKCAkYXJjaCA9fiBte1xBXHMqKD86MzJ8SUEtPzMyfElBLT8zMiBhcmNoaXRlY3R1cmV8aVszNDU2XTg2fHg4Nilccypcen1pICkgeworICAgICAgICAgICAgJGFyY2ggPSAiMzIiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQVxzKig/OjQ4fCg/OmlhKT8zMmV8SW50ZWxccyo2NHxJbnRlbFwoUlwpXHMqNjR8eDg2W18tXTY0fHg2NHxBTUQ2NClccypcen1pICkgeworICAgICAgICAgICAgJGFyY2ggPSAiMzJlIjsKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFhcm0oPzp2N1xEKik/XHp9ICkgeworICAgICAgICAgICAgJGFyY2ggPSAiYXJtIjsKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFwcGM2NGxlfSApIHsKKwkJCSRhcmNoID0gInBwYzY0bGUiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQXBwYzY0fSApIHsKKyAgICAgICAgCSRhcmNoID0gInBwYzY0IjsgICAgICAgICAgICAKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFhYXJjaDY0fSApIHsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAkYXJjaCA9ICJhYXJjaDY0IjsKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFtaWN9ICkgeworICAgICAgICAgICAgJGFyY2ggPSAibWljIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRhcmNoID0gdW5kZWY7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRhcmNoOworfTsgIyBzdWIgY2Fub25fYXJjaAorCisjIENhbm9uaXplIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBuYW1lLgorc3ViIGNhbm9uX21pY19hcmNoKCQpIHsKKyAgICBteSAoICRtaWNfYXJjaCApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkbWljX2FyY2ggKSApIHsKKyAgICAgICAgaWYgKCAkbWljX2FyY2ggPX4gbXtcQWtuZn0gKSB7CisgICAgICAgICAgICAkbWljX2FyY2ggPSAia25mIjsKKyAgICAgICAgfSBlbHNpZiAoICRtaWNfYXJjaCA9fiBte1xBa25jfSkgeworICAgICAgICAgICAgJG1pY19hcmNoID0gImtuYyI7CisgICAgICAgIH0gZWxzaWYgKCAkbWljX2FyY2ggPX4gbXtcQWtubH0gKSB7CisgICAgICAgICAgICAkbWljX2FyY2ggPSAia25sIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRtaWNfYXJjaCA9IHVuZGVmOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHJldHVybiAkbWljX2FyY2g7Cit9OyAjIHN1YiBjYW5vbl9taWNfYXJjaAorCit7ICAjIFJldHVybiBsZWdhbCBhcHByb3ZlZCBhcmNoaXRlY3R1cmUgbmFtZS4KKyAgICBteSAlbGVnYWwgPSAoCisgICAgICAgICIzMiIgID0+ICJJQS0zMiBhcmNoaXRlY3R1cmUiLAorICAgICAgICAiMzJlIiA9PiAiSW50ZWwoUikgNjQiLAorICAgICAgICAiYXJtIiA9PiAiQVJNIiwKKyAgICAgICAgImFhcmNoNjQiID0+ICJBQXJjaDY0IiwKKyAgICAgICAgIm1pYyIgPT4gIkludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSIsCisgICAgKTsKKworICAgIHN1YiBsZWdhbF9hcmNoKCQpIHsKKyAgICAgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgICAgICRhcmNoID0gY2Fub25fYXJjaCggJGFyY2ggKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICAgICAgJGFyY2ggPSAkbGVnYWx7ICRhcmNoIH07CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRhcmNoOworICAgIH07ICMgc3ViIGxlZ2FsX2FyY2gKK30KKworeyAgIyBSZXR1cm4gYXJjaGl0ZWN0dXJlIG5hbWUgc3VpdGFibGUgZm9yIEludGVsIGNvbXBpbGVyIHNldHVwIHNjcmlwdHMuCisgICAgbXkgJW9wdGlvbiA9ICgKKyAgICAgICAgIjMyIiAgPT4gImlhMzIiLAorICAgICAgICAiMzJlIiA9PiAiaW50ZWw2NCIsCisgICAgICAgICI2NCIgID0+ICJpYTY0IiwKKyAgICAgICAgImFybSIgPT4gImFybSIsCisgICAgICAgICJhYXJjaDY0IiA9PiAiYWFyY2giLAorICAgICAgICAibWljIiA9PiAiaW50ZWw2NCIsCisgICAgKTsKKworICAgIHN1YiBhcmNoX29wdCgkKSB7CisgICAgICAgIG15ICggJGFyY2ggKSA9IEBfOworICAgICAgICAkYXJjaCA9IGNhbm9uX2FyY2goICRhcmNoICk7CisgICAgICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgICAgICRhcmNoID0gJG9wdGlvbnsgJGFyY2ggfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGFyY2g7CisgICAgfTsgIyBzdWIgYXJjaF9vcHQKK30KKworIyBDYW5vbml6ZSBPUyBuYW1lLgorc3ViIGNhbm9uX29zKCQpIHsKKyAgICBteSAoICRvcyApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgaWYgKCAkb3MgPX4gbXtcQVxzKig/OkxpbnV4fGxpbnxsKVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAibGluIjsKKyAgICAgICAgfSBlbHNpZiAoICRvcyA9fiBte1xBXHMqKD86TWFjKD86XHMqT1MoPzpccypYKT8pP3xtYWN8bXxEYXJ3aW4pXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJtYWMiOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpXaW4oPzpkb3dzKT8oPzooPzpffFxzKik/KD86TlR8WFB8OTV8OTh8MjAwMykpP3x3KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAid2luIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRvcyA9IHVuZGVmOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHJldHVybiAkb3M7Cit9OyAjIHN1YiBjYW5vbl9vcworCitteSAoICRfaG9zdF9vcywgJF9ob3N0X2FyY2gsICRfdGFyZ2V0X29zLCAkX3RhcmdldF9hcmNoLCAkX3RhcmdldF9taWNfYXJjaCwgJF9kZWZhdWx0X21pY19hcmNoKTsKKworIyBTZXQgdGhlIGRlZmF1bHQgbWljLWFyY2ggdmFsdWUuCiskX2RlZmF1bHRfbWljX2FyY2ggPSAia25jIjsKKworc3ViIHNldF90YXJnZXRfYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gY2Fub25fYXJjaCggJF9bIDAgXSApOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfYXJjaCAgICAgICA9ICRhcmNoOworICAgICAgICAkRU5WeyBMSUJPTVBfQVJDSCB9ID0gJGFyY2g7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkYXJjaDsKK307ICMgc3ViIHNldF90YXJnZXRfYXJjaAorCitzdWIgc2V0X3RhcmdldF9taWNfYXJjaCgkKSB7CisgICAgbXkgKCAkbWljX2FyY2ggKSA9IGNhbm9uX21pY19hcmNoKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkbWljX2FyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfbWljX2FyY2ggICAgICAgPSAkbWljX2FyY2g7CisgICAgICAgICRFTlZ7IExJQk9NUF9NSUNfQVJDSCB9ID0gJG1pY19hcmNoOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG1pY19hcmNoOworfTsgIyBzdWIgc2V0X3RhcmdldF9taWNfYXJjaAorCitzdWIgc2V0X3RhcmdldF9vcygkKSB7CisgICAgbXkgKCAkb3MgKSA9IGNhbm9uX29zKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgJF90YXJnZXRfb3MgICAgICAgPSAkb3M7CisgICAgICAgICRFTlZ7IExJQk9NUF9PUyB9ID0gJG9zOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG9zOworfTsgIyBzdWIgc2V0X3RhcmdldF9vcworCitzdWIgdGFyZ2V0X29wdGlvbnMoKSB7CisgICAgbXkgQG9wdGlvbnMgPSAoCisgICAgICAgICJ0YXJnZXQtb3N8b3M9cyIgPT4KKyAgICAgICAgICAgIHN1YiB7CisgICAgICAgICAgICAgICAgc2V0X3RhcmdldF9vcyggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW9zIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgICB9LAorICAgICAgICAidGFyZ2V0LWFyY2hpdGVjdHVyZXx0YXJnZXJ0LWFyY2h8YXJjaGl0ZWN0dXJlfGFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfYXJjaCggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtYXJjaGl0ZWN0dXJlIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgIH0sCisgICAgICAgICJ0YXJnZXQtbWljLWFyY2hpdGVjdHVyZXx0YXJnZXJ0LW1pYy1hcmNofG1pYy1hcmNoaXRlY3R1cmV8bWljLWFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfbWljX2FyY2goICRfWyAxIF0gKSBvcgorICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW1pYy1hcmNoaXRlY3R1cmUgb3B0aW9uOiBcIiRfWyAxIF1cIlxuIjsKKyAgICAgICAgICAgfSwKKyAgICApOworICAgIHJldHVybiBAb3B0aW9uczsKK307ICMgc3ViIHRhcmdldF9vcHRpb25zCisKKyMgRGV0ZWN0IGhvc3QgYXJjaC4KK3sKKyAgICBteSAkaGFyZHdhcmVfcGxhdGZvcm0gPSBVbmFtZTo6aGFyZHdhcmVfcGxhdGZvcm0oKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiaTM4NiIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJpYTY0IiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiNjQiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYXJtIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiYXJtIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJwcGM2NGxlIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAicHBjNjRsZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAicHBjNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICJwcGM2NCI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYWFyY2g2NCIgKSB7ICAgICAgICAgCisgICAgICAgICRfaG9zdF9hcmNoID0gImFhcmNoNjQiOyAgCisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBob3N0IGhhcmR3YXJlIHBsYXRmb3JtOiBcIiRoYXJkd2FyZV9wbGF0Zm9ybVwiOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9CisKKyMgRGV0ZWN0IGhvc3QgT1MuCit7CisgICAgbXkgJG9wZXJhdGluZ19zeXN0ZW0gPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbSgpOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIkdOVS9MaW51eCIgKSB7CisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiRnJlZUJTRCIgKSB7CisgICAgICAgICMgSG9zdCBPUyByZXNlbWJsZXMgTGludXguCisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiTmV0QlNEIiApIHsKKyAgICAgICAgIyBIb3N0IE9TIHJlc2VtYmxlcyBMaW51eC4KKyAgICAgICAgJF9ob3N0X29zID0gImxpbiI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJEYXJ3aW4iICkgeworICAgICAgICAkX2hvc3Rfb3MgPSAibWFjIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIk1TIFdpbmRvd3MiICkgeworICAgICAgICAkX2hvc3Rfb3MgPSAid2luIjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbTogXCIkb3BlcmF0aW5nX3N5c3RlbVwiOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9CisKKyMgRGV0ZWN0IHRhcmdldCBhcmNoLgoraWYgKCBkZWZpbmVkKCAkRU5WeyBMSUJPTVBfQVJDSCB9ICkgKSB7CisgICAgIyBVc2UgYXJjaCBzcGVjaWZpZWQgaW4gTElCT01QX0FSQ0guCisgICAgJF90YXJnZXRfYXJjaCA9IGNhbm9uX2FyY2goICRFTlZ7IExJQk9NUF9BUkNIIH0gKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkX3RhcmdldF9hcmNoICkgKSB7CisgICAgICAgIGRpZSAiVW5rbm93biBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGluIExJQk9NUF9BUkNIIGVudmlyb25tZW50IHZhcmlhYmxlOiBcIiRFTlZ7IExJQk9NUF9BUkNIIH1cIiI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICAjIE90aGVyd2lzZSB1c2UgaG9zdCBhcmNoaXRlY3R1cmUuCisgICAgJF90YXJnZXRfYXJjaCA9ICRfaG9zdF9hcmNoOworfTsgIyBpZgorJEVOVnsgTElCT01QX0FSQ0ggfSA9ICRfdGFyZ2V0X2FyY2g7CisKKyMgRGV0ZWN0IHRhcmdldCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuCitpZiAoIGRlZmluZWQoICRFTlZ7IExJQk9NUF9NSUNfQVJDSCB9ICkgKSB7CisgICAgIyBVc2UgbWljIGFyY2ggc3BlY2lmaWVkIGluIExJQk9NUF9NSUNfQVJDSC4KKyAgICAkX3RhcmdldF9taWNfYXJjaCA9IGNhbm9uX21pY19hcmNoKCAkRU5WeyBMSUJPTVBfTUlDX0FSQ0ggfSApOworICAgIGlmICggbm90IGRlZmluZWQoICRfdGFyZ2V0X21pY19hcmNoICkgKSB7CisgICAgICAgIGRpZSAiVW5rbm93biBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGluIExJQk9NUF9NSUNfQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZTogXCIkRU5WeyBMSUJPTVBfTUlDX0FSQ0ggfVwiIjsKKyAgICB9OyAjIGlmCit9IGVsc2UgeworICAgICMgT3RoZXJ3aXNlIHVzZSBkZWZhdWx0IEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZS4KKyAgICAkX3RhcmdldF9taWNfYXJjaCA9ICRfZGVmYXVsdF9taWNfYXJjaDsKK307ICMgaWYKKyRFTlZ7IExJQk9NUF9NSUNfQVJDSCB9ID0gJF90YXJnZXRfbWljX2FyY2g7CisKKyMgRGV0ZWN0IHRhcmdldCBPUy4KK2lmICggZGVmaW5lZCggJEVOVnsgTElCT01QX09TIH0gKSApIHsKKyAgICAjIFVzZSBPUyBzcGVjaWZpZWQgaW4gTElCT01QX09TLgorICAgICRfdGFyZ2V0X29zID0gY2Fub25fb3MoICRFTlZ7IExJQk9NUF9PUyB9ICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJF90YXJnZXRfb3MgKSApIHsKKyAgICAgICAgZGllICJVbmtub3duIE9TIHNwZWNpZmllZCBpbiBMSUJPTVBfT1MgZW52aXJvbm1lbnQgdmFyaWFibGU6IFwiJEVOVnsgTElCT01QX09TIH1cIiI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICAjIE90aGVyd2lzZSB1c2UgaG9zdCBPUy4KKyAgICAkX3RhcmdldF9vcyA9ICRfaG9zdF9vczsKK307ICMgaWYKKyRFTlZ7IExJQk9NUF9PUyB9ID0gJF90YXJnZXRfb3M7CisKK3VzZSB2YXJzIEB2YXJzOworCit0aWUoICRob3N0X2FyY2gsICAgICAgICJQbGF0Zm9ybTo6aG9zdF9hcmNoIiApOwordGllKCAkaG9zdF9vcywgICAgICAgICAiUGxhdGZvcm06Omhvc3Rfb3MiICk7Cit0aWUoICRob3N0X3BsYXRmb3JtLCAgICJQbGF0Zm9ybTo6aG9zdF9wbGF0Zm9ybSIgKTsKK3RpZSggJHRhcmdldF9hcmNoLCAgICAgIlBsYXRmb3JtOjp0YXJnZXRfYXJjaCIgKTsKK3RpZSggJHRhcmdldF9taWNfYXJjaCwgIlBsYXRmb3JtOjp0YXJnZXRfbWljX2FyY2giICk7Cit0aWUoICR0YXJnZXRfb3MsICAgICAgICJQbGF0Zm9ybTo6dGFyZ2V0X29zIiApOwordGllKCAkdGFyZ2V0X3BsYXRmb3JtLCAiUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybSIgKTsKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpiYXNlOworCisgICAgdXNlIENhcnA7CisKKyAgICB1c2UgVGllOjpTY2FsYXI7CisgICAgdXNlIGJhc2UgIlRpZTo6U3RkU2NhbGFyIjsKKworICAgIHN1YiBTVE9SRSB7CisgICAgICAgIG15ICRzZWxmID0gc2hpZnQoIEBfICk7CisgICAgICAgIGNyb2FrKCAiTW9kaWZ5aW5nIFwkIiAuIHJlZiggJHNlbGYgKSAuICIgaXMgbm90IGFsbG93ZWQ7IHN0b3BwZWQiICk7CisgICAgfTsgIyBzdWIgU1RPUkUKKworfSAjIHBhY2thZ2UgUGxhdGZvcm06OmJhc2UKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X2FyY2g7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF9ob3N0X2FyY2g7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X2FyY2gKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X29zOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfaG9zdF9vczsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06Omhvc3Rfb3MKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X3BsYXRmb3JtOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICIke19ob3N0X29zfV8ke19ob3N0X2FyY2h9IjsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfcGxhdGZvcm0KKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfYXJjaDsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX3RhcmdldF9hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2gKKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfbWljX2FyY2g7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF90YXJnZXRfbWljX2FyY2g7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfbWljX2FyY2gKKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfb3M7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF90YXJnZXRfb3M7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfb3MKKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm07CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICBpZiAoJF90YXJnZXRfYXJjaCBlcSAibWljIikgeworICAgICAgICAgICAgcmV0dXJuICIke190YXJnZXRfb3N9XyR7X3RhcmdldF9taWNfYXJjaH0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIiR7X3RhcmdldF9vc31fJHtfdGFyZ2V0X2FyY2h9IjsKKyAgICAgICAgfQorICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X3BsYXRmb3JtCisKKworcmV0dXJuIDE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPFBsYXRmb3JtLnBtPiAtLSBGZXcgc3Vicm91dGluZXMgdG8gZ2V0IE9TLCBhcmNoaXRlY3R1cmUgYW5kIHBsYXRmb3JtIG5hbWUgaW4gZm9ybSBzdWl0YWJsZSBmb3IKK25hbWluZyBmaWxlcywgZGlyZWN0b3JpZXMsIG1hY3JvcywgZXRjLgorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBQbGF0Zm9ybSAiOmFsbCI7CisgICAgdXNlIHRvb2xzOworCisgICAgbXkgJGFyY2ggICA9IGNhbm9uX2FyY2goICJlbTY0VCIgKTsgICAgICAgICMgUmV0dXJucyAiMzJlIi4KKyAgICBteSAkbGVnYWwgID0gbGVnYWxfYXJjaCggImVtNjR0IiApOyAgICAgICAgIyBSZXR1cm5zICJJbnRlbChSKSA2NCIuCisgICAgbXkgJG9wdGlvbiA9IGFyY2hfb3B0KCAiZW02NHQiICk7ICAgICAgICAgICMgUmV0dXJucyAiaW50ZWw2NCIuCisgICAgbXkgJG9zICAgICA9IGNhbm9uX29zKCAiV2luZG93cyBOVCIgKTsgICAgICMgUmV0dXJucyAid2luIi4KKworICAgIHByaW50KCAkaG9zdF9hcmNoLCAkaG9zdF9vcywgJGhvc3RfcGxhdGZvcm0gKTsKKyAgICBwcmludCggJHRhcmVndF9hcmNoLCAkdGFyZ2V0X29zLCAkdGFyZ2V0X3BsYXRmb3JtICk7CisKKyAgICB0b29sczo6Z2V0X29wdGlvbnMoCisgICAgICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICAgICAuLi4KKyAgICApOworCisKKz1oZWFkMSBERVNDUklQVElPTgorCitFbnZpcm9ubWVudCB2YXJpYWJsZSBMSUJPTVBfT1Mgc3BlY2lmaWVzIHRhcmdldCBPUyB0byByZXBvcnQuIElmIExJQk9NUF9PUyBpZCBub3QgZGVmaW5lZCwKK3RoZSBzY3JpcHQgYXNzdW1lcyBob3N0IE9TIGlzIHRhcmdldCBPUy4KKworRW52aXJvbm1lbnQgdmFyaWFibGUgTElCT01QX0FSQ0ggc3BlY2lmaWVzIHRhcmdldCBhcmNoaXRlY3R1cmUgdG8gcmVwb3J0LiBJZiBMSUJPTVBfQVJDSCBpcyBub3QgZGVmaW5lZCwKK3RoZSBzY3JpcHQgYXNzdW1lcyBob3N0IGFyY2hpdGVjdHVyZSBpcyB0YXJnZXQgb25lLgorCis9aGVhZDIgRnVuY3Rpb25zLgorCis9b3ZlcgorCis9aXRlbSBCPGNhbm9uX2FyY2goICRhcmNoICk+CisKK0lucHV0IHN0cmluZyBpcyBhbiBhcmNoaXRlY3R1cmUgbmFtZSB0byBjYW5vbml6ZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgbWFueSB2YXJpYW50cywgZm9yIGV4YW1wbGU6CitDPDMyZT4sIEM8SW50ZWw2ND4sIEM8SW50ZWwoUikgNjQ+LCBldGMuIFJldHVybmVkIHN0cmluZyBpcyBhIGNhbm9ub25pemVkIGFyY2hpdGVjdHVyZSBuYW1lLAorb25lIG9mOiBDPDMyPiwgQzwzMmU+LCBDPDY0PiwgQzxhcm0+LCBDPHBwYzY0bGU+LCBDPHBwYzY0PiwgQzxtaWM+LCBvciBDPHVuZGVmPiBpcyBpbnB1dCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQuCisKKz1pdGVtIEI8bGVnYWxfYXJjaCggJGFyY2ggKT4KKworSW5wdXQgc3RyaW5nIGlzIGFyY2hpdGVjdHVyZSBuYW1lLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgc2FtZSB2YXJpYW50cyBhcyBDPGFyY2hfY2Fub24oKT4gZG9lcy4KK1JldHVybmVkIHN0cmluZyBpcyBhIG5hbWUgYXBwcm92ZWQgYnkgSW50ZWwgTGVnYWwsIG9uZSBvZjogQzxJQS0zMiBhcmNoaXRlY3R1cmU+LCBDPEludGVsKFIpIDY0Pgorb3IgQzx1bmRlZj4gaWYgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPGFyY2hfb3B0KCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYXJjaGl0ZWN0dXJlIG5hbWUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBzYW1lIHZhcmlhbnRzIGFzIEM8YXJjaF9jYW5vbigpPiBkb2VzLgorUmV0dXJuZWQgc3RyaW5nIGlzIGFuIGFyY2hpdGVjdHVyZSBuYW1lIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGNvbXBpbGVyIHNldHVwIHNjcmlwdHMKKyhlLiBnLiBDPGljY3ZhcnMuc2g+KSwgb25lIG9mOiBDPElBLTMyIGFyY2hpdGVjdHVyZT4sIEM8SW50ZWwoUikgNjQ+IG9yIEM8dW5kZWY+IGlmIGlucHV0IHN0cmluZyBpcyBub3QKK3JlY29nbml6ZWQuCisKKz1pdGVtIEI8Y2Fub25fb3MoICRvcyApPgorCitJbnB1dCBzdHJpbmcgaXMgT1MgbmFtZSB0byBjYW5vbml6ZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgbWFueSB2YXJpYW50cywgZm9yIGV4YW1wbGU6IEM8bWFjPiwgQzxPUyBYPiwgZXRjLiBSZXR1cm5lZCBzdHJpbmcgaXMgYSBjYW5vbml6ZWQgT1MgbmFtZSwgb25lIG9mOiBDPGxpbj4sCitDPG1hYz4sIEM8d2luPiwgb3IgQzx1bmRlZj4gaXMgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPHRhcmdldF9vcHRpb25zKCk+CisKK1JldHVybnMgYXJyYXkgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gQzx0b29sczo6Z2V0X29wdGlvbnMoKT4gdG8gbGV0IGEgc2NyaXB0IHJlY29nbml6ZQorQzwtLXRhcmdldC1hcmNoaXRlY3R1cmU9STxzdHI+PiBhbmQgQzwtLXRhcmdldC1vcz1JPHN0cj4+IG9wdGlvbnMuIFR5cGljYWwgdXNhZ2UgaXM6CisKKyAgICB1c2UgdG9vbHM7CisgICAgdXNlIFBsYXRmb3JtOworCisgICAgbXkgKCAkb3MsICRhcmNoLCAkcGxhdGZvcm0gKTsgICAgIyBHbG9iYWwgdmFyaWFibGVzLCBub3QgaW5pdGlhbGl6ZWQuCisKKyAgICAuLi4KKworICAgIGdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwgICMgTGV0IHNjcmlwdCByZWNvZ25pemUgLS10YXJnZXQtb3MgYW5kIC0tdGFyZ2V0LWFyY2ggb3B0aW9ucy4KKyAgICAgICAgLi4uCisgICAgKTsKKyAgICAjIEluaXRpYWxpemUgdmFyaWFibHMgYWZ0ZXIgcGFyc2luZyBjb21tYW5kIGxpbmUuCisgICAgKCAkb3MsICRhcmNoLCAkcGxhdGZvcm0gKSA9ICggUGxhdGZvcm06OnRhcmdldF9vcygpLCBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2goKSwgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybSgpICk7CisKKz1iYWNrCisKKz1oZWFkMiBWYXJpYWJsZXMKKworPWl0ZW0gQjwkaG9zdF9hcmNoPgorCitDYW5vbml6ZWQgbmFtZSBvZiBob3N0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwkaG9zdF9vcz4KKworQ2Fub25pemVkIG5hbWUgb2YgaG9zdCBPUy4KKworPWl0ZW0gQjwkaG9zdF9wbGF0Zm9ybT4KKworSG9zdCBwbGF0Zm9ybSBuYW1lIChjb25jYXRlbmF0ZWQgY2Fub25pemVkIE9TIG5hbWUsIHVuZGVyc2NvcmUsIGFuZCBjYW5vbml6ZWQgYXJjaGl0ZWN0dXJlIG5hbWUpLgorCis9aXRlbSBCPCR0YXJnZXRfYXJjaD4KKworQ2Fub25pemVkIG5hbWUgb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwkdGFyZ2V0X29zPgorCitDYW5vbml6ZWQgbmFtZSBvZiB0YXJnZXQgT1MuCisKKz1pdGVtIEI8JHRhcmdldF9wbGF0Zm9ybT4KKworVGFyZ2V0IHBsYXRmb3JtIG5hbWUgKGNvbmNhdGVuYXRlZCBjYW5vbml6ZWQgT1MgbmFtZSwgdW5kZXJzY29yZSwgYW5kIGNhbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSkuCisKKz1iYWNrCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1VuYW1lLnBtIGIvZmluYWwvcnVudGltZS90b29scy9saWIvVW5hbWUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1MDcwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1VuYW1lLnBtCkBAIC0wLDAgKzEsNjM1IEBACisjCisjIFRoaXMgaXMgbm90IGEgcnVubmFibGUgc2NyaXB0LCBpdCBpcyBhIFBlcmwgbW9kdWxlLCBhIGNvbGxlY3Rpb24gb2YgdmFyaWFibGVzLCBzdWJyb3V0aW5lcywgZXRjLgorIyBUbyBnZXQgaGVscCBhYm91dCBleHBvcnRlZCB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMKKyMgICAgIHBlcmxkb2MgVW5hbWUucG0KKyMKKyMgb3Igc2VlIFBPRCAoUGxhaW4gT2xkIERvY3VtZW50YXRpb24pIGVtYmVkZGVkIHRvIHRoZSBzb3VyY2UuLi4KKyMKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworcGFja2FnZSBVbmFtZTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSB3YXJuaW5nczo6cmVnaXN0ZXI7Cit1c2UgRXhwb3J0ZXI7CisKK3VzZSBQT1NJWDsKK3VzZSBGaWxlOjpHbG9iICI6Z2xvYiI7Cit1c2UgTmV0OjpEb21haW4gcXd7fTsKKworIyBGb2xsb3dpbmcgY29kZSBkb2VzIG5vdCB3b3JrIHdpdGggUGVybCA1LjYgb24gTGludXgqIE9TIGFuZCBXaW5kb3dzKiBPUzoKKyMKKyMgICAgIHVzZSBpZiAkXk8gZXEgImRhcndpbiIsIHRvb2xzID0+IHF3e307CisjCisjIFRoZSB3b3JrYXJvdW5kIGZvciBQZXJsIDUuNjoKKyMKK0JFR0lOIHsKKyAgICBpZiAoICReTyBlcSAiZGFyd2luIiBvciAkXk8gZXEgImxpbnV4IiApIHsKKwlyZXF1aXJlIHRvb2xzOworICAgICAgICBpbXBvcnQgdG9vbHM7CisgICAgfTsgIyBpZgorICAgIGlmICggJF5PIGVxICJNU1dpbjMyIiApIHsKKyAgICAgICAgcmVxdWlyZSBXaW4zMjsKKyAgICB9OyAjIGlmCit9OyAjIEJFR0lOCisKK215ICRtc3dpbiA9IHFye1xBKD86TVNXaW4zMnxXaW5kb3dzX05UKVx6fTsKKworbXkgQHBvc2l4ID0gcXd7IGtlcm5lbF9uYW1lIGZxZG4ga2VybmVsX3JlbGVhc2Uga2VybmVsX3ZlcnNpb24gbWFjaGluZSB9OworICAgICMgUHJvcGVydGllcyBzdXBwb3J0ZWQgYnkgUE9TSVg6OnVuYW1lKCkuCitteSBAbGludXggPQorICAgIHF3eyBwcm9jZXNzb3IgaGFyZHdhcmVfcGxhdGZvcm0gb3BlcmF0aW5nX3N5c3RlbSB9OworICAgICMgUHJvcGVydGllcyByZXBvcnRlZCBieSB1bmFtZSBpbiBMaW51eCogT1MuCitteSBAYmFzZSA9ICggQHBvc2l4LCBAbGludXggKTsKKyAgICAjIEJhc2UgcHJvcGVydGllcy4KK215IEBhdXggPQorICAgICgKKyAgICAgICAgcXd7IGhvc3RfbmFtZSBkb21haW5fbmFtZSB9LAorICAgICAgICBtYXAoICJvcGVyYXRpbmdfc3lzdGVtXyRfIiwgcXd7IG5hbWUgcmVsZWFzZSBjb2RlbmFtZSBkZXNjcmlwdGlvbiB9ICkKKyAgICApOworICAgICMgQXV4aWxpYXJ5IHByb3BlcnRpZXMuCitteSBAYWxsID0gKCBAYmFzZSwgQGF1eCApOworICAgICMgQWxsIHRoZSBwcm9wZXJ0aWVzLgorbXkgQG1ldGEgPSBxd3sgYmFzZV9uYW1lcyBhbGxfbmFtZXMgdmFsdWUgfTsKKyAgICAjIE1ldGEgZnVuY3Rpb25zLgorCitvdXIgJFZFUlNJT04gICAgID0gIjAuMDciOworb3VyIEBJU0EgICAgICAgICA9IHF3eyBFeHBvcnRlciB9Oworb3VyIEBFWFBPUlQgICAgICA9IHF3e307CitvdXIgQEVYUE9SVF9PSyAgID0gKCBAYWxsLCBAbWV0YSApOworb3VyICVFWFBPUlRfVEFHUyA9CisgICAgKAorICAgICAgICBiYXNlID0+IFsgQGJhc2UgXSwKKyAgICAgICAgYWxsICA9PiBbIEBhbGwgIF0sCisgICAgICAgIG1ldGEgPT4gWyBAbWV0YSBdLAorICAgICk7CisKK215ICV2YWx1ZXM7CisgICAgIyBIYXNoIG9mIHZhbHVlcy4gU29tZSB2YWx1ZXMgYXJlIHN0cmluZ3MsIHNvbWUgbWF5IGJlIHJlZmVyZW5jZXMgdG8gY29kZSB3aGljaCBzaG91bGQgYmUKKyAgICAjIGV2YWx1YXRlZCB0byBnZXQgcmVhbCB2YWx1ZS4gVGhpcyB0cmljayBpcyBpbXBsZW1lbnRlZCBiZWNhdXNlIGNhbGwgdG8gTmV0OjpEb21haW46Omhvc3RmcWRuKCkKKyAgICAjIGlzIHJlbGF0aXZlbHkgc2xvdy4KKworIyBHZXQgdmFsdWVzIGZyb20gUE9TSVg6OnVuYW1lKCkuCitAdmFsdWVzeyBAcG9zaXggfSA9IFBPU0lYOjp1bmFtZSgpOworCisjIE9uIHNvbWUgc3lzdGVtcyBQT1NJWDo6dW5hbWUoKSByZXR1cm5zICJzaG9ydCIgbm9kZSBuYW1lICh3aXRob3V0IGRvbWFpbiBuYW1lKS4gVG8gYmUgY29uc2lzdGVudAorIyBvbiBhbGwgc3lzdGVtcywgd2Ugd2lsbCBnZXQgbm9kZSBuYW1lIGZyb20gYWx0ZXJuYXRpdmUgc291cmNlLgoraWYgKCAkXk8gPX4gbS9jeWd3aW4vaSApIHsKKyAgICAjIEZ1bmN0aW9uIGZyb20gTmV0OjpEb21haW4gbW9kdWxlIHdvcmtzIHdlbGwsIGJ1dCBvbiBDeWd3aW4gaXQgcHJpbnRzIHRvCisgICAgIyBzdGRlcnIgImRvbWFpbm5hbWU6IG5vdCBmb3VuZCIuIFNvIHdlIHdpbGwgdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igbm93LgorICAgICR2YWx1ZXN7IGZxZG4gfSA9IGxjKCAkRU5WeyBDT01QVVRFUk5BTUUgfSAuICIuIiAuICRFTlZ7IFVTRVJETlNET01BSU4gfSApOworfSBlbHNlIHsKKyAgICAjIE9uIHN5c3RlbXMgb3RoZXIgdGhhbiBDeWd3aW4sIGxldCB1cyB1c2UgTmV0OjpEb21haW46Omhvc3RmcWRuKCksIGJ1dCBkbyBpdCBvbmx5IG5vZGUgbmFtZQorICAgICMgaXMgcmVhbGx5IHJlcXVlc3RlZC4KKyAgICAkdmFsdWVzeyBmcWRuIH0gPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgJGZxZG4gPSBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKTsgIyAiZnFkbiIgc3RhbmRzIGZvciAiZnVsbHkgcXVhbGlmaWVkIGRvYW1haW4gbmFtZSIuCisgICAgICAgICAgICAjIE9uIHNvbWUgc3lzdGVtcyBQT1NJWDo6dW5hbWUoKSBhbmQgTmV0OjpEb21haW46Omhvc3RmcWRuKCkgcmVwb3J0cyBkaWZmZXJlbnQgbmFtZXMuCisgICAgICAgICAgICAjIExldCB1cyBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhleSBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4gTmFtZXMgYXJlIGluc2lnbmlmaWNhbnRseQorICAgICAgICAgICAgIyBkaWZmZXJlbnQgaWYgUE9TSVg6OnVuYW1lKCkgbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpLgorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICRmcWRuIGVxIHN1YnN0ciggJGZxZG4sIDAsIGxlbmd0aCggJGZxZG4gKSApCisgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCggJGZxZG4gKSA9PSBsZW5ndGgoICRmcWRuICkKKyAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkZnFkbiwgbGVuZ3RoKCAkZnFkbiApLCAxICkgZXEgIi4iCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgIyBPay4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2FybmluZ3M6Ondhcm5pZigKKyAgICAgICAgICAgICAgICAgICAgIlBPU0lYOjp1bmFtZSgpIGFuZCBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKSByZXBvcnRlZCBkaWZmZXJlbnQgbmFtZXM6ICIgLgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiJHZhbHVlc3sgZnFkbiB9XCIgYW5kIFwiJGZxZG5cIiByZXNwZWN0aXZlbHlcbiIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgcmV0dXJuICRmcWRuOworICAgICAgICB9OyAjIHN1YgorfTsgIyBpZgorCitpZiAoICReTyA9fiAkbXN3aW4gKSB7CisgICAgaWYgKAorICAgICAgICAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQSg/Ong4NnxbNTZdODYpXHp9CisgICAgICAgIGFuZAorICAgICAgICBleGlzdHMoICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFQ1RVUkUgfSApIGFuZCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURUNUVVJFIH0gZXEgIng4NiIKKyAgICAgICAgYW5kCisgICAgICAgIGV4aXN0cyggJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiB9ICkKKyAgICApIHsKKyAgICAgICAgaWYgKCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURVc2NDMyIH0gZXEgIkFNRDY0IiApIHsKKyAgICAgICAgICAgICR2YWx1ZXN7IG1hY2hpbmUgfSA9ICJ4ODZfNjQiOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorfTsgIyBpZgorCisjIFNvbWUgdmFsdWVzIGFyZSBub3QgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCksIGxldCB1cyBjb21wdXRlIHRoZW0uCisKKyMgcHJvY2Vzc29yLgorJHZhbHVlc3sgcHJvY2Vzc29yIH0gPSAkdmFsdWVzeyBtYWNoaW5lIH07CisKKyMgaGFyZHdhcmVfcGxhdGZvcm0uCitpZiAoIDAgKSB7Cit9IGVsc2lmICggJF5PIGVxICJsaW51eCIgb3IgJF5PIGVxICJmcmVlYnNkIiBvciAkXk8gZXEgIm5ldGJzZCIgKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWlbMzQ1Nl04Nlx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJpMzg2IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoeDg2XzY0fGFtZDY0KVx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWFybXY3XEQqXHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImFybSI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBcHBjNjRsZVx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJwcGM2NGxlIjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFwcGM2NFx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJwcGM2NCI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBYWFyY2g2NFx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJhYXJjaDY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PIGVxICJkYXJ3aW4iICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODYiIG9yICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAiaTM4NiIgKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPQorICAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgICBteSAkcGxhdGZvcm0gPSAiaTM4NiI7CisgICAgICAgICAgICAgICAgIyBTb21lIE9TZXMgb24gSW50ZWwoUikgNjQgc3RpbGwgcmVwb3J0cyAiaTM4NiIgbWFjaGluZS4gVmVyaWZ5IGl0IGJ5IHVzaW5nCisgICAgICAgICAgICAgICAgIyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgJ3N5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjQnLiBPbiBJbnRlbChSKSA2NC1iaXQgc3lzdGVtcyB0aGUKKyAgICAgICAgICAgICAgICAjIHZhbHVlID09IDE7IG9uIDMyLWJpdCBzeXN0ZW1zIHRoZSAnaHcub3B0aW9uYWwueDg2XzY0JyBwcm9wZXJ0eSBlaXRoZXIgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAjIG9yIHRoZSB2YWx1ZSA9PSAwLiBUaGUgcGF0aCB2YXJpYWJsZSBkb2VzIG5vdCBjb250YWluIGEgcGF0aCB0byBzeXNjdGwgd2hlbgorICAgICAgICAgICAgICAgICMgc3RhcnRlZCBieSBjcm9udGFiLgorICAgICAgICAgICAgICAgIG15ICRzeXNjdGwgPSAoIHdoaWNoKCAic3lzY3RsIiApIG9yICIvdXNyL3NiaW4vc3lzY3RsIiApOworICAgICAgICAgICAgICAgIG15ICRvdXRwdXQ7CisgICAgICAgICAgICAgICAgZGVidWcoICJFeGVjdXRpbmcgJHN5c2N0bC4uLiIgKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlKCBbICRzeXNjdGwsICItbiIsICJody5vcHRpb25hbC54ODZfNjQiIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgICAgICAgICBjaG9tcCggJG91dHB1dCApOworICAgICAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggIiRvdXRwdXQiIGVxICIiIG9yICIkb3V0cHV0IiBlcSAiMCIgKSB7CisgICAgICAgICAgICAgICAgICAgICRwbGF0Zm9ybSA9ICJpMzg2IjsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggIiRvdXRwdXQiIGVxICIxIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJHBsYXRmb3JtID0gIng4Nl82NCI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGllICJVbnN1cHBvcnRlZCB2YWx1ZSAoXCIkb3V0cHV0XCIpIHJldHVybmVkIGJ5IFwiJHN5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjRcIjsgc3RvcHBlZCI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIHJldHVybiAkcGxhdGZvcm07CisgICAgICAgICAgICB9OyAjIHN1YiB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiApIHsKKwkjIFNvbWUgT1MgWCogdmVyc2lvbnMgcmVwb3J0ICJ4ODZfNjQiLgorCSR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PID1+ICRtc3dpbiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBKD86eDg2fFs1Nl04Nilcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiBvciAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgImFtZDY0IiApIHsKKyAgICAgICAgIyBBY3RpdmVQZXJsIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgcmV0dXJucyAieDg2XzY0Iiwgd2hpbGUgQWN0aXZlUGVybCBmb3IgSW50ZWwoUikgNjQgcmV0dXJucyAiYW1kNjQiLgorICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICReTyBlcSAiY3lnd2luIiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBaVszNDU2XTg2XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImkzODYiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2UgeworICAgIGRpZSAiVW5zdXBwb3J0ZWQgT1MgKFwiJF5PXCIpOyBzdG9wcGVkIjsKK307ICMgaWYKKworIyBvcGVyYXRpbmdfc3lzdGVtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gZXEgIkxpbnV4IiApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiR05VL0xpbnV4IjsKKyAgICBteSAkcmVsZWFzZTsgICAgIyBOYW1lIG9mIGNob3NlbiAiKi1yZWxlYXNlIiBmaWxlLgorICAgIG15ICRidWxrOyAgICAgICAjIENvbnRlbnQgb2YgcmVsZWFzZSBmaWxlLgorICAgICMgT24gVWJ1bnR1LCBsc2ItcmVsZWFzZSBpcyBxdWl0ZSBpbmZvcm1hdGl2ZSwgZS4gZy46CisgICAgIyAgICAgRElTVFJJQl9JRD1VYnVudHUKKyAgICAjICAgICBESVNUUklCX1JFTEVBU0U9OS4wNAorICAgICMgICAgIERJU1RSSUJfQ09ERU5BTUU9amF1bnR5CisgICAgIyAgICAgRElTVFJJQl9ERVNDUklQVElPTj0iVWJ1bnR1IDkuMDQiCisgICAgIyBUcnkgbHNiLXJlbGVhc2UgZmlyc3QuIEJ1dCBvbiBzb21lIG9sZGVyIHN5c3RlbXMgbHNiLXJlbGVhc2UgaXMgbm90IGluZm9ybWF0aXZlLgorICAgICMgSXQgbWF5IGNvbnRhaW4ganVzdCBvbmUgbGluZToKKyAgICAjICAgICBMU0JfVkVSU0lPTj0iMS4zIgorICAgICRyZWxlYXNlID0gIi9ldGMvbHNiLXJlbGVhc2UiOworICAgIGlmICggLWUgJHJlbGVhc2UgKSB7CisgICAgICAgICRidWxrID0gcmVhZF9maWxlKCAkcmVsZWFzZSApOworICAgIH0gZWxzZSB7CisgICAgICAgICRidWxrID0gIiI7CisgICAgfTsgIyBpZgorICAgIGlmICggJGJ1bGsgPX4gbXteRElTVFJJQl99ICkgeworICAgICAgICAjIE9rLCB0aGlzIGxzYi1yZWxlYXNlIGlzIGluZm9ybWF0aXZlLgorICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0lEXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfSUQ6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gPSAkMTsKKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9SRUxFQVNFXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfUkVMRUFTRToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICQxOworICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0NPREVOQU1FXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfQ09ERU5BTUU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSB9ID0gJDE7CisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfREVTQ1JJUFRJT05ccyo9Ij9ccyooLio/KSI/XHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfREVTQ1JJUFRJT046IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBPb3BzLiBsc2ItcmVsZWFzZSBpcyBtaXNzZWQgb3Igbm90IGluZm9ybWF0aXZlLiBUcnkgb3RoZXIgKi1yZWxlYXNlIGZpbGVzLgorICAgICAgICAkcmVsZWFzZSA9ICIvZXRjL3N5c3RlbS1yZWxlYXNlIjsKKyAgICAgICAgaWYgKCBub3QgLWUgJHJlbGVhc2UgKSB7ICAgICMgVXNlIC9ldGMvc3lzdGVtLXJlbGVhc2UiIGlmIHN1Y2ggZmlsZSBleGlzdHMuCisgICAgICAgICAgICAjIE90aGVyd2lzZSB0cnkgb3RoZXIgIi9ldGMvKi1yZWxlYXNlIiBmaWxlcywgYnV0IGlnbm9yZSAiL2V0Yy9sc2ItcmVsZWFzZSIuCisgICAgICAgICAgICBteSBAcmVsZWFzZXMgPSBncmVwKCAkXyBuZSAiL2V0Yy9sc2ItcmVsZWFzZSIsIGJzZF9nbG9iKCAiL2V0Yy8qLXJlbGVhc2UiICkgKTsKKyAgICAgICAgICAgICMgT24gc29tZSBGZWRvcmEgc3lzdGVtcyB0aGVyZSBhcmUgdHdvIGZpbGVzOiBmZWRvcmEtcmVsZWFzZSBhbmQgcmVkaGF0LXJlbGVhc2UKKyAgICAgICAgICAgICMgd2l0aCBpZGVudGljYWwgY29udGVudC4gSWYgZmVkb3JhLXJlbGVhc2UgcHJlc2VudCwgaWdub3JlIHJlZGphdC1yZWxlYXNlLgorICAgICAgICAgICAgaWYgKCBncmVwKCAkXyBlcSAiL2V0Yy9mZWRvcmEtcmVsZWFzZSIsIEByZWxlYXNlcyApICkgeworICAgICAgICAgICAgICAgIEByZWxlYXNlcyA9IGdyZXAoICRfIG5lICIvZXRjL3JlZGhhdC1yZWxlYXNlIiwgQHJlbGVhc2VzICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoIEByZWxlYXNlcyA9PSAxICkgeworICAgICAgICAgICAgICAgICRyZWxlYXNlID0gJHJlbGVhc2VzWyAwIF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggQHJlbGVhc2VzID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICMgTm8gKi1yZWxlYXNlIGZpbGVzIGZvdW5kLCB0cnkgZGViaWFuX3ZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gIi9ldGMvZGViaWFuX3ZlcnNpb24iOworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdCAtZSAkcmVsZWFzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiTm8gcmVsZWFzZSBmaWxlcyBmb3VuZCBpbiBcIi9ldGMvXCIgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJNb3JlIHRoYW4gb25lIHJlbGVhc2UgZmlsZXMgZm91bmQgaW4gXCIvZXRjL1wiIGRpcmVjdG9yeToiLCBAcmVsZWFzZXMgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkcmVsZWFzZSApICkgeworICAgICAgICAgICAgJGJ1bGsgPSByZWFkX2ZpbGUoICRyZWxlYXNlICk7CisgICAgICAgICAgICBpZiAoICRyZWxlYXNlID1+IG17c3lzdGVtfHJlZGhhdHxmZWRvcmF9ICkgeworICAgICAgICAgICAgICAgICMgUmVkIEhhdCBvciBGZWRvcmEuIFBhcnNlIHRoZSBmaXJzdCBsaW5lIG9mIGZpbGUuCisgICAgICAgICAgICAgICAgIyBUeXBpY2FsIHZhbHVlcyBvZiAqLXJlbGVhc2UgKG9uZSBvZik6CisgICAgICAgICAgICAgICAgIyAgICAgUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBTZXJ2ZXIgcmVsZWFzZSA1LjIgKFRpa2FuZ2EpCisgICAgICAgICAgICAgICAgIyAgICAgUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBBUyByZWxlYXNlIDMgKFRhcm9vbiBVcGRhdGUgNCkKKyAgICAgICAgICAgICAgICAjICAgICBGZWRvcmEgcmVsZWFzZSAxMCAoQ2FtYnJpZGdlKQorICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkZmlyc3RfbGluZSA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9ICRmaXJzdF9saW5lOworICAgICAgICAgICAgICAgICRmaXJzdF9saW5lID1+IG17XEEoLio/KVxzK3JlbGVhc2VccysoLio/KSg/OlxzK1woKC4qPykoPzpccytVcGRhdGVccysoLio/KSk/XCkpP1xzKiR9CisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZToxOiBDYW5ub3QgcGFyc2UgbGluZToiLCAkZmlyc3RfbGluZSApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICB9ICA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ICA9ICQyIC4gKCBkZWZpbmVkKCAkNCApID8gIi4kNCIgOiAiIiApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgfSA9ICQzOworICAgICAgICAgICAgfSBlbHNpZiAoICRyZWxlYXNlID1+IG17U3VTRX0gKSB7CisgICAgICAgICAgICAgICAgIyBUeXBpY2FsIFN1U0UtcmVsZWFzZToKKyAgICAgICAgICAgICAgICAjICAgICBTVVNFIExpbnV4KiBPUyBFbnRlcnByaXNlIFNlcnZlciAxMCAoeDg2XzY0KQorICAgICAgICAgICAgICAgICMgICAgIFZFUlNJT04gPSAxMAorICAgICAgICAgICAgICAgICMgICAgIFBBVENITEVWRUwgPSAyCisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXtcQSguKikkfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBDYW5ub3QgZmluZCB0aGUgZmlyc3QgbGluZToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgIG15ICRmaXJzdF9saW5lID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJGZpcnN0X2xpbmU7CisgICAgICAgICAgICAgICAgJGZpcnN0X2xpbmUgPX4gbXteKC4qPylccyooXGQrKVxzKlwoLio/XClccyokfQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6MTogQ2Fubm90IHBhcnNlIGxpbmU6IiwgJGZpcnN0X2xpbmUgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICQxOworICAgICAgICAgICAgICAgICRidWxrID1+IG17XlZFUlNJT05ccyo9XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIFZFUlNJT046IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICQxOworICAgICAgICAgICAgICAgIGlmICggJGJ1bGsgPX4gbXteUEFUQ0hMRVZFTFxzKj1ccyooLiopXHMqJH1tICkgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSAuPSAiLiQxIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9IGVsc2lmICggJHJlbGVhc2UgPX4gbXtkZWJpYW5fdmVyc2lvbn0gKSB7CisgICAgICAgICAgICAgICAgIyBEZWJpYW4uIFRoZSBmaWxlIGRlYmlhbl92ZXJzaW9uIGNvbnRhaW5zIGp1c3QgdmVyc2lvbiBudW1iZXIsIG5vdGhpbmcgbW9yZToKKyAgICAgICAgICAgICAgICAjICAgICA0LjAKKyAgICAgICAgICAgICAgICBteSAkbmFtZSA9ICJEZWJpYW4iOworICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICAgICAgfSA9ICRuYW1lOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9ICR2ZXJzaW9uOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9ICJ1bmtub3duIjsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSBzcHJpbnRmKCAiJXMgJXMiLCAkbmFtZSwgJHZlcnNpb24gKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSApICkgeworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICJHTlUvTGludXgiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9IGVxICJEYXJ3aW4iICkgeworICAgIG15ICVjb2RlbmFtZXMgPSAoCisgICAgICAgIDEwLjQgPT4gIlRpZ2VyIiwKKyAgICAgICAgMTAuNSA9PiAiTGVvcGFyZCIsCisgICAgICAgIDEwLjYgPT4gIlNub3cgTGVvcGFyZCIsCisgICAgKTsKKyAgIG15ICRkYXJ3aW47CisgICBteSAkZ2V0X29zX2luZm8gPQorICAgICAgIHN1YiB7CisgICAgICAgICAgIG15ICggJG5hbWUgKSA9IEBfOworICAgICAgICAgICBpZiAoIG5vdCBkZWZpbmVkICRkYXJ3aW4gKSB7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJEYXJ3aW4iOworICAgICAgICAgICAgICAgIyBzd192ZXJzIHByaW50cyBPUyBYKiB2ZXJzaW9uIHRvIHN0ZG91dDoKKyAgICAgICAgICAgICAgICMgICAgIFByb2R1Y3ROYW1lOiAgICAgICBPUyBYKgorICAgICAgICAgICAgICAgIyAgICAgUHJvZHVjdFZlcnNpb246ICAgIDEwLjQuMTEKKyAgICAgICAgICAgICAgICMgICAgIEJ1aWxkVmVyc2lvbjogICAgICA4UzIxNjcKKyAgICAgICAgICAgICAgICMgSXQgZG9lcyBub3QgcHJpbnQgY29kZW5hbWUsIHNvIHdlIGNvZGUgT1MgWCogY29kZW5hbWVzIGhlcmUuCisgICAgICAgICAgICAgICBteSAkc3dfdmVycyA9IHdoaWNoKCAic3dfdmVycyIgKSB8fCAiL3Vzci9iaW4vc3dfdmVycyI7CisgICAgICAgICAgICAgICBteSAkb3V0cHV0OworICAgICAgICAgICAgICAgZGVidWcoICJFeGVjdXRpbmcgJHN3X3ZlcnMuLi4iICk7CisgICAgICAgICAgICAgICBleGVjdXRlKCBbICRzd192ZXJzIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgICAgICAgICRvdXRwdXQgPX4gbXteUHJvZHVjdE5hbWU6XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJUaGVyZSBpcyBubyBQcm9kdWN0TmFtZSBpbiBzd192ZXJzIG91dHB1dDoiLCAkb3V0cHV0LCAiKGVvZikiICk7CisgICAgICAgICAgICAgICBteSAkbmFtZSA9ICQxOworICAgICAgICAgICAgICAgJG91dHB1dCA9fiBte15Qcm9kdWN0VmVyc2lvbjpccyooLiopXHMqJH1tCisgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIlRoZXJlIGlzIG5vIFByb2R1Y3RWZXJzaW9uIGluIHN3X3ZlcnMgb3V0cHV0OiIsICRvdXRwdXQsICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgIG15ICRyZWxlYXNlID0gJDE7CisgICAgICAgICAgICAgICAjIFNvbWV0aW1lcyByZWxlYXNlIHJlcG9ydGVkIGFzICIxMC40LjExIiAoMyBjb21wb25lbnRlcyksIHNvbWV0aW1lcyBhcyAiMTAuNiIuCisgICAgICAgICAgICAgICAjIEhhbmRsZSBib3RoIHZhcmlhbnRzLgorICAgICAgICAgICAgICAgJHJlbGVhc2UgPX4gbXteKFxkKy5cZCspKD86XC5cZCspPyg/PVxzfCQpfQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJDYW5ub3QgcGFyc2UgT1MgWCogdmVyc2lvbjogJHJlbGVhc2UiICk7CisgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICQxOworICAgICAgICAgICAgICAgbXkgJGNvZGVuYW1lID0gKCAkY29kZW5hbWVzeyAkdmVyc2lvbiB9IG9yICJ1bmtub3duIiApOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgICAgIH0gPSAkbmFtZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlICAgICB9ID0gJHJlbGVhc2U7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9ICRjb2RlbmFtZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ByaW50ZiggIiVzICVzICglcykiLCAkbmFtZSwgJHJlbGVhc2UsICRjb2RlbmFtZSApOworICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgIHJldHVybiAkZGFyd2luLT57ICRuYW1lIH07CisgICAgICAgfTsgIyBzdWIKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtICAgICAgICAgICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW0iICAgICAgICAgICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgICAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX25hbWUiICAgICAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIiAgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUiICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIiApOyB9OworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQVdpbmRvd3NbIF9dTlRcen0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk1TIFdpbmRvd3MiOworICAgICMgbXkgQG9zX25hbWUgPSBXaW4zMjo6R2V0T1NOYW1lKCk7CisgICAgIyAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICRvc19uYW1lWyAwIF07CisgICAgIyAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3VwZGF0ZSAgfSA9ICRvc19uYW1lWyAxIF07Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBQ1lHV0lOX05ULX0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk1TIFdpbmRvd3MiOworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQUZyZWVCU0R9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJGcmVlQlNEIjsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFOZXRCU0R9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJOZXRCU0QiOworfSBlbHNlIHsKKyAgICBkaWUgIlVuc3VwcG9ydGVkIGtlcm5lbF9uYW1lIChcIiR2YWx1ZXN7IGtlcm5lbF9uYW1lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworfTsgIyBpZgorCisjIGhvc3RfbmFtZSBhbmQgZG9tYWluX25hbWUKKyR2YWx1ZXN7IGhvc3RfbmFtZSB9ID0KKyAgICBzdWIgeworICAgICAgICBteSAkZnFkbiA9IHZhbHVlKCAiZnFkbiIgKTsKKyAgICAgICAgJGZxZG4gPX4gbXtcQShbXi5dKikoPzpcLiguKikpP1x6fTsKKyAgICAgICAgbXkgJGhvc3RfbmFtZSA9ICQxOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaG9zdF9uYW1lICkgb3IgJGhvc3RfbmFtZSBlcSAiIiApIHsKKyAgICAgICAgICAgIGRpZSAiVW5leHBlY3RlZCBlcnJvcjogdW5kZWZpbmVkIG9yIGVtcHR5IGhvc3QgbmFtZTsgc3RvcHBlZCI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRob3N0X25hbWU7CisgICAgfTsKKyR2YWx1ZXN7IGRvbWFpbl9uYW1lIH0gPQorICAgIHN1YiB7CisgICAgICAgIG15ICRmcWRuID0gdmFsdWUoICJmcWRuIiApOworICAgICAgICAkZnFkbiA9fiBte1xBKFteLl0qKSg/OlwuKC4qKSk/XHp9OworICAgICAgICBteSAkZG9tYWluX25hbWUgPSAkMjsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGRvbWFpbl9uYW1lICkgb3IgJGRvbWFpbl9uYW1lIGVxICIiICkgeworICAgICAgICAgICAgZGllICJVbmV4cGVjdGVkIGVycm9yOiB1bmRlZmluZWQgb3IgZW1wdHkgZG9tYWluIG5hbWU7IHN0b3BwZWQiOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkZG9tYWluX25hbWU7CisgICAgfTsKKworIyBSZXBsYWNlIHVuZGVmaW5lZCB2YWx1ZXMgd2l0aCAidW5rbm93biIuCitmb3JlYWNoIG15ICRuYW1lICggQGFsbCApIHsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdmFsdWVzeyAkbmFtZSB9ICkgKSB7CisgICAgICAgICR2YWx1ZXN7ICRuYW1lIH0gPSAidW5rbm93biI7CisgICAgfTsgIyBpZgorfTsgIyBmb3JlYWNoICRuYW1lCisKKyMgRXhwb3J0IGZ1bmN0aW9ucyByZXBvcnRpbmcgcHJvcGVydGllcy4KK2ZvcmVhY2ggbXkgJG5hbWUgKCBAYWxsICkgeworICAgIG5vIHN0cmljdCAicmVmcyI7CisgICAgKiRuYW1lID0gc3ViIHsgcmV0dXJuIHZhbHVlKCAkbmFtZSApOyB9OworfTsgIyBmb3JlYWNoICRuYW1lCisKKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJhc2UgbmFtZXMuCitzdWIgYmFzZV9uYW1lcyB7CisgICAgcmV0dXJuIEBiYXNlOworfTsgIyBzdWIgYmFzZV9uYW1lcworCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbGwgdGhlIG5hbWVzLgorc3ViIGFsbF9uYW1lcyB7CisgICAgcmV0dXJuIEBhbGw7Cit9OyAjIHN1YiBhbGxfbmFtZXMKKworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdmFsdWUgYnkgdGhlIHNwZWNpZmllZCBuYW1lLgorc3ViIHZhbHVlKCQpIHsKKyAgICBteSAkbmFtZSA9IHNoaWZ0KCBAXyApOworICAgIGlmICggcmVmKCAkdmFsdWVzeyAkbmFtZSB9ICkgKSB7CisgICAgICAgIG15ICR2YWx1ZSA9ICR2YWx1ZXN7ICRuYW1lIH0tPigpOworICAgICAgICAkdmFsdWVzeyAkbmFtZSB9ID0gJHZhbHVlOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHZhbHVlc3sgJG5hbWUgfTsKK307ICMgc3ViIHZhbHVlCisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxVbmFtZS5wbT4gLS0gQSBmZXcgc3Vicm91dGluZXMgdG8gZ2V0IHN5c3RlbSBpbmZvcm1hdGlvbiB1c3VhbGx5IHByb3ZpZGVkIGJ5CitDPC9iaW4vdW5hbWU+IGFuZCBDPFBPU0lYOjp1bmFtZSgpPi4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgVW5hbWU7CisKKyAgICAjIEJhc2UgcHJvcGVydHkgZnVuY3Rpb25zLgorICAgICRrZXJuZWxfbmFtZSAgICAgICA9IFVuYW1lOjprZXJuZWxfbmFtZSgpOworICAgICRmcWRuICAgICAgICAgICAgICA9IFVuYW1lOjpmcWRuKCk7CisgICAgJGtlcm5lbF9yZWxlYXNlICAgID0gVW5hbWU6Omtlcm5lbF9yZWxlYXNlKCk7CisgICAgJGtlcm5lbF92ZXJzaW9uICAgID0gVW5hbWU6Omtlcm5lbF92ZXJzaW9uKCk7CisgICAgJG1hY2hpbmUgICAgICAgICAgID0gVW5hbWU6Om1hY2hpbmUoKTsKKyAgICAkcHJvY2Vzc29yICAgICAgICAgPSBVbmFtZTo6cHJvY2Vzc29yKCk7CisgICAgJGhhcmR3YXJlX3BsYXRmb3JtID0gVW5hbWU6OmhhcmR3YXJlX3BsYXRmb3JtKCk7CisgICAgJG9wZXJhdGluZ19zeXN0ZW0gID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW0oKTsKKworICAgICMgQXV4aWxpYXJ5IHByb3BlcnR5IGZ1bmN0aW9ucy4KKyAgICAkaG9zdF9uYW1lICAgICAgICAgPSBVbmFtZTo6aG9zdF9uYW1lKCk7CisgICAgJGRvbWFpbl9uYW1lICAgICAgID0gVW5hbWU6OmRvbWFpbl9uYW1lKCk7CisgICAgJG9zX25hbWUgICAgICAgICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fbmFtZSgpOworICAgICRvc19yZWxlYXNlICAgICAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UoKTsKKyAgICAkb3NfY29kZW5hbWUgICAgICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSgpOworICAgICRvc19kZXNjcmlwdGlvbiAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uKCk7CisKKyAgICAjIE1ldGEgZnVuY3Rpb25zLgorICAgIEBiYXNlX25hbWVzICA9IFVuYW1lOjpiYXNlX25hbWVzKCk7CisgICAgQGFsbF9uYW1lcyAgID0gVW5hbWU6OmFsbF9uYW1lcygpOworICAgICRrZXJuZWxfbmFtZSA9IFVuYW1lOjp2YWx1ZSggImtlcm5lbF9uYW1lIiApOworCis9aGVhZDEgREVTQ1JJUFRJT04KKworQjxVbmFtZS5wbT4gcmVzZW1ibGVzIGZ1bmN0aW9uYWxpdHkgZm91bmQgaW4gQzxQT1NJWDo6dW5hbWUoKT4gZnVuY3Rpb24gb3IgaW4gQzx1bmFtZT4gcHJvZ3JhbS4KK0hvd2V2ZXIsIGJvdGggQzxQT1NJWDo6dW5hbWUoKT4gYW5kIEM8L2Jpbi91bmFtZT4gaGF2ZSBzb21lIGRpc2FkdmFudGFnZXM6CisKKz1vdmVyCisKKz1pdGVtICoKKworQzx1bmFtZT4gbWF5IGJlIG5vdCBhdmFpbGFibGUgaW4gc29tZSBlbnZpcm9ubWVudHMsIGZvciBleGFtcGxlLCBpbiBXaW5kb3dzKiBPUworKEM8dW5hbWU+IG1heSBiZSBmb3VuZCBpbiBzb21lIHRoaXJkLXBhcnR5IHNvZnR3YXJlIHBhY2thZ2VzLCBsaWtlIE1LUyBUb29sa2l0IG9yIEN5Z3dpbiwgYnV0IGl0IGlzCitub3QgYSBwYXJ0IG9mIE9TKS4KKworPWl0ZW0gKgorCitUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQzx1bmFtZT4uIEZvciBleGFtcGxlLCBDPHVuYW1lPiBvbiBPUyBYKiBkb2VzIG5vdAorcmVjb2duaXplIG9wdGlvbnMgQzwtaT4sIEM8LW8+LCBhbmQgYW55IGxvbmcgb3B0aW9ucy4KKworPWl0ZW0gKgorCitEaWZmZXJlbnQgdmVyc2lvbnMgb2YgQzx1bmFtZT4gbWF5IHJlcG9ydCB0aGUgc2FtZSBwcm9wZXJ0eSBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUsCitDPHVuYW1lPiBvbiBMaW51eCogT1MgcmVwb3J0cyBtYWNoaW5lIGFzIEM8aTY4Nj4sIHdoaWxlIEM8dW5hbWU+IG9uIE9TIFgqIHJlcG9ydHMgdGhlIHNhbWUgbWFjaGluZSBhcworQzx4ODY+LgorCis9aXRlbSAqCisKK0M8UE9TSVg6OnVuYW1lKCk+IHJldHVybnMgbGlzdCBvZiB2YWx1ZXMuIEkgY2Fubm90IHJlY2FsbCB3aGF0IGlzIHRoZSBmb3VydGggZWxlbWVudCBvZiB0aGUgbGlzdC4KKworPWJhY2sKKworPWhlYWQyIEJhc2UgRnVuY3Rpb25zCisKK0Jhc2UgcHJvcGVydHkgZnVuY3Rpb25zIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIGFzIEM8dW5hbWU+IHByb2dyYW0uCisKKz1vdmVyCisKKz1pdGVtIEI8a2VybmVsX25hbWUoKT4KKworUmV0dXJucyB0aGUga2VybmVsIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IEM8UE9TSVg6OnVuYW1lKCk+LgorCis9aXRlbSBCPGZxZG4oKT4KKworUmV0dXJucyB0aGUgRlFETiwgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lLiBPbiBzb21lIHN5c3RlbXMgQzxQT1NJWDo6dW5hbWUoKT4gcmVwb3J0cyBzaG9ydCBub2RlCituYW1lICh3aXRoIG5vIGRvbWFpbiBuYW1lKSwgb24gb3RoZXJzIEM8UE9TSVg6OnVuYW1lKCk+IHJlcG9ydHMgZnVsbCBub2RlIG5hbWUuIFRoaXMKK2Z1bmN0aW9uIHN0cml2ZSB0byByZXR1cm4gRlFETiBhbHdheXMgKGJ5IHJlZmluaW5nIEM8UE9TSVg6OnVuYW1lKCk+IHdpdGgKK0M8TmV0OjpEb21haW46Omhvc3RmcWRuKCk+KS4KKworPWl0ZW0gQjxrZXJuZWxfcmVsZWFzZSgpPgorCitSZXR1cm5zIHRoZSBrZXJuZWwgcmVsZWFzZSBzdHJpbmcsIGFzIHJlcG9ydGVkIGJ5IEM8UE9TSVg6OnVuYW1lKCk+LiBVc3VhbGx5IHRoZSBzdHJpbmcgY29uc2lzdHMgb2YKK3NldmVyYWwgbnVtYmVycywgc2VwYXJhdGVkIGJ5IGRvdHMgYW5kIGRhc2hlcywgYnV0IG1heSBhbHNvIGluY2x1ZGUgc29tZSBub24tbnVtZXJpYyBzdWJzdHJpbmdzIGxpa2UKKyJzbXAiLgorCis9aXRlbSBCPGtlcm5lbF92ZXJzaW9uKCk+CisKK1JldHVybnMgdGhlIGtlcm5lbCB2ZXJzaW9uIHN0cmluZywgYXMgcmVwb3J0ZWQgYnkgQzxQT1NJWDo6dW5hbWUoKT4uIEl0IGlzIEI8bm90PiBzZXZlcmFsCitkb3Qtc2VwYXJhdGVkIG51bWJlcnMgYnV0IG11Y2ggbG9uZ2VyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBrZXJuZWwuCitGb3IgZXhhbXBsZSwgb24gTGludXgqIE9TIGl0IGluY2x1ZGVzIGJ1aWxkIGRhdGUuCitJZiB5b3UgbG9vayBmb3Igc29tZXRoaW5nIGlkZW50aWZ5aW5nIHRoZSBrZXJuZWwsIGxvb2sgYXQgTDxrZXJuZWxfcmVsZWFzZT4uCisKKz1pdGVtIEI8bWFjaGluZSgpPgorCitSZXR1cm5zIHRoZSBtYWNoaW5lIGhhcmR3YXJlIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IFBPU0lYOjp1bmFtZSgpLiBOb3QgcmVsaWFibGUuIERpZmZlcmVudCBPU2VzIG1heQorcmVwb3J0IHRoZSBzYW1lIG1hY2hpbmUgaGFyZHdhcmUgbmFtZSBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUsIExpbnV4KiBPUyByZXBvcnRzIEM8aTY4Nj4sIHdoaWxlIE9TIFgqCityZXBvcnRzIEM8eDg2PiBvbiB0aGUgc2FtZSBtYWNoaW5lLgorCis9aXRlbSBCPHByb2Nlc3NvcigpPgorCitSZXR1cm5zIHRoZSBwcm9jZXNzb3IgdHlwZS4gTm90IHJlbGlhYmxlLiBVc3VhbGx5IHRoZSBzYW1lIGFzIEM8bWFjaGluZT4uCisKKz1pdGVtIEI8aGFyZHdhcmVfcGxhdGZvcm0oKT4KKworT25lIG9mOiBDPGkzODY+IG9yIEM8eDg2XzY0Pi4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtKCk+CisKK09uZSBvZjogQzxHTlUvTGludXg+LCBDPE9TIFgqPiwgb3IgQzxNUyBXaW5kb3dzPi4KKworPWJhY2sKKworPWhlYWQyIEF1eGlsaWFyeSBGdW5jdGlvbnMKKworQXV4aWxpYXJ5IGZ1bmN0aW9ucyBleHRlbmRzIGJhc2UgZnVuY3Rpb25zIHdpdGggaW5mb3JtYXRpb24gbm90IHJlcG9ydGVkIGJ5IEM8dW5hbWU+IHByb2dyYW0uCisKK0F1eGlsaWFyeSBmdW5jdGlvbnMgY29sbGVjdCBpbmZvcm1hdGlvbiBmcm9tIGRpZmZlcmVudCBzb3VyY2VzLiBGb3IgZXhhbXBsZSwgb24gT1MgWCosIHRoZXkgbWF5CitjYWxsIEM8c3dfdmVycz4gcHJvZ3JhbSB0byBmaW5kIG91dCBPUyByZWxlYXNlOyBvbiBMaW51eCogT1MgdGhleSBtYXkgcGFyc2UgQzwvZXRjL3JlZGhhdC1yZWxlYXNlPiBmaWxlLAorZXRjLgorCis9b3ZlcgorCis9aXRlbSBCPGhvc3RfbmFtZSgpPgorCitSZXR1cm5zIGhvc3QgbmFtZSAoRlFETiB3aXRoIGRyb3BwZWQgZG9tYWluIHBhcnQpLgorCis9aXRlbSBCPGRvbWFpbl9uYW1lKCk+CisKK1JldHVybnMgZG9tYWluIG5hbWUgKEZRRE4gd2l0aCBkcm9wcGVkIGhvc3QgcGFydCkuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9uYW1lPgorCitOYW1lIG9mIG9wZXJhdGluZyBzeXN0ZW0gb3IgbmFtZSBvZiBMaW51eCogT1MgZGlzdHJpYnV0aW9uLCBsaWtlICJGZWRvcmEiIG9yCisiUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBTZXJ2ZXIiLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZT4KKworUmVsZWFzZSAodmVyc2lvbikgb2Ygb3BlcmF0aW5nIHN5c3RlbSBvciBMaW51eCogT1MgZGlzdHJpYnV0aW9uLiBVc3VhbGx5IGl0IGlzIGEgc2VyaWVzIG9mCitkb3Qtc2VwYXJhdGVkIG51bWJlcnMuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZT4KKworQ29kZW5hbWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSByZWxlYXNlIG9yIExpbnV4KiBPUyBkaXN0cmlidXRpb24uIEZvciBleGFtcGxlLCBGZWRvcmEgMTAgaXMgIkNhbWJyaWRnZSIKK3doaWxlIE9TIFgqIDEwLjQgaXMgIlRpZ2VyIi4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uPgorCitMb25nZXIgc3RyaW5nLiBVc3VhbGx5IGl0IGluY2x1ZGVzIGFsbCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBwcm9wZXJ0aW5nIG1lbnRpb25lZCBhYm92ZSAtLSBuYW1lLAorcmVsZWFzZSwgY29kZW5hbWUgaW4gcGFyZW50aGVzZXMuCisKKz1iYWNrCisKKz1oZWFkMiBNZXRhIEZ1bmN0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPGJhc2VfbmFtZXMoKT4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIGJhc2UgcHJvcGVydHkgbmFtZXMuCisKKz1pdGVtIEI8YWxsX25hbWVzKCk+CisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcHJvcGVydHkgbmFtZXMuCisKKz1pdGVtIEI8dmFsdWUoPiBJPG5hbWU+IEI8KT4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgc3BlY2lmaWVkIGJ5IEk8bmFtZT4uCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCisgICAgdXNlIFVuYW1lOworCisgICAgcHJpbnQoIFVuYW1lOjpzdHJpbmcoKSwgIlxuIiApOworCisgICAgZm9yZWFjaCBteSAkbmFtZSAoIFVuYW1lOjphbGxfbmFtZXMoKSApIHsKKyAgICAgICAgcHJpbnQoICIkbmFtZT1cIiIgLiBVbmFtZTo6dmFsdWUoICRuYW1lICkgLiAiXCJcbiIgKTsKKyAgICB9OyAjIGZvcmVhY2ggJG5hbWUKKworPWhlYWQxIFNFRSBBTFNPCisKK0w8UE9TSVg6OnVuYW1lPiwgTDx1bmFtZT4uCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL3Rvb2xzLnBtIGIvZmluYWwvcnVudGltZS90b29scy9saWIvdG9vbHMucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1Y2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL3Rvb2xzLnBtCkBAIC0wLDAgKzEsMTk4MSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgdG8gYmUgdXNlZCBpbiBvdGhlciBzY3JpcHRzLgorIworIyBUbyBnZXQgaGVscCBhYm91dCBleHBvcnRlZCB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBwbGVhc2UgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIHRvb2xzLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBpbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKz1oZWFkMSBOQU1FCisKK0I8dG9vbHMucG0+IC0tIEEgY29sbGVjdGlvbiBvZiBzdWJyb3V0aW5lcyB3aGljaCBhcmUgd2lkZWx5IHVzZWQgaW4gUGVybCBzY3JpcHRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBGaW5kQmluOworICAgIHVzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKyAgICB1c2UgdG9vbHM7CisKKz1oZWFkMSBERVNDUklQVElPTgorCitCPE5vdGU6PiBCZWNhdXNlIHRoaXMgY29sbGVjdGlvbiBpcyBzbWFsbCBhbmQgaW50ZW5kZWQgZm9yIHdpZGVseSB1c2luZyBpbiBwYXJ0aWN1bGFyIHByb2plY3QsCithbGwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5IGRlZmF1bHQuCisKK0I8Tm90ZTo+IEkgaGF2ZSBzb21lIGlkZWFzIGhvdyB0byBpbXByb3ZlIHRoaXMgY29sbGVjdGlvbiwgYnV0IGl0IGlzIGluIG15IGxvbmctdGVybSBwbGFucy4KK0N1cnJlbnQgc2hhcGUgaXMgbm90IGlkZWFsLCBidXQgZ29vZCBlbm91Z2ggdG8gdXNlLgorCis9Y3V0CisKK3BhY2thZ2UgdG9vbHM7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSB2YXJzIHF3KCBASVNBIEBFWFBPUlQgQEVYUE9SVF9PSyAlRVhQT1JUX1RBR1MgKTsKK3JlcXVpcmUgRXhwb3J0ZXI7CitASVNBID0gcXcoIEV4cG9ydGVyICk7CisKK215IEB2YXJzICAgPSBxdyggJHRvb2wgKTsKK215IEB1dGlscyAgPSBxdyggY2hlY2tfb3B0cyB2YWxpZGF0ZSApOworbXkgQG9wdHMgICA9IHF3KCBnZXRfb3B0aW9ucyApOworbXkgQHByaW50ICA9IHF3KCBkZWJ1ZyBpbmZvIHdhcm5pbmcgY21kbGluZV9lcnJvciBydW50aW1lX2Vycm9yIHF1ZXN0aW9uICk7CitteSBAbmFtZSAgID0gcXcoIGdldF92b2wgZ2V0X2RpciBnZXRfZmlsZSBnZXRfbmFtZSBnZXRfZXh0IGNhdF9maWxlIGNhdF9kaXIgKTsKK215IEBmaWxlICAgPSBxdyggd2hpY2ggYWJzX3BhdGggcmVsX3BhdGggcmVhbF9wYXRoIG1ha2VfZGlyIGNsZWFuX2RpciBjb3B5X2RpciBtb3ZlX2RpciBkZWxfZGlyIGNoYW5nZV9kaXIgY29weV9maWxlIG1vdmVfZmlsZSBkZWxfZmlsZSApOworbXkgQGlvICAgICA9IHF3KCByZWFkX2ZpbGUgd3JpdGVfZmlsZSApOworbXkgQGV4ZWMgICA9IHF3KCBleGVjdXRlIGJhY2t0aWNrcyApOworbXkgQHN0cmluZyA9IHF3eyBwYWQgfTsKK0BFWFBPUlQgPSAoIEB1dGlscywgQG9wdHMsIEB2YXJzLCBAcHJpbnQsIEBuYW1lLCBAZmlsZSwgQGlvLCBAZXhlYywgQHN0cmluZyApOworCit1c2UgVU5JVkVSU0FMICAgICgpOworCit1c2UgRmluZEJpbjsKK3VzZSBJTzo6SGFuZGxlOwordXNlIElPOjpGaWxlOwordXNlIElPOjpEaXI7CisjIE5vdCBhdmFpbGFibGUgb24gc29tZSBtYWNoaW5lczogdXNlIElPOjpabGliOworCit1c2UgR2V0b3B0OjpMb25nICgpOwordXNlIFBvZDo6VXNhZ2UgICAoKTsKK3VzZSBDYXJwICAgICAgICAgKCk7Cit1c2UgRmlsZTo6Q29weSAgICgpOwordXNlIEZpbGU6OlBhdGggICAoKTsKK3VzZSBGaWxlOjpUZW1wICAgKCk7Cit1c2UgRmlsZTo6U3BlYyAgICgpOwordXNlIFBPU0lYICAgICAgICBxd3sgOmZjbnRsX2ggOmVycm5vX2ggfTsKK3VzZSBDd2QgICAgICAgICAgKCk7Cit1c2UgU3ltYm9sICAgICAgICgpOworCit1c2UgRGF0YTo6RHVtcGVyOworCit1c2UgdmFycyBxdyggJHRvb2wgJHZlcmJvc2UgJHRpbWVzdGFtcHMgKTsKKyR0b29sID0gJEZpbmRCaW46OlNjcmlwdDsKKworbXkgQHdhcm5pbmcgPSAoIHN1YiB7fSwgXCZ3YXJuaW5nLCBcJnJ1bnRpbWVfZXJyb3IgKTsKKworCitzdWIgY2hlY2tfb3B0cyhcJSQ7JCkgeworCisgICAgbXkgJG9wdHMgPSBzaGlmdCggQF8gKTsgICMgUmVmZXJlbnNlIHRvIGhhc2ggY29udGFpbmluZyByZWFsIG9wdGlvbnMgYW5kIHRoZWlyIHZhbHVlcy4KKyAgICBteSAkZ29vZCA9IHNoaWZ0KCBAXyApOyAgIyBSZWZlcmVuY2UgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhbGwga25vd24gb3B0aW9uIG5hbWVzLgorICAgIG15ICRtc2cgID0gc2hpZnQoIEBfICk7ICAjIE9wdGlvbmFsIChub24tbWFuZGF0b3J5KSBtZXNzYWdlLgorCisgICAgaWYgKCBub3QgZGVmaW5lZCggJG1zZyApICkgeworICAgICAgICAkbXNnID0gInVua25vd24gb3B0aW9uKHMpIHBhc3NlZCI7ICAgIyBEZWZhdWx0IHZhbHVlIGZvciAkbXNnLgorICAgIH07ICMgaWYKKworICAgICMgSSdsbCB1c2UgdGhlc2UgaGFzaGVzIGFzIHNldHMgb2Ygb3B0aW9ucy4KKyAgICBteSAlZ29vZCA9IG1hcCggKCAkXyA9PiAxICksIEAkZ29vZCApOyAgICMgJWdvb2Qgbm93IGlzIGZpbGxlZCB3aXRoIGFsbCBrbm93biBvcHRpb25zLgorICAgIG15ICViYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlYmFkIGlzIGVtcHR5LgorCisgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRvcHRzICkgKSB7ICAgICAjIEZvciBlYWNoIHJlYWwgb3B0aW9uLi4uCisgICAgICAgIGlmICggbm90IGV4aXN0cyggJGdvb2R7ICRvcHQgfSApICkgeyAjIExvb2sgaXRzIG5hbWUgaW4gdGhlIHNldCBvZiBrbm93biBvcHRpb25zLi4uCisgICAgICAgICAgICAkYmFkeyAkb3B0IH0gPSAxOyAgICAgICAgICAgICAgICAjIEFkZCB1bmtub3duIG9wdGlvbiB0byAlYmFkIHNldC4KKyAgICAgICAgICAgIGRlbGV0ZSggJG9wdHMtPnsgJG9wdCB9ICk7ICAgICAgICMgQW5kIGRlbGV0ZSBvcmlnaW5hbCBvcHRpb24uCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJG9wdAorICAgIGlmICggJWJhZCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiAlYmFkIHNldCBpcyBub3QgZW1wdHkuLi4KKyAgICAgICAgbXkgQGNhbGxlciA9IGNhbGxlciggMSApOyAgICAgICAgICAgICMgSXNzdWUgYSB3YXJuaW5nLgorICAgICAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gMjsKKyAgICAgICAgQ2FycDo6Y2x1Y2soICRjYWxsZXJbIDMgXSAuICI6ICIgLiAkbXNnIC4gIjogIiAuIGpvaW4oICIsICIsIHNvcnQoIGtleXMoICViYWQgKSApICkgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gMTsKKworfTsgIyBzdWIgY2hlY2tfb3B0cworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHVycG9zZToKKyMgICAgIENoZWNrIHN1YnJvdXRpbmUgYXJndW1lbnRzLgorIyBTeW5vcHNpczoKKyMgICAgIG15ICVvcHRzID0gdmFsaWRhdGUoIHBhcmFtcyA9PiBcQF8sIHNwZWMgPT4geyAuLi4gfSwgY2FsbGVyID0+IG4gKTsKKyMgQXJndW1lbnRzOgorIyAgICAgcGFyYW1zIC0tIEEgcmVmZXJlbmNlIHRvIHN1YnJvdXRpbmUncyBhY3R1YWwgYXJndW1lbnRzLgorIyAgICAgc3BlYyAgIC0tIFNwZWNpZmljYXRpb24gb2YgZXhwZWN0ZWQgYXJndW1lbnRzLgorIyAgICAgY2FsbGVyIC0tIC4uLgorIyBSZXR1cm4gdmFsdWU6CisjICAgICBBIGhhc2ggb2YgdmFsaWRhdGVkIG9wdGlvbnMuCisjIERlc2NyaXB0aW9uOgorIyAgICAgSSB3b3VsZCBsaWtlIHRvIHVzZSBQYXJhbXM6OlZhbGlkYXRlIG1vZHVsZSwgYnV0IGl0IGlzIG5vdCBhIHBhcnQgb2YgZGVmYXVsdCBQZXJsCisjICAgICBkaXN0cmlidXRpb24sIHNvIEkgY2Fubm90IHJlbHkgb24gaXQuIFRoaXMgc3Vicm91dGluZSByZXNlbWJsZXMgdG8gc29tZSBleHRlbnQgdG8KKyMgICAgIFBhcmFtczo6VmFsaWRhdGU6OnZhbGlkYXRlX3dpdGgoKS4KKyMgICAgIFNwZWNpZmljYXRpb24gb2YgZXhwZWN0ZWQgYXJndW1lbnRzOgorIyAgICAgICAgeyAkb3B0ID0+IHsgdHlwZSA9PiAkdHlwZSwgZGVmYXVsdCA9PiAkZGVmYXVsdCB9LCAuLi4gfQorIyAgICAgICAgJG9wdCAgICAgLS0gU3RyaW5nLCBvcHRpb24gbmFtZS4KKyMgICAgICAgICR0eXBlICAgIC0tIFN0cmluZywgZXhwZWN0ZWQgdHlwZShzKS4gQWxsb3dlZCB2YWx1ZXMgYXJlICJTQ0FMQVIiLCAiVU5ERUYiLCAiQk9PTEVBTiIsCisjICAgICAgICAgICAgICAgICAgICAiQVJSQVlSRUYiLCAiSEFTSFJFRiIsICJDT0RFUkVGIi4gTXVsdGlwbGUgdHlwZXMgbWF5IGxpc3RlZCB1c2luZyBiYXI6CisjICAgICAgICAgICAgICAgICAgICAiU0NBTEFSfEFSUkFZUkVGIi4gVGhlIHR5cGUgc3RyaW5nIGlzIGNhc2UtaW5zZW5zaXRpdmUuCisjICAgICAgICAkZGVmYXVsdCAtLSBEZWZhdWx0IHZhbHVlIGZvciBhbiBvcHRpb24uIFdpbGwgYmUgdXNlZCBpZiBvcHRpb24gaXMgbm90IHNwZWNpZmllZCBvcgorIyAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLgorIworc3ViIHZhbGlkYXRlKEApIHsKKworICAgIG15ICVvcHRzID0gQF87ICAgICMgVGVtcG9yYXJ5IHVzZSAlb3B0cyBmb3IgcGFyYW1ldGVycyBvZiBgdmFsaWRhdGUnIHN1YnJvdXRpbmUuCisgICAgbXkgJHBhcmFtcyA9ICRvcHRzeyBwYXJhbXMgfTsKKyAgICBteSAkY2FsbGVyID0gKCAkb3B0c3sgY2FsbGVyIH0gb3IgMCApICsgMTsKKyAgICBteSAkc3BlYyAgID0gJG9wdHN7IHNwZWMgfTsKKyAgICB1bmRlZiggJW9wdHMgKTsgICAjIE9rLCBDbGVhbiAlb3B0cywgbm93IHdlIHdpbGwgY29sbGVjdCByZXN1bHQgb2YgdGhlIHN1YnJvdXRpbmUuCisKKyAgICAjIEZpbmQgb3V0IGNhbGxlciBwYWNrYWdlLCBmaWxlbmFtZSwgbGluZSwgYW5kIHN1YnJvdXRpbmUgbmFtZS4KKyAgICBteSAoICRwa2csICRmaWxlLCAkbGluZSwgJHN1YnIgKSA9IGNhbGxlciggJGNhbGxlciApOworICAgIG15IEBlcnJvcnM7ICAgICMgV2Ugd2lsbCBjb2xsZWN0IGVycm9ycyBpbiBhcnJheSBub3QgdG8gc3RvcCBvbiB0aGUgZmlyc3QgZm91bmQgZXJyb3IuCisgICAgbXkgJGVycm9yID0KKyAgICAgICAgc3ViICgkKSB7CisgICAgICAgICAgICBteSAkbXNnID0gc2hpZnQoIEBfICk7CisgICAgICAgICAgICBwdXNoKCBAZXJyb3JzLCAiJG1zZyBhdCAkZmlsZSBsaW5lICRsaW5lLlxuIiApOworICAgICAgICB9OyAjIHN1YgorCisgICAgIyBDaGVjayBvcHRpb25zLgorICAgIHdoaWxlICggQCRwYXJhbXMgKSB7CisgICAgICAgICMgQ2hlY2sgb3B0aW9uIG5hbWUuCisgICAgICAgIG15ICRvcHQgPSBzaGlmdCggQCRwYXJhbXMgKTsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0gKSApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiSW52YWxpZCBvcHRpb24gYCRvcHQnIiApOworICAgICAgICAgICAgc2hpZnQoIEAkcGFyYW1zICk7ICMgU2tpcCB2YWx1ZSBvZiB1bmtub3cgb3B0aW9uLgorICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIENoZWNrIG9wdGlvbiB2YWx1ZSBleGlzdHMuCisgICAgICAgIGlmICggbm90IEAkcGFyYW1zICkgeworICAgICAgICAgICAgJGVycm9yLT4oICJPcHRpb24gYCRvcHQnIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSIgKTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgJHZhbCA9IHNoaWZ0KCBAJHBhcmFtcyApOworICAgICAgICAjIENoZWNrIG9wdGlvbiB2YWx1ZSB0eXBlLgorICAgICAgICBpZiAoIGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9LT57IHR5cGUgfSApICkgeworICAgICAgICAgICAgIyBUeXBlIHNwZWNpZmljYXRpb24gZXhpc3RzLiBDaGVjayBvcHRpb24gdmFsdWUgdHlwZS4KKyAgICAgICAgICAgIG15ICRhY3R1YWxfdHlwZTsKKyAgICAgICAgICAgIGlmICggcmVmKCAkdmFsICkgbmUgIiIgKSB7CisgICAgICAgICAgICAgICAgJGFjdHVhbF90eXBlID0gcmVmKCAkdmFsICkgLiAiUkVGIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGFjdHVhbF90eXBlID0gKCBkZWZpbmVkKCAkdmFsICkgPyAiU0NBTEFSIiA6ICJVTkRFRiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIG15IEB3YW50ZWRfdHlwZXMgPSBzcGxpdCggbXtcfH0sIGxjKCAkc3BlYy0+eyAkb3B0IH0tPnsgdHlwZSB9ICkgKTsKKyAgICAgICAgICAgIG15ICR3YW50ZWRfdHlwZXMgPSBqb2luKCAifCIsIG1hcCggJF8gZXEgImJvb2xlYW4iID8gInNjYWxhcnx1bmRlZiIgOiBxdW90ZW1ldGEoICRfICksIEB3YW50ZWRfdHlwZXMgKSApOworICAgICAgICAgICAgaWYgKCAkYWN0dWFsX3R5cGUgIX4gbXtcQSg/OiR3YW50ZWRfdHlwZXMpXHp9aSApIHsKKyAgICAgICAgICAgICAgICAkYWN0dWFsX3R5cGUgPSBsYyggJGFjdHVhbF90eXBlICk7CisgICAgICAgICAgICAgICAgJHdhbnRlZF90eXBlcyA9IGxjKCBqb2luKCAiIG9yICIsIG1hcCggImAkXyciLCBAd2FudGVkX3R5cGVzICkgKSApOworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3B0aW9uIGAkb3B0JyB2YWx1ZSB0eXBlIGlzIGAkYWN0dWFsX3R5cGUnIGJ1dCBleHBlY3RlZCB0byBiZSAkd2FudGVkX3R5cGVzIiApOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBleGlzdHMoICRzcGVjLT57ICRvcHQgfS0+eyB2YWx1ZXMgfSApICApIHsKKyAgICAgICAgICAgIG15ICR2YWx1ZXMgPSAkc3BlYy0+eyAkb3B0IH0tPnsgdmFsdWVzIH07CisgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkXyBlcSAkdmFsLCBAJHZhbHVlcyApICkgeworICAgICAgICAgICAgICAgICR2YWx1ZXMgPSBqb2luKCAiLCAiLCBtYXAoICJgJF8nIiwgQCR2YWx1ZXMgKSApOworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3B0aW9uIGAkb3B0JyB2YWx1ZSBpcyBgJHZhbCcgYnV0IGV4cGVjdGVkIHRvIGJlIG9uZSBvZiAkdmFsdWVzIiApOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJG9wdHN7ICRvcHQgfSA9ICR2YWw7CisgICAgfTsgIyB3aGlsZQorCisgICAgIyBBc3NpZ24gZGVmYXVsdCB2YWx1ZXMuCisgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRzcGVjICkgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRvcHRzeyAkb3B0IH0gKSBhbmQgZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0tPnsgZGVmYXVsdCB9ICkgKSB7CisgICAgICAgICAgICAkb3B0c3sgJG9wdCB9ID0gJHNwZWMtPnsgJG9wdCB9LT57IGRlZmF1bHQgfTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkb3B0CisKKyAgICAjIElmIHdlIGZvdW5kIGFueSBlcnJvcnMsIHJhaXNlIHRoZW0uCisgICAgaWYgKCBAZXJyb3JzICkgeworICAgICAgICBkaWUgam9pbiggIiIsIEBlcnJvcnMgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gJW9wdHM7CisKK307ICMgc3ViIHZhbGlkYXRlCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBHZXQgb3B0aW9uIGhlbHBlcnMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEdldCBvcHRpb24gaGVscGVycy4KKworPWN1dAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIGdldF9vcHRpb25zCisKK0I8U3lub3BzaXM6PgorCisgICAgZ2V0X29wdGlvbnMoIEBhcmd1bWVudHMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSXQgaXMgdmVyeSBzaW1wbGUgd3JhcHBlciBhcm91bmYgR2V0b3B0OjpMb25nOjpHZXRPcHRpb25zLiBJdCBwYXNzZXMgYWxsIGFyZ3VtZW50cyB0byBHZXRPcHRpb25zLAorYW5kIGFkZCBkZWZpbml0aW9ucyBmb3Igc3RhbmRhcmQgaGVscCBvcHRpb25zOiAtLWhlbHAsIC0tZG9jLCAtLXZlcmJvc2UsIGFuZCAtLXF1aWV0LgorV2hlbiBHZXRPcHRpb25zIGZpbmloZXMsIHRoaXMgc3Vicm91dGluZSBjaGVja3MgZXhpdCBjb2RlLCBpZiBpdCBpcyBub24temVybywgc3RhbmRhcmQgZXJyb3IKK21lc3NhZ2UgaXMgaXNzdWVkIGFuZCBzY3JpcHQgdGVybWluYXRlZC4KKworSWYgLS12ZXJib3NlIG9yIC0tcXVpZXQgb3B0aW9uIGlzIHNwZWNpZmllZCwgQzx0b29scy5wbV92ZXJib3NlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuCitJdCBpcyB0aGUgd2F5IHRvIHByb3BhZ2F0ZSB2ZXJib3NlL3F1aWV0IG1vZGUgdG8gY2FsbGVlIFBlcmwgc2NyaXB0cy4KKworPWN1dAorCitzdWIgZ2V0X29wdGlvbnMgeworCisgICAgR2V0b3B0OjpMb25nOjpDb25maWd1cmUoICJub19pZ25vcmVfY2FzZSIgKTsKKyAgICBHZXRvcHQ6Okxvbmc6OkdldE9wdGlvbnMoCisgICAgICAgICJoMHx1c2FnZSIgICAgICAgID0+IHN1YiB7IFBvZDo6VXNhZ2U6OnBvZDJ1c2FnZSggLWV4aXR2YWwgPT4gMCwgLXZlcmJvc2UgPT4gMCApOyB9LAorICAgICAgICAiaDF8aHxoZWxwIiAgICAgICA9PiBzdWIgeyBQb2Q6OlVzYWdlOjpwb2QydXNhZ2UoIC1leGl0dmFsID0+IDAsIC12ZXJib3NlID0+IDEgKTsgfSwKKyAgICAgICAgImgyfGRvY3xtYW51YWwiICAgPT4gc3ViIHsgUG9kOjpVc2FnZTo6cG9kMnVzYWdlKCAtZXhpdHZhbCA9PiAwLCAtdmVyYm9zZSA9PiAyICk7IH0sCisgICAgICAgICJ2ZXJzaW9uIiAgICAgICAgID0+IHN1YiB7IHByaW50KCAiJHRvb2wgdmVyc2lvbiAkbWFpbjo6VkVSU0lPTlxuIiApOyBleGl0KCAwICk7IH0sCisgICAgICAgICJ2fHZlcmJvc2UiICAgICAgID0+IHN1YiB7ICsrICR2ZXJib3NlOyAgICAgJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiICAgIH0gPSAkdmVyYm9zZTsgICAgfSwKKyAgICAgICAgInF1aWV0IiAgICAgICAgICAgPT4gc3ViIHsgLS0gJHZlcmJvc2U7ICAgICAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgICAgfSA9ICR2ZXJib3NlOyAgICB9LAorICAgICAgICAid2l0aC10aW1lc3RhbXBzIiA9PiBzdWIgeyAkdGltZXN0YW1wcyA9IDE7ICRFTlZ7ICJ0b29scy5wbV90aW1lc3RhbXBzIiB9ID0gJHRpbWVzdGFtcHM7IH0sCisgICAgICAgIEBfLCAjIENhbGxlciBhcmd1bWV0c2EgYXJlIGF0IHRoZSBlbmQgc28gY2FsbGVyIG9wdGlvbnMgb3ZlcnJpZGVzIHN0YW5kYXJkLgorICAgICkgb3IgY21kbGluZV9lcnJvcigpOworCit9OyAjIHN1YiBnZXRfb3B0aW9ucworCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBQcmludCB1dGlsaXRpZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPXBvZAorCis9aGVhZDIgUHJpbnQgdXRpbGl0aWVzLgorCitFYWNoIG9mIHRoZSBwcmludCBzdWJyb3V0aW5lcyBwcmVwZW5kcyBlYWNoIGxpbmUgb2YgaXRzIG91dHB1dCB3aXRoIHRoZSBuYW1lIG9mIGN1cnJlbnQgc2NyaXB0IGFuZAordGhlIHR5cGUgb2YgaW5mb3JtYXRpb24sIGZvciBleGFtcGxlOgorCisgICAgaW5mbyggIldyaXRpbmcgZmlsZS4uLiIgKTsKKword2lsbCBwcmludAorCisgICAgPHNjcmlwdD46IChpKTogV3JpdGluZyBmaWxlLi4uCisKK3doaWxlCisKKyAgICB3YXJuaW5nKCAiRmlsZSBkb2VzIG5vdCBleGlzdCEiICk7CisKK3dpbGwgcHJpbnQKKworICAgIDxzY3JpcHQ+OiAoISk6IEZpbGUgZG9lcyBub3QgZXhpc3QhCisKK0hlcmUgYXJlIGV4cG9ydGVkIGl0ZW1zOgorCis9Y3V0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgX2Zvcm1hdF9tZXNzYWdlKCRcQDskKSB7CisKKyAgICBteSAkcHJlZml4ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRhcmdzICAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJG5vX2VvbCAgPSBzaGlmdCggQF8gKTsgICMgRG8gbm90IGFwcGVuZCAiXG4iIHRvIHRoZSBsYXN0IGxpbmUuCisgICAgbXkgJG1lc3NhZ2UgPSAiIjsKKworICAgIG15ICR0cyA9ICIiOworICAgIGlmICggJHRpbWVzdGFtcHMgKSB7CisgICAgICAgIG15ICggJHNlYywgJG1pbiwgJGhvdXIsICRkYXksICRtb250aCwgJHllYXIgKSA9IGdtdGltZSgpOworICAgICAgICAkbW9udGggKz0gMTsKKyAgICAgICAgJHllYXIgICs9IDE5MDA7CisgICAgICAgICR0cyA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCBVVEM6ICIsICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjICk7CisgICAgfTsgIyBpZgorICAgIGZvciBteSAkaSAoIDEgLi4gQCRhcmdzICkgeworICAgICAgICBteSBAbGluZXMgPSBzcGxpdCggIlxuIiwgJGFyZ3MtPlsgJGkgLSAxIF0gKTsKKyAgICAgICAgZm9yIG15ICRqICggMSAuLiBAbGluZXMgKSB7CisgICAgICAgICAgICBteSAkbGluZSA9ICRsaW5lc1sgJGogLSAxIF07CisgICAgICAgICAgICBteSAkbGFzdF9saW5lID0gKCAoICRpID09IEAkYXJncyApIGFuZCAoICRqID09IEBsaW5lcyApICk7CisgICAgICAgICAgICBteSAkZW9sID0gKCAoIHN1YnN0ciggJGxpbmUsIC0xICkgZXEgIlxuIiApIG9yIGRlZmluZWQoICRub19lb2wgKSA/ICIiIDogIlxuIiApOworICAgICAgICAgICAgJG1lc3NhZ2UgLj0gIiR0cyR0b29sOiAoJHByZWZpeCkgIiAuICRsaW5lIC4gJGVvbDsKKyAgICAgICAgfTsgIyBmb3JlYWNoICRqCisgICAgfTsgIyBmb3JlYWNoICRpCisgICAgcmV0dXJuICRtZXNzYWdlOworCit9OyAjIHN1YiBfZm9ybWF0X21lc3NhZ2UKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzICR2ZXJib3NlCisKK0I8U3lub3BzaXM6PgorCisgICAgJHZlcmJvc2UKKworQjxEZXNjcmlwdGlvbjo+CisKK1BhY2thZ2UgdmFyaWFibGUuIEl0IGRldGVybWluZXMgdmVyYm9zaXR5IGxldmVsLCB3aGljaCBhZmZlY3RzIEM8d2FybmluZygpPiwgQzxpbmZvKCk+LCBhbmQKK0M8ZGVidWcoKT4gc3Vicm91dG5lcyAuCisKK1RoZSB2YXJpYWJsZSBnZXRzIGluaXRpYWwgdmFsdWUgZnJvbSBDPHRvb2xzLnBtX3ZlcmJvc2U+IGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIGV4aXN0cy4KK0lmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgdmFyaWFibGUgaXMgc2V0IHRvIDIuCisKK0luaXRpYWwgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgZGlyZWN0bHkgb3IgYnkgQzxnZXRfb3B0aW9ucz4gZnVuY3Rpb24uCisKKz1jdXQKKworJHZlcmJvc2UgPSBleGlzdHMoICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiB9ICkgPyAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgfSA6IDI7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyAkdGltZXN0YW1wcworCitCPFN5bm9wc2lzOj4KKworICAgICR0aW1lc3RhbXBzCisKK0I8RGVzY3JpcHRpb246PgorCitQYWNrYWdlIHZhcmlhYmxlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgQzxkZWJ1ZygpPiwgQzxpbmZvKCk+LCBDPHdhcm5pbmcoKT4sIEM8cnVudGltZV9lcnJvcigpPgorc3Vicm91dG5lcyBwcmludCB0aW1lc3RhbXBzIG9yIG5vdC4KKworVGhlIHZhcmlhYmxlIGdldHMgaW5pdGlhbCB2YWx1ZSBmcm9tIEM8dG9vbHMucG1fdGltZXN0YW1wcz4gZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgZXhpc3RzLgorSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCB2YXJpYWJsZSBpcyBzZXQgdG8gZmFsc2UuCisKK0luaXRpYWwgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgZGlyZWN0bHkgb3IgYnkgQzxnZXRfb3B0aW9ucygpPiBmdW5jdGlvbi4KKworPWN1dAorCiskdGltZXN0YW1wcyA9IGV4aXN0cyggJEVOVnsgInRvb2xzLnBtX3RpbWVzdGFtcHMiIH0gKSA/ICRFTlZ7ICJ0b29scy5wbV90aW1lc3RhbXBzIiB9IDogMDsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzIGRlYnVnCisKK0I8U3lub3BzaXM6PgorCisgICAgZGVidWcoIEBtZXNzYWdlcyApCisKK0I8RGVzY3JpcHRpb246PgorCitJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgMyBvciBoaWdoZXIsIHByaW50IGRlYnVnIGluZm9ybWF0aW9uIHRvIHRoZSBzdGRlcnIsIHByZXBlbmRpbmcgaXQgd2l0aCAiKCMpIgorcHJlZml4LgorCis9Y3V0CisKK3N1YiBkZWJ1ZyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDMgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiIyIsIEBfICkgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuIDE7CisKK307ICMgc3ViIGRlYnVnCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyBpbmZvCisKK0I8U3lub3BzaXM6PgorCisgICAgaW5mbyggQG1lc3NhZ2VzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0lmIHZlcmJvc2l0eSBsZXZlbCBpcyAyIG9yIGhpZ2hlciwgcHJpbnQgaW5mb3JtYXRpb24gdG8gdGhlIHN0ZGVyciwgcHJlcGVuZGluZyBpdCB3aXRoICIoaSkiIHByZWZpeC4KKworPWN1dAorCitzdWIgaW5mbyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDIgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiaSIsIEBfICApICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBpbmZvCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgd2FybmluZworCitCPFN5bm9wc2lzOj4KKworICAgIHdhcm5pbmcoIEBtZXNzYWdlcyApCisKK0I8RGVzY3JpcHRpb246PgorCitJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgMSBvciBoaWdoZXIsIGlzc3VlIGEgd2FybmluZywgcHJlcGVuZGluZyBpdCB3aXRoICIoISkiIHByZWZpeC4KKworPWN1dAorCitzdWIgd2FybmluZyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDEgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgd2FybiggX2Zvcm1hdF9tZXNzYWdlKCAiISIsIEBfICApICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiB3YXJuaW5nCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgY21kbGluZV9lcnJvcgorCitCPFN5bm9wc2lzOj4KKworICAgIGNtZGxpbmVfZXJyb3IoIEBtZXNzYWdlICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1ByaW50IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBzdGF0dXMgMi4KKworVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBjb21wbGFpbiBvbiBjb21tYW5kIGxpbmUgZXJyb3JzLCBlLiBnLiB1bmtub3duCitvcHRpb25zLCBpbnZhbGlkIGFyZ3VtZW50cywgZXRjLgorCis9Y3V0CisKK3N1YiBjbWRsaW5lX2Vycm9yKDskKSB7CisKKyAgICBteSAkbWVzc2FnZSA9IHNoaWZ0KCBAXyApOworCisgICAgaWYgKCBkZWZpbmVkKCAkbWVzc2FnZSApICkgeworICAgICAgICBpZiAoIHN1YnN0ciggJG1lc3NhZ2UsIC0xLCAxICkgbmUgIlxuIiApIHsKKyAgICAgICAgICAgICRtZXNzYWdlIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICAkbWVzc2FnZSA9ICIiOworICAgIH07ICMgaWYKKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgZGllICRtZXNzYWdlIC4gIlRyeSAtLWhlbHAgb3B0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIjsKKworfTsgIyBzdWIgY21kbGluZV9lcnJvcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHJ1bnRpbWVfZXJyb3IKKworQjxTeW5vcHNpczo+CisKKyAgICBydW50aW1lX2Vycm9yKCBAbWVzc2FnZSApCisKK0I8RGVzY3JpcHRpb246PgorCitQcmludCBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB0aGUgcHJvZ3JhbSB3aXRoIHN0YXR1cyAzLgorCitUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGNvbXBsYWluIG9uIHJ1bnRpbWUgZXJyb3JzLCBlLiBnLgorZGlyZWN0b3JpZXMgd2hpY2ggYXJlIG5vdCBmb3VuZCwgbm9uLXdyaXRhYmxlIGZpbGVzLCBldGMuCisKKz1jdXQKKworc3ViIHJ1bnRpbWVfZXJyb3IoQCkgeworCisgICAgU1RET1VULT5mbHVzaCgpOworICAgIGRpZSBfZm9ybWF0X21lc3NhZ2UoICJ4IiwgQF8gKTsKKworfTsgIyBzdWIgcnVudGltZV9lcnJvcgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHF1ZXN0aW9uCisKK0I8U3lub3BzaXM6PgorCisgICAgcXVlc3Rpb24oICRwcm9tcHQ7ICRhbnN3ZXIsICRjaG9pY2VzICApCisKK0I8RGVzY3JpcHRpb246PgorCitQcmludCAkcHJvbXAgdG8gdGhlIHN0ZGVyciwgcHJlcGVuZGluZyBpdCB3aXRoICJxdWVzdGlvbjoiIHByZWZpeC4gUmVhZCBhIGxpbmUgZnJvbSBzdGRpbiwgY2hvcAorIlxuIiBmcm9tIHRoZSBlbmQsIGl0IGlzIGFuc3dlci4KKworSWYgJGFuc3dlciBpcyBkZWZpbmVkLCBpdCBpcyB0cmVhdGVkIGFzIGZpcnN0IHVzZXIgaW5wdXQuCisKK0lmICRjaG9pY2VzIGlzIHNwZWNpZmllZCwgaXQgY291bGQgYmUgYSByZWdleHAgZm9yIHZhbGlkYXRpbmcgdXNlciBpbnB1dCwgb3IgYSBzdHJpbmcuIEluIGxhdHRlcgorY2FzZSBpdCBpbnRlcnByZXRlZCBhcyBsaXN0IG9mIGNoYXJhY3RlcnMsIGFjY2VwdGFibGUgKGNhc2UtaW5zZW5zaXRpdmUpIGNob2ljZXMuIElmIHVzZXIgZW50ZXJzCitub24tYWNjZXB0YWJsZSBhbnN3ZXIsIHF1ZXN0aW9uIGNvbnRpbnVlIGFza2luZyB1bnRpbCBhbnN3ZXIgaXMgYWNjZXB0YWJsZS4KK0lmICRjaG9pY2VzIGlzIG5vdCBzcGVjaWZpZWQsIGFueSBhbnN3ZXIgaXMgYWNjZXB0YWJsZS4KKworSW4gY2FzZSBvZiBlbmQtb2YtZmlsZSAob3IgQ3RybCtEIHByZXNzZWQgYnkgdXNlciksICRhbnN3ZXIgaXMgQzx1bmRlZj4uCisKK0I8RXhhbXBsZXM6PgorCisgICAgbXkgJGFuc3dlcjsKKyAgICBxdWVzdGlvbiggIlNhdmUgZmlsZSBbeW5dPyAiLCAkYW5zd2VyLCAieW4iICk7CisgICAgICAgICMgV2UgYWNjZXB0cyBvbmx5ICJ5IiwgIlkiLCAibiIsIG9yICJOIi4KKyAgICBxdWVzdGlvbiggIlByZXNzIGVudGVyIHRvIGNvbnRpbnVlIG9yIEN0cmwrQyB0byBhYm9ydC4uLiIgKTsKKyAgICAgICAgIyBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYW5zd2VyIHZhbHVlIC0tIGluIGNhc2Ugb2YgQ3RybCtDIHRoZSBzY3JpcHQgd2lsbCBiZSB0ZXJtaW5hdGVkLAorICAgICAgICAjIG90aGVyd2lzZSB3ZSBjb250aW51ZSBleGVjdXRpb24uCisgICAgcXVlc3Rpb24oICJGaWxlIG5hbWU/ICIsICRhbnN3ZXIgKTsKKyAgICAgICAgIyBBbnkgYW5zd2VyIGlzIGFjY2VwdGFibGUuCisKKz1jdXQKKworc3ViIHF1ZXN0aW9uKCQ7XCQkKSB7CisKKyAgICBteSAkcHJvbXB0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRhbnN3ZXIgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGNob2ljZXMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkYSAgICAgICA9ICggZGVmaW5lZCggJGFuc3dlciApID8gJCRhbnN3ZXIgOiB1bmRlZiApOworCisgICAgaWYgKCByZWYoICRjaG9pY2VzICkgZXEgIlJlZ2V4cCIgKSB7CisgICAgICAgICMgSXQgaXMgYWxyZWFkeSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZG8gbm90aGluZy4KKyAgICB9IGVsc2lmICggZGVmaW5lZCggJGNob2ljZXMgKSApIHsKKyAgICAgICAgIyBDb252ZXJ0IHN0cmluZyB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAgJGNob2ljZXMgPSBxci9bQHsgWyBxdW90ZW1ldGEoICRjaG9pY2VzICkgXSB9XS9pOworICAgIH07ICMgaWYKKworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiPyIsIEB7IFsgJHByb21wdCBdIH0sICJub19lb2wiICkgKTsKKyAgICAgICAgU1RERVJSLT5mbHVzaCgpOworICAgICAgICBpZiAoIGRlZmluZWQoICRhICkgKSB7CisgICAgICAgICAgICBTVERPVVQtPnByaW50KCAkYSAuICJcbiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRhID0gPFNURElOPjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkYSApICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBjaG9tcCggJGEgKTsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGNob2ljZXMgKSBvciAoICRhID1+IG0vXiRjaG9pY2VzJC8gKSApIHsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGEgPSB1bmRlZjsKKyAgICB9OyAjIGZvcmV2ZXIKKyAgICBpZiAoIGRlZmluZWQoICRhbnN3ZXIgKSApIHsKKyAgICAgICAgJCRhbnN3ZXIgPSAkYTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHF1ZXN0aW9uCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFJldHVybnMgdm9sdW1lIHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfdm9sKCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCAkdm9sLCB1bmRlZiwgdW5kZWYgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICByZXR1cm4gJHZvbDsKKworfTsgIyBzdWIgZ2V0X3ZvbAorCisjIFJldHVybnMgZGlyZWN0b3J5IHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfZGlyKCQpIHsKKworICAgIG15ICRwYXRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCBzaGlmdCggQF8gKSApOworICAgIG15ICggJHZvbCwgJGRpciwgdW5kZWYgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICBteSBAZGlycyA9IEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCAkZGlyICk7CisgICAgcG9wKCBAZGlycyApOworICAgICRkaXIgPSBGaWxlOjpTcGVjLT5jYXRkaXIoIEBkaXJzICk7CisgICAgJGRpciA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXIsIHVuZGVmICk7CisgICAgcmV0dXJuICRkaXI7CisKK307ICMgc3ViIGdldF9kaXIKKworIyBSZXR1cm5zIGZpbGUgcGFydCBvZiBwYXRoLgorc3ViIGdldF9maWxlKCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCB1bmRlZiwgdW5kZWYsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgcmV0dXJuICRmaWxlOworCit9OyAjIHN1YiBnZXRfZmlsZQorCisjIFJldHVybnMgZmlsZSBwYXJ0IG9mIHBhdGggd2l0aG91dCBsYXN0IHN1ZmZpeC4KK3N1YiBnZXRfbmFtZSgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggdW5kZWYsIHVuZGVmLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgICRmaWxlID1+IHN7XC5bXi5dKlx6fXt9OworICAgIHJldHVybiAkZmlsZTsKKworfTsgIyBzdWIgZ2V0X25hbWUKKworIyBSZXR1cm5zIGxhc3Qgc3VmZml4IG9mIGZpbGUgcGFydCBvZiBwYXRoLgorc3ViIGdldF9leHQoJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoIHVuZGVmLCB1bmRlZiwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICBteSAkZXh0ID0gIiI7CisgICAgaWYgKCAkZmlsZSA9fiBteyhcLlteLl0qKVx6fSApIHsKKyAgICAgICAgJGV4dCA9ICQxOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJGV4dDsKKworfTsgIyBzdWIgZ2V0X2V4dAorCitzdWIgY2F0X2ZpbGUoQCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZmlsZSA9IHBvcCggQF8gKTsKKyAgICBteSBAZGlycyA9IEBfOworCisgICAgbXkgKCAkdm9sLCAkZGlycyApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCwgIm5vX2ZpbGUiICk7CisgICAgQGRpcnMgPSAoIEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCAkZGlycyApLCBAZGlycyApOworICAgICRkaXJzID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAZGlycyApOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpcnMsICRmaWxlICk7CisKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIGNhdF9maWxlCisKK3N1YiBjYXRfZGlyKEApIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgQGRpcnMgPSBAXzsKKworICAgIG15ICggJHZvbCwgJGRpcnMgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGgsICJub19maWxlIiApOworICAgIEBkaXJzID0gKCBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGRpcnMgKSwgQGRpcnMgKTsKKyAgICAkZGlycyA9IEZpbGU6OlNwZWMtPmNhdGRpciggQGRpcnMgKTsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXJzLCAiIiApOworCisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiBjYXRfZGlyCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBGaWxlIGFuZCBkaXJlY3RvcnkgbWFuaXB1bGF0aW9uIHN1YnJvdXRpbmVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBGaWxlIGFuZCBkaXJlY3RvcnkgbWFuaXB1bGF0aW9uIHN1YnJvdXRpbmVzLgorCis9b3ZlcgorCis9Y3V0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPHdoaWNoKCAkZmlsZSwgQG9wdGlvbnMgKT4KKworU2VhcmNoZXMgZm9yIHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUgaW4gdGhlIChzcGVjaWZpZWQpIGRpcmVjdG9yaWVzLgorUmFpc2VzIGEgcnVudGltZSBlcm9yb3IgaWYgbm8gZXhlY3V0YWJsZSBmaWxlIGZvdW5kLiBSZXR1cm5zIGEgZnVsbCBwYXRoIG9mIGZvdW5kIGV4ZWN1dGFibGUocykuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LWFsbD4gPUU8Z3Q+IEk8Ym9vbD4KKworRG8gbm90IHN0b3Agb24gdGhlIGZpcnN0IGZvdW5kIGZpbGUuIE5vdGUsIHRoYXQgbGlzdCBvZiBmdWxsIHBhdGhzIGlzIHJldHVybmVkIGluIHRoaXMgY2FzZS4KKworPWl0ZW0gQzwtZGlycz4gPUU8Z3Q+IEk8cmVmX3RvX2FycmF5PgorCitTcGVjaWZ5IGRpcmVjdG9yeSBsaXN0IHRvIHNlYXJjaCB0aHJvdWdoLiBJZiBvcHRpb24gaXMgbm90IHBhc3NlZCwgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQoraXMgdXNlZCBmb3IgZGlyZWN0b3J5IGxpc3QuCisKKz1pdGVtIEM8LWV4ZWM+ID1FPGd0PiBJPGJvb2w+CisKK1doZXRoZXIgY2hlY2sgZm9yIGV4ZWN1dGFibGUgZmlsZXMgb3Igbm90LiBCeSBkZWZhdWx0LCBDPHdoaWNoPiBzZWFyY2hlcyBleGVjdXRhYmxlIGZpbGVzLgorSG93ZXZlciwgb24gQ3lnd2luIGV4ZWN1dGFibGUgY2hlY2sgbmV2ZXIgcGVyZm9ybWVkLgorCis9YmFjaworCitFeGFtcGxlczoKKworTG9vayBmb3IgImVjaG8iIGluIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gUEFUSDoKKworICAgIG15ICRlY2hvID0gd2hpY2goICJlY2hvIiApOworCitMb29rIGZvciBhbGwgb2NjdXJlbnNlcyBvZiAiY3AiIGluIHRoZSBQQVRIOgorCisgICAgbXkgQGNwcyA9IHdoaWNoKCAiY3AiLCAtYWxsID0+IDEgKTsKKworTG9vayBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgImljYyIgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcmllczoKKworICAgIG15ICRpY2MgPSB3aGljaCggImljYyIsIC1kaXJzID0+IFsgIi4iLCAiL3Vzci9sb2NhbC9iaW4iLCAiL3Vzci9iaW4iLCAiL2JpbiIgXSApOworCitMb29rIGZvciB0aGUgdGhlIEM8b21wX2xpYi5mPiBmaWxlOgorCisgICAgbXkgQG9tcF9saWIgPSB3aGljaCggIm9tcF9saWIuZiIsIC1hbGwgPT4gMSwgLWV4ZWMgPT4gMCwgLWRpcnMgPT4gWyBAaW5jbHVkZSBdICk7CisKKz1jdXQKKworc3ViIHdoaWNoKCRAKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLWFsbCAtZGlycyAtZXhlYyApIF0gKTsKKyAgICBpZiAoICRvcHRzeyAtYWxsIH0gYW5kIG5vdCB3YW50YXJyYXkoKSApIHsKKyAgICAgICAgbG9jYWwgJENhcnA6OkNhcnBMZXZlbCA9IDE7CisgICAgICAgIENhcnA6OmNsdWNrKCAiYC1hbGwnIG9wdGlvbiBwYXNzZWQgdG8gYHdoaWNoJyBidXQgbGlzdCBpcyBub3QgZXhwZWN0ZWQiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGRlZmluZWQoICRvcHRzeyAtZXhlYyB9ICkgKSB7CisgICAgICAgICRvcHRzeyAtZXhlYyB9ID0gMTsKKyAgICB9OyAjIGlmCisKKyAgICBteSAkZGlycyA9ICggZXhpc3RzKCAkb3B0c3sgLWRpcnMgfSApID8gJG9wdHN7IC1kaXJzIH0gOiBbIEZpbGU6OlNwZWMtPnBhdGgoKSBdICk7CisgICAgbXkgQGZvdW5kOworCisgICAgbXkgQGV4dHMgPSAoICIiICk7CisgICAgaWYgKCAkXk8gZXEgIk1TV2luMzIiIGFuZCAkb3B0c3sgLWV4ZWMgfSApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkRU5WeyBQQVRIRVhUIH0gKSApIHsKKyAgICAgICAgICAgIHB1c2goIEBleHRzLCBzcGxpdCggIjsiLCAkRU5WeyBQQVRIRVhUIH0gKSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyBJZiBQQVRIRVhUIGRvZXMgbm90IGV4aXN0LCB1c2UgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgICAgIHB1c2goIEBleHRzLCBxd3sgLkNPTSAuRVhFIC5CQVQgLkNNRCB9ICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBsb29wOgorICAgIGZvcmVhY2ggbXkgJGRpciAoIEAkZGlycyApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkZXh0ICggQGV4dHMgKSB7CisgICAgICAgICAgICBteSAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRkaXIsICRmaWxlIC4gJGV4dCApOworICAgICAgICAgICAgaWYgKCAtZSAkcGF0aCApIHsKKyAgICAgICAgICAgICAgICAjIEV4ZWN1dGFibGUgYml0IGlzIG5vdCByZWxpYWJsZSBvbiBDeWd3aW4sIGRvIG5vdCBjaGVjayBpdC4KKyAgICAgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWV4ZWMgfSBvciAteCAkcGF0aCBvciAkXk8gZXEgImN5Z3dpbiIgKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2goIEBmb3VuZCwgJHBhdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1hbGwgfSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRleHQKKyAgICB9OyAjIGZvcmVhY2ggJGRpcgorCisgICAgaWYgKCBub3QgQGZvdW5kICkgeworICAgICAgICAjIFRCRDogV2UgbmVlZCB0byBpbnRyb2R1Y2UgYW4gb3B0aW9uIGZvciBjb25kaXRpb25hbCBlbmFibGluZyB0aGlzIGVycm9yLgorICAgICAgICAjIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgZmluZCBcIiRmaWxlXCIgZXhlY3V0YWJsZSBmaWxlIGluIFBBVEguIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIEBmb3VuZCA+IDEgKSB7CisgICAgICAgICMgVEJEOiBJc3N1ZSBhIHdhcm5pbmc/CisgICAgfTsgIyBpZgorCisgICAgaWYgKCAkb3B0c3sgLWFsbCB9ICkgeworICAgICAgICByZXR1cm4gQGZvdW5kOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAkZm91bmRbIDAgXTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHdoaWNoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGFic19wYXRoKCAkcGF0aCwgJGJhc2UgKT4KKworUmV0dXJuIGFic29sdXRlIHBhdGggZm9yIGFuIGFyZ3VtZW50LgorCitNb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgYnkgQzxGaWxlOjpTcGVjLT5yZWwyYWJzKCk+LiBDPGFic19wYXRoKCk+IGFkZGl0aW9uYWxseSBjb2xsYXBzZXMKK0M8ZGlyMS8uLi9kaXIyPiB0byBDPGRpcjI+LgorCitJdCBpcyBub3Qgc28gbmFpdmUgYW5kIG1hZGUgaW50ZW50aW9uYWxseS4gRm9yIGV4YW1wbGUgb24gTGludXgqIE9TIGluIEJhc2ggaWYgRjxsaW5rLz4gaXMgYSBzeW1ib2xpYworbGluayB0byBkaXJlY3RvcnkgRjxzb21lX2Rpci8+CisKKyAgICAkIGNkIGxpbmsKKyAgICAkIGNkIC4uCisKK2JyaW5ncyB5b3UgYmFjayB0byBGPGxpbmsvPidzIHBhcmVudCwgbm90IHRvIHBhcmVudCBvZiBGPHNvbWVfZGlyLz4sCisKKz1jdXQKKworc3ViIGFic19wYXRoKCQ7JCkgeworCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+cmVsMmFicyggJHBhdGgsICggZGVmaW5lZCggJGJhc2UgKSA/ICRiYXNlIDogJEVOVnsgUFdEIH0gKSApOworICAgIG15ICggJHZvbCwgJGRpciwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICB3aGlsZSAoICRkaXIgPX4gc3svKD8hXC5cLilbXi9dKi9cLlwuKD86L3xceil9ey99ICkgeworICAgIH07ICMgd2hpbGUKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCggRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpciwgJGZpbGUgKSApOworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgYWJzX3BhdGgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8cmVsX3BhdGgoICRwYXRoLCAkYmFzZSApPgorCitSZXR1cm4gcmVsYXRpdmUgcGF0aCBmb3IgYW4gYXJndW1lbnQuCisKKz1jdXQKKworc3ViIHJlbF9wYXRoKCQ7JCkgeworCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+YWJzMnJlbCggYWJzX3BhdGgoICRwYXRoICksICRiYXNlICk7CisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiByZWxfcGF0aAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxyZWFsX3BhdGgoICRkaXIgKT4KKworUmV0dXJuIHJlYWwgYWJzb2x1dGUgcGF0aCBmb3IgYW4gYXJndW1lbnQuIEluIHRoZSByZXN1bHQgYWxsIHJlbGF0aXZlIGNvbXBvbmVudHMgKEY8Lj4gYW5kIEY8Li4+KQorYW5kIFU8c3ltYm9saWMgbGlua3MgYXJlIHJlc29sdmVkPi4KKworSW4gbW9zdCBjYXNlcyBpdCBpcyBub3Qgd2hhdCB5b3Ugd2FudC4gQ29uc2lkZXIgdXNpbmcgQzxhYnNfcGF0aD4gZmlyc3QuCisKK0M8YWJzX3BhdGg+IGZ1bmN0aW9uIGZyb20gQjxDd2Q+IG1vZHVsZSB3b3JrcyB3aXRoIGRpcmVjdG9yaWVzIG9ubHkuIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBmaWxlcworYXMgd2VsbC4gQnV0LCBpZiBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgZnVuY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSBpdCAoeWV0KS4KKworVGhlIGZ1bmN0aW9uIHVzZXMgQzxydW50aW1lX2Vycm9yPiB0byByYWlzZSBhbiBlcnJvciBpZiBzb21ldGhpbmcgd3JvbmcuCisKKz1jdXQKKworc3ViIHJlYWxfcGF0aCgkKSB7CisKKyAgICBteSAkb3JpZ19wYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHJlYWxfcGF0aDsKKyAgICBteSAkbWVzc2FnZSA9ICIiOworICAgIGlmICggbm90IC1lICRvcmlnX3BhdGggKSB7CisgICAgICAgICRtZXNzYWdlID0gIlwiJG9yaWdfcGF0aFwiIGRvZXMgbm90IGV4aXN0cyI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBDd2Q6OmFic19wYXRoIGRvZXMgbm90IHdvcmsgd2l0aCBmaWxlcywgc28gaW4gdGhpcyBjYXNlIHdlIHNob3VsZCBoYW5kbGUgZmlsZSBzZXBhcmF0ZWx5LgorICAgICAgICBteSAkZmlsZTsKKyAgICAgICAgaWYgKCBub3QgLWQgJG9yaWdfcGF0aCApIHsKKyAgICAgICAgICAgICggbXkgJHZvbCwgbXkgJGRpciwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggRmlsZTo6U3BlYy0+cmVsMmFicyggJG9yaWdfcGF0aCApICk7CisgICAgICAgICAgICAkb3JpZ19wYXRoID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpciApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsICRTSUd7IF9fV0FSTl9fIH0gPSBzdWIgeyAkbWVzc2FnZSA9ICRfWyAwIF07IH07CisgICAgICAgICAgICAkcmVhbF9wYXRoID0gQ3dkOjphYnNfcGF0aCggJG9yaWdfcGF0aCApOworICAgICAgICB9OworICAgICAgICBpZiAoIGRlZmluZWQoICRmaWxlICkgKSB7CisgICAgICAgICAgICAkcmVhbF9wYXRoID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSggJHJlYWxfcGF0aCwgJGZpbGUgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkcmVhbF9wYXRoICkgb3IgJG1lc3NhZ2UgbmUgIiIgKSB7CisgICAgICAgICRtZXNzYWdlID1+IHMvXnN0YXRcKC4qXCk6ICguKilccythdCAuKj8gbGluZSBcZCtccypcei8kMS87CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgZmluZCByZWFsIHBhdGggZm9yIFwiJG9yaWdfcGF0aFwiIiAuICggJG1lc3NhZ2UgbmUgIiIgPyAiOiAkbWVzc2FnZSIgOiAiIiApICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkcmVhbF9wYXRoOworCit9OyAjIHN1YiByZWFsX3BhdGgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8bWFrZV9kaXIoICRkaXIsIEBvcHRpb25zICk+CisKK01ha2UgYSBkaXJlY3RvcnkuCisKK1RoaXMgZnVuY3Rpb24gbWFrZXMgYSBkaXJlY3RvcnkuIElmIG5lY2Vzc2FyeSwgbW9yZSB0aGFuIG9uZSBsZXZlbCBjYW4gYmUgY3JlYXRlZC4KK0lmIGRpcmVjdG9yeSBleGlzdHMsIHdhcm5pbmcgaXNzdWVzICh0aGUgc2NyaXB0IGJlaGF2aW9yIGRlcGVuZHMgb24gdmFsdWUgb2YKK0M8LXdhcm5pbmdfbGV2ZWw+IG9wdGlvbikuIElmIGRpcmVjdG9yeSBjcmVhdGlvbiBmYWlscyBvciBDPCRkaXI+IGV4aXN0cyBidXQgaXQgaXMgbm90IGEKK2RpcmVjdG9yeSwgZXJyb3IgaXNzc3Vlcy4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtbW9kZT4KKworVGhlIG51bWVyaWMgbW9kZSBmb3IgbmV3IGRpcmVjdG9yaWVzLCAwNzUwIChyd3hyLXgtLS0pIGJ5IGRlZmF1bHQuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIG1ha2VfZGlyKCRAKSB7CisKKyAgICBteSAkZGlyICAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgICA9CisgICAgICAgIHZhbGlkYXRlKAorICAgICAgICAgICAgcGFyYW1zID0+IFxAXywKKyAgICAgICAgICAgIHNwZWMgPT4geworICAgICAgICAgICAgICAgIHBhcmVudHMgPT4geyB0eXBlID0+ICJib29sZWFuIiwgZGVmYXVsdCA9PiAxICAgIH0sCisgICAgICAgICAgICAgICAgbW9kZSAgICA9PiB7IHR5cGUgPT4gInNjYWxhciIsICBkZWZhdWx0ID0+IDA3NzcgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGRpclwiIjsKKworICAgIGlmICggLWUgJGRpciApIHsKKyAgICAgICAgaWYgKCAtZCAkZGlyICkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGl0IGV4aXN0cywgYnV0IG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBldmFsIHsKKyAgICAgICAgICAgIEZpbGU6OlBhdGg6Om1rcGF0aCggJGRpciwgMCwgJG9wdHN7IG1vZGUgfSApOworICAgICAgICB9OyAjIGV2YWwKKyAgICAgICAgaWYgKCAkQCApIHsKKyAgICAgICAgICAgICRAID1+IHN7XHMrYXQgKD86W2EtekEtWjAtOSAvXy5dKi8pP3Rvb2xzXC5wbSBsaW5lIFxkK1xzKn17fTsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiAkQCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCAtZCAkZGlyICkgeyAjIEp1c3QgaW4gY2FzZSwgY2hlY2sgaXQgb25lIG1vcmUgdGltZS4uLgorICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXguIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBtYWtlX2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjb3B5X2RpciggJHNyY19kaXIsICRkc3RfZGlyLCBAb3B0aW9ucyApPgorCitDb3B5IGRpcmVjdG9yeSByZWN1cnNpdmVseS4KKworVGhpcyBmdW5jdGlvbiBjb3BpZXMgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkuCitJZiBzb3VyY2UgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IG9yIG5vdCBhIGRpcmVjdG9yeSwgZXJyb3IgaXNzdWVzLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1vdmVyd3JpdGU+CisKK092ZXJ3cml0ZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGlmIGl0IGV4aXN0cy4KKworPWJhY2sKKworPWN1dAorCitzdWIgY29weV9kaXIoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjb3B5IGRpcmVjdG9yeSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1kICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgZGVsX2RpciggJGRzdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICJjcCIsICItUiIsICRzcmMsICRkc3QgXSApOworCit9OyAjIHN1YiBjb3B5X2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxtb3ZlX2RpciggJHNyY19kaXIsICRkc3RfZGlyLCBAb3B0aW9ucyApPgorCitNb3ZlIGRpcmVjdG9yeS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtb3ZlcndyaXRlPgorCitPdmVyd3JpdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBpZiBpdCBleGlzdHMuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIG1vdmVfZGlyKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY29weSBkaXJlY3RvcnkgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZCAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgIGRlbF9kaXIoICRkc3QgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSggWyAibXYiLCAkc3JjLCAkZHN0IF0gKTsKKworfTsgIyBzdWIgbW92ZV9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y2xlYW5fZGlyKCAkZGlyLCBAb3B0aW9ucyApPgorCitDbGVhbiBhIGRpcmVjdG9yeTogZGVsZXRlIGFsbCB0aGUgZW50cmllcyAocmVjdXJzaXZlbHkpLCBidXQgbGVhdmUgdGhlIGRpcmVjdG9yeS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtZm9yY2U+ID0+IGJvb2wKKworSWYgYSBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLCB0cnkgdG8gY2hhbmdlIHBlcm1pc3Npb25zIGZpcnN0LCB0aGVuIGNsZWFuIGl0LgorCis9aXRlbSBDPC1za2lwPiA9PiByZWdleHAKKworUmVnZXhwLiBJZiBhIGRpcmVjdG9yeSBlbnRyeSBtYWNoZWQgdGhlIHJlZ2V4cCwgaXQgaXMgc2tpcHBlZCwgbm90IGRlbGV0ZWQuIChBcyBhIHN1YnNlcXVlbmNlLAorYSBkaXJlY3RvcnkgY29udGFpbmluZyBza2lwcGVkIGVudHJpZXMgaXMgbm90IGRlbGV0ZWQuKQorCis9YmFjaworCis9Y3V0CisKK3N1YiBfY2xlYW5fZGlyKCQpOworCitzdWIgX2NsZWFuX2RpcigkKSB7CisgICAgb3VyICVfY2xlYW5fZGlyX29wdHM7CisgICAgbXkgKCAkZGlyICkgPSBAXzsKKyAgICBteSAkc2tpcCAgICA9ICRfY2xlYW5fZGlyX29wdHN7IHNraXAgfTsgICAgIyBSZWdleHAuCisgICAgbXkgJHNraXBwZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHNraXBwZWQgZmlsZXMuCisgICAgbXkgJHByZWZpeCAgPSAiQ2xlYW5pbmcgYCRkaXInIGZhaWxlZDoiOworICAgIG15IEBzdGF0ICAgID0gc3RhdCggJGRpciApOworICAgIG15ICRtb2RlICAgID0gJHN0YXRbIDIgXTsKKyAgICBpZiAoIG5vdCBAc3RhdCApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBzdGF0IGAkZGlyJzogJCEiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kIF8gKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJJdCBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtdyBfICkgeyAgICAgICAgIyBEaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLgorICAgICAgICBpZiAoIG5vdCAtbyBfIG9yIG5vdCAkX2NsZWFuX2Rpcl9vcHRzeyBmb3JjZSB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgRGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBidXQgbWluZS4gVHJ5IHRvIGNoYW5nZSBwZXJtaXNzaW9ucy4KKyAgICAgICAgY2htb2QoICRtb2RlIHwgU19JV1VTUiwgJGRpciApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IG1ha2UgZGlyZWN0b3J5IHdyaXRhYmxlOiAkISIgKTsKKyAgICB9OyAjIGlmCisgICAgbXkgJGhhbmRsZSAgID0gSU86OkRpci0+bmV3KCAkZGlyICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCByZWFkIGRpcmVjdG9yeTogJCEiICk7CisgICAgbXkgQGVudHJpZXMgID0gRmlsZTo6U3BlYy0+bm9fdXB3YXJkcyggJGhhbmRsZS0+cmVhZCgpICk7CisgICAgJGhhbmRsZS0+Y2xvc2UoKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHJlYWQgZGlyZWN0b3J5OiAkISIgKTsKKyAgICBmb3JlYWNoIG15ICRlbnRyeSAoIEBlbnRyaWVzICkgeworICAgICAgICBteSAkcGF0aCA9IGNhdF9maWxlKCAkZGlyLCAkZW50cnkgKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkc2tpcCApIGFuZCAkZW50cnkgPX4gJHNraXAgKSB7CisgICAgICAgICAgICArKyAkc2tpcHBlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggLWwgJHBhdGggKSB7CisgICAgICAgICAgICAgICAgdW5saW5rKCAkcGF0aCApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgZGVsZXRlIHN5bWxpbmsgYCRwYXRoJzogJCEiICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXQoICRwYXRoICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBzdGF0IGAkcGF0aCc6ICQhICIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIC1mIF8gKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbF9maWxlKCAkcGF0aCApOworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCAtZCBfICkgeworICAgICAgICAgICAgICAgICAgICBteSAkcmMgPSBfY2xlYW5fZGlyKCAkcGF0aCApOworICAgICAgICAgICAgICAgICAgICBpZiAoICRyYyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm1kaXIoICRwYXRoICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBkZWxldGUgZGlyZWN0b3J5IGAkcGF0aCc6ICQhIiApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgICRza2lwcGVkICs9ICRyYzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiYCRwYXRoJyBpcyBuZWl0aGVyIGEgZmlsZSBub3IgYSBkaXJlY3RvcnkuIiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaAorICAgIHJldHVybiAkc2tpcHBlZDsKK307ICMgc3ViIF9jbGVhbl9kaXIKKworCitzdWIgY2xlYW5fZGlyKCRAKSB7CisgICAgbXkgJGRpciAgPSBzaGlmdCggQF8gKTsKKyAgICBvdXIgJV9jbGVhbl9kaXJfb3B0czsKKyAgICBsb2NhbCAlX2NsZWFuX2Rpcl9vcHRzID0KKyAgICAgICAgdmFsaWRhdGUoCisgICAgICAgICAgICBwYXJhbXMgPT4gXEBfLAorICAgICAgICAgICAgc3BlYyA9PiB7CisgICAgICAgICAgICAgICAgc2tpcCAgPT4geyB0eXBlID0+ICJyZWdleHByZWYiIH0sCisgICAgICAgICAgICAgICAgZm9yY2UgPT4geyB0eXBlID0+ICJib29sZWFuIiAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApOworICAgIG15ICRza2lwcGVkID0gX2NsZWFuX2RpciggJGRpciApOworICAgIHJldHVybiAkc2tpcHBlZDsKK307ICMgc3ViIGNsZWFuX2RpcgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGRlbF9kaXIoICRkaXIsIEBvcHRpb25zICk+CisKK0RlbGV0ZSBhIGRpcmVjdG9yeSByZWN1cnNpdmVseS4KKworVGhpcyBmdW5jdGlvbiBkZWxldGVzIGEgZGlyZWN0b3J5LiBJZiBkaXJlY3RvcnkgY2FuIG5vdCBiZSBkZWxldGVkIG9yIGl0IGlzIG5vdCBhIGRpcmVjdG9yeSwgZXJyb3IKK21lc3NhZ2UgaXNzdWVzIChhbmQgc2NyaXB0IGV4aXN0cykuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1iYWNrCisKKz1jdXQKKworc3ViIGRlbF9kaXIoJEApIHsKKworICAgIG15ICRkaXIgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkRlbGV0aW5nIGRpcmVjdG9yeSBcIiRkaXJcIiBmYWlsZWQiOworICAgIG91ciAlX2NsZWFuX2Rpcl9vcHRzOworICAgIGxvY2FsICVfY2xlYW5fZGlyX29wdHMgPQorICAgICAgICB2YWxpZGF0ZSgKKyAgICAgICAgICAgIHBhcmFtcyA9PiBcQF8sCisgICAgICAgICAgICBzcGVjID0+IHsKKyAgICAgICAgICAgICAgICBmb3JjZSA9PiB7IHR5cGUgPT4gImJvb2xlYW4iIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApOworCisgICAgaWYgKCBub3QgLWUgJGRpciApIHsKKyAgICAgICAgIyBOb3RoaW5nIHRvIGRvLgorICAgICAgICByZXR1cm47CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kICRkaXIgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBpdCBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBfY2xlYW5fZGlyKCAkZGlyICk7CisgICAgcm1kaXIoICRkaXIgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeC4iICk7CisKK307ICMgc3ViIGRlbF9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y2hhbmdlX2RpciggJGRpciApPgorCitDaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkuCisKK0lmIGFueSBlcnJvciBvY2N1cnJlZCwgZXJyb3IgaXNzdWVzIGFuZCBzY3JpcHQgZXhpdHMuCisKKz1jdXQKKworc3ViIGNoYW5nZV9kaXIoJCkgeworCisgICAgbXkgJGRpciA9IHNoaWZ0KCBAXyApOworCisgICAgQ3dkOjpjaGRpciggJGRpciApCisgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgY2hkaXIgdG8gXCIkZGlyXCI6ICQhIiApOworCit9OyAjIHN1YiBjaGFuZ2VfZGlyCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y29weV9maWxlKCAkc3JjX2ZpbGUsICRkc3RfZmlsZSwgQG9wdGlvbnMgKT4KKworQ29weSBmaWxlLgorCitUaGlzIGZ1bmN0aW9uIGNvcGllcyBhIGZpbGUuIElmIHNvdXJjZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBmaWxlLCBlcnJvciBpc3N1ZXMuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW92ZXJ3cml0ZT4KKworT3ZlcndyaXRlIGRlc3RpbmF0aW9uIGZpbGUsIGlmIGl0IGV4aXN0cy4KKworPWJhY2sKKworPWN1dAorCitzdWIgY29weV9maWxlKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY29weSBmaWxlIFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1mICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1mICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgZGVsX2ZpbGUoICRkc3QgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIEZpbGU6OkNvcHk6OmNvcHkoICRzcmMsICRkc3QgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogJCEiICk7CisgICAgIyBPbiBXaW5kb3dzKiBPUyBGaWxlOjpDb3B5IHByZXNlcnZlcyBmaWxlIGF0dHJpYnV0ZXMsIGJ1dCBvbiBMaW51eCogT1MgaXQgZG9lc24ndC4KKyAgICAjIFNvIHdlIHNob3VsZCBkbyBpdCBtYW51YWxseS4uLgorICAgIGlmICggJF5PID1+IG0vXmxpbnV4XHovICkgeworICAgICAgICBteSAkbW9kZSA9ICggc3RhdCggJHNyYyApIClbIDIgXQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGNhbm5vdCBnZXQgc3RhdHVzIGluZm8gZm9yIHNvdXJjZSBmaWxlLiIgKTsKKyAgICAgICAgY2htb2QoICRtb2RlLCAkZHN0ICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBjYW5ub3QgY2hhbmdlIG1vZGUgb2YgZGVzdGluYXRpb24gZmlsZS4iICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBjb3B5X2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBtb3ZlX2ZpbGUoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBtb3ZlIGZpbGUgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1vdmVyd3JpdGUgKSBdICk7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZiAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZiAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIEZpbGU6OkNvcHk6Om1vdmUoICRzcmMsICRkc3QgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogJCEiICk7CisKK307ICMgc3ViIG1vdmVfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIGRlbF9maWxlKCQpIHsKKyAgICBteSAkZmlsZXMgPSBzaGlmdCggQF8gKTsKKyAgICBpZiAoIHJlZiggJGZpbGVzICkgZXEgIiIgKSB7CisgICAgICAgICRmaWxlcyA9IFsgJGZpbGVzIF07CisgICAgfTsgIyBpZgorICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBAJGZpbGVzICkgeworICAgICAgICBkZWJ1ZyggIkRlbGV0aW5nIGZpbGUgYCRmaWxlJy4uLiIgKTsKKyAgICAgICAgbXkgJHJjID0gdW5saW5rKCAkZmlsZSApOworICAgICAgICBpZiAoICRyYyA9PSAwICYmICQhICE9IEVOT0VOVCApIHsKKyAgICAgICAgICAgICMgUmVwb3JuIGFuIGVycm9yLCBidXQgaWdub3JlIEVOT0VOVCwgYmVjYXVzZSB0aGUgZ29hbCBpcyBhY2hpZXZlZC4KKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJEZWxldGluZyBmaWxlIGAkZmlsZScgZmFpbGVkOiAkISIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkZmlsZQorfTsgIyBzdWIgZGVsX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1iYWNrCisKKz1jdXQKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEZpbGUgSS9PIHN1YnJvdXRpbmVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBGaWxlIEkvTyBzdWJyb3V0aW5lcy4KKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHJlYWRfZmlsZQorCitCPFN5bm9wc2lzOj4KKworICAgIHJlYWRfZmlsZSggJGZpbGUsIEBvcHRpb25zICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1JlYWQgZmlsZSBhbmQgcmV0dXJuIGl0cyBjb250ZW50LiBJbiBzY2FsYXIgY29udGV4dCBmdW5jdGlvbiByZXR1cm5zIGEgc2NhbGFyLCBpbiBsaXN0IGNvbnRleHQKK2Z1bmN0aW9uIHJldHVybnMgbGlzdCBvZiBsaW5lcy4KKworTm90ZTogSWYgdGhlIGxhc3Qgb2YgZmlsZSBkb2VzIG5vdCB0ZXJtaW5hdGUgd2l0aCBuZXdsaW5lLCBmdW5jdGlvbiB3aWxsIGFwcGVuZCBpdC4KKworQjxBcmd1bWVudHM6PgorCis9b3ZlcgorCis9aXRlbSBCPCRmaWxlPgorCitBIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gcmVhZCBmcm9tLgorCis9YmFjaworCitCPE9wdGlvbnM6PgorCis9b3ZlcgorCis9aXRlbSBCPC1iaW5hcnk+CisKK0lmIHRydWUsIGZpbGUgdHJlYXRzIGFzIGEgYmluYXJ5IGZpbGU6IG5vIG5ld2xpbmUgY29udmVyc2lvbiwgbm8gdHJ1bmNhdGluZyB0cmFpbGluZyBzcGFjZSwgbm8KK25ld2xpbmUgcmVtb3ZpbmcgcGVyZm9ybWVkLiBFbnRpcmUgZmlsZSByZXR1cm5lZCBhcyBhIHNjYWxhci4KKworPWl0ZW0gQjwtYnVsaz4KKworVGhpcyBvcHRpb24gaXMgYWxsb3dlZCBvbmx5IGluIGJpbmFyeSBtb2RlLiBPcHRpb24ncyB2YWx1ZSBzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIuCitJZiBvcHRpb24gcHJlc2VudCwgZmlsZSBjb250ZW50IHBsYWNlZCB0byBwb2ludGVlIHNjYWxhciBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlICgxKS4KKworPWl0ZW0gQjwtY2hvbXA+CisKK0lmIHRydWUsIG5ld2xpbmUgY2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBmcm9tIGZpbGUgY29udGVudC4gQnkgZGVmYXVsdCBuZXdsaW5lIGNoYXJhY3RlcnMgcmVtYWluLgorVGhpcyBvcHRpb24gaXMgbm90IGFwcGxpY2FibGUgaW4gYmluYXJ5IG1vZGUuCisKKz1pdGVtIEI8LWtlZXBfdHJhaWxpbmdfc3BhY2U+CisKK0lmIHRydWUsIHRyYWlubGluZyBzcGFjZSByZW1haW4gYXQgdGhlIGVuZHMgb2YgbGluZXMuIEJ5IGRlZmF1bHQgYWxsIHRyYWlsaW5nIHNwYWNlcyBhcmUgcmVtb3ZlZC4KK1RoaXMgb3B0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIGluIGJpbmFyeSBtb2RlLgorCis9YmFjaworCitCPEV4YW1wbGVzOj4KKworUmV0dXJuIGZpbGUgYXMgc2luZ2xlIGxpbmUsIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMuCisKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggIm1lc3NhZ2UudHh0IiApOworCitSZXR1cm4gZmlsZSBhcyBsaXN0IG9mIGxpbmVzIHdpdGggcmVtb3ZlZCB0cmFpbGluZyBzcGFjZSBhbmQKK25ld2xpbmUgY2hhcmFjdGVycy4KKworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCAibWVzc2FnZS50eHQiLCAtY2hvbXAgPT4gMSApOworCitSZWFkIGEgYmluYXJ5IGZpbGU6CisKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggIm1lc3NhZ2UudHh0IiwgLWJpbmFyeSA9PiAxICk7CisKK1JlYWQgYSBiaWcgYmluYXJ5IGZpbGU6CisKKyAgICBteSAkYnVsazsKKyAgICByZWFkX2ZpbGUoICJiaWdfYmluYXJ5X2ZpbGUiLCAtYmluYXJ5ID0+IDEsIC1idWxrID0+IFwkYnVsayApOworCitSZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQ6CisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggXCpTVERJTiApOworCis9Y3V0CisKK3N1YiByZWFkX2ZpbGUoJEApIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQoIEBfICk7ICAjIFRoZSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHJlYWQgZnJvbS4KKyAgICBteSAlb3B0cyA9IEBfOyAgICAgICAgICAgIyBPcHRpb25zLgorCisgICAgbXkgJG5hbWU7CisgICAgbXkgJGhhbmRsZTsKKyAgICBteSBAYnVsazsKKyAgICBteSAkZXJyb3IgPSBcJnJ1bnRpbWVfZXJyb3I7CisKKyAgICBteSBAYmlub3B0cyA9IHF3KCAtYmluYXJ5IC1lcnJvciAtYnVsayApOyAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb25zIGF2YWlsYWJsZSBpbiBiaW5hcnkgbW9kZS4KKyAgICBteSBAdHh0b3B0cyA9IHF3KCAtYmluYXJ5IC1lcnJvciAta2VlcF90cmFpbGluZ19zcGFjZSAtY2hvbXAgLWxheWVyICk7ICMgT3B0aW9ucyBhdmFpbGFibGUgaW4gdGV4dCAobm9uLWJpbmFyeSkgbW9kZS4KKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBAYmlub3B0cywgQHR4dG9wdHMgXSApOworICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgQGJpbm9wdHMgXSwgInRoZXNlIG9wdGlvbnMgY2Fubm90IGJlIHVzZWQgd2l0aCAtYmluYXJ5IiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIEB0eHRvcHRzIF0sICJ0aGVzZSBvcHRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgLWJpbmFyeSIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZXhpc3RzKCAkb3B0c3sgLWVycm9yIH0gKSApIHsKKyAgICAgICAgJG9wdHN7IC1lcnJvciB9ID0gImVycm9yIjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkb3B0c3sgLWVycm9yIH0gZXEgIndhcm5pbmciICkgeworICAgICAgICAkZXJyb3IgPSBcJndhcm5pbmc7CisgICAgfSBlbHNpZiggJG9wdHN7IC1lcnJvciB9IGVxICJpZ25vcmUiICkgeworICAgICAgICAkZXJyb3IgPSBzdWIge307CisgICAgfSBlbHNpZiAoIHJlZiggJG9wdHN7IC1lcnJvciB9ICkgZXEgIkFSUkFZIiApIHsKKyAgICAgICAgJGVycm9yID0gc3ViIHsgcHVzaCggQHsgJG9wdHN7IC1lcnJvciB9IH0sICRfWyAwIF0gKTsgfTsKKyAgICB9OyAjIGlmCisKKyAgICBpZiAoICggcmVmKCAkZmlsZSApIGVxICJHTE9CIiApIG9yIFVOSVZFUlNBTDo6aXNhKCAkZmlsZSwgIklPOjpIYW5kbGUiICkgKSB7CisgICAgICAgICRuYW1lID0gInVua25vd24iOworICAgICAgICAkaGFuZGxlID0gJGZpbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG5hbWUgPSAkZmlsZTsKKyAgICAgICAgaWYgKCBnZXRfZXh0KCAkZmlsZSApIGVxICIuZ3oiIGFuZCBub3QgJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgICAgICRoYW5kbGUgPSBJTzo6WmxpYi0+bmV3KCAkbmFtZSwgInJiIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGhhbmRsZSA9IElPOjpGaWxlLT5uZXcoICRuYW1lLCAiciIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaGFuZGxlICkgKSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIGlucHV0OiAkISIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIGRlZmluZWQoICRoYW5kbGUgKSApIHsKKyAgICAgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICAgICAgYmlubW9kZSggJGhhbmRsZSApOworICAgICAgICAgICAgbG9jYWwgJC8gPSB1bmRlZjsgICAjIFNldCBpbnB1dCByZWNvcmQgc2VwYXJhdG9yIHRvIHVuZGVmIHRvIHJlYWQgZW50aXJlIGZpbGUgYXMgb25lIGxpbmUuCisgICAgICAgICAgICBpZiAoIGV4aXN0cyggJG9wdHN7IC1idWxrIH0gKSApIHsKKyAgICAgICAgICAgICAgICAkeyAkb3B0c3sgLWJ1bGsgfSB9ID0gJGhhbmRsZS0+Z2V0bGluZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkYnVsa1sgMCBdID0gJGhhbmRsZS0+Z2V0bGluZSgpOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3B0c3sgLWxheWVyIH0gKSApIHsKKyAgICAgICAgICAgICAgICBiaW5tb2RlKCAkaGFuZGxlLCAkb3B0c3sgLWxheWVyIH0gKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIEBidWxrID0gJGhhbmRsZS0+Z2V0bGluZXMoKTsKKyAgICAgICAgICAgICMgU3BlY2lhbCB0cmljayBmb3IgVVRGLTggZmlsZXM6IERlbGV0ZSBCT00sIGlmIGFueS4KKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9wdHN7IC1sYXllciB9ICkgYW5kICRvcHRzeyAtbGF5ZXIgfSBlcSAiOnV0ZjgiICkgeworICAgICAgICAgICAgICAgIGlmICggc3Vic3RyKCAkYnVsa1sgMCBdLCAwLCAxICkgZXEgIlx4e0ZFRkZ9IiApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkYnVsa1sgMCBdLCAwLCAxICkgPSAiIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGhhbmRsZS0+Y2xvc2UoKQorICAgICAgICAgICAgb3IgJGVycm9yLT4oICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgY2xvc2VkIGFmdGVyIGlucHV0OiAkISIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gYW5kIGV4aXN0cyggJG9wdHN7IC1idWxrIH0gKSApIHsKKyAgICAgICAgICAgICR7ICRvcHRzeyAtYnVsayB9IH0gPSAiIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgIGlmICggZXhpc3RzKCAkb3B0c3sgLWJ1bGsgfSApICkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gJGJ1bGtbIDAgXTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggKCBAYnVsayA+IDAgKSBhbmQgKCBzdWJzdHIoICRidWxrWyAtMSBdLCAtMSwgMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICRidWxrWyAtMSBdIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1rZWVwX3RyYWlsaW5nX3NwYWNlIH0gKSB7CisgICAgICAgICAgICBtYXAoICRfID1+IHMvXHMrXG5cei9cbi8sIEBidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkb3B0c3sgLWNob21wIH0gKSB7CisgICAgICAgICAgICBjaG9tcCggQGJ1bGsgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIHdhbnRhcnJheSgpICkgeworICAgICAgICAgICAgcmV0dXJuIEBidWxrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGpvaW4oICIiLCBAYnVsayApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCit9OyAjIHN1YiByZWFkX2ZpbGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyB3cml0ZV9maWxlCisKK0I8U3lub3BzaXM6PgorCisgICAgd3JpdGVfZmlsZSggJGZpbGUsICRidWxrLCBAb3B0aW9ucyApCisKK0I8RGVzY3JpcHRpb246PgorCitXcml0ZSBmaWxlLgorCitCPEFyZ3VtZW50czo+CisKKz1vdmVyCisKKz1pdGVtIEI8JGZpbGU+CisKK1RoZSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHdyaXR0ZSB0by4KKworPWl0ZW0gQjwkYnVsaz4KKworQnVsayB0byB3cml0ZSB0byBhIGZpbGUuIENhbiBiZSBhIHNjYWxhciwgb3IgYSByZWZlcmVuY2UgdG8gc2NhbGFyIG9yIGFuIGFycmF5LgorCis9YmFjaworCitCPE9wdGlvbnM6PgorCis9b3ZlcgorCis9aXRlbSBCPC1iYWNrdXA+CisKK0lmIHRydWUsIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIGZpbGUgb3ZlcndyaXR0ZW4uIEJhY2t1cCBjb3B5IGlzIHBsYWNlZCBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeS4KK1RoZSBuYW1lIG9mIGJhY2t1cCBjb3B5IGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIGZpbGUgd2l0aCBgficgYXBwZW5kZWQuIEJ5IGRlZmF1bHQgYmFja3VwIGNvcHkKK2lzIG5vdCBjcmVhdGVkLgorCis9aXRlbSBCPC1hcHBlbmQ+CisKK0lmIHRydWUsIHRoZSB0ZXh0IHdpbGwgYmUgYWRkZWQgdG8gZXhpc3RpbmcgZmlsZS4KKworPWJhY2sKKworQjxFeGFtcGxlczo+CisKKyAgICB3cml0ZV9maWxlKCAibWVzc2FnZS50eHQiLCBcJGJ1bGsgKTsKKyAgICAgICAgIyBXcml0ZSBmaWxlLCB0YWtlIGNvbnRlbnQgZnJvbSBhIHNjYWxhci4KKworICAgIHdyaXRlX2ZpbGUoICJtZXNzYWdlLnR4dCIsIFxAYnVsaywgLWJhY2t1cCA9PiAxICk7CisgICAgICAgICMgV3JpdGUgZmlsZSwgdGFrZSBjb250ZW50IGZyb20gYW4gYXJyYXksIGNyZWF0ZSBhIGJhY2t1cCBjb3B5LgorCis9Y3V0CisKK3N1YiB3cml0ZV9maWxlKCQkQCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCggQF8gKTsgICMgVGhlIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gd3JpdGUgdG8uCisgICAgbXkgJGJ1bGsgPSBzaGlmdCggQF8gKTsgICMgVGhlIHRleHQgdG8gd3JpdGUuIENhbiBiZSByZWZlcmVuY2UgdG8gYXJyYXkgb3Igc2NhbGFyLgorICAgIG15ICVvcHRzID0gQF87ICAgICAgICAgICAjIE9wdGlvbnMuCisKKyAgICBteSAkbmFtZTsKKyAgICBteSAkaGFuZGxlOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1hcHBlbmQgLWJhY2t1cCAtYmluYXJ5IC1sYXllciApIF0gKTsKKworICAgIG15ICRtb2RlID0gJG9wdHN7IC1hcHBlbmQgfSA/ICJhIjogInciOworICAgIGlmICggKCByZWYoICRmaWxlICkgZXEgIkdMT0IiICkgb3IgVU5JVkVSU0FMOjppc2EoICRmaWxlLCAiSU86OkhhbmRsZSIgKSApIHsKKyAgICAgICAgJG5hbWUgPSAidW5rbm93biI7CisgICAgICAgICRoYW5kbGUgPSAkZmlsZTsKKyAgICB9IGVsc2UgeworICAgICAgICAkbmFtZSA9ICRmaWxlOworICAgICAgICBpZiAoICRvcHRzeyAtYmFja3VwIH0gYW5kICggLWYgJG5hbWUgKSApIHsKKyAgICAgICAgICAgIGNvcHlfZmlsZSggJG5hbWUsICRuYW1lIC4gIn4iLCAtb3ZlcndyaXRlID0+IDEgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkaGFuZGxlID0gSU86OkZpbGUtPm5ldyggJG5hbWUsICRtb2RlICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciBvdXRwdXQ6ICQhIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgIGJpbm1vZGUoICRoYW5kbGUgKTsKKyAgICB9IGVsc2lmICggJG9wdHN7IC1sYXllciB9ICkgeworICAgICAgICBiaW5tb2RlKCAkaGFuZGxlLCAkb3B0c3sgLWxheWVyIH0gKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCByZWYoICRidWxrICkgZXEgIiIgKSB7CisgICAgICAgIGlmICggZGVmaW5lZCggJGJ1bGsgKSApIHsKKyAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAkYnVsayApOworICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1iaW5hcnkgfSBhbmQgKCBzdWJzdHIoICRidWxrLCAtMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggIlxuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoIHJlZiggJGJ1bGsgKSBlcSAiU0NBTEFSIiApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkJGJ1bGsgKSApIHsKKyAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAkJGJ1bGsgKTsKKyAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYmluYXJ5IH0gYW5kICggc3Vic3RyKCAkJGJ1bGssIC0xICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAiXG4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggcmVmKCAkYnVsayApIGVxICJBUlJBWSIgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAJGJ1bGsgKSB7CisgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRsaW5lICkgKSB7CisgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICRsaW5lICk7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1iaW5hcnkgfSBhbmQgKCBzdWJzdHIoICRsaW5lLCAtMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICJcbiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaAorICAgIH0gZWxzZSB7CisgICAgICAgIENhcnA6OmNyb2FrKCAid3JpdGVfZmlsZTogXCRidWxrIG11c3QgYmUgYSBzY2FsYXIgb3IgcmVmZXJlbmNlIHRvIChzY2FsYXIgb3IgYXJyYXkpIiApOworICAgIH07ICMgaWYKKyAgICAkaGFuZGxlLT5jbG9zZSgpCisgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgY2xvc2VkIGFmdGVyIG91dHB1dDogJCEiICk7CisKK307ICMgc3ViIHdyaXRlX2ZpbGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1jdXQKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEV4ZWN1dGlvbiBzdWJyb3V0aW5lcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgRXhlY3V0aW9uIHN1YnJvdXRpbmVzLgorCis9b3ZlcgorCis9Y3V0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgX3ByZSB7CisKKyAgICBteSAkYXJnID0gc2hpZnQoIEBfICk7CisKKyAgICAjIElmIHJlZGlyZWN0aW9uIGlzIG5vdCByZXF1aXJlZCwgZXhpdC4KKyAgICBpZiAoIG5vdCBleGlzdHMoICRhcmctPnsgcmVkaXIgfSApICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OyAjIGlmCisKKyAgICAjIElucHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJG1vZGUgICA9ICRhcmctPnsgbW9kZSAgIH07ICMgTW9kZSwgIjwiIChpbnB1dCApIG9yICI+IiAob3V0cHV0KS4KKyAgICBteSAkaGFuZGxlID0gJGFyZy0+eyBoYW5kbGUgfTsgIyBIYW5kbGUgdG8gbWFuaXB1bGF0ZS4KKyAgICBteSAkcmVkaXIgID0gJGFyZy0+eyByZWRpciAgfTsgIyBEYXRhLCBhIGZpbGUgbmFtZSBpZiBhIHNjYWxhciwgb3IgZmlsZSBjb250ZW50cywgaWYgYSByZWZlcmVuY2UuCisKKyAgICAjIE91dHB1dCBwYXJhbWV0ZXJzLgorICAgIG15ICRzYXZlX2hhbmRsZTsKKyAgICBteSAkdGVtcF9oYW5kbGU7CisgICAgbXkgJHRlbXBfbmFtZTsKKworICAgICMgU2F2ZSBvcmlnaW5hbCBoYW5kbGUgKGJ5IGR1cGluZyBpdCkuCisgICAgJHNhdmVfaGFuZGxlID0gU3ltYm9sOjpnZW5zeW0oKTsKKyAgICAkaGFuZGxlLT5mbHVzaCgpOworICAgIG9wZW4oICRzYXZlX2hhbmRsZSwgJG1vZGUgLiAiJiIgLiAkaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIFByZXBhcmUgYSBmaWxlIHRvIElPLgorICAgIGlmICggVU5JVkVSU0FMOjppc2EoICRyZWRpciwgIklPOjpIYW5kbGUiICkgb3IgKCByZWYoICRyZWRpciApIGVxICJHTE9CIiApICkgeworICAgICAgICAjICRyZWRpciBpcyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIElPOjpIYW5kbGUgY2xhc3MgKG9yIGl0cyBkZWNlZGFudCkuCisgICAgICAgICR0ZW1wX2hhbmRsZSA9ICRyZWRpcjsKKyAgICB9IGVsc2lmICggcmVmKCAkcmVkaXIgKSApIHsKKyAgICAgICAgIyAkcmVkaXIgaXMgYSByZWZlcmVuY2UgdG8gY29udGVudCB0byBiZSByZWFkL3dyaXR0ZW4uCisgICAgICAgICMgUHJlcGFyZSB0ZW1wIGZpbGUuCisgICAgICAgICggJHRlbXBfaGFuZGxlLCAkdGVtcF9uYW1lICkgPQorICAgICAgICAgICAgRmlsZTo6VGVtcDo6dGVtcGZpbGUoCisgICAgICAgICAgICAgICAgIiR0b29sLlhYWFhYWFhYIiwKKyAgICAgICAgICAgICAgICBESVIgICAgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCksCisgICAgICAgICAgICAgICAgU1VGRklYID0+ICIudG1wIiwKKyAgICAgICAgICAgICAgICBVTkxJTksgPT4gMQorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJHRlbXBfaGFuZGxlICkgKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wIGZpbGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJG1vZGUgZXEgIjwiICkgeworICAgICAgICAgICAgIyBJdCBpcyBhIGZpbGUgdG8gYmUgcmVhZCBieSBjaGlsZCwgcHJlcGFyZSBmaWxlIGNvbnRlbnQgdG8gYmUgcmVhZC4KKyAgICAgICAgICAgICR0ZW1wX2hhbmRsZS0+cHJpbnQoIHJlZiggJHJlZGlyICkgZXEgIlNDQUxBUiIgPyAkeyAkcmVkaXIgfSA6IEB7ICRyZWRpciB9ICk7CisgICAgICAgICAgICAkdGVtcF9oYW5kbGUtPmZsdXNoKCk7CisgICAgICAgICAgICBzZWVrKCAkdGVtcF9oYW5kbGUsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICAjIFVuZm9ydHVuYXRlbGx5LCBJIGNvdWxkIG5vdCB1c2UgT08gaW50ZXJmYWNlIHRvIHNlZWsuCisgICAgICAgICAgICAgICAgIyBBY3RpdmVQZXJsIDUuNi4xIGNvbXBsYWlucyBvbiBib3RoIGZvcm1zOgorICAgICAgICAgICAgICAgICMgICAgJHRlbXBfaGFuZGxlLT5zZWVrKCAwICk7ICAgICMgQXMgZGVjbGFyZWQgaW4gSU86OlNlZWthYmxlLgorICAgICAgICAgICAgICAgICMgICAgJHRlbXBfaGFuZGxlLT5zZXRwb3MoIDAgKTsgICMgQXMgZGVzY3JpYmVkIGluIGRvY3VtZW50YXRpb24uCisgICAgICAgIH0gZWxzaWYgKCAkbW9kZSBlcSAiPiIgKSB7CisgICAgICAgICAgICAjIEl0IGlzIGEgZmlsZSBmb3Igb3V0cHV0LiBDbGVhciBvdXRwdXQgdmFyaWFibGUuCisgICAgICAgICAgICBpZiAoIHJlZiggJHJlZGlyICkgZXEgIlNDQUxBUiIgKSB7CisgICAgICAgICAgICAgICAgJHsgJHJlZGlyIH0gPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQHsgJHJlZGlyIH0gPSAoKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgICMgJHJlZGlyIGlzIGEgbmFtZSBvZiBmaWxlIHRvIGJlIHJlYWQvd3JpdHRlbi4KKyAgICAgICAgIyBKdXN0IG9wZW4gZmlsZS4KKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkcmVkaXIgKSApIHsKKyAgICAgICAgICAgICR0ZW1wX25hbWUgPSAkcmVkaXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGVtcF9uYW1lID0gRmlsZTo6U3BlYy0+ZGV2bnVsbCgpOworICAgICAgICB9OyAjIGlmCisgICAgICAgICR0ZW1wX2hhbmRsZSA9IElPOjpGaWxlLT5uZXcoICR0ZW1wX25hbWUsICRtb2RlICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJmaWxlIFwiJHRlbXBfbmFtZVwiIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yICIgLiAoICRtb2RlIGVxICI8IiA/ICJpbnB1dCIgOiAib3V0cHV0IiApIC4gIjogJCEiICk7CisgICAgfTsgIyBpZgorCisgICAgIyBSZWRpcmVjdCBoYW5kbGUgdG8gdGVtcCBmaWxlLgorICAgIG9wZW4oICRoYW5kbGUsICRtb2RlIC4gIiYiIC4gJHRlbXBfaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIFNhdmUgb3V0cHV0IHBhcmFtZXRlcnMuCisgICAgJGFyZy0+eyBzYXZlX2hhbmRsZSB9ID0gJHNhdmVfaGFuZGxlOworICAgICRhcmctPnsgdGVtcF9oYW5kbGUgfSA9ICR0ZW1wX2hhbmRsZTsKKyAgICAkYXJnLT57IHRlbXBfbmFtZSAgIH0gPSAkdGVtcF9uYW1lOworCit9OyAjIHN1YiBfcHJlCisKKworc3ViIF9wb3N0IHsKKworICAgIG15ICRhcmcgPSBzaGlmdCggQF8gKTsKKworICAgICMgSW5wdXQgcGFyYW1ldGVycy4KKyAgICBteSAkbW9kZSAgID0gJGFyZy0+eyBtb2RlICAgfTsgIyBNb2RlLCAiPCIgb3IgIj4iLgorICAgIG15ICRoYW5kbGUgPSAkYXJnLT57IGhhbmRsZSB9OyAjIEhhbmRsZSB0byBzYXZlIGFuZCBzZXQuCisgICAgbXkgJHJlZGlyICA9ICRhcmctPnsgcmVkaXIgIH07ICMgRGF0YSwgYSBmaWxlIG5hbWUgaWYgYSBzY2FsYXIsIG9yIGZpbGUgY29udGVudHMsIGlmIGEgcmVmZXJlbmNlLgorCisgICAgIyBQYXJhbWV0ZXJzIHNhdmVkIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorICAgIG15ICRzYXZlX2hhbmRsZSA9ICRhcmctPnsgc2F2ZV9oYW5kbGUgfTsKKyAgICBteSAkdGVtcF9oYW5kbGUgPSAkYXJnLT57IHRlbXBfaGFuZGxlIH07CisgICAgbXkgJHRlbXBfbmFtZSAgID0gJGFyZy0+eyB0ZW1wX25hbWUgICB9OworCisgICAgIyBJZiBubyBoYW5kbGUgd2FzIHNhdmVkLCBleGl0LgorICAgIGlmICggbm90ICRzYXZlX2hhbmRsZSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgIyBpZgorCisgICAgIyBDbG9zZSBoYW5kbGUuCisgICAgJGhhbmRsZS0+Y2xvc2UoKQorICAgICAgICBvciBkaWUoICIkISIgKTsKKworICAgICMgUmVhZCB0aGUgY29udGVudCBvZiB0ZW1wIGZpbGUsIGlmIG5lY2Vzc2FyeSwgYW5kIGNsb3NlIHRlbXAgZmlsZS4KKyAgICBpZiAoICggJG1vZGUgbmUgIjwiICkgYW5kIHJlZiggJHJlZGlyICkgKSB7CisgICAgICAgICR0ZW1wX2hhbmRsZS0+Zmx1c2goKTsKKyAgICAgICAgc2VlayggJHRlbXBfaGFuZGxlLCAwLCAwICk7CisgICAgICAgIGlmICggJF5PID1+IG0vTVNXaW4vICkgeworICAgICAgICAgICAgYmlubW9kZSggJHRlbXBfaGFuZGxlLCAiOmNybGYiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCByZWYoICRyZWRpciApIGVxICJTQ0FMQVIiICkgeworICAgICAgICAgICAgJHsgJHJlZGlyIH0gLj0gam9pbiggIiIsICR0ZW1wX2hhbmRsZS0+Z2V0bGluZXMoKSApOworICAgICAgICB9IGVsc2lmICggcmVmKCAkcmVkaXIgKSBlcSAiQVJSQVkiICkgeworICAgICAgICAgICAgcHVzaCggQHsgJHJlZGlyIH0sICR0ZW1wX2hhbmRsZS0+Z2V0bGluZXMoKSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggbm90IFVOSVZFUlNBTDo6aXNhKCAkcmVkaXIsICJJTzo6SGFuZGxlIiApICkgeworICAgICAgICAkdGVtcF9oYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgICAgIG9yIGRpZSggIiQhIiApOworICAgIH07ICMgaWYKKworICAgICMgUmVzdG9yZSBoYW5kbGUgdG8gb3JpZ2luYWwgdmFsdWUuCisgICAgJHNhdmVfaGFuZGxlLT5mbHVzaCgpOworICAgIG9wZW4oICRoYW5kbGUsICRtb2RlIC4gIiYiIC4gJHNhdmVfaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIENsb3NlIHNhdmUgaGFuZGxlLgorICAgICRzYXZlX2hhbmRsZS0+Y2xvc2UoKQorICAgICAgICBvciBkaWUoICIkISIgKTsKKworICAgICMgRGVsZXRlIHBhcmFtZXRlcnMgc2F2ZWQgZHVyaW5nIHByZXByb2Nlc3NpbmcuCisgICAgZGVsZXRlKCAkYXJnLT57IHNhdmVfaGFuZGxlIH0gKTsKKyAgICBkZWxldGUoICRhcmctPnsgdGVtcF9oYW5kbGUgfSApOworICAgIGRlbGV0ZSggJGFyZy0+eyB0ZW1wX25hbWUgICB9ICk7CisKK307ICMgc3ViIF9wb3N0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGV4ZWN1dGUoIFsgQGNvbW1hbmQgXSwgQG9wdGlvbnMgKT4KKworRXhlY3V0ZSBzcGVjaWZpZWQgcHJvZ3JhbSBvciBzaGVsbCBjb21tYW5kLgorCitQcm9ncmFtIGlzIHNwZWNpZmllZCBieSByZWZlcmVuY2UgdG8gYW4gYXJyYXksIHRoYXQgYXJyYXkgaXMgcGFzc2VkIHRvIEM8c3lzdGVtKCk+IGZ1bmN0aW9uIHdoaWNoCitleGVjdXRlcyB0aGUgY29tbWFuZC4gU2VlIEw8cGVybGZ1bmM+IGZvciBkZXRhaWxzIGhvdyBDPHN5c3RlbSgpPiBpbnRlcnByZXRzIHZhcmlvdXMgZm9ybXMgb2YKK0M8QGNvbW1hbmQ+LgorCitCeSBkZWZhdWx0LCBpbiBjYXNlIG9mIGFueSBlcnJvciBlcnJvciBtZXNzYWdlIGlzIGlzc3VlZCBhbmQgc2NyaXB0IHRlcm1pbmF0ZWQgKGJ5IHJ1bnRpbWVfZXJyb3IoKSkuCitGdW5jdGlvbiByZXR1cm5zIGFuIGV4aXQgY29kZSBvZiBwcm9ncmFtLgorCitBbHRlcm5hdGl2ZWx5LCBoZSBmdW5jdGlvbiBtYXkgcmV0dXJuIGV4aXQgc3RhdHVzIG9mIHRoZSBwcm9ncmFtIChzZWUgQzwtaWdub3JlX3N0YXR1cz4pIG9yIHNpZ25hbAorKHNlZSBDPC1pZ25vcmVfc2lnbmFsPikgc28gY2FsbGVyIG1heSBhbmFseXplIGl0IGFuZCBjb250aW51ZSBleGVjdXRpb24uCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LXN0ZGluPgorCitSZWRpcmVjdCBzdGRpbiBvZiBwcm9ncmFtLiBUaGUgdmFsdWUgb2Ygb3B0aW9uIGNhbiBiZToKKworPW92ZXIKKworPWl0ZW0gQzx1bmRlZj4KKworU3RkaW4gb2YgY2hpbGQgaXMgYXR0YWNoZWQgdG8gbnVsbCBkZXZpY2UuCisKKz1pdGVtIGEgc3RyaW5nCisKK1N0ZGluIG9mIGNoaWxkIGlzIGF0dGFjaGVkIHRvIGEgZmlsZSB3aXRoIG5hbWUgc3BlY2lmaWVkIGJ5IG9wdGlvbi4KKworPWl0ZW0gYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIKKworQSBkZXJlZmVyZW5jZWQgc2NhbGFyIGlzIHdyaXR0ZW4gdG8gYSB0ZW1wIGZpbGUsIGFuZCBjaGlsZCdzIHN0ZGluIGlzIGF0dGFjaGVkIHRvIHRoYXQgZmlsZS4KKworPWl0ZW0gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkKKworQSBkZXJlZmVyZW5jZWQgYXJyYXkgaXMgd3JpdHRlbiB0byBhIHRlbXAgZmlsZSwgYW5kIGNoaWxkJ3Mgc3RkaW4gaXMgYXR0YWNoZWQgdG8gdGhhdCBmaWxlLgorCis9YmFjaworCis9aXRlbSBDPC1zdGRvdXQ+CisKK1JlZGlyZWN0IHN0ZG91dC4gUG9zc2libGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgQzwtc3RkaW4+IG9wdGlvbi4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcworcmVmZXJlbmNlIHNwZWNpZmllcyBhIHZhcmlhYmxlIHJlY2VpdmluZyBwcm9ncmFtJ3Mgb3V0cHV0LgorCis9aXRlbSBDPC1zdGRlcnI+CisKK0l0IHNpbWlsYXIgdG8gQzwtc3Rkb3V0PiwgYnV0IHJlZGlyZWN0cyBzdGRlcnIuIFRoZXJlIGlzIG9ubHkgb25lIGFkZGl0aW9uYWwgdmFsdWU6CisKKz1vdmVyCisKKz1pdGVtIGFuIGVtcHR5IHN0cmluZworCittZWFucyB0aGF0IHN0ZGVyciBzaG91bGQgYmUgcmVkaXJlY3RlZCB0byB0aGUgc2FtZSBwbGFjZSB3aGVyZSBzdGRvdXQgaXMgcmVkaXJlY3RlZCB0by4KKworPWJhY2sKKworPWl0ZW0gQzwtYXBwZW5kPgorCitSZWRpcmVjdGVkIHN0cmVhbSB3aWxsIG5vdCBvdmVyd3JpdGUgcHJldmlvdXMgY29udGVudCBvZiBmaWxlIChvciB2YXJpYWJsZSkuCitOb3RlLCB0aGF0IG9wdGlvbiBhZmZlY3RzIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIuCisKKz1pdGVtIEM8LWlnbm9yZV9zdGF0dXM+CisKK0J5IGRlZmF1bHQsIHN1YnJvdXRpbmUgcmFpc2VzIGFuIGVycm9yIGFuZCBleGl0cyB0aGUgc2NyaXB0IGlmIHByb2dyYW0gcmV0dXJucyBub24tZXhpdCBzdGF0dXMuIElmCit0aGlzIG9wdGlvbnMgaXMgdHJ1ZSwgbm8gZXJyb3IgaXMgcmFpc2VkLiBJbnN0ZWFkLCBzdGF0dXMgaXMgcmV0dXJuZWQgYXMgZnVuY3Rpb24gcmVzdWx0IChhbmQgJEAgaXMKK3NldCB0byBlcnJvciBtZXNzYWdlKS4KKworPWl0ZW0gQzwtaWdub3JlX3NpZ25hbD4KKworQnkgZGVmYXVsdCwgc3Vicm91dGluZSByYWlzZXMgYW4gZXJyb3IgYW5kIGV4aXRzIHRoZSBzY3JpcHQgaWYgcHJvZ3JhbSBkaWUgd2l0aCBzaWduYWwuIElmCit0aGlzIG9wdGlvbnMgaXMgdHJ1ZSwgbm8gZXJyb3IgaXMgcmFpc2VkIGluIHN1Y2ggYSBjYXNlLiBJbnN0ZWFkLCBzaWduYWwgbnVtYmVyIGlzIHJldHVybmVkIChhcworbmVnYXRpdmUgdmFsdWUpLCBlcnJvciBtZXNzYWdlIGlzIHBsYWNlZCB0byBDPCRAPiB2YXJpYWJsZS4KKworSWYgY29tbWFuZCBpcyBub3QgZXZlbiBzdGFydGVkLCAtMjU2IGlzIHJldHVybmVkLgorCis9YmFjaworCitFeGFtcGxlczoKKworICAgIGV4ZWN1dGUoIFsgImNtZC5leGUiLCAiL2MiLCAiZGlyIiBdICk7CisgICAgICAgICMgRXhlY3V0ZSBOVCBzaGVsbCB3aXRoIHNwZWNpZmllZCBvcHRpb25zLCBubyByZWRpcmVjdGlvbnMgYXJlCisgICAgICAgICMgbWFkZS4KKworICAgIG15ICRvdXRwdXQ7CisgICAgZXhlY3V0ZSggWyAiY3ZzIiwgIi1uIiwgIi1xIiwgInVwZGF0ZSIsICIuIiBdLCAtc3Rkb3V0ID0+IFwkb3V0cHV0ICk7CisgICAgICAgICMgRXhlY3V0ZSAiY3ZzIC1uIC1xIHVwZGF0ZSAuIiBjb21tYW5kLCBvdXRwdXQgaXMgc2F2ZWQKKyAgICAgICAgIyBpbiAkb3V0cHV0IHZhcmlhYmxlLgorCisgICAgbXkgQG91dHB1dDsKKyAgICBleGVjdXRlKCBbIHF3KCBjdnMgLW4gLXEgdXBkYXRlIC4gKSBdLCAtc3Rkb3V0ID0+IFxAb3V0cHV0LCAtc3RkZXJyID0+IHVuZGVmICk7CisgICAgICAgICMgRXhlY3V0ZSBzcGVjaWZpZWQgY29tbWFuZCwgIG91dHB1dCBpcyBzYXZlZCBpbiBAb3V0cHV0CisgICAgICAgICMgdmFyaWFibGUsIHN0ZGVyciBzdHJlYW0gaXMgcmVkaXJlY3RlZCB0byBudWxsIGRldmljZQorICAgICAgICAjICgvZGV2L251bGwgaW4gTGludXgqIE9TIGFuIG51bCBpbiBXaW5kb3dzKiBPUykuCisKKz1jdXQKKworc3ViIGV4ZWN1dGUoJEApIHsKKworICAgICMgISEhIEFkZCBzb21ldGhpbmcgdG8gY29tcGxhaW4gb24gdW5rbm93biBvcHRpb25zLi4uCisKKyAgICBteSAkY29tbWFuZCA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgID0gQF87CisgICAgbXkgJHByZWZpeCAgPSAiQ291bGQgbm90IGV4ZWN1dGUgJGNvbW1hbmQtPlsgMCBdIjsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtc3RkaW4gLXN0ZG91dCAtc3RkZXJyIC1hcHBlbmQgLWlnbm9yZV9zdGF0dXMgLWlnbm9yZV9zaWduYWwgKSBdICk7CisKKyAgICBpZiAoIHJlZiggJGNvbW1hbmQgKSBuZSAiQVJSQVkiICkgeworICAgICAgICBDYXJwOjpjcm9hayggImV4ZWN1dGU6ICRjb21tYW5kIG11c3QgYmUgYSByZWZlcmVuY2UgdG8gYXJyYXkiICk7CisgICAgfTsgIyBpZgorCisgICAgbXkgJHN0ZGluICA9IHsgaGFuZGxlID0+IFwqU1RESU4sICBtb2RlID0+ICI8IiB9OworICAgIG15ICRzdGRvdXQgPSB7IGhhbmRsZSA9PiBcKlNURE9VVCwgbW9kZSA9PiAiPiIgfTsKKyAgICBteSAkc3RkZXJyID0geyBoYW5kbGUgPT4gXCpTVERFUlIsIG1vZGUgPT4gIj4iIH07CisgICAgbXkgJHN0cmVhbXMgPSB7CisgICAgICAgIHN0ZGluICA9PiAkc3RkaW4sCisgICAgICAgIHN0ZG91dCA9PiAkc3Rkb3V0LAorICAgICAgICBzdGRlcnIgPT4gJHN0ZGVycgorICAgIH07ICMgJHN0cmVhbXMKKworICAgIGZvciBteSAkc3RyZWFtICggcXcoIHN0ZGluIHN0ZG91dCBzdGRlcnIgKSApIHsKKyAgICAgICAgaWYgKCBleGlzdHMoICRvcHRzeyAiLSRzdHJlYW0iIH0gKSApIHsKKyAgICAgICAgICAgIGlmICggcmVmKCAkb3B0c3sgIi0kc3RyZWFtIiB9ICkgIX4gbS9cQSh8U0NBTEFSfEFSUkFZKVx6LyApIHsKKyAgICAgICAgICAgICAgICBDYXJwOjpjcm9hayggImV4ZWN1dGU6IC0kc3RyZWFtIG9wdGlvbjogbXVzdCBoYXZlIHZhbHVlIG9mIHNjYWxhciwgb3IgcmVmZXJlbmNlIHRvIChzY2FsYXIgb3IgYXJyYXkpLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRzdHJlYW1zLT57ICRzdHJlYW0gfS0+eyByZWRpciB9ID0gJG9wdHN7ICItJHN0cmVhbSIgfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoICRvcHRzeyAtYXBwZW5kIH0gYW5kICggJHN0cmVhbXMtPnsgJHN0cmVhbSB9LT57IG1vZGUgfSApIGVxICI+IiApIHsKKyAgICAgICAgICAgICRzdHJlYW1zLT57ICRzdHJlYW0gfS0+eyBtb2RlIH0gPSAiPj4iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRzdHJlYW0KKworICAgIF9wcmUoICRzdGRpbiAgKTsKKyAgICBfcHJlKCAkc3Rkb3V0ICk7CisgICAgaWYgKCBkZWZpbmVkKCAkc3RkZXJyLT57IHJlZGlyIH0gKSBhbmQgbm90IHJlZiggJHN0ZGVyci0+eyByZWRpciB9ICkgYW5kICggJHN0ZGVyci0+eyByZWRpciB9IGVxICIiICkgKSB7CisgICAgICAgIGlmICggZXhpc3RzKCAkc3Rkb3V0LT57IHJlZGlyIH0gKSApIHsKKyAgICAgICAgICAgICRzdGRlcnItPnsgcmVkaXIgfSA9ICRzdGRvdXQtPnsgdGVtcF9oYW5kbGUgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRzdGRlcnItPnsgcmVkaXIgfSA9ICR7ICRzdGRvdXQtPnsgaGFuZGxlIH0gfTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBfcHJlKCAkc3RkZXJyICk7CisgICAgbXkgJHJjID0gc3lzdGVtKCBAJGNvbW1hbmQgKTsKKyAgICBteSAkZXJybm8gPSAkITsKKyAgICBteSAkY2hpbGQgPSAkPzsKKyAgICBfcG9zdCggJHN0ZGVyciApOworICAgIF9wb3N0KCAkc3Rkb3V0ICk7CisgICAgX3Bvc3QoICRzdGRpbiAgKTsKKworICAgIG15ICRleGl0ID0gMDsKKyAgICBteSAkc2lnbmFsX251bSAgPSAkY2hpbGQgJiAxMjc7CisgICAgbXkgJGV4aXRfc3RhdHVzID0gJGNoaWxkID4+IDg7CisgICAgJEAgPSAiIjsKKworICAgIGlmICggJHJjID09IC0xICkgeworICAgICAgICAkQCA9ICJcIiRjb21tYW5kLT5bIDAgXVwiIGZhaWxlZDogJGVycm5vIjsKKyAgICAgICAgJGV4aXQgPSAtMjU2OworICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWlnbm9yZV9zaWduYWwgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRAICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggJHNpZ25hbF9udW0gIT0gMCApIHsKKyAgICAgICAgJEAgPSAiXCIkY29tbWFuZC0+WyAwIF1cIiBmYWlsZWQgZHVlIHRvIHNpZ25hbCAkc2lnbmFsX251bS4iOworICAgICAgICAkZXhpdCA9IC0gJHNpZ25hbF9udW07CisgICAgICAgIGlmICggbm90ICRvcHRzeyAtaWdub3JlX3NpZ25hbCB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJEAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCAkZXhpdF9zdGF0dXMgIT0gMCApIHsKKyAgICAgICAgJEAgPSAiXCIkY29tbWFuZC0+WyAwIF1cIiByZXR1cm5lZCBub24temVybyBzdGF0dXMgJGV4aXRfc3RhdHVzLiI7CisgICAgICAgICRleGl0ID0gJGV4aXRfc3RhdHVzOworICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWlnbm9yZV9zdGF0dXMgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRAICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gJGV4aXQ7CisKK307ICMgc3ViIGV4ZWN1dGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8YmFja3RpY2tzKCBbIEBjb21tYW5kIF0sIEBvcHRpb25zICk+CisKK1J1biBzcGVjaWZpZWQgcHJvZ3JhbSBvciBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gb3V0cHV0LgorCitJbiBzY2FsYXIgY29udGV4dCBlbnRpcmUgb3V0cHV0IGlzIHJldHVybmVkIGluIGEgc2luZ2xlIHN0cmluZy4gSW4gbGlzdCBjb250ZXh0IGxpc3Qgb2Ygc3RyaW5ncworaXMgcmV0dXJuZWQuIEZ1bmN0aW9uIGlzc3VlcyBhbiBlcnJvciBhbmQgZXhpdHMgc2NyaXB0IGlmIGFueSBlcnJvciBvY2N1cnMuCisKKz1jdXQKKworCitzdWIgYmFja3RpY2tzKCRAKSB7CisKKyAgICBteSAkY29tbWFuZCA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgID0gQF87CisgICAgbXkgQG91dHB1dDsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtY2hvbXAgKSBdICk7CisKKyAgICBleGVjdXRlKCAkY29tbWFuZCwgLXN0ZG91dCA9PiBcQG91dHB1dCApOworCisgICAgaWYgKCAkb3B0c3sgLWNob21wIH0gKSB7CisgICAgICAgIGNob21wKCBAb3V0cHV0ICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICggd2FudGFycmF5KCkgPyBAb3V0cHV0IDogam9pbiggIiIsIEBvdXRwdXQgKSApOworCit9OyAjIHN1YiBiYWNrdGlja3MKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBwYWQoJCQkKSB7CisgICAgbXkgKCAkc3RyLCAkbGVuZ3RoLCAkcGFkICkgPSBAXzsKKyAgICBteSAkbHN0ciA9IGxlbmd0aCggJHN0ciApOyAgICAjIExlbmd0aCBvZiBzb3VyY2Ugc3RyaW5nLgorICAgIGlmICggJGxzdHIgPCAkbGVuZ3RoICkgeworICAgICAgICBteSAkbHBhZCAgPSBsZW5ndGgoICRwYWQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgcGFkLgorICAgICAgICBteSAkY291bnQgPSBpbnQoICggJGxlbmd0aCAtICRsc3RyICkgLyAkbHBhZCApOyAgICAgIyBOdW1iZXIgb2YgcGFkIHJlcGV0aXRpb25zLgorICAgICAgICBteSAkdGFpbCAgPSAkbGVuZ3RoIC0gKCAkbHN0ciArICRscGFkICogJGNvdW50ICk7CisgICAgICAgICRzdHIgPSAkc3RyIC4gKCAkcGFkIHggJGNvdW50ICkgLiBzdWJzdHIoICRwYWQsIDAsICR0YWlsICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkc3RyOworfTsgIyBzdWIgcGFkCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWJhY2sKKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmV0dXJuIDE7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9Y3V0CisKKyMgRW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsIGIvZmluYWwvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNGY0Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbApAQCAtMCwwICsxLDc3NSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBFbmNvZGUgcXd7IGVuY29kZSB9OworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK291ciAkVkVSU0lPTiA9ICIwLjA0IjsKK215ICRlc2NhcGUgICAgICA9IHFyeyV9OworbXkgJHBsYWNlaG9sZGVyID0gcXJ7KFxkKVwkKHN8bD9bZHVdKX07CisKK215ICRzZWN0aW9ucyA9CisgICAgeworICAgICAgICBtZXRhICAgICA9PiB7IHNob3J0ID0+ICJwcnAiIH0sICMgInBycCIgc3RhbmRzIGZvciAicHJvcGVydHkiLgorICAgICAgICBzdHJpbmdzICA9PiB7IHNob3J0ID0+ICJzdHIiIH0sCisgICAgICAgIGZvcm1hdHMgID0+IHsgc2hvcnQgPT4gImZtdCIgfSwKKyAgICAgICAgbWVzc2FnZXMgPT4geyBzaG9ydCA9PiAibXNnIiB9LAorICAgICAgICBoaW50cyAgICA9PiB7IHNob3J0ID0+ICJobnQiIH0sCisgICAgfTsKK215IEBzZWN0aW9ucyA9IHF3eyBtZXRhIHN0cmluZ3MgZm9ybWF0cyBtZXNzYWdlcyBoaW50cyB9OworIyBBc3NpZ24gc2VjdGlvbiBwcm9wZXJ0aWVzOiBsb25nIG5hbWUsIHNldCBudW1iZXIsIGJhc2UgbnVtYmVyLgorbWFwKCAkc2VjdGlvbnMtPnsgJHNlY3Rpb25zWyAkXyBdIH0tPnsgbG9uZyB9ID0gJHNlY3Rpb25zWyAkXyBdLCAgICAgICggMCAuLiBAc2VjdGlvbnMgLSAxICkgKTsKK21hcCggJHNlY3Rpb25zLT57ICRzZWN0aW9uc1sgJF8gXSB9LT57IHNldCAgfSA9ICggJF8gKyAxICksICAgICAgICAgICAoIDAgLi4gQHNlY3Rpb25zIC0gMSApICk7CittYXAoICRzZWN0aW9ucy0+eyAkc2VjdGlvbnNbICRfIF0gfS0+eyBiYXNlIH0gPSAoICggJF8gKyAxICkgPDwgMTYgKSwgKCAwIC4uIEBzZWN0aW9ucyAtIDEgKSApOworCisjIFByb3BlcnRpZXMgb2YgTWV0YSBzZWN0aW9uLgorbXkgQHByb3BlcnRpZXMgPSBxd3sgTGFuZ3VhZ2UgQ291bnRyeSBMYW5nSWQgVmVyc2lvbiBSZXZpc2lvbiB9OworCisKK3N1YiBfZ2VuZXJhdGVfY29tbWVudCgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRvcGVuLCAkY2xvc2UgKSA9IEBfOworICAgIG15ICRidWxrID0KKyAgICAgICAgJG9wZW4gLiAiIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEgIiAuICRjbG9zZSAuICJcbiIgLgorICAgICAgICAkb3BlbiAuICIgVGhlIGZpbGUgd2FzIGdlbmVyYXRlZCBmcm9tICIgLiBnZXRfZmlsZSggJGRhdGEtPnsgIiVtZXRhIiB9LT57IHNvdXJjZSB9ICkgLgorICAgICAgICAgICAgIiBieSAiIC4gJHRvb2wgLiAiIG9uICIgLiBsb2NhbHRpbWUoKSAuICIuICIgLiAkY2xvc2UgLiAiXG4iOworICAgIHJldHVybiAkYnVsazsKKworfTsgIyBzdWIgX2dlbmVyYXRlX2NvbW1lbnQKKworCitzdWIgbXNnMnNnbigkKSB7CisKKyAgICAjIENvbnZlcnQgbWVzc2FnZSBzdHJpbmcgdG8gc2lnbmF0dXJlLiBTaWduYXR1cmUgaXMgYSBsaXN0IG9mIHBsYWNlaG9sZGVycyBpbiBzb3J0ZWQgb3JkZXIuCisgICAgIyBGb3IgZXhhbXBsZSwgc2lnbmF0dXJlIG9mICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIiBpcyAiJTEkcyAlMiRzIi4KKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgbXkgQHBsYWNlaG9sZGVyczsKKyAgICBwb3MoICRtc2cgKSA9IDA7CisgICAgd2hpbGUgKCAkbXNnID1+IG17XEcuKj8kZXNjYXBlJHBsYWNlaG9sZGVyfWcgKSB7CisgICAgICAgICRwbGFjZWhvbGRlcnNbICQxIC0gMSBdID0gIiUkMVwkJDIiOworICAgIH07ICMgd2hpbGUKKyAgICBmb3IgKCBteSAkaSA9IDE7ICRpIDw9IEBwbGFjZWhvbGRlcnM7ICsrICRpICkgeworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkcGxhY2Vob2xkZXJzWyAkaSAtIDEgXSApICkgeworICAgICAgICAgICAgJHBsYWNlaG9sZGVyc1sgJGkgLSAxIF0gPSAiJSRpXCQtIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yICRpCisgICAgcmV0dXJuIGpvaW4oICIgIiwgQHBsYWNlaG9sZGVycyApOworCit9OyAjIHN1YiBtc2cyc2duCisKKworc3ViIG1zZzJzcmMoJCkgeworCisgICAgIyBDb252ZXJ0IG1lc3NhZ2Ugc3RyaW5nIHRvIGEgQyBzdHJpbmcgY29uc3RhbnQuCisKKyAgICBteSAoICRtc2cgKSA9IEBfOworICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgJG1zZyA9fiBzeyRlc2NhcGUkcGxhY2Vob2xkZXJ9e1wlJDEhJDIhfWc7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkbXNnOworCit9OyAjIHN1YiBtc2cyc3JjCisKKworbXkgJHNwZWNpYWwgPQorICAgIHsKKyAgICAgICAgIm4iID0+ICJcbiIsCisgICAgICAgICJ0IiA9PiAiXHQiLAorICAgIH07CisKK3N1YiBtc2cybWMoJCkgeworICAgIG15ICggJG1zZyApID0gQF87CisgICAgJG1zZyA9IG1zZzJzcmMoICRtc2cgKTsgIyBHZXQgd2luZG93cyBzdHlsZSBwbGFjZWhvbGRlcnMuCisgICAgJG1zZyA9fiBze1xcKC4pfXsgZXhpc3RzKCAkc3BlY2lhbC0+eyAkMSB9ICkgPyAkc3BlY2lhbC0+eyAkMSB9IDogJDEgfWdlOworICAgIHJldHVybiAkbXNnOworfTsgIyBzdWIgbXNnMm1jCisKKworCitzdWIgcGFyc2VfbWVzc2FnZSgkKSB7CisKKyAgICBteSAoICRtc2cgKSA9IEBfOworICAgIHBvcyggJG1zZyApID0gMDsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIGlmICggJG1zZyAhfiBte1xHLio/JGVzY2FwZX1nYyApIHsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAkbXNnICF+IG17XEckcGxhY2Vob2xkZXJ9Z2MgKSB7CisgICAgICAgICAgICByZXR1cm4gIkJhZCAlLXNlcXVlbmNlIG5lYXIgXCIlIiAuIHN1YnN0ciggJG1zZywgcG9zKCAkbXNnICksIDcgKSAuICJcIiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmV2ZXIKKyAgICByZXR1cm4gdW5kZWY7CisKK307ICMgc3ViIHBhcnNlX21lc3NhZ2UKKworCitzdWIgcGFyc2Vfc291cmNlKCQpIHsKKworICAgIG15ICggJG5hbWUgKSA9IEBfOworCisgICAgbXkgQGJ1bGsgPSByZWFkX2ZpbGUoICRuYW1lLCAtbGF5ZXIgPT4gIjp1dGY4IiApOworICAgIG15ICRkYXRhID0ge307CisKKyAgICBteSAkbGluZTsKKyAgICBteSAkbiA9IDA7ICAgICAgICAgIyBMaW5lIG51bWJlci4KKyAgICBteSAkb2Jzb2xldGUgPSAwOyAgIyBDb3VudGVyIG9mIG9ic29sZXRlIGVudHJpZXMuCisgICAgbXkgJGxhc3RfaWR4OworICAgIG15ICVpZGVudHM7CisgICAgbXkgJHNlY3Rpb247CisKKyAgICBteSAkZXJyb3IgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkbiwgJGxpbmUsICRtc2cgKSA9IEBfOworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkVycm9yIHBhcnNpbmcgJG5hbWUgbGluZSAkbjogIiAuICIkbXNnOlxuIiAuICIgICAgJGxpbmUiICk7CisgICAgICAgIH07ICMgc3ViCisKKyAgICBmb3JlYWNoICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICAjIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEFccyooXG58Iyl9ICkgeworICAgICAgICAgICAgJGxhc3RfaWR4ID0gdW5kZWY7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgUGFyc2Ugc2VjdGlvbiBoZWFkZXIuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQS1cKi1ccyooW0EtWl9dKilccyotXCotXHMqXG5cen1pICkgeworICAgICAgICAgICAgJHNlY3Rpb24gPSAoIGxjKCAkMSApICk7CisgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkc2VjdGlvbiBlcSAkXywgQHNlY3Rpb25zICkgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlVua25vd24gc2VjdGlvbiBcIiRzZWN0aW9uXCIgc3BlY2lmaWVkIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRkYXRhLT57ICRzZWN0aW9uIH0gKSApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiTXVsdGlwbGUgc2VjdGlvbnMgb2YgdGhlIHNhbWUgdHlwZSBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAlaWRlbnRzID0gKCk7ICAgICAjIENsZWFuIGxpc3Qgb2Yga25vd24gbWVzc2FnZSBpZGVudGlmaWVycy4KKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJHNlY3Rpb24gKSApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJTZWN0aW9uIGhlYWRpbmcgZXhwZWN0ZWQiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBzZWN0aW9uIGJvZHkuCisgICAgICAgIGlmICggJHNlY3Rpb24gZXEgIm1ldGEiICkgeworICAgICAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBKFtBLVpfXVtBLVpfMC05XSopXHMrIiguKikiXHMqP1xuP1x6fWkgKSB7CisgICAgICAgICAgICAgICAgIyBQYXJzZSBtZXRhIHByb3BlcnRpZXMgKHN1Y2ggYXMgTGFuZ3VhZ2UsIENvdW50cnksIGFuZCBMYW5nSWQpLgorICAgICAgICAgICAgICAgIG15ICggJHByb3BlcnR5LCAkdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgZ3JlcCggJF8gZXEgJHByb3BlcnR5ICwgQHByb3BlcnRpZXMgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlVua25vd24gcHJvcGVydHkgXCIkcHJvcGVydHlcIiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIGlmICggZXhpc3RzKCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgJHByb3BlcnR5IH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlByb3BlcnR5IFwiJHByb3BlcnR5XCIgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkbGFzdF9pZHggPSB1bmRlZjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlByb3BlcnR5IGxpbmUgZXhwZWN0ZWQiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBtZXNzYWdlLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEEoW0EtWl9dW0EtWl8wLTldKilccysiKC4qKSJccyo/XG4/XHp9aSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCAkbWVzc2FnZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIGlmICggJGlkZW50IGVxICJPQlNPTEVURSIgKSB7CisgICAgICAgICAgICAgICAgIyBJZiBpZCBpcyAiT0JTT0xFVEUiLCBhZGQgYSB1bmlxdWUgc3VmZml4LiBJdCBwcm92aWRlcyBjb252ZW5pZW50IHdheSB0byBtYXJrCisgICAgICAgICAgICAgICAgIyBvYnNvbGV0ZSBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICArKyAkb2Jzb2xldGU7CisgICAgICAgICAgICAgICAgJGlkZW50IC49ICRvYnNvbGV0ZTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIGlmICggZXhpc3RzKCAkaWRlbnRzeyAkaWRlbnQgfSApICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJJZGVudGlmaWVyIFwiJGlkZW50XCIgaXMgcmVkZWZpbmVkIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBDaGVjayAlLXNlcXVlbmNlcy4KKyAgICAgICAgICAgIG15ICRlcnIgPSBwYXJzZV9tZXNzYWdlKCAkbWVzc2FnZSApOworICAgICAgICAgICAgaWYgKCAkZXJyICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICRlcnIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgU2F2ZSBtZXNzYWdlLgorICAgICAgICAgICAgcHVzaCggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9LCBbICRpZGVudCwgJG1lc3NhZ2UgXSApOworICAgICAgICAgICAgJGlkZW50c3sgJGlkZW50IH0gPSAxOworICAgICAgICAgICAgJGxhc3RfaWR4ID0gQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9IC0gMTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBjb250aW51YXRpb24gbGluZS4KKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBXHMqIiguKikiXHMqXHp9ICkgeworICAgICAgICAgICAgbXkgJG1lc3NhZ2UgPSAkMTsKKyAgICAgICAgICAgIGlmICggbm90IGRlZmluZWQoICRsYXN0X2lkeCApICApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5leHBlY3RlZCBjb250aW51YXRpb24gbGluZSIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgQ2hlY2sgJS1zZXF1ZW5jZXMuCisgICAgICAgICAgICBteSAkZXJyID0gcGFyc2VfbWVzc2FnZSggJG1lc3NhZ2UgKTsKKyAgICAgICAgICAgIGlmICggJGVyciApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAkZXJyICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAjIFNhdmUgY29udGludWF0aW9uLgorICAgICAgICAgICAgJGRhdGEtPnsgJHNlY3Rpb24gfS0+WyAkbGFzdF9pZHggXS0+WyAxIF0gLj0gJG1lc3NhZ2U7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJNZXNzYWdlIGRlZmluaXRpb24gZXhwZWN0ZWQiICk7CisgICAgfTsgIyBmb3JlYWNoCisgICAgJGRhdGEtPnsgIiVtZXRhIiB9LT57IHNvdXJjZSB9ID0gJG5hbWU7CisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkZGF0YS0+eyAkc2VjdGlvbiB9ICkgKSB7CisgICAgICAgICAgICAkZGF0YS0+eyAkc2VjdGlvbiB9ID0gW107CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKworICAgIGZvcmVhY2ggbXkgJHByb3BlcnR5ICggQHByb3BlcnRpZXMgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSApICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyAkbmFtZTogIiAuCisgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlZCBcIiRwcm9wZXJ0eVwiIHByb3BlcnR5IGlzIG5vdCBzcGVjaWZpZWQiCisgICAgICAgICAgICApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHB1c2goIEB7ICRkYXRhLT57IG1ldGEgfSB9LCBbICRwcm9wZXJ0eSwgJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9IF0gKTsKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIHJldHVybiAkZGF0YTsKKworfTsgIyBzdWIgcGFyc2Vfc291cmNlCisKKworc3ViIGdlbmVyYXRlX2VudW0oJCQkKSB7CisKKyAgICBteSAoICRkYXRhLCAkZmlsZSwgJHByZWZpeCApID0gQF87CisgICAgbXkgJGJ1bGsgPSAiIjsKKworICAgICRidWxrID0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiLy8iLCAiLy8iICkgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgImVudW0gJHtwcmVmaXh9X2lkIHtcblxuIiAuCisgICAgICAgICIgICAgLy8gQSBzcGVjaWFsIGlkIGZvciBhYnNlbmNlIG9mIG1lc3NhZ2UuXG4iIC4KKyAgICAgICAgIiAgICAke3ByZWZpeH1fbnVsbCA9IDAsXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgIG15ICRzaG9ydCA9ICRwcm9wcy0+eyBzaG9ydCB9OyAgICAgICAgICAjIFNob3J0IHNlY3Rpb24gbmFtZSwgZnJlcXVlbnRseSB1c2VkLgorICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIiAgICAvLyBTZXQgIyRwcm9wcy0+eyBzZXQgfSwgJHByb3BzLT57IGxvbmcgfS5cbiIgLgorICAgICAgICAgICAgIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fZmlyc3QgPSAkcHJvcHMtPnsgYmFzZSB9LFxuIjsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCB1bmRlZiApID0gQCRpdGVtOworICAgICAgICAgICAgJGJ1bGsgLj0gIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fJHtpZGVudH0sXG4iOworICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgJGJ1bGsgLj0gIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fbGFzdCxcblxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKyAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV94eHhfbGFzdGVzdFxuXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIn07IC8vIGVudW0gJHtwcmVmaXh9X2lkXG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJ0eXBlZGVmIGVudW0gJHtwcmVmaXh9X2lkICAke3ByZWZpeH1faWRfdDtcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIlxuIiAuCisgICAgICAgICIvLyBlbmQgb2YgZmlsZSAvL1xuIjsKKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGsgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfZW51bQorCisKK3N1YiBnZW5lcmF0ZV9zaWduYXR1cmUoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgLj0gIi8vIG1lc3NhZ2UgY2F0YWxvZyBzaWduYXR1cmUgZmlsZSAvL1xuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgbXkgJHByb3BzID0gJHNlY3Rpb25zLT57ICRzZWN0aW9uIH07ICAgICMgU2VjdGlvbiBwcm9wZXJ0aWVzLgorICAgICAgICBteSAkc2hvcnQgPSAkcHJvcHMtPnsgc2hvcnQgfTsgICAgICAgICAgIyBTaG9ydCBzZWN0aW9uIG5hbWUsIGZyZXF1ZW50bHkgdXNlZC4KKyAgICAgICAgJGJ1bGsgLj0gIi0qLSAiIC4gdWMoICRwcm9wcy0+eyBsb25nIH0gKSAuICItKi1cblxuIjsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCAkbXNnICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSBzcHJpbnRmKCAiJS00MHMgJXNcbiIsICRpZGVudCwgbXNnMnNnbiggJG1zZyApICk7CisgICAgICAgIH07ICMgZm9yZWFjaAorICAgICAgICAkYnVsayAuPSAiXG4iOworICAgIH07ICMgZm9yZWFjaCAkdHlwZQorCisgICAgJGJ1bGsgLj0gIi8vIGVuZCBvZiBmaWxlIC8vXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsayApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9zaWduYXR1cmUKKworCitzdWIgZ2VuZXJhdGVfZGVmYXVsdCgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlLCAkcHJlZml4ICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiLy8iLCAiLy8iICkgLgorICAgICAgICAiXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICJzdGF0aWMgY2hhciBjb25zdCAqXG4iIC4KKyAgICAgICAgICAgICJfXyR7cHJlZml4fV9kZWZhdWx0XyR7c2VjdGlvbn0iIC4gIltdID1cbiIgLgorICAgICAgICAgICAgIiAgICB7XG4iIC4KKyAgICAgICAgICAgICIgICAgICAgIE5VTEwsXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgJGJ1bGsgLj0gIiAgICAgICAgXCIiIC4gbXNnMnNyYyggJG1zZyApIC4gIlwiLFxuIjsKKyAgICAgICAgfTsgIyB3aGlsZQorICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIiAgICAgICAgTlVMTFxuIiAuCisgICAgICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgICAgICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPQorICAgICAgICAic3RydWN0IGttcF9pMThuX3NlY3Rpb24ge1xuIiAuCisgICAgICAgICIgICAgaW50ICAgICAgICAgICBzaXplO1xuIiAuCisgICAgICAgICIgICAgY2hhciBjb25zdCAqKiBzdHI7XG4iIC4KKyAgICAgICAgIn07IC8vIHN0cnVjdCBrbXBfaTE4bl9zZWN0aW9uXG4iIC4KKyAgICAgICAgInR5cGVkZWYgc3RydWN0IGttcF9pMThuX3NlY3Rpb24gIGttcF9pMThuX3NlY3Rpb25fdDtcbiIgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgInN0YXRpYyBrbXBfaTE4bl9zZWN0aW9uX3RcbiIgLgorICAgICAgICAiX18ke3ByZWZpeH1fc2VjdGlvbnNbXSA9XG4iIC4KKyAgICAgICAgIiAgICB7XG4iIC4KKyAgICAgICAgIiAgICAgICAgeyAwLCBOVUxMIH0sXG4iOworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgICAgICB7ICIgLiBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gLiAiLCBfXyR7cHJlZml4fV9kZWZhdWx0XyR7c2VjdGlvbn0gfSxcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIiAgICAgICAgeyAwLCBOVUxMIH1cbiIgLgorICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgIlxuIjsKKworICAgICRidWxrIC49CisgICAgICAgICJzdHJ1Y3Qga21wX2kxOG5fdGFibGUge1xuIiAuCisgICAgICAgICIgICAgaW50ICAgICAgICAgICAgICAgICAgIHNpemU7XG4iIC4KKyAgICAgICAgIiAgICBrbXBfaTE4bl9zZWN0aW9uX3QgKiAgc2VjdDtcbiIgLgorICAgICAgICAifTsgLy8gc3RydWN0IGttcF9pMThuX3RhYmxlXG4iIC4KKyAgICAgICAgInR5cGVkZWYgc3RydWN0IGttcF9pMThuX3RhYmxlICBrbXBfaTE4bl90YWJsZV90O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAic3RhdGljIGttcF9pMThuX3RhYmxlX3QgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlID1cbiIgLgorICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAiICAgICAgICAiIC4gQHNlY3Rpb25zIC4gIixcbiIgLgorICAgICAgICAiICAgICAgICBfX2ttcF9pMThuX3NlY3Rpb25zXG4iIC4KKyAgICAgICAgIiAgICB9O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiLy8gZW5kIG9mIGZpbGUgLy9cbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrICk7CisKK307ICMgc3ViIGdlbmVyYXRlX2RlZmF1bHQKKworCitzdWIgZ2VuZXJhdGVfbWVzc2FnZV91bml4KCQkKSB7CisKKyAgICBteSAoICRkYXRhLCAkZmlsZSApID0gQF87CisgICAgbXkgJGJ1bGsgICAgID0gIiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICJcJCIsICJcJCIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiXCRxdW90ZSBcIlxuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICJcJCAiIC4gKCAiLSIgeCA3OCApIC4gIlxuXCQgJHNlY3Rpb25cblwkICIgLiAoICItIiB4IDc4ICkgLiAiXG5cbiIgLgorICAgICAgICAgICAgIlwkc2V0ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9LT57IHNldCB9XG4iIC4KKyAgICAgICAgICAgICJcbiI7CisgICAgICAgIG15ICRuID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggdW5kZWYsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICsrICRuOworICAgICAgICAgICAgJGJ1bGsgLj0gIiRuIFwiIiAuIG1zZzJzcmMoICRtc2cgKSAuICJcIlxuIjsKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIlwkIGVuZCBvZiBmaWxlIFwkXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsaywgLWxheWVyID0+ICI6dXRmOCIgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfbWVzc2FnZV9saW51eAorCisKK3N1YiBnZW5lcmF0ZV9tZXNzYWdlX3dpbmRvd3MoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworICAgIG15ICRsYW5ndWFnZSA9ICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5ndWFnZSB9OworICAgIG15ICRsYW5naWQgICA9ICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5nSWQgfTsKKworICAgICRidWxrIC49CisgICAgICAgIF9nZW5lcmF0ZV9jb21tZW50KCAkZGF0YSwgIjsiLCAiOyIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiTGFuZ3VhZ2VOYW1lcyA9ICgkbGFuZ3VhZ2U9JGxhbmdpZDptc2dfJGxhbmdpZClcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIkZhY2lsaXR5TmFtZXM9KFxuIjsKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICRwcm9wcy0+eyBzaG9ydCB9PSIgLiAkcHJvcHMtPnsgc2V0IH0gLiJcbiI7CisgICAgfTsgIyBmb3JlYWNoICRzZWN0aW9uCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIilcblxuIjsKKworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRzaG9ydCA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9LT57IHNob3J0IH07CisgICAgICAgIG15ICRuID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggdW5kZWYsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICsrICRuOworICAgICAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICAgICAiTWVzc2FnZUlkPSRuXG4iIC4KKyAgICAgICAgICAgICAgICAiRmFjaWxpdHk9JHNob3J0XG4iIC4KKyAgICAgICAgICAgICAgICAiTGFuZ3VhZ2U9JGxhbmd1YWdlXG4iIC4KKyAgICAgICAgICAgICAgICBtc2cybWMoICRtc2cgKSAuICJcbi5cblxuIjsKKyAgICAgICAgfTsgIyBmb3JlYWNoICRpdGVtCisgICAgfTsgIyBmb3JlYWNoICRzZWN0aW9uCisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIjsgZW5kIG9mIGZpbGUgO1xuIjsKKworICAgICRidWxrID0gZW5jb2RlKCAiVVRGLTE2TEUiLCAkYnVsayApOyAjIENvbnZlcnQgdGV4dCB0byBVVEYtMTZMRSB1c2VkIGluIFdpbmRvd3MqIE9TLgorICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGssIC1iaW5hcnkgPT4gMSApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9tZXNzYWdlX3dpbmRvd3MKKworCisjCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKyMKKworbXkgJGlucHV0X2ZpbGU7CitteSAkZW51bV9maWxlOworbXkgJHNpZ25hdHVyZV9maWxlOworbXkgJGRlZmF1bHRfZmlsZTsKK215ICRtZXNzYWdlX2ZpbGU7CitteSAkaWQ7CitteSAkcHJlZml4ID0gIiI7CitnZXRfb3B0aW9ucygKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAiZW51bS1maWxlPXMiICAgICAgPT4gXCRlbnVtX2ZpbGUsCisgICAgInNpZ25hdHVyZS1maWxlPXMiID0+IFwkc2lnbmF0dXJlX2ZpbGUsCisgICAgImRlZmF1bHQtZmlsZT1zIiAgID0+IFwkZGVmYXVsdF9maWxlLAorICAgICJtZXNzYWdlLWZpbGU9cyIgICA9PiBcJG1lc3NhZ2VfZmlsZSwKKyAgICAiaWR8bGFuZy1pZCIgICAgICAgPT4gXCRpZCwKKyAgICAicHJlZml4PXMiCSAgICAgICA9PiBcJHByZWZpeCwKKyk7CitpZiAoIEBBUkdWID09IDAgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vIHNvdXJjZSBmaWxlIHNwZWNpZmllZCAtLSBub3RoaW5nIHRvIGRvIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IHNvdXJjZSBmaWxlcyBzcGVjaWZpZWQiICk7Cit9OyAjIGlmCiskaW5wdXRfZmlsZSA9ICRBUkdWWyAwIF07CisKKworbXkgJGdlbmVyYXRlX21lc3NhZ2U7CitpZiAoICR0YXJnZXRfb3MgPX4gbXtcQSg/OmxpbnxtYWMpXHp9ICkgeworICAgICRnZW5lcmF0ZV9tZXNzYWdlID0gXCZnZW5lcmF0ZV9tZXNzYWdlX3VuaXg7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAkZ2VuZXJhdGVfbWVzc2FnZSA9IFwmZ2VuZXJhdGVfbWVzc2FnZV93aW5kb3dzOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgaXMgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworCisjCisjIERvIHRoZSB3b3JrLgorIworCitteSAkZGF0YSA9IHBhcnNlX3NvdXJjZSggJGlucHV0X2ZpbGUgKTsKK2lmICggZGVmaW5lZCggJGlkICkgKSB7CisgICAgcHJpbnQoICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5nSWQgfSwgIlxuIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZW51bV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfZW51bSggJGRhdGEsICRlbnVtX2ZpbGUsICRwcmVmaXggKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJHNpZ25hdHVyZV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfc2lnbmF0dXJlKCAkZGF0YSwgJHNpZ25hdHVyZV9maWxlICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRkZWZhdWx0X2ZpbGUgKSApIHsKKyAgICBnZW5lcmF0ZV9kZWZhdWx0KCAkZGF0YSwgJGRlZmF1bHRfZmlsZSwgJHByZWZpeCApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkbWVzc2FnZV9maWxlICkgKSB7CisgICAgJGdlbmVyYXRlX21lc3NhZ2UtPiggJGRhdGEsICRtZXNzYWdlX2ZpbGUgKTsKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxtZXNzYWdlLWNvbnZlcnRlci5wbD4gLS0gQ29udmVydCBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUgaW50byBhbm90aGVyIHRleHQgZm9ybXMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPG1lc3NhZ2UtY29udmVydGVyLnBsPiBJPG9wdGlvbj4uLi4gPGZpbGU+CisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1lbnVtLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZW51bSBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1kZWZhdWx0LWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZGVmYXVsdCBtZXNzYWdlcyBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1sYW5nLWlkPgorCitQcmludCBsYW5ndWFnZSBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUuCisKKz1pdGVtIEI8LS1tZXNzYWdlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgbWVzc2FnZSBmaWxlLgorCis9aXRlbSBCPC0tc2lnbmF0dXJlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgc2lnbmF0dXJlIGZpbGUuCisKK1NpZ25hdHVyZXMgYXJlIHVzZWQgZm9yIGNoZWNraW5nIGNvbXBhdGliaWxpdHkuIEZvciBleGFtcGxlLCB0byBjaGVjayBhIHByaW1hcnkKK2NhdGFsb2cgYW5kIGl0cyB0cmFuc2xhdGlvbiB0byBhbm90aGVyIGxhbmd1YWdlLCBzaWduYXR1cmVzIG9mIGJvdGggY2F0YWxvZ3Mgc2hvdWxkIGJlIGdlbmVyYXRlZAorYW5kIGNvbXBhcmVkLiBJZiBzaWduYXR1cmVzIGFyZSBpZGVudGljYWwsIGNhdGFsb2dzIGFyZSBjb21wYXRpYmxlLgorCis9aXRlbSBCPC0tcHJlZml4PT5JPHByZWZpeD4KKworUHJlZml4IHRvIGJlIHVzZWQgZm9yIGFsbCBDIGlkZW50aWZpZXJzICh0eXBlIGFuZCB2YXJpYWJsZSBuYW1lcykgaW4gZW51bSBhbmQgZGVmYXVsdCBtZXNzYWdlcworZmlsZXMuCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgT1MgbmFtZSB0aGUgbWVzc2FnZSBmb3JtYXRzIHRvIGJlIGNvbnZlcnRlZCBmb3IuIElmIG5vdCBzcGVjaWZpZWQgZXhwb2xpY2l0bHksIHZhbHVlIG9mCitMSUJPTVBfT1MgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZC4gSWYgTElCT01QX09TIGlzIG5vdCBkZWZpbmVkLCBob3N0IE9TIGlzIGRldGVjdGVkLgorCitEZXBlbmRpbmcgb24gT1MsIEI8bWVzc2FnZS1jb252ZXJ0ZXIucGw+IGNvbnZlcnRzIG1lc3NhZ2UgZm9ybWF0cyB0byBHTlUgc3R5bGUgb3IgTVMgc3R5bGUuCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBzdHJpbmcgYW5kIGV4aXQuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgaW5wdXQgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKKz1oZWFkMiBNZXNzYWdlIENhdGFsb2cgRmlsZSBGb3JtYXQKKworSXQgaXMgcGxhaW4gdGV4dCBmaWxlIGluIFVURi04IGVuY29kaW5nLiBFbXB0eSBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggc2hhcnAgc2lnbiAoQzwjPikgYXJlCitpZ25vcmVkLiBFQk5GIHN5bnRheCBvZiBjb250ZW50OgorCisgICAgY2F0YWxvZyAgICA9IHsgc2VjdGlvbiB9OworICAgIHNlY3Rpb24gICAgPSBoZWFkZXIgYm9keTsKKyAgICBoZWFkZXIgICAgID0gIi0qLSAiIHNlY3Rpb24taWQgIiAtKi0iICJcbiI7CisgICAgYm9keSAgICAgICA9IHsgbWVzc2FnZSB9OworICAgIG1lc3NhZ2UgICAgPSBtZXNzYWdlLWlkIHN0cmluZyAiXG4iIHsgc3RyaW5nICJcbiIgfTsKKyAgICBzZWN0aW9uLWlkID0gaWRlbnRpZmllcjsKKyAgICBtZXNzYWdlLWlkID0gIk9CU09MRVRFIiB8IGlkZW50aWZpZXI7CisgICAgaWRlbnRpZmllciA9IGxldHRlciB7IGxldHRlciB8IGRpZ2l0IHwgIl8iIH07CisgICAgc3RyaW5nICAgICA9ICIiIiB7IGNoYXJhY3RlciB9ICIiIjsKKworSWRlbnRpZmllciBzdGFydHMgd2l0aCBsZXR0ZXIsIHdpdGggZm9sbG93aW5nIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLiBJZGVudGlmaWVycyBhcmUKK2Nhc2Utc2Vuc2l0aXZlLiBTZXRpb24gaWRlbnRpZmllcnMgYXJlIGZpeGVkOiBDPE1FVEE+LCBDPFNUUklOR1M+LCBDPEZPUk1BVFM+LCBDPE1FU1NBR0VTPiBhbmQKK0M8SElOVFM+LiBNZXNzYWdlIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBzZWN0aW9uLiBTcGVjaWFsIEM8T0JTT0xFVEU+IHBzZXVkby1pZGVudGlmaWVyCittYXkgYmUgdXNlZCBtYW55IHRpbWVzLgorCitTdHJpbmcgaXMgYSBDIHN0cmluZyBsaXRlcmFsIHdoaWNoIG11c3Qgbm90IGNyb3NzIGxpbmUgYm91bmRhcmllcy4KK0xvbmcgbWVzc2FnZXMgbWF5IG9jY3VweSBtdWx0aXBsZSBsaW5lcywgYSBzdHJpbmcgcGVyIGxpbmUuCisKK01lc3NhZ2UgbWF5IGluY2x1ZGUgcHJpbnRmLWxpa2UgR05VLXN0eWxlIHBsYWNlaG9sZGVycyBmb3IgYXJndW1lbnRzOiBDPCVJPG4+JEk8dD4+LAord2hlcmUgSTxuPiBpcyBhcmd1bWVudCBudW1iZXIgKEM8MT4sIEM8Mj4sIC4uLiksCitJPHQ+IC0tIGFyZ3VtZW50IHR5cGUsIEM8cz4gKHN0cmluZykgb3IgQzxkPiAoMzItYml0IGludGVnZXIpLgorCitTZWUgYWxzbyBjb21tZW50cyBpbiBGPGkxOG4vZW5fVVMudHh0Pi4KKworPWhlYWQyIE91dHB1dCBGaWxlcworCitUaGlzIHNjcmlwdCBjYW4gZ2VuZXJhdGUgMyBkaWZmZXJlbnQgdGV4dCBmaWxlcyBmcm9tIHNpbmdsZSBzb3VyY2U6CisKKz1vdmVyCisKKz1pdGVtIEVudW0gZmlsZS4KKworRW51bSBmaWxlIGlzIGEgQyBpbmNsdWRlIGZpbGUsIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMgb2YgbWVzc2FnZSBpZGVudGlmaWVycywgZS4gZy46CisKKyAgICBlbnVtIGttcF9pMThuX2lkIHsKKworICAgICAgICAvLyBTZXQgIzEsIG1ldGEuCisgICAgICAgIGttcF9pMThuX3BycF9maXJzdCA9IDY1NTM2LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ3VhZ2UsCisgICAgICAgIGttcF9pMThuX3BycF9Db3VudHJ5LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ0lkLAorICAgICAgICBrbXBfaTE4bl9wcnBfVmVyc2lvbiwKKyAgICAgICAga21wX2kxOG5fcHJwX1JldmlzaW9uLAorICAgICAgICBrbXBfaTE4bl9wcnBfbGFzdCwKKworICAgICAgICAvLyBTZXQgIzIsIHN0cmluZ3MuCisgICAgICAgIGttcF9pMThuX3N0cl9maXJzdCA9IDEzMTA3MiwKKyAgICAgICAga21wX2kxOG5fc3RyX0Vycm9yLAorICAgICAgICBrbXBfaTE4bl9zdHJfVW5rbm93bkZpbGUsCisgICAgICAgIGttcF9pMThuX3N0cl9Ob3RBTnVtYmVyLAorICAgICAgICAuLi4KKworICAgICAgICAvLyBTZXQgIzMsIGZvdHJtYXRzLgorICAgICAgICAuLi4KKworICAgICAgICBrbXBfaTE4bl94eHhfbGFzdGVzdAorCisgICAgfTsgLy8gZW51bSBrbXBfaTE4bl9pZAorCisgICAgdHlwZWRlZiBlbnVtIGttcF9pMThuX2lkICBrbXBfaTE4bl9pZF90OworCis9aXRlbSBEZWZhdWx0IG1lc3NhZ2VzIGZpbGUuCisKK0RlZmF1bHQgbWVzc2FnZXMgZmlsZSBpcyBhIEMgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgZGVmYXVsdCBtZXNzYWdlcyB0byBiZSBlbWJlZGRlZCBpbnRvCithcHBsaWNhdGlvbiAoYW5kIHVzZWQgaWYgZXh0ZXJuYWwgbWVzc2FnZSBjYXRhbG9nIGRvZXMgbm90IGV4aXN0IG9yIGNvdWxkIG5vdCBiZSBvcGVuKToKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfbWV0YVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICJFbmdsaXNoIiwKKyAgICAgICAgICAgICJVU0EiLAorICAgICAgICAgICAgIjEwMzMiLAorICAgICAgICAgICAgIjIiLAorICAgICAgICAgICAgIjIwMDkwODA2IiwKKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfc3RyaW5nc1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgIkVycm9yIiwKKyAgICAgICAgICAgICIodW5rbm93biBmaWxlKSIsCisgICAgICAgICAgICAibm90IGEgbnVtYmVyIiwKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgTlVMTAorICAgICAgICB9OworCisgICAgLi4uCisKKz1pdGVtIE1lc3NhZ2UgZmlsZS4KKworTWVzc2FnZSBmaWxlIGlzIGFuIGlucHV0IGZvciBtZXNzYWdlIGNvbXBpbGVyLCBGPGdlbmNhdD4gb24gTGludXgqIE9TIGFuZCBPUyBYKiwgb3IgRjxtYy5leGU+IG9uCitXaW5kb3dzKiBPUy4KKworSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBMaW51eCogT1MgbWVzc2FnZSBmaWxlOgorCisgICAgJHF1b3RlICIKKyAgICAxICJKYXBhbmVzZSIKKyAgICAyICJKYXBhbiIKKyAgICAzICIxMDQxIgorICAgIDQgIjIiCisgICAgNSAiQmFzZWQgb24gRW5saXNoIG1lc3NhZ2UgY2F0YWxvZyByZXZpc2lvbiAyMDA5MDgwNiIKKyAgICAuLi4KKworRXhhbXBsZSBvZiBXaW5kb3dzKiBPUyBtZXNzYWdlIGZpbGU6CisKKyAgICBMYW5ndWFnZU5hbWVzID0gKEphcGFuZXNlPTEwMDQxOm1zZ18xMDQxKQorCisgICAgRmFjaWxpdHlOYW1lcyA9ICgKKyAgICAgcHJwPTEKKyAgICAgc3RyPTIKKyAgICAgZm10PTMKKyAgICAgLi4uCisgICAgKQorCisgICAgTWVzc2FnZUlkPTEKKyAgICBGYWNpbGl0eT1wcnAKKyAgICBMYW5ndWFnZT1KYXBhbmVzZQorICAgIEphcGFuZXNlCisgICAgLgorCisgICAgLi4uCisKKz1pdGVtIFNpZ25hdHVyZS4KKworU2lnbmF0dXJlIGlzIGEgcHJvY2Vzc2VkIHNvdXJjZSBmaWxlOiBjb21tZW50cyBzdHJpcHBlZCwgc3RyaW5ncyBkZWxldGVkLCBidXQgcGxhY2Vob2xkZXJzIGtlcHQgYW5kCitzb3J0ZWQuCisKKyAgICAtKi0gRk9STUFUUy0qLQorCisgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIEZhdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgU3lzRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJC0gJTIkcworICAgIFByYWdtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkcyAlMiRzICUzJHMgJTQkcworCitUaGUgcHVycG9zZSBvZiBzaWduYXR1cmVzIC0tIGNvbXBhcmUgdHdvIG1lc3NhZ2Ugc291cmNlIGZpbGVzIGZvciBjb21wYXRpYmlsaXR5LiBJZiBzaWduYXR1cmVzIG9mCit0d28gbWVzc2FnZSBzb3VyY2VzIGFyZSB0aGUgc2FtZSwgYmluYXJ5IG1lc3NhZ2UgY2F0YWxvZ3Mgd2lsbCBiZSBjb21wYXRpYmxlLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworR2VuZXJhdGUgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgbWVzc2FnZSBpZGVudGlmaWVyczoKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1lbnVtLWZpbGU9a21wX2kxOG5faWQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbmNsdWRlIGZpbGUgY29udGF0aW5nIGRlZmF1bHQgbWVzc2FnZXM6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tZGVmYXVsdC1maWxlPWttcF9pMThuX2RlZmF1bHQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBMaW51eCogT1MgZXhhbXBsZToKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1tZXNzYWdlLWZpbGU9cnVfUlUuVVRGLTgubXNnIHJ1X1JVLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBXaW5kb3dzKiBPUyBleGFtcGxlOgorCisgICAgPiBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLW1lc3NhZ2UtZmlsZT1ydV9SVS5VVEYtOC5tYyBydV9SVS50eHQKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL0xJQ0VOU0UgYi9maW5hbC90ZXN0c3VpdGUvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlmYjAxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL0xJQ0VOU0UKQEAgLTAsMCArMSwzNCBAQAorICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgCisgIFVuaXZlcnNpdHkgb2YgSG91c3RvbiBTeXN0ZW0KKyAgCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisgIAorICBvIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAKKyAgbyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAKKyAgbyBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG9mIEhvdXN0b24gU3lzdGVtIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAKKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LmNmZyBiL2ZpbmFsL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1NzgxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5jZmcKQEAgLTAsMCArMSw3OCBAQAorIyAtKi0gUHl0aG9uIC0qLQorCisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IHBsYXRmb3JtCisKK3RyeToKKyAgIGltcG9ydCBsaXQudXRpbAorICAgaW1wb3J0IGxpdC5mb3JtYXRzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICBwYXNzCisKKyMgbmFtZTogVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlLgorY29uZmlnLm5hbWUgPSAnT3Blbk1QVmFsaWRhdGlvblN1aXRlJworCisjIHRlc3RGb3JtYXQ6IFRoZSB0ZXN0IGZvcm1hdCB0byB1c2UgdG8gaW50ZXJwcmV0IHRlc3RzLgorY29uZmlnLnRlc3RfZm9ybWF0ID0gbGl0LmZvcm1hdHMuU2hUZXN0KGV4ZWN1dGVfZXh0ZXJuYWw9RmFsc2UpCisKKyMgc3VmZml4ZXM6IEEgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgdG8gdHJlYXQgYXMgdGVzdCBmaWxlcworIyBOb3RlIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbGl0LmxvY2FsLmNmZyBmaWxlcworY29uZmlnLnN1ZmZpeGVzID0gWycubGwnXQorCisjIHRlc3Rfc291cmNlX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgYXJlIGxvY2F0ZWQuCisjY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgPSAiL2hvbWUvaWNob3lqeC9pbnN0YWxsL29wZW5tcC90ZXN0c3VpdGUvYmluIgorI29zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKworIyB0ZXN0X2V4ZWNfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBzaG91bGQgYmUgcnVuLgorI21wdnNfb2JqX3Jvb3QgPSBnZXRhdHRyKGNvbmZpZywgJ21wdnNfb2JqX3Jvb3QnLCBOb25lKQorI2lmIG1wdnNfb2JqX3Jvb3QgaXMgbm90IE5vbmU6Citjb25maWcudGVzdF9leGVjX3Jvb3QgPSAiLi8iCisjb3MucGF0aC5qb2luKG1wdnNfb2JqX3Jvb3QsICdzcmMnKQorCisjIERpc2NvdmVyIHRoZSAnY2xhbmcnIGFuZCAnY2xhbmdjYycgdG8gdXNlLgorCitpbXBvcnQgb3MKKworZGVmIGluZmVyQ2xhbmcoUEFUSCk6CisgICAgIyBEZXRlcm1pbmUgd2hpY2ggY2xhbmcgdG8gdXNlLgorICAgIGNsYW5nID0gb3MuZ2V0ZW52KCdDTEFORycpCisKKyAgICAjIElmIHRoZSB1c2VyIHNldCBjbGFuZyBpbiB0aGUgZW52aXJvbm1lbnQsIGRlZmluaXRlbHkgdXNlIHRoYXQgYW5kIGRvbid0CisgICAgIyB0cnkgdG8gdmFsaWRhdGUuCisgICAgaWYgY2xhbmc6CisgICAgICAgIHJldHVybiBjbGFuZworCisgICAgIyBPdGhlcndpc2UgbG9vayBpbiB0aGUgcGF0aC4KKyAgICBjbGFuZyA9IGxpdC51dGlsLndoaWNoKCdjbGFuZycsIFBBVEgpCisKKyAgICBpZiBub3QgY2xhbmc6CisgICAgICAgIGxpdF9jb25maWcuZmF0YWwoImNvdWxkbid0IGZpbmQgJ2NsYW5nJyBwcm9ncmFtLCB0cnkgc2V0dGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNMQU5HIGluIHlvdXIgZW52aXJvbm1lbnQiKQorCisgICAgcmV0dXJuIGNsYW5nCisKK2NvbmZpZy5jbGFuZyA9IGluZmVyQ2xhbmcoY29uZmlnLmVudmlyb25tZW50WydQQVRIJ10pLnJlcGxhY2UoJ1xcJywgJy8nKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCAoJyVjbGFuZycsICcgJyArIGNvbmZpZy5jbGFuZyArICcgJykgKQorCisjIFByb3BvZ2F0ZSBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRlc3QgZW52aXJvbm1lbnQuCitkZWYgYWRkRW52KG5hbWUpOgorICAgIGlmIG5hbWUgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgY29uZmlnLmVudmlyb25tZW50W25hbWVdID0gb3MuZW52aXJvbltuYW1lXQorCithZGRFbnYoJ0hPTUUnKQorYWRkRW52KCdQV0QnKQorCisKK2FkZEVudignQ19JTkNMVURFX1BBVEgnKQorYWRkRW52KCdDUExVU19JTkNMVURFX1BBVEgnKQorYWRkRW52KCdMSUJSQVJZX1BBVEgnKQorYWRkRW52KCdMRF9MSUJSQVJZX1BBVEgnKQorYWRkRW52KCdEWUxEX0xJQlJBUllfUEFUSCcpCisKKyMgQ2hlY2sgdGhhdCB0aGUgb2JqZWN0IHJvb3QgaXMga25vd24uCitpZiBjb25maWcudGVzdF9leGVjX3Jvb3QgaXMgTm9uZToKKyAgICBsaXQuZmF0YWwoJ3Rlc3QgZXhlY3V0aW9uIHJvb3Qgbm90IHNldCEnKQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnNpdGUuY2ZnLmluIGIvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQuc2l0ZS5jZmcuaW4KQEAgLTAsMCArMSwzMCBAQAorIyMgQXV0b2dlbmVyYXRlZCBieSBMTFZNL0NsYW5nIGNvbmZpZ3VyYXRpb24uCisjY29uZmlnLm1wdnNfc3JjX3Jvb3QgPSAiL2hvbWUvaWNob3lqeC9pbnN0YWxsL29wZW5tcC90ZXN0c3VpdGUvYmluL2MiCitjb25maWcubXB2c19vYmpfcm9vdCA9ICIvdG1wIgorY29uZmlnLmxsdm1fdG9vbHNfZGlyID0gIkBMTFZNX1RPT0xTX0RJUkAiCisKKworIyBOZWVkZWQgdG8gY2hlY2sgaWYgYSBoYWNrIG5lZWRzIHRvIGJlIGFwcGxpZWQKK2NvbmZpZy5sbHZtX3ZlcnNpb25fbWFqb3IgPSAiQExMVk1fVkVSU0lPTl9NQUpPUkAiCisKKyMgQ29tcGlsZXJzCisjIEZJWE1FOiB1c2UgbGx2bWNjIG5vdCBsbHZtZ2NjCitjb25maWcubGx2bWNsYW5nID0gImNsYW5nIgorCisjIEZlYXR1cmVzCitjb25maWcuZW5hYmxlX3VjbGliYyA9IFRydWUgaWYgQEVOQUJMRV9VQ0xJQkNAID09IDEgZWxzZSBGYWxzZQorY29uZmlnLmVuYWJsZV9wb3NpeF9ydW50aW1lID0gVHJ1ZSBpZiBARU5BQkxFX1BPU0lYX1JVTlRJTUVAID09IDEgZWxzZSBGYWxzZQorY29uZmlnLmhhdmVfc2VsaW51eCA9IFRydWUgaWYgQEhBVkVfU0VMSU5VWEAgPT0gMSBlbHNlIEZhbHNlCisKKyMgQ3VycmVudCB0YXJnZXQKK2NvbmZpZy50YXJnZXRfdHJpcGxlID0gIkBUQVJHRVRfVFJJUExFQCIKKworIyBMZXQgdGhlIG1haW4gY29uZmlnIGRvIHRoZSByZWFsIHdvcmsuCit0cnk6CisgIGxpdAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgIyBVc2UgbGl0X2NvbmZpZyBjbGFzcworICBsaXRfY29uZmlnLmxvYWRfY29uZmlnKGNvbmZpZywgIkBNUFZTX1NPVVJDRV9ESVJAL2xpdC5jZmciKQorZWxzZToKKyAgIyBVc2Ugb2xkIGxpdCBjbGFzcworICBsaXQubG9hZF9jb25maWcoY29uZmlnLCAiQE1QVlNfU09VUkNFX0RJUkAvbGl0LmNmZyIpCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQudG1wIGIvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQzMGZiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnRtcApAQCAtMCwwICsxIEBACisuLi9MTFZNLUlSL2xpbl8zMmUvCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvTWFrZWZpbGUgYi9maW5hbC90ZXN0c3VpdGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiYzNkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI1NCBAQAorIyBHZW5lcmFsIE1ha2VmaWxlIGNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgY29tcGlsZXIgZmxhZ3MgZm9yIHRoZSB0ZXN0cworCisjIG1vZGlmeSBDQyBhbmQgQ0ZMQUdTIGZvciBPcGVuTVAgQyBjb21waWxlcnMKKyMgbW9kaWZ5IEZDIGFuZCBGRkxBR1MgZm9yIE9wZW5NUCBGb3J0cmFuIGNvbXBpbGVycworCisKKyMgQ29udGVudDoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIDEuIEJhc2ljIHVzYWdlCisjIDIuIEdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzCisjIDMuIENvbXBpbGVyIHNlbGVjdGlvbiBhbmQgRmxhZ3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDEuIEJhc2ljIHVzYWdlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgCW1ha2UgY3Rlc3QJCWdlbmVyYXRlIGMgdGVzdCAiY3Rlc3QiCisjIAltYWtlIGZ0ZXN0CQlnZW5lcmF0ZSBmb3J0cmFuIHRlc3QgImZ0ZXN0IgorIwltYWtlIGNsZWFuCQlyZW1vdmVzIGFsbCBzb3VyY2VzIGFuZCBiaW5hcmllcworIyAJbWFrZSBjbGVhbmFsbAlyZW1vdmVzIHNvdXJjZXMsYmluYXJpZXMgYW5kIGxvZ2ZpbGVzCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDIuIEdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBGb3IgZ2VuZXJhbCB0ZXN0c3VpdGUgc2V0dGluZ3Mgc2VlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyMgb21wdHMuY29uZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMy4gQ29tcGlsZXIgc2VsZWN0aW9uIGFuZCBGbGFncworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ0xBTkcgQ29tcGlsZXIKK0NDICAgICA9IGNsYW5nCitDRkxBR1MgPSAtZm9wZW5tcCAtUyAtZW1pdC1sbHZtCitGQyAgICAgPSBnZm9ydHJhbgorRkZMQUdTID0gLWZvcGVubXAgLWxtCitGRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisKKyMgR05VIENvbXBpbGVyCisjIENDICAgICA9IGdjYworIyBDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisjIEZDICAgICA9IGdmb3J0cmFuIAorIyBGRkxBR1MgPSAtZm9wZW5tcCAtbG0KKyMgRkZMQUdTID0gLWZvcGVubXAgLWxtIC1PMworCisjIEZ1aml0c3UgQ29tcGlsZXJzOgorI0NDID0gZmNjCisjQ0ZMQUdTID0gLUtPTVAsZmFzdF9HUDI9MgorI0ZDPWZydAorI0ZGTEFHUz0tS09NUCxmYXN0X0dQMj0yIC13IC1BbSAtWDkgLUZpeGVkCisKKworIyBQR0kgY29tcGlsZXJzCisjQ0MgPSBwZ2NjCisjQ0ZMQUdTID0gLW1wCisjQ0ZMQUdTID0gLW1wIC1EVkVSQk9TRQorI0NGTEFHUyA9IC1mYXN0IC1tcAorCisjRkMgPSBwZ2Y5MAorI0ZGTEFHUyA9IC1mYXN0IC1tcAorI0ZGTEFHUyA9IC1tcCAtZworCisKKyMgSW50ZWwgY29tcGlsZXJzOgorI0NDID0gaWNjCisjQ0ZMQUdTID0gLU8zIC1pcCAtb3Blbm1wCisjQ0ZMQUdTID0gLVdhbGwgLU8wIC1vcGVubXAKKyNDRkxBR1MgPSAgLW9wZW5tcCAtbG0KKyNDRkxBR1MgPSAgLW9wZW5tcCAtbG0gLURWRVJCT1NFCisKKyNGQyA9IGlmb3J0CisjRkZMQUdTID0gLW9wZW5tcCAtbG0gLWZwcAorCisjIE9tbmkgY29tcGlsZXJzOgorI0NDID0gb21wY2MKKyNDRkxBR1MgPSAtTzMgLWxtCisKKworIyBBc3N1cmUgY29tcGlsZXJzOgorI0NDID0gYXNzdXJlYworI0NGTEFHUyA9IC1PMyAtV0FwbmFtZT1wcm9qZWN0IC1EVVNFX0FTU1VSRT0xCisjRkMgPQorI0ZGTEFHUyA9CisKKyMgTkVDOgorI0NDID0gYysrCisjQ0MgPSBzeGMrKworI0NGTEFHUyA9IC1Qb3Blbm1wCisKKyNGQz1zeGY5MAorI0ZGTEFHUz0gLVBvcGVubXAKKworCisjIEhpdGFjaGk6CisjQ0MgPSB4Y2MKKyNDRkxBR1MgPSAtTzQgLXB2ZWMgK09wIC1wYXJhbGxlbCAtb21wCisjRkMgPQorI0ZGTEFHUyA9CisKKworIyBTR0k6CisjQ0MgPSBjYworI0NGTEFHUyA9IC1tcCAtbG0KKyNGQyA9CisjRkZMQUdTID0KKworCisjIElCTSBjb21waWxlcnM6CisjQ0MgPSB4bGNfcgorI0NGTEFHUyA9IC1xc21wPW9tcCAtbG0KKworCisjRkM9eGxmOTBfcgorI0ZGTEFHUz0tcXNtcD1vbXAgLXFmaXhlZD0xMzIgLXFsYW5nbHZsPWV4dGVuZGVkCisKKworIyBTVU4gY29tcGlsZXJzCisjQ0MgPSBjYworI0NGTEFHUyA9IC1mYXN0IC14b3Blbm1wIC1sbQorCisjRkMgPWY5MAorI0ZGTEFHUyA9IC14b3Blbm1wIC1mYXN0IC1sbQorCisKKyMgb3BlbjY0IGNvbXBpbGVycworIyByZW1hcms6IC1JLiB3YXMgYSB3b3JrYXJvdW5kIGJlY2F1c2UgdGhlIGluc3RhbGxhdGlvbiBjYW1lIHdpdGhvdXQgb21wLmggZmlsZQorI0NDID0gb3BlbmNjCisjQ0ZMQUdTID0gLU8wIC1vcGVubXAgLWxtIC1JLiAtbG9tcCAtbHB0aHJlYWQKKyNDRkxBR1MgPSAtTzAgLW9wZW5tcCAtbG0gLUkgL2hvbWUvbWF0dGhldy9vcHQvdXNyL2luY2x1ZGUgLWxwdGhyZWFkCisjQ0ZMQUdTID0gLW9wZW5tcCAtbG0KKworI0ZDID0gb3BlbmY5MAorI0ZGTEFHUyA9IC1PMCAtb3Blbm1wIC1sbSAgLWxvbXAgLWxwdGhyZWFkCisKKworI1BhdGhzY2FsZSBDb21waWxlcgorI0NDID0gcGF0aGNjCisjQ0ZMQUdTID0gLW1wIC1PZmFzdCAtbG0KKworI0ZDPXBhdGhmOTAKKyNGRkxBR1M9IC1tcCAtT2Zhc3QgLWxtCisKKworI09wZW5VSCBDb21waWxlcgorI0NDID0gdWhjYworI0NGTEFHUyA9IC1tcAorCisjRkMgPSB1aGY5MAorI0ZGTEFHUyA9IC1tcAorCisjIENoZWNrIHBhdGgKK0ZJTEU9TExWTS1JUi9saXQudG1wCitDSEVDS19QQVRIPWBjYXQgJChGSUxFKWAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitoZWxwOgorCUBlY2hvICJPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSwgdjMuMCIKKwlAZWNobyAiKEMpIFVuaXZlcnNpdHkgb2YgU3R1dHRnYXJ0LCBVbml2ZXJzaXR5IG9mIEhvdXN0b24iCisJQGVjaG8gIiIKKwlAZWNobyAiRG8gbWFrZSBbcnVsZV0sIHdoZXJlIHJ1bGUgbWF5IGJlIG9uZSBvZjoiCisJQGVjaG8gIiAgY3Rlc3QiCisJQGVjaG8gIiAgICBCdWlsZCBhbmQgcnVuIHRoZSBPcGVuTVAvQyB2YWxpZGF0aW9uIHRlc3RzLiIKKwlAZWNobyAiICBmdGVzdCIKKwlAZWNobyAiICAgIEJ1aWxkIGFuZCBydW4gdGhlIE9wZW5NUC9Gb3J0cmFuIHZhbGlkYXRpb24gdGVzdHMuIgorCUBlY2hvICIgIHByaW50X2NvbXBpbGVfb3B0aW9ucyIKKwlAZWNobyAiICAgIERpc3BsYXkgdGhlIGRlZmF1bHQgY29tcGlsZXIgYW5kIGNvbXBpbGVyIG9wdGlvbnMgYmVpbmcgdGVzdGVkIgorCUBlY2hvICIgIGNsZWFuc3JjcyIKKwlAZWNobyAiICAgIFJlbW92ZSBzb3VyY2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZXMiCisJQGVjaG8gIiAgY2xlYW5iaW5zIgorCUBlY2hvICIgICAgUmVtb3ZlIGV4ZWN1dGFibGVzIGZyb20gYmluLyBkaXJlY3RvcnkiCisJQGVjaG8gIiAgY2xlYW5vdXRzIgorCUBlY2hvICIgICAgUmVtb3ZlIGFsbCAqLm91dCBmaWxlcyBmcm9tIGJpbi8gZGlyZWN0b3J5IgorCUBlY2hvICIgIGNsZWFubG9ncyIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgKi5sb2cgZmlsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbiIKKwlAZWNobyAiICAgIENsZWFuIG91dCBhbmQgbG9nIGZpbGVzIgorCUBlY2hvICIgIGRpc3RjbGVhbiIKKwlAZWNobyAiICAgIENsZWFuIGFyY2ggdGVzdCBkaXJlY3Rvcnkgd2l0aCBjbGVhbiIKKwlAZWNobyAiICB2ZXJ5Y2xlYW4iCisJQGVjaG8gIiAgICBSZW1vdmUgdGhlIGVudGlyZSBiaW4vYyBkaXJlY3Rvcnkgd2l0aCBkaXN0Y2xlYW4iCisKK29tcF9teV9zbGVlcDoKKwlta2RpciAtcCBiaW4vYworCWNwIG9tcF9teV9zbGVlcC5oIGJpbi9jLworb21wX3Rlc3RzdWl0ZTogb21wX3Rlc3RzdWl0ZS5oCisJbWtkaXIgLXAgYmluL2MKKwljcCBvbXBfdGVzdHN1aXRlLmggYmluL2MvCitvbXBfdGVzdHN1aXRlLmg6IG9tcHRzLWMuY29uZiBjLyoKKwkuL29tcHRzX21ha2VIZWFkZXIucGwgLWY9b21wdHMtYy5jb25mIC10PWMKKy5jLm86IG9tcF90ZXN0c3VpdGUgb21wX215X3NsZWVwCisJJChDQykgJChDRkxBR1MpIC1jICQ8CisKK2N0ZXN0OiBvbXBfbXlfc2xlZXAgb21wX3Rlc3RzdWl0ZQorCS4vcnVudGVzdC5wbCAtLWxhbmc9YyB0ZXN0bGlzdC1jLnR4dAorCWNkIGJpbi87IG1ha2UgLWoKKworZnRlc3Q6CisJbWtkaXIgLXAgYmluL2ZvcnRyYW4KKwljcCBvbXBfdGVzdHN1aXRlLmYgYmluL2ZvcnRyYW4KKwljcCBvbXBfbXlfc2xlZXAuZiBiaW4vZm9ydHJhbgorCS4vcnVudGVzdC5wbCAtLWxhbmc9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorCitwcmludF9jb21waWxlX29wdGlvbnM6CisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gIkMgY29tcGlsZXIiCisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gImNvbXBpbGF0aW9uOiAkKENDKSAkKENGTEFHUykiCisJQCQoQ0MpIC0tdmVyc2lvbgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJGb3J0cmFuIGNvbXBpbGVyIgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJjb21waWxhdGlvbjogJChGQykgJChGRkxBR1MpIgorCUAkKEZDKSAtLXZlcnNpb24KKworCisKK3BhdGhfdG9fYXJjaD0kKHNoZWxsIC4uL3J1bnRpbWUvdG9vbHMvY2hlY2stb3Blbm1wLXRlc3QucGwpCisKK2NsZWFuc3JjczoKKwlmaW5kIGJpbi8gLWluYW1lICIqLltjZl0iIC1leGVjIHJtIC1yZiB7fSBcOworY2xlYW5iaW5zOgorCWZpbmQgYmluL2MgLXBlcm0gL2EreCAtdHlwZSBmIC1leGVjIHJtIC1yZiB7fSBcOworCWZpbmQgLi9iaW4vYyAtbm90IC1uYW1lICIqLmMiIC1hIC1ub3QgLW5hbWUgIioubGwiIC10eXBlIGYgLWV4ZWMgcm0gLXJmIHt9IFw7CitjbGVhbm91dHM6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5vdXQiIC1leGVjIHJtIC1yZiB7fSBcOworY2xlYW5sb2dzOgorCWZpbmQgYmluLyAtaW5hbWUgIioubG9nIiAtZXhlYyBybSAtcmYge30gXDsKKwlybSAtcmYgLi8kKHBhdGhfdG9fYXJjaCkKKworY2xlYW46IGNsZWFub3V0cyBjbGVhbmxvZ3MgY2xlYW5iaW5zIGNsZWFuc3JjcworCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLXJmIGJpbi9jLyoKKwlybSAtcmYgTExWTS1JUi8kKENIRUNLX1BBVEgpCisKK3ZlcnljbGVhbjogZGlzdGNsZWFuCisJcm0gLXJmIGJpbi9jLworCXJtIC1yZiBiaW4vZm9ydHJhbi8KKworCitjbGVhbmFsbDogCisJcm0gLXJmIC4vYmluL2MvCisJcm0gLXJmIC4vYmluL2ZvcnRyYW4vCisJcm0gLXJmIC4vTExWTS1JUi8kKHBhdGhfdG9fYXJjaCkKKwlybSAtcmYgLi8kKHBhdGhfdG9fYXJjaCkKKwlybSAtcmYgLi8qLmxvZworCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9SRUFETUVfTExWTV9PUEVOTVAgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FX0xMVk1fT1BFTk1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOGNhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FX0xMVk1fT1BFTk1QCkBAIC0wLDAgKzEsNDYgQEAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8ICAgICAgICAgICAgICBUbyB1c2UgdGhlIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIGZvciB0ZXN0aW5nICAgICAgICAgICAgICAgIHwgCit8IAkJCUxMVk0gT3Blbk1QIEltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAJICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgYW5kIFRvb2xzLCAgICAgICAgICAgICAgICAgICAgIHwgCit8CQkJVW5pdmVyc2l0eSBvZiBIb3VzdG9uICAgICAgICAgIAkJCSAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFuLiAyMDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUd28gbmV3IGZpbGVzIGhhdmUgYmVlbiBhZGRlZCB0byBvcGVubXAvcnVudGltZTogY2hlY2stb3Blbm1wLnBsIGFuZCBjaGVjay1vcGVubXAtdGVzdC5wbCAKK0dvIHRvIC9vcGVubXAvcnVudGltZSwgcnVuOgorbWFrZSB0ZXN0IGNvbXBpbGVyPWNsYW5nCittYWtlIHRlc3QtY2xlYW4gIAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgT3Blbk1QLUxMVk0gUHJvamVjdCwgZm9sbG93aW5nIGFyZSB0aGUgRmlsZXMgYW5kIERpcmVjdG9yaWVzIHRvIGtub3cgYWJvdXQ6IAorCisKKyAgYyAgICAgICAgICAgICAgICAgICAgICAgICAJIERpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBjIHRlc3RzCisgIGZvcnRyYW4gICAgICAgICAgICAgICAgICAgCSBEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgRm9ydHJhbgorICBNYWtlZmlsZSAgICAgICAgICAgICAgICAgIAkgTWFrZWZpbGUgY29udGFpbmluZyBvcHRpb25zIGZvciBjb21waWxhdGlvbgorICBSRUFETUVfTExWTV9PUEVOTVAgICAgICAgICAgICAgUkVBRE1FIGZpbGUgZm9yIHRvIHVzZSB0aGUgT3Blbk1QIHRlc3Qtc3VpdGUgCisgIFJFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZSBSRUFETUUgZmlsZSBvbiB0aGUgVmFsaWRhdGlvbiBTdWl0ZSwgdGVtcGxhdGVzLCBldGMuLCAKKwkJCQkgYXMgYSBiYXNpcyBmb3IgdGVzdGluZyB0aGUgTExWTSBPcGVuTVAgaW1wbGVtZW50YXRpb24uIAorICBMTFZNX0lSCQkJIERpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC1zcGVjaWZpYyBJUiBmaWxlcworICBiaW4vbGl0IGZpbGVzCQkgICAgICAgICBJbiB0aGUgbGl0IG1vZGVsLCBldmVyeSB0ZXN0IG11c3QgZXhpc3QgaW5zaWRlIHNvbWUgdGVzdCBzdWl0ZS4gCisJCQkJIGxpdCByZXNvbHZlcyB0aGUgaW5wdXRzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIAorCQkJCSB0ZXN0IHN1aXRlcyBieSBzZWFyY2hpbmcgdXB3YXJkcyBmcm9tIHRoZSBpbnB1dCBwYXRoIAorCQkJCSB1bnRpbCBpdCBmaW5kcyBhIGxpdC5jZmcgb3IgbGl0LnNpdGUuY2ZnIGZpbGUuIAorCQkJCSBUaGVzZSBmaWxlcyBzZXJ2ZSBhcyBib3RoIGEgbWFya2VyIG9mIHRlc3Qgc3VpdGVzIGFuZCAKKwkJCQkgYXMgY29uZmlndXJhdGlvbiBmaWxlcyB3aGljaCBsaXQgbG9hZHMgaW4gb3JkZXIgdG8gCisJCQkJIHVuZGVyc3RhbmQgaG93IHRvIGZpbmQgYW5kIHJ1biB0aGUgdGVzdHMgaW5zaWRlIHRoZSB0ZXN0IHN1aXRlLgkKKyAgYmluL2hlYWRlcgkJCSBIZWFkZXIgZm9yIHRoZSB0ZXN0cywgY2FsbHMgY2xhbmcgZHJpdmVyIGZvciB0aGUgdGVzdCwgCisJCQkJIGFuZCBleGVjdXRlcyB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUJCQkKKyAgYmluL01ha2VmaWxlIAkJCSBUbyBnZW5lcmF0ZSBMTFZNX0lSIGZpbGVzIAorICBiaW4vZGlzdHJpYnV0ZS5zaCAJCSBHZW5lcmF0ZXMgTExWTV9JUiBmaWxlcywgZmluZHMgdGhlIGFyY2hpdGVjdHVyZSBhbmQgT1MsIG1vdmVzIAorCQkJCSB0aGUgZ2VuZXJhdGVkIElSIGZpbGVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZvbGRlciAKKyAgcnVudGltZS90b29scy9jaGVjay1vcGVubXAucGwgIFJldHJpZXZpbmcgdGhlIHJpZ2h0IHBhdGggCisgIHJ1bnRpbWUvdG9vbHMvCisgIGNoZWNrLW9wZW5tcC10ZXN0LnBsCQkgUmV0dXJucyB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBPUywgZS5nLiBsaW5fMzJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29udGFjdCBhbmQgU3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRhY3Q6IGh0dHA6Ly93d3cuY3MudWguZWR1L35ocGN0b29scy8KK0VtYWlsOiBzdW5pdGFAY3MudWguZWR1CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvUkVBRE1FX09wZW5NUF9WYWxpZGF0aW9uX1N1aXRlIGIvZmluYWwvdGVzdHN1aXRlL1JFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2E3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL1JFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZQpAQCAtMCwwICsxLDMzNCBAQAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3wgICAgICAgICAgICAgICAgICAgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgIFYgMy4wICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgQ2VudGVyLCBTdHV0dGdhcnQgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgIEhpZ2ggUGVyZm9ybWFuY2UgQ29tcHV0aW5nIGFuZCBUb29scywgVW5pdmVyc2l0eSBvZiBIb3VzdG9uICAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYW4uIDIwMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitUQUJMRSBPRiBDT05URU5UUworCitJICAgIAlJTlRST0RVQ1RJT04KK0kuMS4JICBBaW1zIGFuZCBnZW5lcmFsIGZ1bmN0aW9uCitJLjIuIAkgIEZpbGVzIGFuZCBkaXJlY3RvcmllcworCitJSQkJVVNBR0UKK0lJLjEuCSAgRmlyc3QgcnVuIHdpdGggbWFrZQorSUkuMgkgIFdoZXJlIHRvIHNlYXJjaCBmb3IgcmVzdWx0cworSUkuMy4JICBVc2luZyB0aGUgcnVudGVzdCBzY3JpcHQKKworSUlJCQlBZGRpbmcgYW5kIG1vZGlmeWluZyB0ZXN0cworSUlJLjEuCSAgVGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorCitJVgkJS25vd24gSXNzdWVzIGFuZCBXb3JrYXJvdW5kCisKK1YgICAgICAgQ29udGFjdCBhbmQgU3VwcG9ydAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSS4gIElOVFJPRFVDVElPTgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0kuMS4gIEFpbXMgYW5kIGdlbmVyYWwgZnVuY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBPcGVuTVAgdmFsaWRhdGlvbiBzdWl0ZSBpcyBkZXNpZ25lZCB0byB2ZXJpZnkgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24KK29mIE9wZW5NUCBpbiBjb21waWxlcnMuIEl0IGlzIGNhcGFibGUgb2YgY2hlY2tpbmcgRm9ydHJhbiBhcyB3ZWxsIGFzIGMKK2NvbXBpbGVyLgorCitUZXN0aW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBzdGF0aXN0aWNzLiBFYWNoIGRpcmVjdGl2ZSBpcyB0ZXN0ZWQKK2J5IGNvbXB1dGluZyBhbmQgdmVyaWZ5aW5nIHRoZSByZXN1bHQgd2l0aCB0aGUgYWxyZWFkeSBrbm93biB2YWx1ZS4gSW4gbW9zdAorY2FzZXMgYSB3cm9uZyBpbXBsZW1lbnRhdGlvbiBjYW4gcmVzdWx0IGluIHRoZSByaWdodCB2YWx1ZXMuIFNvIHRoZSB0ZXN0cyBhcmUKK3J1biBzZXZlcmFsIHRpbWVzLgorCitBZGRpdGlvbmFsbHksIHRoZSB2YWxpZGF0aW9uIHN1aXRlIGNyZWF0ZXMgc28gY2FsbGVkIGNyb3NzdGVzdHMgZm9yIGVhY2gKK2RpcmVjdGl2ZS4gVGhlc2UgYXJlIHRlc3RzIGluIHdoaWNoIGVpdGhlciB0aGUgZGlyZWN0aXZlIGlzIG1pc3Npbmcgb3IgdXNlZAord2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzLiBJZiB0aGlzIHNvIGNhbGxlZCBjcm9zc3Rlc3QgZmFpbHMsIHRoaXMgaW5kaWNhdGVzCitzdHJvbmdseSB0aGF0IHRoZSBwcmV2aW91cyB0ZXN0IGlzIGNhcGFibGUgb2YgdGVzdGluZyB0aGUgZGlyZWN0aXZlLgorCitMYXN0bHksIGFuIG9ycGhhbmVkIHRlc3QgaXMgYWxzbyBydW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXJlY3RpdmUgYmVpbmcKK3Rlc3RlZCBpcyBhYmxlIHRvIGNvcnJlY3RseSBydW4gd2hlbiAnb3JwaGFuZWQnIGZyb20gdGhlIG1haW4gZnVuY3Rpb24uCitFc3NlbnRpYWxseSwgdGhlIGRpcmVjdGl2ZSdzIGNvZGUgaXMgcGxhY2VkIGludG8gaXRzIG93biBmdW5jdGlvbiB3aGljaCBpcworY2FsbGVkIGR1cmluZyBleGVjdXRpb24gb2YgdGhlIG1haW4gZnVuY3Rpb24gYW5kIG9mdGVuIGluc2lkZSBhIHBhcmFsbGVsCityZWdpb24uCisKKworSS4yLiAgRmlsZXMgYW5kIGRpcmVjdG9yaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZCBjICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBjIHRlc3RzCitkIGZvcnRyYW4gICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIEZvcnRyYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cworICBNYWtlZmlsZSAgICAgICAgICAgICAgICAgIE1ha2VmaWxlIGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24KKyAgY29tbW9uX3V0aWxpdHkuZgorICBvbXBfbXlfc2xlZXAuaCAgICAgICAgICAgIHRocmVhZCBzYXZlIHNsZWVwIGZ1bmN0aW9uCisgIG9tcF90ZXN0c3VpdGUuZiAgICAgICAgICAgRm9ydHJhbiBoZWFkZXIgZmlsZQorICBvbXBfdGVzdHN1aXRlLmggICAgICAgICAgIGF1dG9nZW5lcmF0ZWQgYy1oZWFkZXIgZmlsZQorICBvbXB0cy1jLmNvbmYgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGMgdGVzdHMgYWJvdXQgaG93IG9mdGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRlc3RzIHNoYWxsIGJlIGV4ZWN1dGVkIG9yIGhvdyBsYXJnZSB0aGUgbG9vcCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMKKyAgb21wdHNfbWFrZUhlYWRlci5wbAkgICAgcGVybCBtb2R1bGUgZm9yIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGlvbiBvZiBhbiB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRhdGUgaGVhZGVyIGZpbGUKKyAgb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtCXBlcmwgbW9kdWxlIGNvbnRhaW5pbmcgZ2VuZXJhbCBmdW5jdGlvbnMgZm9yCisJCQkJICAgICAgICAgICAgdGhlIHBhcnNlci5wbCBzY3JpcHQKKyAgb21wdHNfcGFyc2VyLnBsCSAgICAgICAgc2NyaXB0IGZvciBnZW5lcmF0aW5nIHRoZSBzb3VyY2UgY29kZSBvdXQgb2YgdGhlIHRlbXBsYXRlcworICBvbXB0c19zdGFuZGFsb25lUHJvYy5jCWZyYW1ld29yayBmb3IgdGhlIGMgdGVzdHMKKyAgb21wdHNfc3RhbmRhbG9uZVByb2MuZglmcmFtZXdvcmsgZm9yIHRoZSBGb3J0cmFuIHRlc3RzCisgIFJFQURNRQkJICAgICAgICAgICAgdGhlIFJFQURNRSBmaWxlIHlvdSd2ZSBhbHJlYWR5IGZvdW5kIDstKQorICBMSUNFTlNFICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGxpY2Vuc2UgaW5mb3JtYXRpb24KKyAgcnVudGVzdC5wbAkJICAgICAgICB0aGUgZnJhbWUgcHJvZ3JhbSBvZiB0aGUgdGVzdCBzdWl0ZQorICB0ZXN0bGlzdC1mLnR4dAkgICAgICAgIHRlc3QgbGlzdCBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgdGVzdHMgZm9yIEZvcnRyYW4KKyAgdGVzdGxpc3QtYy50eHQJICAgICAgICB0ZXN0IGxpc3QgY29udGFpbmluZyB0aGUgYXZhaWxhYmxlIHRlc3RzIGZvciBjCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lJLiAgVVNBR0UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0lJLjEuIEZpcnN0IHJ1biB3aXRoIG1ha2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworWW91IGNhbiBkbyBhIGZpcnN0IHNpbXBsZSBydW4gb2YgdGhlIHRlc3RzdWl0ZSBvbmx5IGFmdGVyIG9uZSBzdGVwIG9mCitjb25maWd1cmF0aW9uOgorCisxKSBNb2RpZnkgdGhlIG9tcHRzLmNvbmYgYW5kIG9tcHRzLWMuY29uZiBmaWxlLCBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aHJlYWRzCithbmQgbnVtYmVyIG9mIHJlcGV0aXRpb25zIG9mIGVhY2ggdGVzdC4KKworMikgTW9kaWZ5IHRoZSBNYWtlZmlsZSwgdW5jb21tZW50aW5nIHRoZSBDQy9GQyBhbmQgQ0ZMQUdTL0ZGTEFHUyB2YXJpYWJsZXMgZm9yCit0aGUgY29tcGlsZXIgb2YgeW91ciBjaG9pY2UuCisKK0FuZCBub3cgeW91IGNhbiBydW4gdGhlIHRlc3RzdWl0ZSBlaXRoZXIgZm9yIGEgQyBjb21waWxlciB3aXRoOgorCis+CW1ha2UgY3Rlc3QKKworb3IgZm9yIGEgRm9ydHJhbiBjb21waWxlciB3aXRoOgorCis+CW1ha2UgZnRlc3QKKworCitJSS4yLiBSdW5uaW5nIGN1c3RvbSB0ZXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitJbiBvcmRlciB0byBydW4gc2luZ2xlIHRlc3RzIG9yIGN1c3RvbSBncm91cHMgb2YgdGVzdHMsIHR3byBtYWtlIGNvbW1tYW5kcworYXJlIGRlZmluZWQ6IG1ha2Ugc3Rlc3QgYW5kIG1ha2UgZnN0ZXN0LiBUaGVzZSB0d28gY29tbWFuZCByZWZlcmVuY2UgdGhlIGZpbGUKK2N1c3RvbXRlc3QudHh0IHdoZW4gbG9va2luZyBmb3IgYSB0ZXN0bGlzdCB0byB1c2UuIFNpbXBseSBlZGl0IGN1c3RvbXRlc3QudHh0Cit0byBpbmNsdWRlIHRoZSBkZXNpcmVkIHRlc3Qgb3IgdGVzdHMuIElmIGN1c3RvbXRlc3QudHh0IGNvbnRhaW5zIGMgdGVzdHMsCisKKz4gICAgICBtYWtlIHN0ZXN0CisKK29yIGZvciBmb3J0cmFuIHRlc3RzCisKKz4gICAgICBtYWtlIGZzdGVzdAorCitJbiBvcmRlciB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQgaW4gdGhlIHRlc3RzLCBzaW1wbHkgZWRpdCB0aGUKK01ha2VmaWxlIHZhcmlhYmxlcyBNSU5USFJFQURTIGFuZCBNQVhUSFJFQURTLiBCeSBkZWZhdWx0LCB0aGV5IGFyZSBjb25maWd1cmVkCit0byB1c2UgMiB0aHJlYWRzLiBUbyBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRlc3QgaXMgcnVuLCBmb3IgYyB0ZXN0cworZWRpdCB0aGUgUkVQRVRJVElPTlMgdmFyaWFibGUgaW4gdGhlIGZpbGUgb21wdHMtYy5jb25mLiBUaGUgTE9PUENPVU5UIGFuZAorU0xFRVBUSU1FIHZhcmlhYmxlcyBjYW4gYWxzbyBiZSBjaGFuZ2VkIGhlcmUuIEZvciBmb3J0cmFuIHRlc3RzLCBlZGl0IHRoZSBmaWxlCitvbXBfdGVzdHN1aXRlLmYgdG8gY2hhbmdlIGJvdGggdGhlIExPT1BDT1VOVCBhbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRlc3QKK2lzIHJ1bi4KKworCisKK0lJLjMuIFVuZGVyc3RhbmRpbmcgdGhlIHJlc3VsdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1doZW4gcnVubmluZyB0aGUgdGVzdHN1aXRlIHRoZSByZXN1bHRzIHdpbGwgYmUgc2hvd24gb24gdGhlIHNjcmVlbi4KKworSWYgeW91IG5lZWQgdGhlIHJlc3VsdHMgZm9yIGZ1cnRoZXIgcHVycG9zZSB5b3UgY2FuIHVzZSB0aGUgcmVzdWx0cy50eHQsIHdoaWNoCitpcyBhIHNpbXBsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgZm9yIGVhY2ggZGlyZWN0aXZlCitpbiBhIHNpbmdsZSBsaW5lLiBFYWNoIGxpbmUgc3RhcnRzIHdpdGggdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4gVGhlbiBmb2xsb3dzCit0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0IGdpdmVuIGluIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwYXNzZWQgdGVzdHMuIElmIDEwMCUgb2YKK3RoZSB0ZXN0cyBwYXNzZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgc2Vjb25kIG51bWJlciBnaXZlcyB0aGUgcmVzdWx0IG9mIHRoZQorY29ycmVzcG9uZGluZyBjcm9zc3Rlc3QuIENyb3NzdGVzdHMgd2lsbCBvbmx5IGJlIHJ1biBpZiB0aGUgbm9ybWFsIHRlc3QgcGFzc2VzCit3aXRoIDEwMCUgYWNjdXJhY3kuIElmIGEgY3Jvc3N0ZXN0IHdhcyBub3QgcnVuIG9yIGEgdGVzdCBkb2VzIG5vdCBleGlzdCwgaXQgaXMKK2Rlbm90YXRlZCBieSBhICItIi4KK0FmdGVyIHRoZSByZXN1bHRzIG9mIHRoZSBub3JtYWwgdGVzdHMsIHRoZXJlIGZvbGxvdyBhIHNlcmllcyBvZiB0ZXN0cyBpbiB0aGUKK29ycGhhbmVkIG1vZGUuIElmIHRoZXJlIHdlcmUgbm8gb3JwaGFuZWQgdGVzdHMgYXZhaWxhYmxlIHRoaXMgaXMgc2hvd24gYnkgYSAiLSIuCisKK0lmIHlvdSBydW4gdGhlIHRlc3RzdWl0ZSB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHRocmVhZHMgKGUuZy4gdXNpbmcgdGhlCitydW50ZXN0LnBsIHNjcmlwdCkgdGhlIHJlc3VsdHMgYXJlIHNob3duIGluIGJsb2NrcyBvZiA0IGNvbHVtbnMgZm9yIGVhY2ggbnVtYmVyCitvZiB0aHJlYWRzLgorCitJZiBhIHRlc3QgZmFpbHMgeW91IGNhbiBmaW5kIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gaW4gdGhlIG9tcHRzLmxvZywKK2Jpbi9jLyoub3V0IGFuZCAqLmxvZyBmaWxlcy4gV2hpbGUgdGhlIG9tcHRzLmxvZyBmaWxlIGNvbnRhaW5zIGFsbCBjb21waWxlcgorZXJyb3IgbWVzc2FnZXMgZm9yIGFsbCB0ZXN0cywgdGhlICoub3V0IGFuZCAqLmxvZyBmaWxlcyBjb250YWluIGRldGFpbGVkIGluZm9yYW10aW9uCitvbiB0aGUgZXhlY3V0aW9uIHByb2Nlc3Mgb2YgdGhlIHNpbmdsZSB0ZXN0cy4KK0luIHRoZSAqLm91dCBmaWxlcyB0aGVyZSBhcmUgbGlzdGVkIGFsbCB0aGUgcmVzdWx0cyBvZiB0aGUgc2luZ2xlIGV4ZWN1dGlvbnMgb2YKK3RoZSB0ZXN0cy4gSW4gdGhlICoubG9nIGZpbGVzIHRoZXJlIGFyZSBlcnJvciBtZXNzYWdlcyBvZiB0aGUgdGVzdHMgaXRzZWxmLgorCisKK0lJLjQuIENsZWFuaW5nIFVwCistLS0tLS0tLS0tLS0tLS0tLQorCisKK0JlY2F1c2UgbWFueSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHRlc3RlZCBkaXJlY3RpdmUsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeQordG8gY2xlYW4gdGhlIG1haW4gZGlyZWN0b3J5IGFmdGVyIGEgYmF0dGVyeSBvZiB0ZXN0cy4gVG8gY2xlYW4gYWxsIGdlbmVyYXRlZCBmaWxlcworaW4gdGhlIG1haW4gZGlyZWN0b3J5IGluY2x1ZGluZyB0aGUgcmVzdWx0cyBhbmQgbG9nIGZpbGVzLAorCis+ICAgICBtYWtlIGNsZWFuCisKKworVG8gY2xlYW4gb25seSB0aGUgbG9ncyBhbmQgb3V0IGZpbGVzLAorCis+ICAgICBtYWtlIGNsZWFubG9ncworCitUbyBjbGVhbiBvbmx5IHRoZSByZXN1bHRzLAorCis+ICAgICBtYWtlIGNsZWFucmVzdWx0cworCisKKworSUkuNC4gVXNpbmcgdGhlIHJ1bnRlc3Qgc2NyaXB0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworU28gZm9yIHNwZWNpYWwgcHVycG9zZSB5b3UgY2FuIHVzZSB0aGUgcnVudGVzdC5wbCBzY3JpcHQsIHdoaWNoIGFsbG93cyBhIGxvdAorbW9yZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uIHByb2Nlc3MgdGhhbiB0aGUgZXhlY3V0aW9uIHdpdGggbWFrZS4KKworVXNpbmcgdGhlIHJ1bnRlc3QucGwgc2NyaXB0IGlzIHJhdGhlciBlYXN5LiBZb3UgY2FuIHVzZSB0aGUgdGhlIHRlc3Qgc3VpdGUgb25seQorYWZ0ZXIgdHdvIHN0ZXBzIG9mIG1vZGlmaWNhdGlvbnM6CisKKzEuKSBNb2RpZnkgdGhlIE1ha2VmaWxlIHRvIHlvdXIgd2lzaGVzIGNob29zaW5nIHlvdXIgY29tcGlsZXIgYW5kIHRoZSBuZWNlc3NhcnkKKyAgICBjb21waWxlciBmbGFncy4KKzIuKSBJZiBuZWNlc3NhcnkgZWRpdCBvbmUgb2YgdGhlIHRlc3QgbGlzdHMgKHRlc3RsaXN0LWMudHh0KSBhbmQgY29tbWVudCBvdXQgdGhlCisgICAgdGVzdHMgeW91IGRvIG5vdCB3YW50IHRvIHJ1biB1c2luZyAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiBUZXN0bGlzdHMgZm9yIEZvcnRyYW4gZW5kCisgICAgd2l0aCAtZi50eHQgd2hpbGUgdGVzdCBsaXN0cyBmb3IgYyB3aXRoIC1jLnR4dC4KKworQW5kIG5vdyB5b3UgY2FuIHJ1biB0aGUgdGVzdCBzdWl0ZSBlaXRoZXIgZm9yIEZvcnRyYW4gdXNpbmcKKwkjCT4gIC4vcnVudGVzdC5wbCAtbGFuZz1mb3J0cmFuIC1kPWZvcnRyYW4gdGVzdGxpc3QtZi50eHQKK29yIGZvciBjCisJIwk+ICAuL3J1bnRlc3QucGwgLWxhbmc9YyAtZD1jIHRlc3RsaXN0LWMudHh0CisKK1dpdGggdGhlIC0taGVscCBvcHRpb24geW91IGNhbiBzaG93IHRoZSBjb21wbGV0ZSBsaXN0IG9mIG9wdGlvbnMgYW5kIHRoZWlyCitleHBsYW5hdGlvbnMuCisKK1RoZSB0ZXN0IHJlc3VsdHMgYXJlIHN1bW1hcml6ZWQgaW4gY3Jlc3VsdHMgb3IgZnJlc3VsdHMudHh0IHdoaWxlICoubG9nIGtlZXAKK2RldGFpbHMgZm9yIGluZGl2aWR1YWwgdGVzdHMuIFRoZXJlIGlzIGFsc28gYSBmaWxlIChvbXB0cy5sb2cpIGtlZXBpbmcKK2NvbXBpbGF0aW9uIGluZm9ybWF0aW9uLiAoc2VlIHNlY3Rpb24gSUkuMiApCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHRlc3QgdGhlIGRpcmVjdGl2ZXMgaW4gb3JwaGFuZWQgbW9kZSB5b3UgY2FuIHVzZSB0aGUKKy1ub3JwaGFuIG9wdGlvbi4gWW91IGFsc28gY2FuIHVzZSB0aGUgcnVudGVzdC5wbCBzY3JpcHQgZWl0aGVyIHRvIGNvbXBpbGUgYWxsCit0ZXN0cyBvciBydW4gY29tcGlsZWQgdGVzdHMgZS5nLiBmb3IgY3Jvc3MgY29tcGlsYXRpb24gb24gb3RoZXIgcGxhdGZvcm1zLiBGb3IKK3RoaXMgdGhlcmUgYXJlIHRoZSBvcHRpb25zIC1ub3J1biBhbmQgLW5vY29tcGlsZS4KKworSGFwcHkgdGVzdGluZyEKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSUlJLglIb3cgdG8gYWRkIG5ldyB0ZXN0cyAvIFRoZSBzdHJ1Y3R1cmUgb2YgdGVzdCB0ZW1wbGF0ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJSUkuMSAgVGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0ZXN0IHN1aXRlIGlzIGJhc2VkIG9uIHRlbXBsYXRlcyBzbyB0aGF0IHlvdSBvbmx5IGhhdmUgb25lIGZpbGUgZm9yIHRlc3QsCitjcm9zc3Rlc3QgYW5kIHRoZSBvcnBoYW5lZCB2ZXJzaW9ucyBvZiB0aGVtLgorCisJQSkgRGVzY3JpcHRpb24gb2YgdGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorCitUaGUgc3ludGF4IG9mIHRoZSB0ZW1wbGF0ZXMgaXMgbXVjaCBsaWtlIHhtbC4gU28gZWFjaCB0ZXN0IGJlZ2lucyB3aXRoCisnPG9tcHRzOnRlc3Q+JyBhbmQgZW5kcyB3aXRoICc8L29tcHRzOnRlc3Q+Jy4KKworSW4gYmV0d2VlbiB0aGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBibG9ja3MgaG9sZGluZyBpbmZvcm1hdGlvbjoKKworLSA8b21wdHM6dGVzdGRlc2NyaXB0aW9uPiA8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4gSW4gYmV0d2VlbiB0aGlzIHRhZyB5b3UgY2FuCisgIGdpdmUgYSBkZXNjcmlwdGlvbiBvbiB3aGF0IHRoZSB0ZXN0IGNoZWNrcyBhbmQgaG93IGl0IHdvcmtzLgorCistIDxvbXB0czpvbXB2ZXJzaW9uPiA8L29tcHRzOnZlcnNpb24+IFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAgT3Blbk1QLXZlcnNpb24gd2hpY2ggaW5jbHVkZXMgdGhlIHRlc3RlZCBkaXJlY3RpdmUuCisKKy0gPG9tcHRzOmRpcmVjdGl2ZT4gPC9vbXB0czpkaXJlY3RpdmU+IFVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aXZlIGhvdyBpdCBpcworICBjYWxsZWQgaW4gdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlLgorCistIDxvbXB0czpkZXBlbmRlbmNlcz4gPC9vbXB0czpkZXBlbmRlbmNlcz4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIHNwZWNpZnkgb3RoZXIKKyAgb21wIGRpcmVjdGl2ZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSBmb3IgdGhlIGNvcnJlY3QgZXhlY3V0aW9uIG9mIHlvdXIgdGVzdC4KK1RoZSBkaXJlY3RpdmVzIGhhdmUgdG8gYmUgbGlzdGVkIGJ5IHRoZWlyIGRpcmVjdGl2ZSBuYW1lcyBhcyBpdCBpcyBjYWxsZWQgaW4KK3RoZSBwcm9ncmFtbWluZyBsYW5ndWFnZS4gTXVsdGlwbGUgZGlyZWN0aXZlcyBhcmUgc2VwYXJhdGVkIGJ5ICcsJy4KKworLSA8b21wdHM6dGVzdGNvZGU+IDwvb21wdHM6dGVzdGNvZGU+IEluIHRoaXMgdGFnIHN0YW5kcyB0aGUgd2hvbGUgc291cmNlIGNvZGUKK2ZvciB0aGUgdGVzdCAvIGNyb3NzdGVzdC4gIEVhY2ggdGVzdCBoYXMgdG8gYmUgd3JpdHRlbiBhcyBhIGZ1bmN0aW9uLiBUaGUKK3N5bnRheCBvZiB0aGUgZnVuY3Rpb25zIGRpZmZlcnMgYmV0d2VlbiBDIGFuZCBGb3J0cmFuOiBJbiBDIGl0IGhhcyB0byB0YWtlIGEKK2ZpbGUgcG9pbnRlciAnRklMRSAqIGxvZ0ZpbGUnIGFuZCByZXR1cm4gYW4gaW50LiBJZiB0aGUgdGVzdCBoYXMgYmVlbiBwYXNzZWQKK3N1Y2Nlc3NmdWwgaXQgaGFzIHRvIHJldHVybiBhIHZhbHVlIHVuZXF1YWwgdG8gMC4gVGhlIGZpbGUgcG9pbnRlciBjYW4gYmUgdXNlZAordG8gd3JpdGUgaW5mb3JtYXRpb24gaW50byBhIGxvZyBmaWxlLiAgSW4gRm9ydHJhbiB0aGUgZnVuY3Rpb24gdGFrZXMgbm8KK2FyZ3VtZW50IGFuZCB0aGUgZnVuY3Rpb24gbmFtZSBtdXN0IG5vdCBleGNlZWQgWFggY2hhcmFjdGVycy4gIFRoZSByZXR1cm4gdmFsdWUKK2hhcyB0byBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlICc8dGVzdGZ1bmN0aW9ubmFtZT4nIHRhZ3MuIEl0IGhhcyB0byBiZSAxIGlmIHRoZQordGVzdCBzdWNjZWVkZWQgYW5kIDAgaWYgdGhlIHRlc3QgZmFpbGVkLiBGb3IgZGV0YWlscyBzZWUgdGhlIGV4YW1wbGUuCisKK1RvIHRlbGwgdGhlIHRlc3Qgc3VpdGUgdGhlIG5hbWUgb2YgeW91ciB0ZXN0IGZ1bmN0aW9uIHlvdSBoYXZlIHRvIGVuY2xvc2UgaXQKK2ludG8gdGhlICc8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiA8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4nIHRhZy4KKworSWYgdGhlcmUgYXJlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGVzdCBhbmQgY3Jvc3N0ZXN0IHlvdSBjYW4gdXNlIHRoZQorPG9tcHRzOmNoZWNrPiA8L29tcHRzOmNoZWNrPiBhbmQgPG9tcHRzOmNyb3NzY2hlY2s+IDwvb21wdHM6Y3Jvc3NjaGVjaz4gdGFnLgorV2hlbiBnZW5lcmF0aW5nIHRoZSB0ZXN0IHRoZSBwYXJzZXIgd2lsbCB1c2UgdGhlIGNvZGUgZW5jbG9zZWQgaW4KKzxvbXB0czpjaGVjaz4gdGFncyBhbmQgY3V0IG91dCB0aGUgY29kZSB3cml0dGVuIGluIDxvbXB0czpjcm9zc2NoZWNrPiB0YWdzLiBTbworeW91IGhhdmUgdHdvIHBvc3NpYmlsaXRpZXMgdG8gd3JpdGUgeW91ciB0ZW1wbGF0ZSBmb3IgdGVzdCBhbmQgY3Jvc3N0ZXN0OiBUaGUKK2ZpcnN0IHdheSB5b3UgY2FuIHdyaXRlIHRoZSBjb21wbGV0ZSBjb2RlIGlzIHRvIHdyaXRlIHRoZSB0ZXN0IGluIG9uZQorPG9tcHRzOmNoZWNrPiB0YWcgYW5kIGxhdGVyIHRoZSBjcm9zc3Rlc3QgaW4gb25lIDxvbXB0czpjcm9zc2NoZWNrPiB0YWcuICBUaGUKK3NlY29uZCB3YXkgaXMgdG8gd3JpdGUgYm90aCB0ZXN0cyBvbmx5IGJ5IGVuY2xvc2luZyBkaWZmZXJpbmcgcGFydHMgaW4KK2NvcnJlc3BvbmRpbmcgdGFncy4KKworVGhlIGZpcnN0IG1ldGhvZCBzaG91bGQgYmUgcHJlZmVycmVkIGlmIHRlc3QgYW5kIGNyb3NzdGVzdCBkaWZmZXIgbXVjaCBmcm9tCitlYWNoIG90aGVyLiBUaGUgc2Vjb25kIGUuZy4gaWYgeW91IG9ubHkgd2FudCB0byBjaGFuZ2UgYSBmZXcgb3B0aW9ucyBsaWtlCityZXBsYWNpbmcgYW4gb21wIHNpbmdsZXByaXZhdGUgY2xhdXNlIGJ5IGFuIG9tcCBwcml2YXRlIGNsYXVzZSBvciB0byBjdXQgb3V0CithIGRpcmVjdGl2ZSBsaWtlIG9tcCBmbHVzaC4gIFdoZW4geW91IHVzZSB0aGUgZmlyc3Qgd2F5IHlvdSBoYXZlIHRvIHRha2UgY2FyZQorb2YgdGhlIGZ1bmN0aW9uIG5hbWUhIFlvdSBoYXZlIHRvIGRlY2xhcmUgaXQgdHdpY2Ugd2l0aAorPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4hCisKKy0gPG9tcHRzOm9ycGhhbj4gPC9vbXB0czpvcnBoYW4+IFRoaXMgdGFnIGNhbiBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIGVuYWJsZQorICB5b3VyIHRlc3QgdG8gY2hlY2sgdGhlIGRpcmVjdGl2ZSBpbiBvcnBoYW4gcmVnaW9ucywgdG9vLiAgVGhlIGNvZGUgZW5jbG9zZWQKK2luIHRoaXMgcGFydCB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZAoraW5zdGVhZC4gIElmIHlvdSBoYXZlIHZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBvdXRzaWRlIHRoaXMgcmVnaW9uIHlvdSBoYXZlIHRvCitkZWNsYXJlIHRoZW0gYXMgZ2xvYmFsIHZhcmlhYmxlcyBlbmNsb3NlZCBpbiBhbiA8b21wdHM6b3JwaGFuOnZhcnM+IHRhZy4gRm9yCitmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIDxvbXB0czpvcnBoYW46dmFycz4gdGFnLgorCistIDxvbXB0czpvcnBoYW46dmFycz4gPC9vbXB0czpvcnBoYW46dmFycz4gVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IGdsb2JhbAorICB2YXJpYWJsZXMgZm9yIGFuIG9ycGhhbiByZWdpb24gd2hpY2ggYWxsb3cgdGhlIGV4Y2hhbmdlIG9mIHZhbHVlcyBiZXR3ZWVuCit0aGUgbWFpbiBwcm9ncmFtIGFuZCB0aGUgb3JwaGFuZWQgZnVuY3Rpb25zLiBUaGUgdXNhZ2UgZGlmZmVycyBiZXR3ZWVuIEMgYW5kCitGb3J0cmFuLiAgSW4gQyB5b3UgaGF2ZSB0byB1c2UgYSBzaW5nbGUgZGVjbGFyYXRpb24gZm9yIGVhY2ggdmFyaWFibGUuIFlvdSBjYW4KK2VpdGhlciBkZWNsYXJlIGFsbCB2YXJpYWJsZXMgaW4gb25lIHNpbmdsZSBvciBpbiBzZXZlcmFsIGRpZmZlcmVudCByZWdpb25zLiBZb3UKK211c3Qgbm90IGluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyBpbnNpZGUhICBJbiBGb3J0cmFuIHlvdSBoYXZlIHRvIHB1dCBhbGwKK2RlY2xhcmF0aW9ucyBpbiBvbmUgc2luZ2xlIHRhZy4gQmVjYXVzZSB0aGVyZSBleGlzdCBubyBnbG9iYWwgdmFyaWFibGVzIGFzIGluCitDIHlvdSBoYXZlIHRvIHVzZSBjb21tb24gYmxvY2tzLiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgdGhlIGV4YW1wbGVzLgorCitJSUkuMi4gIEFkZGluZyB0ZXN0cyB0byB0aGUgdGVzdCBsaXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIG5ldyB0ZXN0IHlvdSBoYXZlIHRvIGFkZCB0aGVtIHRvIGEgdGVzdGxpc3QuIFNpbXBseQorYWRkIHRoZSBmdW5jdGlvbiBuYW1lIGluIGEgbmV3IExpbmUgaW50byBhIGZpbGUuCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitJVi4gICBLbm93biBJc3N1ZXMgYW5kIFdvcmthcm91bmQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgU3VuIE9TIGhhcyBhIHByb2JsZW0gd2l0aCB0aGUgLW1heGRlcHRoIG9wdGlvbiBvbiB0aGUgJ21ha2UgY2xlYW5hbGwnCitjb21tYW5kLiBUaGlzIHByZXZlbnRzIHRoZSB0ZXN0cyBmcm9tIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkKK2FuZCBjYW4gY2F1c2UgcHJvYmxlbXMgd2l0aCBmdXR1cmUgdGVzdHMuIFRvIHJlbWVkeSwgZWRpdCB0aGUgbWFrZWZpbGUgbGluZQordW5kZXIgdGhlIGNsZWFuIGNvbW1hbmQ6CisKKyAgICAgLXJtIFtjZl10ZXN0Ki5bY2ZdIFtjZl1jcm9zc3Rlc3QqLltjZl0gW2NmXWN0ZXN0Ki5bY2ZdIFtjZl1vcnBoYW4qLltjZl0KKworQ2hhbmdlIHRvOgorCisgICAgIC1ybSBbY2ZddGVzdCogW2NmXWNyb3NzdGVzdCogW2NmXWN0ZXN0KiBbY2Zdb3JwaGFuKgorCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1YuICAgQ29udGFjdCBhbmQgU3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRhY3Q6IGh0dHA6Ly93d3cuY3MudWguZWR1L35ocGN0b29scwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2FkZGluZ194ZmFpbHMucHkgYi9maW5hbC90ZXN0c3VpdGUvYWRkaW5nX3hmYWlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYWQ0OGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2FkZGluZ194ZmFpbHMucHkKQEAgLTAsMCArMSwzMiBAQAorCitpbXBvcnQgb3MKK2ltcG9ydCBjb21tYW5kcworCitwZXJsID0gIi91c3IvYmluL3BlcmwiCitMTFZNID0gIi4vTExWTS1JUi8iCit0ZW1wX2ZpbGVuYW1lID0gInRlbXAiCitYRkFJTF90ZXh0ID0gIjsgWEZBSUw6ICpcbiIKKworCithcmNoX2ZpbGVfbGlzdCA9IGRpY3QoKQorYXJjaF9maWxlX2xpc3RbJ2xpbl8zMmUnXSA9IFsndGVzdF9vbXBfdGFza19maW5hbC5sbCcsICd0ZXN0X29tcF90YXNrX3VudGllZC5sbCddCisKKworYXJjaF9zY3JpcHQgPSAiLi4vcnVudGltZS90b29scy9jaGVjay1vcGVubXAtdGVzdC5wbCIKK2FyY2hfY21kID0gcGVybCArICIgIiArIGFyY2hfc2NyaXB0CithcmNoID0gY29tbWFuZHMuZ2V0b3V0cHV0KGFyY2hfY21kKQorYXJjaCA9IGFyY2hbOmxlbihhcmNoKS0xXQorCitwcmludCAiQWRkaW5nIFhGQUlMUyAuLi4iCisKK2ZvciBmIGluIGFyY2hfZmlsZV9saXN0W2FyY2hdOgorCWZpbGVuYW1lID0gTExWTSArIGFyY2ggKyAiLyIgKyBmCisJbGluZXMgPSBvcGVuKGZpbGVuYW1lKS5yZWFkbGluZXMoKQorCWxpbmVzLmluc2VydCgxLCBYRkFJTF90ZXh0KQorCWYyID0gb3Blbih0ZW1wX2ZpbGVuYW1lLCAidyIpCisJZm9yIGwgaW4gbGluZXM6CisJCWYyLndyaXRlKGwpCisJZjIuY2xvc2UoKQorCisJb3Muc3lzdGVtKCJtdiAiICsgdGVtcF9maWxlbmFtZSArICIgIiArIGZpbGVuYW1lKQorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYmluL01ha2VmaWxlIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJkM2JhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitDQyAgICAgPSBjbGFuZworQ0ZMQUdTID0gLWZvcGVubXAgLVMgLWVtaXQtbGx2bQorSU5DTCA9CitMSUJTID0KKworQklOID0KK1NSQ19ESVIgPSAuL2MKK1NSQ19GSUxFUyA6PSAkKGZvcmVhY2ggRElSLCAkKFNSQ19ESVIpLCAkKHdpbGRjYXJkICQoU1JDX0RJUikvKi5jKSkKK09CSlMgOj0gJChwYXRzdWJzdCAlLmMsICUubywgJChTUkNfRklMRVMpKQorVEFSR0VUTElTVCA6PSAkKHBhdHN1YnN0ICUuYywgJSwgJChTUkNfRklMRVMpKQorCithbGw6JChUQVJHRVRMSVNUKQorCS4vZGlzdHJpYnV0ZS5zaAorCUAgZWNobyBhbGwgZG9uZQorCisuUEhPTlk6IGNsZWFuCisKKyQoVEFSR0VUTElTVCk6ICQoU1JDX0ZJTEVTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExJQlMpICQoSU5DTCkgJEAuYyAtbyAkQC5sbAorCitjbGVhbjoKKwlAIHJtIC1yZiBjLyoKKwlAIGVjaG8gY2xlYW4gYmluIGRvbmUKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vZGlzdHJpYnV0ZS5zaCBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vZGlzdHJpYnV0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYmIwZjVmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9kaXN0cmlidXRlLnNoCkBAIC0wLDAgKzEsMTI1IEBACisjIS9iaW4vYmFzaAorCisjIGFkZCBoZWFkZXIgZm9yIC5sbCBmaWxlcworCisjIGdldCB0bXAgaGVhZGVyCitjcCBoZWFkZXIgL3RtcC90bXAuaGVhZGVyCitlY2hvID4+IC90bXAvdG1wLmhlYWRlcgorCisjIGNyZWF0ZSB0ZW1wb3JhcnkgdGVzdCBwYWNrYWdlCitta2RpciBjLSRNQUNIVFlQRSRPU1RZUEUKK2BjcCBjLyoubGwgYy0kTUFDSFRZUEUkT1NUWVBFL2AKKworIyBhZGQgbmV3IGhlYWRlciBpbnRvIC5sbCBmaWxlcworZm9yIGZpbGUgaW4gYy0kTUFDSFRZUEUkT1NUWVBFLyoKK2RvCisgICAgY3AgJGZpbGUgL3RtcC90bXAubGwuYmYKKyAgICBjYXQgL3RtcC90bXAuaGVhZGVyIC90bXAvdG1wLmxsLmJmID4gL3RtcC90bXAubGwKKyAgICBtdiAvdG1wL3RtcC5sbCAkZmlsZQorZG9uZQorCisKKyMgaW4gYmluLywgdGFyZ2V0IGlzIC4uL0xMVk0tSVIvQVJDSC9PUworTEVWRUw9Li4vTExWTS1JUi8KK0FSQ0hfUEFUSD0uLi9MTFZNLUlSLworT1NfUEFUSD0uLi9MTFZNLUlSLworCisjIGZvciBsaW51eCBzeXN0ZW0sIGFkZCB5b3VyIGFyY2ggYW5kIG9zIGhlcmUKK2RlY2xhcmUgLWEgQVJDSGVzPSh4ODYgeDg2XzY0IHBvd2VycGMgYXJtIG1pcHMgZGFyd2luKQorZGVjbGFyZSAtYSBPU2VzPShsaW51eCBtYWNvc3ggd2luZG93cyBkYXJ3aW4pCisKK2RlY2xhcmUgbG93ZXJBUkNICitkZWNsYXJlIGxvd2VyT1MKKworIyB0YXJnZXQgZGlyZWN0b3J5IG5hbWUKK2RlY2xhcmUgdXBwZXJBUkNICitkZWNsYXJlIHVwcGVyT1MKKworbG93ZXJBUkNIPSQoZWNobyAiJE1BQ0hUWVBFIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQorbG93ZXJPUz0kKGVjaG8gIiRPU1RZUEUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCisKKyMgQVJDSAorZm9yIGkgaW4gJHtBUkNIZXNbQF19CitkbworICAgIHJlc3VsdD0kKGVjaG8gIiR7bG93ZXJBUkNIfSIgfCBncmVwICRpKQorICAgIGlmIFtbICIkcmVzdWx0IiAhPSAiIiBdXQorICAgIHRoZW4KKyAgICAgICAgIyB1cHBlckFSQ0g9JGkKKwkJdXBwZXJBUkNIPSQoZWNobyAiJGkiIHwgdHIgJ1s6bG93ZXI6XScgJ1s6dXBwZXI6XScpCisgICAgZmkKK2RvbmUKKworaWYgW1sgIiR1cHBlckFSQ0giID09ICIiIF1dCit0aGVuCisgICAgZWNobyAiTm90IGZvdW5kICR7bG93ZXJBUkNIfSBpbiB0aGUgWyR7QVJDSGVzW0BdfV0hIgorICAgIGV4aXQKK2ZpCisKKyMgT1MKK2ZvciBpIGluICR7T1Nlc1tAXX0KK2RvCisgICAgcmVzdWx0PSQoZWNobyAiJHtsb3dlck9TfSIgfCBncmVwICRpKQorICAgIGlmIFtbICIkcmVzdWx0IiAhPSAiIiBdXQorICAgIHRoZW4KKyAgICAgICAgIyB1cHBlck9TPSRpCisJCXVwcGVyT1M9JChlY2hvICIkaSIgfCB0ciAnWzpsb3dlcjpdJyAnWzp1cHBlcjpdJykKKyAgICBmaQorZG9uZQorCitpZiBbWyAiJHVwcGVyT1MiID09ICIiIF1dCit0aGVuCisgICAgZWNobyAiTm90IGZvdW5kICR7bG93ZXJPU30gaW4gdGhlIFske09TZXNbQF19XSEiCisgICAgZXhpdAorZmkKKworIyBzdXJ2aXZlZCwgYXNzZW1ibGUgdGhlIHBhdGgKKyMgQVJDSF9QQVRIKz0kdXBwZXJBUkNILworIyBPU19QQVRIKz0kdXBwZXJBUkNILyR1cHBlck9TLworQVJDSF9uZXdGb3JtYXQ9LgoraWYgWyAkdXBwZXJBUkNIID0gIlg4NiIgXTsgdGhlbgorICAgIEFSQ0hfbmV3Rm9ybWF0PTMyCitlbHNlCisgICAgQVJDSF9uZXdGb3JtYXQ9MzJlCitmaQorT1NfbmV3Rm9ybWF0PS4KK2lmIFsgJHVwcGVyT1MgPSAiTElOVVgiIF07IHRoZW4KKyAgICBPU19uZXdGb3JtYXQ9bGluCitlbGlmIFsgJHVwcGVyT1MgPSAiTUFDT1NYIiBdOyB0aGVuCisgICAgT1NfbmV3Rm9ybWF0PW1hYworZWxpZiBbICR1cHBlck9TID0gIldJTkRPV1MiIF07IHRoZW4KKyAgICBPU19uZXdGb3JtYXQ9d2luCitlbGlmIFsgJHVwcGVyT1MgPSAiREFSV0lOIiBdOyB0aGVuCisgICAgT1NfbmV3Rm9ybWF0PWRhcgorZWxzZQorICAgIE9TX25ld0Zvcm1hdD11bmtub3duCitmaQorT1NfUEFUSCs9JE9TX25ld0Zvcm1hdCJfIiRBUkNIX25ld0Zvcm1hdAorCisjIHRlc3QgYW5kIGNyZWF0ZSBkaXJlY3RvcnkKK2lmIFsgISAtZCAiJExFVkVMIiBdOyB0aGVuCisgICAgbWtkaXIgJExFVkVMCisgICAgbWtkaXIgJE9TX1BBVEgKK2Vsc2UKKyAgICBpZiBbICEgLWQgIiRPU19QQVRIIiBdOyB0aGVuCisgICAgICAgIG1rZGlyICRPU19QQVRICisgICAgZmkKK2ZpCisKKyMgcmVzZXJ2ZSB0aGUgdG1wIHBhdGggdG8gTExWTS1JUi9BUkNIL09TCitlY2hvICRPU19QQVRIIi8iID4gbGl0LnRtcAorCisjIE9TX0FSQ0g9JE9TX25ld0Zvcm1hdCJfIiRBUkNIX25ld0Zvcm1hdAorIyBlY2hvIC1lICJpZiBub3QgJyRPU19BUkNIJyBpbiBjb25maWcucm9vdC50YXJnZXRzOiIgPiAkT1NfUEFUSCcvJ2xpdC5sb2NhbC5jZmcKKyMgZWNobyAtZSAiXHRjb25maWcudW5zdXBwb3J0ZWQgPSBUcnVlIiA+PiAkT1NfUEFUSCcvJ2xpdC5sb2NhbC5jZmcKKworIyBjb3B5ICoubGwgZmlsZXMgdG8gQVJDSC9PUworYGNwIGxpdC4qICRMRVZFTGAKKworIyBvbWl0IG9ycGggdGVzdAorYHJtIGMtJE1BQ0hUWVBFJE9TVFlQRS9jdGVzdF8qLmxsYAorYHJtIGMtJE1BQ0hUWVBFJE9TVFlQRS9vcnBoX2N0ZXN0XyoubGxgCitgY3AgYy0kTUFDSFRZUEUkT1NUWVBFLyoubGwgJE9TX1BBVEhgCisKKyMgY2xlYW4KK2BybSAvdG1wL3RtcC4qYAorcm0gLXJmIGMtJE1BQ0hUWVBFJE9TVFlQRS8KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vaGVhZGVyIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9oZWFkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0MWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vaGVhZGVyCkBAIC0wLDAgKzEsNiBAQAorOyBSVU46ICVjbGFuZyAtbG9tcCAtbG0gJXMgLW8gJXQgJiYgJXQgMj4mMSB8IEZpbGVDaGVjayAlcworOyBDSEVDSy1OT1Q6IFRlc3QgZmFpbGVkCis7IENIRUNLOiBEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzCisKKworCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC5jZmcgYi9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1NzgxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LmNmZwpAQCAtMCwwICsxLDc4IEBACisjIC0qLSBQeXRob24gLSotCisKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ2xpdCcgdGVzdCBydW5uZXIuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHJlCitpbXBvcnQgcGxhdGZvcm0KKwordHJ5OgorICAgaW1wb3J0IGxpdC51dGlsCisgICBpbXBvcnQgbGl0LmZvcm1hdHMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgIHBhc3MKKworIyBuYW1lOiBUaGUgbmFtZSBvZiB0aGlzIHRlc3Qgc3VpdGUuCitjb25maWcubmFtZSA9ICdPcGVuTVBWYWxpZGF0aW9uU3VpdGUnCisKKyMgdGVzdEZvcm1hdDogVGhlIHRlc3QgZm9ybWF0IHRvIHVzZSB0byBpbnRlcnByZXQgdGVzdHMuCitjb25maWcudGVzdF9mb3JtYXQgPSBsaXQuZm9ybWF0cy5TaFRlc3QoZXhlY3V0ZV9leHRlcm5hbD1GYWxzZSkKKworIyBzdWZmaXhlczogQSBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byB0cmVhdCBhcyB0ZXN0IGZpbGVzCisjIE5vdGUgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBsaXQubG9jYWwuY2ZnIGZpbGVzCitjb25maWcuc3VmZml4ZXMgPSBbJy5sbCddCisKKyMgdGVzdF9zb3VyY2Vfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBhcmUgbG9jYXRlZC4KKyNjb25maWcudGVzdF9zb3VyY2Vfcm9vdCA9ICIvaG9tZS9pY2hveWp4L2luc3RhbGwvb3Blbm1wL3Rlc3RzdWl0ZS9iaW4iCisjb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCisjIHRlc3RfZXhlY19yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIHNob3VsZCBiZSBydW4uCisjbXB2c19vYmpfcm9vdCA9IGdldGF0dHIoY29uZmlnLCAnbXB2c19vYmpfcm9vdCcsIE5vbmUpCisjaWYgbXB2c19vYmpfcm9vdCBpcyBub3QgTm9uZToKK2NvbmZpZy50ZXN0X2V4ZWNfcm9vdCA9ICIuLyIKKyNvcy5wYXRoLmpvaW4obXB2c19vYmpfcm9vdCwgJ3NyYycpCisKKyMgRGlzY292ZXIgdGhlICdjbGFuZycgYW5kICdjbGFuZ2NjJyB0byB1c2UuCisKK2ltcG9ydCBvcworCitkZWYgaW5mZXJDbGFuZyhQQVRIKToKKyAgICAjIERldGVybWluZSB3aGljaCBjbGFuZyB0byB1c2UuCisgICAgY2xhbmcgPSBvcy5nZXRlbnYoJ0NMQU5HJykKKworICAgICMgSWYgdGhlIHVzZXIgc2V0IGNsYW5nIGluIHRoZSBlbnZpcm9ubWVudCwgZGVmaW5pdGVseSB1c2UgdGhhdCBhbmQgZG9uJ3QKKyAgICAjIHRyeSB0byB2YWxpZGF0ZS4KKyAgICBpZiBjbGFuZzoKKyAgICAgICAgcmV0dXJuIGNsYW5nCisKKyAgICAjIE90aGVyd2lzZSBsb29rIGluIHRoZSBwYXRoLgorICAgIGNsYW5nID0gbGl0LnV0aWwud2hpY2goJ2NsYW5nJywgUEFUSCkKKworICAgIGlmIG5vdCBjbGFuZzoKKyAgICAgICAgbGl0X2NvbmZpZy5mYXRhbCgiY291bGRuJ3QgZmluZCAnY2xhbmcnIHByb2dyYW0sIHRyeSBzZXR0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xBTkcgaW4geW91ciBlbnZpcm9ubWVudCIpCisKKyAgICByZXR1cm4gY2xhbmcKKworY29uZmlnLmNsYW5nID0gaW5mZXJDbGFuZyhjb25maWcuZW52aXJvbm1lbnRbJ1BBVEgnXSkucmVwbGFjZSgnXFwnLCAnLycpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoICgnJWNsYW5nJywgJyAnICsgY29uZmlnLmNsYW5nICsgJyAnKSApCisKKyMgUHJvcG9nYXRlIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGVzdCBlbnZpcm9ubWVudC4KK2RlZiBhZGRFbnYobmFtZSk6CisgICAgaWYgbmFtZSBpbiBvcy5lbnZpcm9uOgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSBvcy5lbnZpcm9uW25hbWVdCisKK2FkZEVudignSE9NRScpCithZGRFbnYoJ1BXRCcpCisKKworYWRkRW52KCdDX0lOQ0xVREVfUEFUSCcpCithZGRFbnYoJ0NQTFVTX0lOQ0xVREVfUEFUSCcpCithZGRFbnYoJ0xJQlJBUllfUEFUSCcpCithZGRFbnYoJ0xEX0xJQlJBUllfUEFUSCcpCithZGRFbnYoJ0RZTERfTElCUkFSWV9QQVRIJykKKworIyBDaGVjayB0aGF0IHRoZSBvYmplY3Qgcm9vdCBpcyBrbm93bi4KK2lmIGNvbmZpZy50ZXN0X2V4ZWNfcm9vdCBpcyBOb25lOgorICAgIGxpdC5mYXRhbCgndGVzdCBleGVjdXRpb24gcm9vdCBub3Qgc2V0IScpCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC5zaXRlLmNmZy5pbiBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC5zaXRlLmNmZy5pbgpAQCAtMCwwICsxLDMwIEBACisjIyBBdXRvZ2VuZXJhdGVkIGJ5IExMVk0vQ2xhbmcgY29uZmlndXJhdGlvbi4KKyNjb25maWcubXB2c19zcmNfcm9vdCA9ICIvaG9tZS9pY2hveWp4L2luc3RhbGwvb3Blbm1wL3Rlc3RzdWl0ZS9iaW4vYyIKK2NvbmZpZy5tcHZzX29ial9yb290ID0gIi90bXAiCitjb25maWcubGx2bV90b29sc19kaXIgPSAiQExMVk1fVE9PTFNfRElSQCIKKworCisjIE5lZWRlZCB0byBjaGVjayBpZiBhIGhhY2sgbmVlZHMgdG8gYmUgYXBwbGllZAorY29uZmlnLmxsdm1fdmVyc2lvbl9tYWpvciA9ICJATExWTV9WRVJTSU9OX01BSk9SQCIKKworIyBDb21waWxlcnMKKyMgRklYTUU6IHVzZSBsbHZtY2Mgbm90IGxsdm1nY2MKK2NvbmZpZy5sbHZtY2xhbmcgPSAiY2xhbmciCisKKyMgRmVhdHVyZXMKK2NvbmZpZy5lbmFibGVfdWNsaWJjID0gVHJ1ZSBpZiBARU5BQkxFX1VDTElCQ0AgPT0gMSBlbHNlIEZhbHNlCitjb25maWcuZW5hYmxlX3Bvc2l4X3J1bnRpbWUgPSBUcnVlIGlmIEBFTkFCTEVfUE9TSVhfUlVOVElNRUAgPT0gMSBlbHNlIEZhbHNlCitjb25maWcuaGF2ZV9zZWxpbnV4ID0gVHJ1ZSBpZiBASEFWRV9TRUxJTlVYQCA9PSAxIGVsc2UgRmFsc2UKKworIyBDdXJyZW50IHRhcmdldAorY29uZmlnLnRhcmdldF90cmlwbGUgPSAiQFRBUkdFVF9UUklQTEVAIgorCisjIExldCB0aGUgbWFpbiBjb25maWcgZG8gdGhlIHJlYWwgd29yay4KK3RyeToKKyAgbGl0CitleGNlcHQgTmFtZUVycm9yOgorICAjIFVzZSBsaXRfY29uZmlnIGNsYXNzCisgIGxpdF9jb25maWcubG9hZF9jb25maWcoY29uZmlnLCAiQE1QVlNfU09VUkNFX0RJUkAvbGl0LmNmZyIpCitlbHNlOgorICAjIFVzZSBvbGQgbGl0IGNsYXNzCisgIGxpdC5sb2FkX2NvbmZpZyhjb25maWcsICJATVBWU19TT1VSQ0VfRElSQC9saXQuY2ZnIikKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LnRtcCBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQzMGZiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9saXQudG1wCkBAIC0wLDAgKzEgQEAKKy4uL0xMVk0tSVIvbGluXzMyZS8KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODNhOTczCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2MvaGFzX29wZW5tcC5jCkBAIC0wLDAgKzEsMzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgT3Blbk1wIHN1cHBvcnQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPl9PUEVOTVA8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5oYXNfb3Blbm1wPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHJ2YWx1ZSA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIDxvbXB0czpvcnBoYW4+CisgICAgPG9tcHRzOmNoZWNrPgorI2lmZGVmIF9PUEVOTVAKKwlydmFsdWUgPSAxOworI2VuZGlmCisgICAgPC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyNpZiAwCisJcnZhbHVlID0gMTsKKyNlbmRpZgorICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgIDwvb21wdHM6b3JwaGFuPgorCXJldHVybiAocnZhbHVlKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyZDFhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9hdG9taWMuYwpAQCAtMCwwICsxLDQzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgYXRvbWljIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3Agd2l0aCBhbiBhdG9taWMgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgYXRvbWljPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9hdG9taWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworICAgICAgICBpbnQgZGlmZjsKKyAgICAgICAgZG91YmxlIGRzdW0gPSAwOworICAgICAgICBkb3VibGUgZHQgPSAwLjU7CS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgICAgICAgZG91YmxlIGRkaWZmOworICAgICAgICBpbnQgcHJvZHVjdDsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGludCAqbG9naWNzOworICAgICAgICBpbnQgYml0X2FuZCA9IDE7CisgICAgICAgIGludCBiaXRfb3IgPSAwOworICAgICAgICBpbnQgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAJLyogZHReRE9VQkxFX0RJR0lUUyAqLworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKyAgICBpbnQgajsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBrbm93bl9kaWZmOworICAgIGludCBrbm93bl9wcm9kdWN0OworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBsb2dpY19hbmQgPSAxOworICAgIGludCBsb2dpY19vciA9IDA7CisgICAgZG91YmxlIGRrbm93bl9zdW07CisgICAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7CisgICAgZG91YmxlIGRwdCwgZGl2OworICAgIGludCBsb2dpY3NBcnJheVtMT09QQ09VTlRdOworICAgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworICAgIAorICAgIHN1bSA9IDA7CisgICAgZGlmZiA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisJICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisJCXN1bSArPSBpOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICBpZiAoa25vd25fc3VtICE9IHN1bSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsIAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsIAorICAgICAgICAgICAgICAgICBzdW0sIGtub3duX3N1bSk7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKyAgICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAgIAorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIGRpZmYgLT0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGtub3duX2RpZmYgPSAoKExPT1BDT1VOVCAtIDEpICogTE9PUENPVU5UKSAvIDIgKiAtMTsKKyAgICBpZiAoZGlmZiAhPSBrbm93bl9kaWZmKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLAorICAgICAgICAgICAgICAgZGlmZik7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworICAgIC8qIFRlc3RzIGZvciBkb3VibGVzICovCisgICAgZHN1bSA9IDA7CisgICAgZHB0ID0gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisgICAgICB7CisgICAgICAgIGRwdCAqPSBkdDsKKyAgICAgIH0KKyAgICBka25vd25fc3VtID0gKDEgLSBkcHQpIC8gKDEgLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZHN1bSArPSBwb3cgKGR0LCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGRzdW0gIT0gZGtub3duX3N1bSAmJiAoZmFicyAoZHN1bSAtIGRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IpKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgICAgICAgICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bSAtIGRrbm93bl9zdW0pOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICBkcHQgPSAxOworCisgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikKKyAgICB7CisgICAgICAgIGRwdCAqPSBkdDsKKyAgICB9CisgICAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICB7CisgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZGRpZmYgLT0gcG93IChkdCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9IAorICAgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwKKyAgICAgICAgICAgICAgICAgZGRpZmYpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgCisgICAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgICAgaWYgKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBwcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgcHJvZHVjdCwga25vd25fcHJvZHVjdCk7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworICAgIHByb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBwcm9kdWN0IC89IGk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAocHJvZHVjdCAhPSAxKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHByb2R1Y3QgZGl2aXNpb24gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDFcbiIsCisgICAgICAgICAgICAgICAgIHByb2R1Y3QpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisgICAgCisgICAgZGl2ID0gNS4wRSs1OworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZGl2IC89IGk7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZhYnMoZGl2LTAuMTM3Nzg3KSA+PSAxLjBFLTQgKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBkaXZpc2lvbiB3aXRoIGRvdWJsZTogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mIDAuMTM3Nzg3XG4iLCBkaXYpOworICAgIH0KKworICAgIHggPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gTE9PUENPVU5UKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiArK1xuIik7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeC0tOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoeCAhPSAwKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiAtLVxuIik7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorICAgIHsKKyAgICAgICAgbG9naWNzW2pdID0gMTsKKyAgICB9CisgICAgYml0X2FuZCA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9hbmQgJj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKCFiaXRfYW5kKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgYml0X2FuZCA9IDE7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9hbmQgJj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X2FuZCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDA7CisgICAgfQorICAgIGJpdF9vciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfb3IgfD0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X29yKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisgICAgYml0X29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIWJpdF9vcikKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgaisrKQorICAgIHsKKyAgICAgICAgbG9naWNzW2pdID0gMDsKKyAgICB9CisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+IAorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciBePSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKGV4Y2x1c2l2X2JpdF9vcikgCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKyAgICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICghZXhjbHVzaXZfYml0X29yKSAKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisgICAgeCA9IDE7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIHggPDw9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICggeCAhPSAxMDI0KQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiA8PFxuIik7CisgICAgICAgIHggPSAxMDI0OworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeCA+Pj0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gMSkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gPj5cbiIpOworICAgIH0KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9iYXJyaWVyLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjY5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGJhcnJpZXIgZGlyZWN0aXZlLiBUaGUgdGVzdCBjcmVhdGVzIHNldmVyYWwgdGhyZWFkcyBhbmQgc2VuZHMgb25lIG9mIHRoZW0gc2xlZXBpbmcgYmVmb3JlIHNldHRpbmcgYSBmbGFnLiBBZnRlciB0aGUgYmFycmllciB0aGUgb3RoZXIgb25lcyBkbyBzb21lIGxpdHRsZSB3b3JrIGRlcGVuZGluZyBvbiB0aGUgZmxhZy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGJhcnJpZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYmFycmllcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCByZXN1bHQxOworCWludCByZXN1bHQyOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICByZXN1bHQxID0gMDsKKyAgICByZXN1bHQyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgPG9tcHRzOm9ycGhhbj4KKwlpbnQgcmFuazsKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCWlmIChyYW5rID09MSkgeworICAgICAgICBteV9zbGVlcChTTEVFUFRJTUVfTE9ORyk7CisgICAgICAgIHJlc3VsdDIgPSAzOworCX0KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBiYXJyaWVyPC9vbXB0czpjaGVjaz4KKwlpZiAocmFuayA9PSAyKSB7CisJICAgIHJlc3VsdDEgPSByZXN1bHQyOworCX0KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgcHJpbnRmKCJyZXN1bHQxPSVkXG4iLHJlc3VsdDEpOworICAgIHJldHVybiAocmVzdWx0MSA9PSAzKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfY3JpdGljYWwuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9jcml0aWNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2YyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfY3JpdGljYWwuYwpAQCAtMCwwICsxLDQyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBjcml0aWNhbCBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGhpbiBhIGNyaXRpY2FsIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBjcml0aWNhbDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9jcml0aWNhbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBzdW09MDsKKyAgICBpbnQga25vd25fc3VtOworCSAgCisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgIGludCBteXN1bT0wOworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgICNwcmFnbWEgb21wIGZvcgorCSAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorCSAgICAgIG15c3VtID0gbXlzdW0gKyBpOworCisgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGNyaXRpY2FsPC9vbXB0czpjaGVjaz4KKwkgICAgc3VtID0gbXlzdW0gK3N1bTsKKyAgICAgICAgCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAKKyAgICBwcmludGYoInN1bT0lZFxuIixzdW0pOworICAgIGtub3duX3N1bSA9IDk5OSAqIDEwMDAgLyAyOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZmx1c2guYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mbHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYWJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZmx1c2guYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmbHVzaCBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmbHVzaDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBiYXJyaWVyPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZmx1c2g8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0MTsKKwlpbnQgcmVzdWx0MjsKKwlpbnQgZHVtbXk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworCXJlc3VsdDEgPSAwOworCXJlc3VsdDIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwlpbnQgcmFuazsKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBiYXJyaWVyCisJaWYgKHJhbmsgPT0gMSkgeworCSAgICByZXN1bHQyID0gMzsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGZsdXNoIChyZXN1bHQyKTwvb21wdHM6Y2hlY2s+CisJCWR1bW15ID0gcmVzdWx0MjsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorCisJaWYgKHJhbmsgPT0gMCkgeworCSAgICA8b21wdHM6Y2hlY2s+bXlfc2xlZXAoU0xFRVBUSU1FX0xPTkcpOzwvb21wdHM6Y2hlY2s+CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0Mik8L29tcHRzOmNoZWNrPgorCQlyZXN1bHQxID0gcmVzdWx0MjsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICByZXR1cm4gKChyZXN1bHQxID09IHJlc3VsdDIpICYmIChyZXN1bHQyID09IGR1bW15KSAmJiAocmVzdWx0MiA9PSAzKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTZmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2NvbGxhcHNlLmMKQEAgLTAsMCArMSw1NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2l0aCBvbXAgZm9yIGNvbGxhcHNlIGNsYXVzZS4gQmluZCB3aXRoIHR3byBsb29wcy4gV2l0aG91dCB0aGUgY29sbGFwc2UgY2xhdXNlLCB0aGUgZmlyc3QgbG9vcCB3aWxsIG5vdCBiZSBvcmRlcmVkPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgY29sbGFwc2U8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZvciBzY2hlZHVsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGF0IGkgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IAorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgICAgc3RhdGljIGludCBsYXN0X2k7CisgICAgaW50IGlzbGFyZ2VyOworICAgIGlmIChpPT0xKQorICAgICAgbGFzdF9pPTA7CisgICAgaXNsYXJnZXIgPSAoKGkgPj0gbGFzdF9pKSYmKGkgLSBsYXN0X2k8PTEpKTsKKyAgICBsYXN0X2kgPSBpOworICAgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2NvbGxhcHNlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGlzX2xhcmdlciA9IDE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICBpbnQgaSxqOworCSAgaW50IG15X2lzbGFyZ2VyID0gMTsKKyAgICAgICNwcmFnbWEgb21wIGZvciBwcml2YXRlKGksaikgc2NoZWR1bGUoc3RhdGljLDEpIDxvbXB0czpjaGVjaz5jb2xsYXBzZSgyKTwvb21wdHM6Y2hlY2s+IG9yZGVyZWQKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKXsKKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz5teV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkmJiBteV9pc2xhcmdlcjs8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgZm9yIChqID0xOyBqIDwxMDA7IGorKykKKyAgICAgICAgICB7CisgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisJCSAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisJCSAgICAgIG15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSYmbXlfaXNsYXJnZXI7CisgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCSAgICAgIH0JLyogZW5kIG9mIGZvciAqLworICAgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorCQlpc19sYXJnZXIgPSBpc19sYXJnZXIgJiYgbXlfaXNsYXJnZXI7CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgcmV0dXJuIChpc19sYXJnZXIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzIwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBmaXJzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBmaXJzdHByaXZhdGUuIEZpcnN0IGl0IHN0b3JlcyB0aGUgcmVzdWx0IG9mIGl0cyBsYXN0IGl0ZXJhdGlvbiBpbiB2YXJpYWJsZSAoMikuIFRoZW4gaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBmaXJzdHByaXZhdGUgdmFyaWFibGUgKDEpLiBBdCB0aGUgZW5kIGFsbCBmaXJzdHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHRocmVhZHNudW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTAgPSAxMjM0NTsKKyAgICBzdW0xID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZWFkc251bT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgICAgIH0KKwkvKiBzdW0wID0gMDsgKi8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkgICAgc3VtMSA9IHN1bTA7CisJfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCisgICAga25vd25fc3VtID0gMTIzNDUqIHRocmVhZHNudW0rIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA4MGEyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBsYXN0cHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBzYXZlcyB0aGUgbmV4dCBzdW1tYW5kIGluIGEgbGFzdHByaXZhdGUgdmFyaWFibGUgaTAuIEF0IHRoZSBlbmQgaTAgaXMgY29tcGFyZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZCBsYXN0IHN1bW1hbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSxvbXAgc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisJaW50IHN1bSA9IDA7CisJaW50IGtub3duX3N1bTsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJICAgIGludCBpMDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCisJaTAgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJICAgIHN1bTAgPSAwOworCSAgICB7CS8qIEJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisJICAgIDxvbXB0czpvcnBoYW4+CisJCWludCBpOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyw3KSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CS8qIGVuZCBvZiBmb3IgKi8KKwkgICAgPC9vbXB0czpvcnBoYW4+CisJICAgIH0JLyogZW5kIG9mIG9ycGhhbmVkIGJsb2NrICovCisKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICAgIHsKKwkJc3VtID0gc3VtICsgc3VtMDsKKwkgICAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKwl9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiBrbm93bl9zdW0gPSAlZCAsIHN1bSA9ICVkIFxuIixrbm93bl9zdW0sc3VtKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiBMT09QQ09VTlQgPSAlZCAsIGkwID0gJWQgXG4iLExPT1BDT1VOVCxpMCk7CisJcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX25vd2FpdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2VjNDBiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYwpAQCAtMCwwICsxLDU3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czpkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBub3dhaXQgZGlyZWN0aXZlLiBJdCBmaWxscyBhbiBhcnJheSB3aXRoIHZhbHVlcyBhbmQgb3BlcmF0ZXMgb24gdGhlc2UgaW4gdGhlIGZvbGxvd2luZy48L29tcHRzOmRlc2NyaXB0aW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnZlcnNpb24+MS4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IsIG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCTxvbXB0czpvcnBoYW46dmFycz4KKwkJaW50IHJlc3VsdDsKKwkJaW50IGNvdW50OworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGo7CisJaW50IG15YXJyYXlbTE9PUENPVU5UXTsKKworCXJlc3VsdCA9IDA7CisJY291bnQgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisJPG9tcHRzOm9ycGhhbj4KKwkJaW50IHJhbms7CisJCWludCBpOworCisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5ub3dhaXQ8L29tcHRzOmNoZWNrPiAKKwkJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBlbnRlcmluZyBmb3IgbG9vcCBhbmQgZ29pbmcgdG8gc2xlZXAuXG4iLCByYW5rKTsKKwkJCQlteV9zbGVlcChTTEVFUFRJTUUpOworCQkJCWNvdW50ID0gMTsKKyNwcmFnbWEgb21wIGZsdXNoKGNvdW50KQorCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgd29rZSB1cCBhbmQgc2V0IGNvdW50ID0gMS5cbiIsIHJhbmspOworCQkJfQorCQl9CisJCQorCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4aXRlZCBmaXJzdCBmb3IgbG9vcCBhbmQgZW50ZXJzIHRoZSBzZWNvbmQuXG4iLCByYW5rKTsKKyNwcmFnbWEgb21wIGZvcgorCQlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIAorCQl7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCWlmIChjb3VudCA9PSAwKQorCQkJCXJlc3VsdCA9IDE7CisJCX0KKwk8L29tcHRzOm9ycGhhbj4KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX29yZGVyZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTdkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX29yZGVyZWQuYwpAQCAtMCwwICsxLDYwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBvcmRlcmVkIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhbiB2YXJpYWJsZSBpbiBhbiBwYXJhbGxlbGl6ZWQgbG9vcCBhbmQgd2F0Y2hpbmcgZWFjaCBpdGVyYXRpb24gaWYgdGhlIHN1bWFuZCBpcyBsYXJnZXIgYXMgdGhlIGxhc3Qgb25lLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZvciBzY2hlZHVsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGF0IGkgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IAorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgICAgaW50IGlzbGFyZ2VyOworICAgIGlzbGFyZ2VyID0gKGkgPiBsYXN0X2kpOworICAgIGxhc3RfaSA9IGk7CisgICAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IGlzX2xhcmdlciA9IDE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgbGFzdF9pID0gMDsKKyAgICBzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKwkgICAgaW50IG15X2lzbGFyZ2VyID0gMTsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgb3JkZXJlZAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG9yZGVyZWQ8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkgJiYgbXlfaXNsYXJnZXI7CisJCSAgICBzdW0gPSBzdW0gKyBpOworCQl9CS8qIGVuZCBvZiBvcmRlcmVkICovCisJICAgIH0JLyogZW5kIG9mIGZvciAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgICAgeworCQlpc19sYXJnZXIgPSBpc19sYXJnZXIgJiYgbXlfaXNsYXJnZXI7CisJICAgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAga25vd25fc3VtPSg5OSAqIDEwMCkgLyAyOworICAgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIGlzX2xhcmdlcik7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY1MTEwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw2NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZm9yIHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgcHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGEgdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIHRoaXMgdGhyZWFkIHdhaXRzIHNvbWUgdGltZSBiZWZvcmUgaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpdGVyYXRpb24gdGhlIHZhbHVlIG9mICgxKSBpcyBhc3NpZ25lZCB0byAoMikuIEF0IHRoZSBlbmQgYWxsIHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsLG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitzdGF0aWMgdm9pZCBkb19zb21lX3dvcmsgKCl7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKwlzdW0gKz0gc3FydCAoKGRvdWJsZSkgaSk7CisgICAgfQorfQorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgc3VtID0gMDsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0wID0gMDsJLyogc2V0dGluZyAoZ2xvYmFsKSBzdW0wID0gMCAqLworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwlzdW0xID0gMDsJLyogc2V0dGluZyBzdW0xIGluIGVhY2ggdGhyZWFkIHRvIDAgKi8KKworCXsJLyogYmVnaW4gb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+IHNjaGVkdWxlKHN0YXRpYywxKQorCSAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCSAgICB7CisJCXN1bTAgPSBzdW0xOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJc3VtMCA9IHN1bTAgKyBpOworCQlkb19zb21lX3dvcmsgKCk7CisjcHJhZ21hIG9tcCBmbHVzaAorCQlzdW0xID0gc3VtMDsKKwkgICAgfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisJfQkvKiBlbmQgb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKmVuZCBvZiBjcml0aWNhbCovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMTkxNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw0MjkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpY2ggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIGR0OworCWludCBzdW07CisJaW50IGRpZmY7CisJaW50IHByb2R1Y3QgPSAxOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50ICpsb2dpY3M7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisKKyAgICBpbnQgaTsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBrbm93bl9wcm9kdWN0OworICAgIGRvdWJsZSByb3VuZGluZ19lcnJvciA9IDEuRS05OwkvKiBvdmVyIGFsbCByb3VuZGluZyBlcnJvciB0byBiZSBpZ25vcmVkIGluIHRoZSBkb3VibGUgdGVzdHMgKi8KKyAgICBkb3VibGUgZHB0OworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBsb2dpY3NBcnJheVtMT09QQ09VTlRdOworCisgICAgLyogVmFyaWFibGVzIGZvciBpbnRlZ2VyIHRlc3RzICovCisgICAgc3VtID0gMDsKKyAgICBwcm9kdWN0ID0gMTsKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgLyogdmFyaWFiZWxzIGZvciBkb3VibGUgdGVzdHMgKi8KKyAgICBkdCA9IDEuIC8gMy47CS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgICBkc3VtID0gMC47CisgICAgLyogVmFyaWFiZWxlcyBmb3IgbG9naWMgIHRlc3RzICovCisgICAgbG9naWNzID0gbG9naWNzQXJyYXk7CisgICAgbG9naWNfYW5kID0gMTsKKyAgICBsb2dpY19vciA9IDA7CisgICAgLyogVmFyaWFiZWxlcyBmb3IgYml0IG9wZXJhdG9ycyB0ZXN0cyAqLworICAgIGJpdF9hbmQgPSAxOworICAgIGJpdF9vciA9IDA7CisgICAgLyogVmFyaWFibGVzIGZvciBleGNsdXNpdiBiaXQgb3IgKi8KKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFRlc3RzIGZvciBpbnRlZ2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgYWRkaXRpb24gKioqKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkgICAgZm9yIChqID0gMTsgaiA8PSBMT09QQ09VTlQ7IGorKykKKwkgICAgeworCQlzdW0gPSBzdW0gKyBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsIHN1bSwga25vd25fc3VtKTsgCisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgaW50ZWdlciBzdWJ0cmFjdG9uICoqKiovCisKKyAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspCisJICAgIHsKKwkJZGlmZiA9IGRpZmYgLSBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGRpZmYgIT0gMCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwgZGlmZik7CisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgaW50ZWdlciBtdWx0aXBsaWNhdGlvbiAqKioqLworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkgICAgZm9yIChqID0gMTsgaiA8PSBNQVhfRkFDVE9SOyBqKyspCisJICAgIHsKKwkJcHJvZHVjdCAqPSBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgICAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorICAgIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgZG91YmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBkb3VibGUgYWRkaXRpb24gKioqKi8KKworICAgIGRzdW0gPSAwLjsKKyAgICBkcHQgPSAxLjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgeworCWRwdCAqPSBkdDsKKyAgICB9CisgICAgZGtub3duX3N1bSA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgaisrKQorCSAgICB7CQorCQlkc3VtICs9IHBvdyAoZHQsIGopOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisJcmVzdWx0Kys7IAorCWZwcmludGYgKGxvZ0ZpbGUsICJcbkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgICB9CisKKyNpZiAwCisgICAgZHB0ID0gMS47CisgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkKKyAgICB7CisJZHB0ICo9IGR0OworICAgIH0KKyNlbmRpZgorCisKKy8qKioqIFRlc3RpbmcgZG91YmxlIHN1YnRyYWN0aW9uICoqKiovCisKKyAgICBkZGlmZiA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikKKwkgICAgeworCQlkZGlmZiAtPSBwb3cgKGR0LCBqKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwgZGRpZmYpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgbG9naWNhbCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBsb2dpYyBhbmQgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJbG9naWNzW2ldID0gMTsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tqXSk7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZighbG9naWNfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGxvZ2ljX2FuZCA9IDE7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYobG9naWNfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGxvZ2ljIG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKSAgPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGxvZ2ljX29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgbG9naWNfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYoIWxvZ2ljX29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFRlc3RzIGZvciBiaXQgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKiBUZXN0aW5nIGJpdCBhbmQgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICB7CisJbG9naWNzW2ldID0gMTsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKSAgPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tqXSk7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoIWJpdF9hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoYml0X2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgYml0IG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGlmICghYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGV4Y2x1c2l2ZSBiaXQgb3IgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJbG9naWNzW2ldID0gMDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGlmICghZXhjbHVzaXZfYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIC8qZnByaW50ZiAoIlxuUmVzdWx0OiVkXG4iLCByZXN1bHQpOyovCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7CisKKyAgICBmcmVlIChsb2dpY3MpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxYTFjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jCkBAIC0wLDAgKzEsNTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBzY2hlZHVsZSBhdXRvPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgYXV0bzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfYXV0bzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHRocmVhZHNudW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTAgPSAxMjM0NTsKKyAgICBzdW0xID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZWFkc251bT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgICAgIH0KKwkvKiBzdW0wID0gMDsgKi8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCkgc2NoZWR1bGUoYXV0byk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkgICAgc3VtMSA9IHN1bTA7CisJfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCisgICAga25vd25fc3VtID0gMTIzNDUqIHRocmVhZHNudW0rIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjZGE1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jCkBAIC0wLDAgKzEsMTExIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGR5bmFtaWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoLG9tcCBmb3Igbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKworLyoKKyogVGVzdCBmb3IgZHluYW1pYyBzY2hlZHVsaW5nIHdpdGggY2h1bmsgc2l6ZQorKiBNZXRob2Q6IGNhY3VsYXRlIGhvdyBtYW55IHRpbWVzIHRoZSBpdGVyYXRpb24gc3BhY2UgaXMgZGlzcGF0Y2hlZAorKiAgICAgICAgIGFuZCBqdWRnZSBpZiBlYWNoIGRpc3BhdGNoIGhhcyB0aGUgcmVxdWVzdGVkIGNodW5rIHNpemUKKyogICAgICAgICB1bmxlc3MgaXQgaXMgdGhlIGxhc3Qgb25lLgorKiBJdCBpcyBwb3NzaWJsZSBmb3IgdHdvIGFkamFjZW50IGNodW5rcyBhcmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGhyZWFkCisqIE1vZGlmeWllZCBieSBDaHVuaHVhIExpYW8KKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBDRkRNQVhfU0laRSAxMDAKK2NvbnN0IGludCBjaHVua19zaXplID0gNzsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9keW5hbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IHRpZDsKKzxvbXB0czpvcnBoYW46dmFycz4gIAorICBpbnQgKnRpZHM7CisgIGludCBpOworPC9vbXB0czpvcnBoYW46dmFycz4KKworICBpbnQgdGlkc0FycmF5W0NGRE1BWF9TSVpFXTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHRtcF9jb3VudCA9IDA7IC8qZGlzcGF0Y2ggdGltZXMqLworICBpbnQgKnRtcDsgIC8qc3RvcmUgY2h1bmsgc2l6ZSBmb3IgZWFjaCBkaXNwYXRjaCovCisgIGludCByZXN1bHQgPSAwOworICAKKyAgdGlkcyA9IHRpZHNBcnJheTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICB7CQkJCS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICBpbnQgdGlkOworCisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5zY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkU7IGkrKykKKyAgICAgIHsKKwl0aWRzW2ldID0gdGlkOworICAgICAgfQorICAgICA8L29tcHRzOm9ycGhhbj4KKyAgfQkJCQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkUgLSAxOyArK2kpCisgICAgeworICAgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pCisJeworCSAgY291bnQrKzsKKwl9CisgICAgfQorCisgIHRtcCA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoY291bnQgKyAxKSk7CisgIHRtcFswXSA9IDE7CisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKQorICAgIHsKKyAgICAgIGlmICh0bXBfY291bnQgPiBjb3VudCkKKwl7CisJICBwcmludGYgKCItLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGVzdGludGVybmFsIEVycm9yOiBMaXN0IHRvbyBzbWFsbCEhIVxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwkvKiBFcnJvciBoYW5kbGluZyAqLworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pCisJeworCSAgdG1wX2NvdW50Kys7CisJICB0bXBbdG1wX2NvdW50XSA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRtcFt0bXBfY291bnRdKys7CisJfQorICAgIH0KKy8qCitwcmludGYoImRlYnVnLS0tLVxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyArK2kpCisJcHJpbnRmKCIlZCAiLHRpZHNbaV0pOworcHJpbnRmKCJkZWJ1Zy0tLS1cbiIpOworKi8KKy8qIGlzIGR5bmFtaWMgc3RhdGVtZW50IHdvcmtpbmc/ICovCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGlmICgodG1wW2ldJWNodW5rX3NpemUpIT0wKSAKKy8qaXQgaXMgcG9zc2libGUgZm9yIDIgYWRqYWNlbnQgY2h1bmtzIGFzc2lnbmVkIHRvIGEgc2FtZSB0aHJlYWQqLworCXsKKyAgICAgICAgIHJlc3VsdCsrOworICBmcHJpbnRmKGxvZ0ZpbGUsIlRoZSBpbnRlcm1lZGlhdGUgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworCSAgLypyZXN1bHQgKz0gKCh0bXBbaV0gLyBjaHVua19zaXplKSAtIDEpOyovCisJfQorICAgIH0KKyAgaWYgKCh0bXBbY291bnRdJWNodW5rX3NpemUpIT0oQ0ZETUFYX1NJWkUlY2h1bmtfc2l6ZSkpCisgICB7IAorICAgcmVzdWx0Kys7CisgIGZwcmludGYobG9nRmlsZSwidGhlIGxhc3QgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworICAgfQorICAvKiBmb3IgKGludCBpPTA7aTxjb3VudCsxOysraSkgcHJpbnRmKCIlZFx0Oj1cdCVkXG4iLGkrMSx0bXBbaV0pOyAqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1NjRhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKQEAgLTAsMCArMSwyMjUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZ3VpZGVkIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3Igc2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZm9yIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKiBUZXN0IGZvciBndWlkZWQgc2NoZWR1bGluZworICogRW5zdXJlIHRocmVhZHMgZ2V0IGNodW5rcyBpbnRlcmxlYXZlbHkgZmlyc3QKKyAqIFRoZW4ganVkZ2UgdGhlIGNodW5rIHNpemVzIGFyZSBkZWNyZWFzaW5nIHRvIGEgc3RhYmxlIHZhbHVlCisgKiBNb2RpZmllZCBieSBDaHVuaHVhIExpYW8KKyAqIEZvciBleGFtcGxlLCAxMDAgaXRlcmF0aW9uIG9uIDIgdGhyZWFkcywgY2h1bmtzaXplIDcKKyAqIG9uZSBsaW5lIGZvciBlYWNoIGRpc3BhdGNoLCAwLzEgbWVhbnMgdGhyZWFkIGlkCisgKiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgMjQKKyAqIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAxOAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgIDE0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyAqIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorICogMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAgMC4wMDUKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDAxCisjZW5kaWYKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgKiB0aWRzOworCWludCAqIGNodW5rc2l6ZXM7CisJaW50IG5vdG91dDsKKwlpbnQgbWF4aXRlcjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IHRocmVhZHM7CisgICAgaW50IGk7CisgICAgaW50IHJlc3VsdDsKKworICAgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworCW1heGl0ZXIgPSAwOworICAgIHJlc3VsdCA9IDE7CisgICAgbm90b3V0ID0gMTsKKworLyogVGVzdGluZyBpZiBlbm91Z2h0IHRocmVhZHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGVjay4gKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2luZ2xlCisJICB7CisJCXRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworCSAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworCWlmICh0aHJlYWRzIDwgMikgeworCSAgcHJpbnRmICgiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyAuXG4iKTsKKwkgIGZwcmludGYgKGxvZ0ZpbGUsICJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzLiBBdmFpbGFibGUgd2VyZSBvbmx5ICVkIHRocmVhZChzKS5cbiIsIHRocmVhZHMpOworCSAgcmV0dXJuICgwKTsKKwl9IC8qIGVuZCBpZiAqLworCisKKyAgICAvKiBOb3cgdGhlIHJlYWwgcGFyYWxsZWwgd29yazogIAorICAgICAqCisJICogRWFjaCB0aHJlYWQgd2lsbCBzdGFydCBpbW1lZGlhdGVseSB3aXRoIHRoZSBmaXJzdCBjaHVuay4KKyAgICAgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzLG1heGl0ZXIpCisgICAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIGRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShndWlkZWQpPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opCisgICAgICB7CisJY291bnQgPSAwLjsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisJaWYgKGogPiBtYXhpdGVyKQorCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICB7CisJICAgIG1heGl0ZXIgPSBqOworCSAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8gCisJfQorCS8qcHJpbnRmICgidGhyZWFkICVkIHNsZWVwaW5nXG4iLCB0aWQpOyovCisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkJCisJd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpCisJeworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisJICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKwkgIGNvdW50ICs9IFNMRUVQVElNRTsKKyNpZmRlZiBWRVJCT1NFCisJICBwcmludGYoIi4iKTsKKyNlbmRpZgorCX0KKyNpZmRlZiBWRVJCT1NFCisJaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisJLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKwl0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKwlwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisKKyAgICAgIG5vdG91dCA9IDA7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldmFsdWF0aW9uIG9mIHRoZSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJeworCSAgaW50IGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkgIGludCBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsKKwkgIGludCBnbG9iYWxfY2h1bmtuciA9IDA7CisJICBpbnQgbG9jYWxfY2h1bmtucltOVU1CRVJfT0ZfVEhSRUFEU107CisJICBpbnQgb3BlbndvcmsgPSBDRlNNQVhfU0laRTsKKwkgIGludCBleHBlY3RlZF9jaHVua19zaXplOworCSAgZG91YmxlIGMgPSAxOworCisJICBmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1RIUkVBRFM7IGkrKykKKwkJbG9jYWxfY2h1bmtucltpXSA9IDA7CisKKwkgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7CisKKyAgICAgIC8qCisJICAgKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBnbG9iYWwgY2h1bmtzCisJICAgKi8KKwkgIC8qZnByaW50Zihsb2dGaWxlLCIjIGdsb2JhbF9jaHVua25yIHRocmVhZCBsb2NhbF9jaHVua25yIGNodW5rc2l6ZVxuIik7ICovCisJICBmb3IoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkKKwkgIHsKKwkJaWYgKGxhc3RfdGhyZWFkbnI9PXRpZHNbaV0pIHsgCisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUrKzsgCisJCX0KKwkJZWxzZQorCQl7CisJCSAgLyogZnByaW50ZiAobG9nRmlsZSwgIiVkXHQlZFx0JWRcdCVkXG4iLCBnbG9iYWxfY2h1bmtucixsYXN0X3RocmVhZG5yLCBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdLCBtKTsgKi8KKwkJICBnbG9iYWxfY2h1bmtucisrOworCQkgIGxvY2FsX2NodW5rbnJbbGFzdF90aHJlYWRucl0rKzsKKwkJICBsYXN0X3RocmVhZG5yID0gdGlkc1tpXTsKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJCX0KKwkgIH0KKwkgIC8qIG5vdyBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBzYXZpbmcgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzICovCisJICBjaHVua3NpemVzID0gKGludCopbWFsbG9jKGdsb2JhbF9jaHVua25yICogc2l6ZW9mKGludCkpOworCisgICAgICAvKgorCSAgICogRXZhbHVhdGUgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzCisJICAgKi8KKwkgIGdsb2JhbF9jaHVua25yID0gMDsKKwkgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkgIGxhc3RfdGhyZWFkbnIgPSB0aWRzWzBdOwkgICAgCisJICBmb3IgKGkgPSAxOyBpIDw9IENGU01BWF9TSVpFOyArK2kpCisJICB7CisJCS8qIElmIHRoZSB0aHJlYWRudW1iZXIgd2FzIHRoZSBzYW1lIGFzIGJlZm9yZSBpbmNyZWFzZSB0aGUgZGV0ZWN0ZWQgY2h1bmtzaXplIGZvciB0aGlzIGNodW5rCisJCSAqIG90aGVyd2lzZSBzZXQgdGhlIGRldGVjdGVkIGNodW5rc2l6ZSBhZ2FpbiB0byBvbmUgYW5kIHNhdmUgdGhlIG51bWJlciBvZiB0aGUgbmV4dCB0aHJlYWQgaW4gbGFzdF90aHJlYWRuci4gCisJCSAqLworCQlpZiAobGFzdF90aHJlYWRuciA9PSB0aWRzW2ldKSB7IAorCQkgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorCQl9CisJCWVsc2UgeworCQkgIGNodW5rc2l6ZXNbZ2xvYmFsX2NodW5rbnJdID0gZGV0ZXJtaW5lZF9jaHVua3NpemU7CisJCSAgZ2xvYmFsX2NodW5rbnIrKzsKKwkJICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisJCSAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCQl9CisJICB9CisKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiZm91bmRcdGV4cGVjdGVkXHRjb25zdGFudFxuIik7CisjZW5kaWYKKworCSAgLyogaWRlbnRpZnkgdGhlIGNvbnN0YW50IGMgZm9yIHRoZSBleHBvbmVudGlhbCBkZWNyZWFzZSBvZiB0aGUgY2h1bmtzaXplICovCisJICBleHBlY3RlZF9jaHVua19zaXplID0gb3BlbndvcmsgLyB0aHJlYWRzOworCSAgYyA9IChkb3VibGUpIGNodW5rc2l6ZXNbMF0gLyBleHBlY3RlZF9jaHVua19zaXplOworCSAgCisJICBmb3IgKGkgPSAwOyBpIDwgZ2xvYmFsX2NodW5rbnI7IGkrKykKKwkgIHsKKwkJLyogY2FsY3VsYXRlIHRoZSBuZXcgZXhwZWN0ZWQgY2h1bmtzaXplICovCisJCWlmIChleHBlY3RlZF9jaHVua19zaXplID4gMSkgCisJCSAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IGMgKiBvcGVud29yayAvIHRocmVhZHM7CisJCQorI2lmZGVmIFZFUkJPU0UKKwkJZnByaW50ZiAobG9nRmlsZSwgIiU4ZFx0JThkXHQlbGZcbiIsIGNodW5rc2l6ZXNbaV0sIGV4cGVjdGVkX2NodW5rX3NpemUsIGMgKiBjaHVua3NpemVzW2ldL2V4cGVjdGVkX2NodW5rX3NpemUpOworI2VuZGlmCisJCQorCQkvKiBjaGVjayBpZiBjaHVua3NpemUgaXMgaW5zaWRlIHRoZSByb3VuZGluZyBlcnJvcnMgKi8KKwkJaWYgKGFicyAoY2h1bmtzaXplc1tpXSAtIGV4cGVjdGVkX2NodW5rX3NpemUpID49IDIpIHsKKwkJICByZXN1bHQgPSAwOworI2lmbmRlZiBWRVJCT1NFCisJCSAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkIHZhbHVlOiAlZCBpbnN0ZWFkIG9mICVkXG4iLCBjaHVua3NpemVzW2ldLCBleHBlY3RlZF9jaHVua19zaXplKTsKKwkJICByZXR1cm4gMDsKKyNlbmRpZgorCQl9IC8qIGVuZCBpZiAqLworCisjaWZuZGVmIFZFUkJPU0UKKwkJaWYgKGV4cGVjdGVkX2NodW5rX3NpemUgLSBjaHVua3NpemVzW2ldIDwgMCApCisJCSAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rc2l6ZSBkaWQgbm90IGRlY3JlYXNlOiAlZCBpbnN0ZWFkIG9mICVkXG4iLCBjaHVua3NpemVzW2ldLGV4cGVjdGVkX2NodW5rX3NpemUpOworI2VuZGlmCisKKwkJLyogY2FsY3VsYXRpbmcgdGhlIHJlbWFpbmluZyBhbW91bnQgb2Ygd29yayAqLworCQlvcGVud29yayAtPSBjaHVua3NpemVzW2ldOworCSAgfQkKKwl9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWQ3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCkBAIC0wLDAgKzEsMTY1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHN0YXRpYyBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG5vd2FpdCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAwLjAxCisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwNQorI2VuZGlmCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9zdGF0aWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgKiB0aWRzOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKyAgY2h1bmtfc2l6ZSA9IDc7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0JLyogZW5kIG9mIHNpbmdsZSAqLworICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmICh0aHJlYWRzIDwgMikKKyAgeworICAgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiKTsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIGZwcmludGYgKGxvZ0ZpbGUsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIHNwZWNpZmllZCBjaHVua3NpemUgb2YgJWRcbiIsIENGU01BWF9TSVpFLCBjaHVua19zaXplKTsKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOwkvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisJZG91YmxlIGNvdW50OworICAgICAgaW50IHRpZDsKKyAgICAgIGludCBqOworCisgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyNwcmFnbWEgb21wIGZvciBub3dhaXQgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisJICBwcmludGYoIi4iKTsKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyoqKiogYW5hbHlzaW5nIHRoZSBkYXRhIGluIGFycmF5IHRpZHMgKioqKi8KKworICAgIGxhc3R0aWQgPSB0aWRzWzBdOworICAgIHRtcF9jb3VudCA9IDA7IAorCisgICAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQgaW5jcmVhc2UgdG1wX2NvdW50IGJ5IG9uZS4gKi8KKyAgICAgIGlmICh0aWRzW2ldID09IGxhc3R0aWQpIHsKKwl0bXBfY291bnQrKzsKKyNpZmRlZiBWRVJCT1NFCisJZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcgCisgICAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4gCisgICAgICAgKi8JICAKKyAgICAgIGlmICh0aWRzW2ldID09IChsYXN0dGlkICsgMSkgJSB0aHJlYWRzIHx8IHRpZHNbaV0gPT0gLTEpIHsKKwkvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKwlpZiAodG1wX2NvdW50ID09IGNodW5rX3NpemUpIHsKKwkgIHRtcF9jb3VudCA9IDE7CisJICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiT0tcbiIpOworI2VuZGlmCisJfQorCS8qIElmIHRoZSBjaHVuayBzaXplIHdhcyB3cm9uZywgY2hlY2sgaWYgdGhlIGVuZCB3YXMgcmVhY2hlZCAqLworCWVsc2UgeworCSAgaWYgKHRpZHNbaV0gPT0gLTEpIHsKKwkgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKwkgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiTGFzdCB0aHJlYWQgaGFkIGNodW5rIHNpemUgJWRcbiIsIHRtcF9jb3VudCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGggbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKwkgICAgICByZXN1bHQgPSAwOworCSAgICB9CisJICB9CisJICBlbHNlIHsKKwkgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIHdhcyAlZClcbiIsIHRtcF9jb3VudCwgY2h1bmtfc2l6ZSk7CisJICAgIHJlc3VsdCA9IDA7CisJICB9CisJfQorICAgICAgfQorICAgICAgZWxzZSB7CisJZnByaW50Zihsb2dGaWxlLCAiRVJST1I6IEZvdW5kIHRocmVhZCB3aXRoIG51bWJlciAlZCAoc2hvdWxkIGJlIGluYmV0d2VlbiAwIGFuZCAlZCkuIiwgdGlkc1tpXSwgdGhyZWFkcyAtIDEpOworCXJlc3VsdCA9IDA7CisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NjY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYwpAQCAtMCwwICsxLDIxMiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzdGF0aWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZSBjb25zaWRlcmluZyB0aGUgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBjaHVuayBkaXN0cmlidXRpb24gb2Ygc2V2ZXJhbCBsb29wIHJlZ2lvbnMgaXMgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuIE1QIHN0YW5kYXJkIHZlcnNpb24gMy4wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG5vd2FpdCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAwLjAxCisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwNQorI2VuZGlmCisKKyNkZWZpbmUgVkVSQk9TRSAwCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCB0aHJlYWRzOworICBpbnQgaSxsYXN0dGlkOworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCAqIHRpZHM7CisgIGludCAqIHRpZHMyOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKyAgY2h1bmtfc2l6ZSA9IDc7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0JLyogZW5kIG9mIHNpbmdsZSAqLworICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmICh0aHJlYWRzIDwgMikKKyAgeworICAgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiKTsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIGZwcmludGYgKGxvZ0ZpbGUsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIHNwZWNpZmllZCBjaHVua3NpemUgb2YgJWRcbiIsIENGU01BWF9TSVpFLCBjaHVua19zaXplKTsKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOwkvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisJZG91YmxlIGNvdW50OworICAgICAgaW50IHRpZDsKKyAgICAgIGludCBqOworCisgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyNwcmFnbWEgb21wIGZvciBub3dhaXQgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisJICBwcmludGYoIi4iKTsKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyoqKiogYW5hbHlzaW5nIHRoZSBkYXRhIGluIGFycmF5IHRpZHMgKioqKi8KKworICAgIGxhc3R0aWQgPSB0aWRzWzBdOworICAgIHRtcF9jb3VudCA9IDA7IAorCisgICAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQgaW5jcmVhc2UgdG1wX2NvdW50IGJ5IG9uZS4gKi8KKyAgICAgIGlmICh0aWRzW2ldID09IGxhc3R0aWQpIHsKKwl0bXBfY291bnQrKzsKKyNpZmRlZiBWRVJCT1NFCisJZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcgCisgICAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4gCisgICAgICAgKi8JICAKKyAgICAgIGlmICh0aWRzW2ldID09IChsYXN0dGlkICsgMSkgJSB0aHJlYWRzIHx8IHRpZHNbaV0gPT0gLTEpIHsKKwkvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKwlpZiAodG1wX2NvdW50ID09IGNodW5rX3NpemUpIHsKKwkgIHRtcF9jb3VudCA9IDE7CisJICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiT0tcbiIpOworI2VuZGlmCisJfQorCS8qIElmIHRoZSBjaHVuayBzaXplIHdhcyB3cm9uZywgY2hlY2sgaWYgdGhlIGVuZCB3YXMgcmVhY2hlZCAqLworCWVsc2UgeworCSAgaWYgKHRpZHNbaV0gPT0gLTEpIHsKKwkgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKwkgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiTGFzdCB0aHJlYWQgaGFkIGNodW5rIHNpemUgJWRcbiIsIHRtcF9jb3VudCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGggbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKwkgICAgICByZXN1bHQgPSAwOworCSAgICB9CisJICB9CisJICBlbHNlIHsKKwkgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIHdhcyAlZClcbiIsIHRtcF9jb3VudCwgY2h1bmtfc2l6ZSk7CisJICAgIHJlc3VsdCA9IDA7CisJICB9CisJfQorICAgICAgfQorICAgICAgZWxzZSB7CisJZnByaW50Zihsb2dGaWxlLCAiRVJST1I6IEZvdW5kIHRocmVhZCB3aXRoIG51bWJlciAlZCAoc2hvdWxkIGJlIGluYmV0d2VlbiAwIGFuZCAlZCkuIiwgdGlkc1tpXSwgdGhyZWFkcyAtIDEpOworCXJlc3VsdCA9IDA7CisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgICAgfQorICB9CisKKyAgLyogTm93IHdlIGNoZWNrIGlmIHNldmVyYWwgbG9vcCByZWdpb25zIGluIG9uZSBwYXJhbGxlbCByZWdpb24gaGF2ZSB0aGUgc2FtZSAKKyAgICogbG9naWNhbCBhc3NpZ25lbWVudCBvZiBjaHVua3MgdG8gdGhyZWFkcy4KKyAgICogV2UgdXNlIHRoZSBub3dhaXQgY2xhdXNlIHRvIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSB0byBnZXQgYW4gZXJyb3IuICovCisKKyAgLyogRmlyc3Qgd2UgYWxsb2NhdGUgc29tZSBtb3JlIG1lbW1vcnkgKi8KKyBmcmVlICh0aWRzKTsKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiBMT09QQ09VTlQpOworICB0aWRzMiA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiBMT09QQ09VTlQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIHsKKyAgICAgICAgICBpbnQgbjsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljKTwvb21wdHM6Y2hlY2s+IG5vd2FpdAorICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBMT09QQ09VTlQ7IG4rKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChMT09QQ09VTlQgPT0gbiArIDEgKQorICAgICAgICAgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICB0aWRzW25dID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgeworICAgICAgICAgIGludCBtOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMpPC9vbXB0czpjaGVjaz4gbm93YWl0CisgICAgICAgICAgZm9yIChtID0gMTsgbSA8PSBMT09QQ09VTlQ7IG0rKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHRpZHMyW20tMV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHMyW2ldKSB7CisgICAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rIG5vLiAlZCB3YXMgYXNzaWduZWQgb25jZSB0byB0aHJlYWQgJWQgYW5kIGxhdGVyIHRvIHRocmVhZCAlZC5cbiIsIGksIHRpZHNbaV0sdGlkczJbaV0pOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICB9CisKKyAgZnJlZSAodGlkcyk7CisgIGZyZWUgKHRpZHMyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwOTJiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDM5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhhdCB0aGUgb21wX2dldF9udW1fdGhyZWFkcyByZXR1cm5zIHRoZSBjb3JyZWN0IG51bWJlciBvZiB0aHJlYWRzLiBUaGVyZWZvciBpdCBjb3VudHMgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBzZWN0aW9uIGFuZCBjb21wYXJzIHRoaXMgdmFsdWUgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X251bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgLyogY2hlY2tzIHRoYXQgb21wX2dldF9udW1fdGhyZWFkcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mCisgICAgICAgdGhyZWFkcyAqLworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHNfbGliOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IG50aHJlYWRzID0gMDsKKworICAgIG50aHJlYWRzX2xpYiA9IC0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgbnRocmVhZHMrKzsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworI3ByYWdtYSBvbXAgc2luZ2xlCisJeyAKKzxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5udGhyZWFkc19saWIgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKwl9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisJZnByaW50ZiAobG9nRmlsZSwgIkNvdW50ZWQgJWQgdGhyZWFkcy4gZ2V0X251bV90aHJlYWRzIHJldHVybmVkICVkLlxuIiwgbnRocmVhZHMsIG50aHJlYWRzX2xpYik7CisgICAgcmV0dXJuIChudGhyZWFkcyA9PSBudGhyZWFkc19saWIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiNTdmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGljay5jCkBAIC0wLDAgKzEsMjQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX2dldF93dGljayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGljazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGU8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGljazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIHRpY2s7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICB0aWNrID0gLTEuOworCisgICAgPG9tcHRzOm9ycGhhbj4KKwk8b21wdHM6Y2hlY2s+dGljayA9IG9tcF9nZXRfd3RpY2sgKCk7PC9vbXB0czpjaGVjaz4KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICBmcHJpbnRmIChsb2dGaWxlLCAiV29yayB0b29rICVsZiBzZWMuIHRpbWUuXG4iLCB0aWNrKTsKKyAgICByZXR1cm4gKCh0aWNrID4gMC4wKSAmJiAodGljayA8IDAuMDEpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMjI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpbWUuYwpAQCAtMCwwICsxLDM4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpbWUgZnVuY3Rpb24uIEl0IGNvbXBhcmVzIHRoZSB0aW1lIHdpdGggd2hpY2ggaXMgY2FsbGVkIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCB0aGUgdGltZSBpdCB0b29rIGJ5IG1lc3N1cmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsIG9mIHRoZSBzbGVlcCBmdW5jdGlvbiBhbmQgaXRzIGVuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGltZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGU8c3RkaW8uaD4KKyNpbmNsdWRlPHN0ZGxpYi5oPgorI2luY2x1ZGU8dW5pc3RkLmg+CisKKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGltZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIHN0YXJ0OworCWRvdWJsZSBlbmQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBkb3VibGUgbWVhc3VyZWRfdGltZTsKKyAgICBpbnQgd2FpdF90aW1lID0gMTsgCisKKyAgICBzdGFydCA9IDA7CisgICAgZW5kID0gMDsKKworICAgIDxvbXB0czpvcnBoYW4+CisJPG9tcHRzOmNoZWNrPnN0YXJ0ID0gb21wX2dldF93dGltZSAoKTs8L29tcHRzOmNoZWNrPgorICAgIDwvb21wdHM6b3JwaGFuPgorCW15X3NsZWVwICh3YWl0X3RpbWUpOyAKKyAgICA8b21wdHM6b3JwaGFuPgorCTxvbXB0czpjaGVjaz5lbmQgPSBvbXBfZ2V0X3d0aW1lICgpOzwvb21wdHM6Y2hlY2s+CisgICAgPC9vbXB0czpvcnBoYW4+CisJbWVhc3VyZWRfdGltZSA9IGVuZC1zdGFydDsKKyAgICBmcHJpbnRmKGxvZ0ZpbGUsICJXb3JrIHRvb2sgJWxmIHNlYy4gdGltZS5cbiIsIG1lYXN1cmVkX3RpbWUpOworICAgIHJldHVybiAoKG1lYXN1cmVkX3RpbWUgPiAwLjk5ICogd2FpdF90aW1lKSAmJiAobWVhc3VyZWRfdGltZSA8IDEuMDEgKiB3YWl0X3RpbWUpKSA7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2luX3BhcmFsbGVsLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfaW5fcGFyYWxsZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWI2MTExCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2luX3BhcmFsbGVsLmMKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgb21wX2luX3BhcmFsbGVsIHJldHVybnMgZmFsc2Ugd2hlbiBjYWxsZWQgZnJvbSBhIHNlcmlhbCByZWdpb24gYW5kIHRydWUgd2hlbiBjYWxsZWQgd2l0aGluIGEgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKy8qCisgKiBDaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyAqIGFuZCB0cnVlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIHdpdGhpbiBwYXJhbGxlbCByZWdpb24uIAorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9pbl9wYXJhbGxlbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzZXJpYWw7CisJaW50IGlzcGFyYWxsZWw7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHNlcmlhbCA9IDE7CisgICAgaXNwYXJhbGxlbCA9IDA7CisKKyAgICA8b21wdHM6Y2hlY2s+CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgc2VyaWFsID0gb21wX2luX3BhcmFsbGVsICgpOworCTwvb21wdHM6b3JwaGFuPgorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJaXNwYXJhbGxlbCA9IG9tcF9pbl9wYXJhbGxlbCAoKTsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0KKyAgICA8L29tcHRzOmNoZWNrPgorCisgICAgPG9tcHRzOmNyb3NzY2hlY2s+CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNpbmdsZQorCSAgICB7CisKKwkgICAgfQorCX0KKyAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisKKwlyZXR1cm4gKCEoc2VyaWFsKSAmJiBpc3BhcmFsbGVsKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbG9jay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2xvY2suYwpAQCAtMCwwICsxLDQ1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbG9jayAgYW5kIHRoZSBvbXBfdW5zZXRfbG9jayBmdW5jdGlvbiBieSBjb3VudGluZyB0aGUgdGhyZWFkcyBlbnRlcmluZyBhbmQgZXhpdGluZyBhIHNpbmdsZSByZWdpb24gd2l0aCBsb2Nrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbG9ja190IGxjazsKKyAgICAKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKyAgb21wX2luaXRfbG9jayAoJmxjayk7CisgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvcihpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5vbXBfc2V0X2xvY2sgKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCW5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJbnJfaXRlcmF0aW9ucysrOworCW5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPm9tcF91bnNldF9sb2NrKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJPC9vbXB0czpvcnBoYW4+CisgICAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbG9jayAoJmxjayk7CisgIAorICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7CisgIAorfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGIyZjFlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX21hc3Rlci5jCkBAIC0wLDAgKzEsMzcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9tYXN0ZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBudGhyZWFkczsKKwlpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnRocmVhZHMgPSAwOworICAgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG1hc3RlciA8L29tcHRzOmNoZWNrPgorCSAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBudGhyZWFkcysrOworCQl9CisJCWV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKwkgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgICAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXJfMy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX21hc3Rlcl8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5ODEyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXJfMy5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi4gSXQgYWxzbyBjaGVja3MgdGhhdCB0aGUgbWFzdGVyIHRocmVhZCBoYXMgdGhlIHRocmVhZCBudW1iZXIgMCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW4gTVAgc3RhbmRhcmQgdmVyc2lvbiAzLjAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyXzM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBudGhyZWFkczsKKwlpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgICAgICAgaW50IHRpZF9yZXN1bHQgPSAwOyAvKiBjb3VudHMgdXAgdGhlIG51bWJlciBvZiB3cm9uZyB0aHJlYWQgbm8uIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXN0ZXIgdGhyZWFkLiAoTXVzdCBiZSAwKSAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBudGhyZWFkcyA9IDA7CisgICAgZXhlY3V0aW5nX3RocmVhZCA9IC0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgbWFzdGVyIDwvb21wdHM6Y2hlY2s+CisJICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGlkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICAgICAgaWYgKHRpZCAhPSAwKSB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICAgICAgICAgICAgICB7IHRpZF9yZXN1bHQrKzsgfQorICAgICAgICAgICAgICAgIH0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIG50aHJlYWRzKys7CisJCX0KKwkJZXhlY3V0aW5nX3RocmVhZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworCSAgICB9IC8qIGVuZCBvZiBtYXN0ZXIqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8KKyAgICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSAmJiAodGlkX3Jlc3VsdCA9PSAwKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGUzODkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbmVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X25lc3RfbG9jayBhbmQgdGhlIG9tcF91bnNldF9uZXN0X2xvY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9uZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbmVzdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgIAorICAgIHsKKyNwcmFnbWEgb21wIGZvcgorCWZvcihpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPm9tcF9zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJCW5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X25lc3RfbG9jayAoJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTdiYzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbmVzdGVkLmMKQEAgLTAsMCArMSw0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfbmVzdGVkIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbmVzdGVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKy8qCisgKiBUZXN0IGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBuZXN0ZWQgcGFyYWxsZWxpc20KKyAqIEJ5IENodW5odWEgTGlhbywgVW5pdmVyc2l0eSBvZiBIb3VzdG9uCisgKiBPY3QuIDIwMDUKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbmVzdGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworCisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2lmZGVmIF9PUEVOTVAKKyAgICA8b21wdHM6Y2hlY2s+b21wX3NldF9uZXN0ZWQoMSk7PC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6Y3Jvc3NjaGVjaz5vbXBfc2V0X25lc3RlZCgwKTs8L29tcHRzOmNyb3NzY2hlY2s+CisjZW5kaWYKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGNvdW50ZXIpCit7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICBjb3VudGVyICsrOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICBjb3VudGVyIC0tOworICAgIH0KKzwvb21wdHM6b3JwaGFuPgorfQorICAgIHJldHVybiAoY291bnRlciAhPSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyYmZhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBjb3B5aW4gZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgY29weWluPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBzdW0xID0gNzg5OworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfY29weWluPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtLCBudW1fdGhyZWFkczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTEgPSA3OworICAgIG51bV90aHJlYWRzID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmNvcHlpbihzdW0xKTwvb21wdHM6Y2hlY2s+CisgICAgeworCS8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykKKwkgICAgeworCQlzdW0xID0gc3VtMSArIGk7CisJICAgIH0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgICAgICAgbnVtX3RocmVhZHMrKzsKKwl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODczNzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZGVmYXVsdCBvcHRpb24gb2YgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGRlZmF1bHQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZGVmYXVsdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBteXN1bTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgCisgIGludCBrbm93bl9zdW07CisgIHN1bSA9MDsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKworICA8b21wdHM6b3JwaGFuPgorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+ZGVmYXVsdChzaGFyZWQpPC9vbXB0czpjaGVjaz4gcHJpdmF0ZShpKSBwcml2YXRlKG15c3VtPG9tcHRzOmNyb3NzY2hlY2s+LHN1bTwvb21wdHM6Y3Jvc3NjaGVjaz4pCisgIHsKKwlteXN1bSA9IDA7CisgICNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgbXlzdW0gPSBteXN1bSArIGk7CisJfSAKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtID0gc3VtICsgbXlzdW07CisJfSAgIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIDwvb21wdHM6b3JwaGFuPgorICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAJZnByaW50Zihsb2dGaWxlLCAiS05PV05fU1VNID0gJWQ7IFNVTSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvL3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTE9NzsKKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0xKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0xKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICB7CisKKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I0OTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbixvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bSA7CisgICAgaW50IGkyOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgCisgICAgc3VtPTA7CisgICAgaTI9MzsKKyAgICBpbnQga25vd25fc3VtOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwkgIHN1bSA9IHN1bSArIChpICsgaTIpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgKyBpMiAqIExPT1BDT1VOVDsKKyAgICAKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfZmlzdHByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ODZiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfaWYuYwpAQCAtMCwwICsxLDM4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgaWYgZGlyZWN0aXZlLiBOZWVkcyBhdCBsZWFzdCB0d28gdGhyZWFkcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICBpbnQga25vd25fc3VtOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgbnVtX3RocmVhZHM7CisgICAgaW50IHN1bSwgc3VtMjsKKyAgICBpbnQgaTsKKyAgICBpbnQgY29udHJvbDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGNvbnRyb2wgPSAwOworICAgIG51bV90aHJlYWRzPTA7CisgICAgc3VtID0gMDsKKyAgICBzdW0yID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmlmIChjb250cm9sPT0xKTwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGk9MDsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCXN1bSA9IHN1bSArIGk7CisgICAgfSAvKmVuZCBvZiBmb3IqLworCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIGZwcmludGYgKGxvZ0ZpbGUsICJOdW1iZXIgb2YgdGhyZWFkcyBkZXRlcm1pbmVkIGJ5IG9tcF9nZXRfbnVtX3RocmVhZHM6ICVkXG4iLCBudW1fdGhyZWFkcyk7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtICYmIG51bV90aHJlYWRzID09IDEpOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5ZGViYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisgICAgaW50IGk7CisgICAgaW50IGkwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBzdW0gPTA7CisgICAgaTAgPSAtMTsKKyAgICBpbnQga25vd25fc3VtOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsNykgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisgICAgeworCXN1bSA9IHN1bSArIGk7CisJaTAgPSBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE0YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQgZGlyZWN0aXZlPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBsYXN0X2kgPSAwOworaW50IGk7CisKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSkKKworLyogVmFyaWFibGUgaWkgaXMgdXNlZCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGEgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZSB1c2VkIGFzIGEgbG9vcAorICogaW5kZXguIFNlZSB0ZXN0IG9tcF90aHJlYWRwcml2YXRlX2Zvci4KKyAqLworc3RhdGljIGludCBpaTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaWkpCisKKy8qISAKKyAgVXRpbGl0eSBmdW5jdGlvbjogcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgbGFyZ2VyIHRoYW4gCisgIHRoZSBhcmd1bWVudCBvZiB0aGUgbGFzdCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uCisgICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIyIChpbnQgaSl7CisJaW50IGlzbGFyZ2VyOworCWlzbGFyZ2VyID0gKGkgPiBsYXN0X2kpOworCWxhc3RfaSA9IGk7CisJcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IGlzX2xhcmdlcjsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCisJaW50IGtub3duX3N1bTsKKwlpbnQgaTsKKwkKKwlzdW0gPSAwOworCWlzX2xhcmdlciA9IDE7CisJbGFzdF9pID0gMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+b3JkZXJlZDwvb21wdHM6Y2hlY2s+CisJZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKQorCXsKKwkJaWkgPSBpOworCTxvbXB0czpvcnBoYW4+Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgb3JkZXJlZDwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisJCQlpc19sYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyMiAoaWkpICYmIGlzX2xhcmdlcjsKKwkJCXN1bSAgPSBzdW0gKyBpaTsKKwkJfQorCTwvb21wdHM6b3JwaGFuPgorCX0KKwlrbm93bl9zdW0gPSAoOTkgKiAxMDApIC8gMjsKKwlmcHJpbnRmIChsb2dGaWxlLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsIGtub3duX3N1bSwgc3VtKTsKKwlmcHJpbnRmIChsb2dGaWxlLCIgaXNfbGFyZ2VyID0gJWRcbiIsIGlzX2xhcmdlcik7CisJcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXI7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI4MGNjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw0OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbixvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICh2b2lkKXsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgc3VtID0gMDsKKyAgICBmb3IoaSA9IDA7IGkgPCAxMDAwOyBpKyspeworCXN1bSArPSBzcXJ0IChpKTsKKyAgICB9Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisgICAgaW50IGk7CisgICAgaW50IGkyOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgCisgICAgc3VtID0wOworICAgIGkyPTA7CisgICAgaW50IGtub3duX3N1bTsKKyAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgCisgICAgZm9yIChpPTE7aTw9TE9PUENPVU5UO2krKykKKyAgICB7CisJaTIgPSBpOworI3ByYWdtYSBvbXAgZmx1c2gKKwlkb19zb21lX3dvcmsgKCk7CisjcHJhZ21hIG9tcCBmbHVzaAorCXN1bSA9IHN1bSArIGkyOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI4MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCQkvKiBkdF5ET1VCTEVfRElHSVRTICovCisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1tMT09QQ09VTlRdOworCWludCBpOworCWRvdWJsZSBkcHQ7CisJaW50IHJlc3VsdDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgc3VtID0wOworICAgIGRzdW09MDsKKwlkdCA9IDEuLzMuOworICAgIHJlc3VsdCA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisJbG9naWNfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfYW5kPTE7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisJeworCQlzdW09c3VtK2k7CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOyAKKwl9CisKKwlkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKQorCXsKKwkJZGlmZj1kaWZmLWk7CisJfQorCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCisJLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKwlkc3VtPTA7CisJZHB0PTE7CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRzdW0gKz0gcG93KGR0LGkpOworCX0KKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwl9CisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspCisJeworCQlwcm9kdWN0ICo9IGk7CisJfQorCisJa25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcblxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCX0KKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKwl9CisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMi5cbiIpOworCX0KKworCisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKzwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9pZi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmNDViMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9pZi5jCkBAIC0wLDAgKzEsNDAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgb3B0aW9uIG9mIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7Cis8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworICBpbnQgbXlzdW07CisgIGludCBjb250cm9sPTE7Cis8L29tcHRzOm9ycGhhbjp2YXJzPgorICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5pZihjb250cm9sPT0wKTwvb21wdHM6Y2hlY2s+CisgIHsKKwk8b21wdHM6b3JwaGFuPgorICAgIG15c3VtID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgPC9vbXB0czpvcnBoYW4+CisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3ZmVkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jCkBAIC0wLDAgKzEsNDYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3BhcmFsbGVsX251bV90aHJlYWRzIGRpcmVjdGl2ZSBieSBjb3VudGluZyB0aGUgdGhyZWFkcyBpbiBhIHBhcmFsbGVsIHJlZ2lvbiB3aGljaCB3YXMgc3RhcnRlZCB3aXRoIGFuIGV4cGxpY2l0bHkgc3RhdGVkIG51bWJlciBvZiB0aHJlYWRzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyZWxsZWwgbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgbWFzdGVyLG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24sb21wIGF0b21pYzwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBmYWlsZWQ7CisJaW50IHRocmVhZHM7CisJaW50IG50aHJlYWRzOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQgbWF4X3RocmVhZHMgPSAwOworCisgICAgZmFpbGVkID0gMDsKKworICAgIC8qIGZpcnN0IHdlIGNoZWNrIGhvdyBtYW55IHRocmVhZHMgYXJlIGF2YWlsYWJsZSAqLworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBtYXN0ZXIKKwltYXhfdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfQorCisgICAgLyogd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZyb20gb25lIHRvIG1heGltdW06Ki8KKyAgICBmb3IgKHRocmVhZHMgPSAxOyB0aHJlYWRzIDw9IG1heF90aHJlYWRzOyB0aHJlYWRzKyspCisgICAgeworCW50aHJlYWRzID0gMDsKKworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24oKzpmYWlsZWQpIDxvbXB0czpjaGVjaz5udW1fdGhyZWFkcyh0aHJlYWRzKTwvb21wdHM6Y2hlY2s+CisJICAgIHsKKwkJZmFpbGVkID0gZmFpbGVkICsgISh0aHJlYWRzID09IG9tcF9nZXRfbnVtX3RocmVhZHMgKCkpOworI3ByYWdtYSBvbXAgYXRvbWljCisJICAgIG50aHJlYWRzICs9IDE7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKwlmYWlsZWQgPSBmYWlsZWQgKyAhKG50aHJlYWRzID09IHRocmVhZHMpOworICAgIH0KKyAgICByZXR1cm4gKCFmYWlsZWQpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2NjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtLCBudW1fdGhyZWFkcyxzdW0xOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDA7CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+IHN1bTE9MDsgPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIG51bV90aHJlYWRzID0gMDsKKworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0xKTwvb21wdHM6Y2hlY2s+CisgICAgeworCTxvbXB0czpjaGVjaz4KKwlzdW0xID0gNzsKKwk8L29tcHRzOmNoZWNrPgorCS8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykKKwkgICAgeworCQlzdW0xID0gc3VtMSArIGk7CisJICAgIH0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgICAgICAgbnVtX3RocmVhZHMrKzsKKwl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY4Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMjc4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CisJZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAJCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKwlpbnQgZGlmZjsKKwlkb3VibGUgZGRpZmY7CisJaW50IHByb2R1Y3Q7CisJaW50IGtub3duX3Byb2R1Y3Q7CisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworCWludCBsb2dpY19hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfYW5kOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzW0xPT1BDT1VOVF07CisJaW50IGk7CisJZG91YmxlIGRwdDsKKwlpbnQgcmVzdWx0OworPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBzdW0gPTA7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3Q9MTsKKwlsb2dpY19hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9hbmQ9MTsKKwliaXRfb3I9MDsKKwlleGNsdXNpdl9iaXRfb3I9MDsKKyAgICByZXN1bHQ9MDsKKwlkdCA9IDEuLzMuOworCWtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UO2krKykKKwl7CisJCXN1bT1zdW0raTsKKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsc3VtLGtub3duX3N1bSk7IAorCX0KKworCWRpZmYgPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDsrK2kpCisJeworCQlkaWZmPWRpZmYtaTsKKwl9CisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisKKwkvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworCWRzdW09MDsKKwlkcHQ9MTsKKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHN1bSArPSBwb3coZHQsaSk7CisJfQorCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZGRpZmYgLT0gcG93KGR0LGkpOworCX0KKwlpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MTtpPD1NQVhfRkFDVE9SO2krKykKKwl7CisJCXByb2R1Y3QgKj0gaTsKKwl9CisKKwlrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJfQorCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxLlxuIik7CisJfQorCisJbG9naWNfYW5kID0gMTsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2ldOworCX0KKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyLlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZihsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworCX0KKwlsb2dpY19vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisJfQorCisKKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwliaXRfYW5kID0gMTsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyLlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCX0KKwlpZihleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlleGNsdXNpdl9iaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorICAgIDwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMzODM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID03OworICBzdW0wPTExOworCis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgICAgICAgICAgICAgCisgICAgfSAgICAgIC8qZW5kIG9mIHBhcmFsbGVsIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgora25vd25fc3VtPTExKjMrNzsKK3JldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZTVmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBpMDsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBzdW0wID0gMDsKKyAgaTAgPSAtMTsKKyAgCisgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGksc3VtMCkgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAgCisgICAgICB7CisJc3VtMD0wOworCWZvciAoaT0xO2k8NDAwO2krKykKKwkgIHsKKwkgICAgc3VtMD1zdW0wK2k7CisJICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9LyogZW5kIG9mIHNlY3Rpb24gKi8KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisJc3VtMD0wOworCWZvcihpPTQwMDtpPDcwMDtpKyspCisJICB7CisJICAgIHN1bTA9c3VtMCtpOyAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgZm9yKi8KKwkgICAgaTA9aTsKKwkgIH0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtPSBzdW0rc3VtMDsKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisJc3VtMD0wOworCWZvcihpPTcwMDtpPDEwMDA7aSsrKQorCSAgeworCSAgICBzdW0wPXN1bTAraTsKKyAgICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisgICAgfS8qIGVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCisgIDwvb21wdHM6b3JwaGFuPiAKKyAga25vd25fc3VtPSg5OTkqMTAwMCkvMjsKKyAgcmV0dXJuICgoa25vd25fc3VtPT1zdW0pICYmIChpMD09OTk5KSApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmU0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9IDc7CisgIHN1bTA9MDsKKworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoPG9tcHRzOmNoZWNrPnN1bTAsPC9vbXB0czpjaGVjaz4gaSkKKyAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICB7CisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICBzdW0wPTA7CisgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgZm9yIChpPTE7aTw0MDA7aSsrKQorCXN1bTA9c3VtMCtpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgc3VtMD0wOworICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihpPTQwMDtpPDcwMDtpKyspCisJc3VtMD1zdW0wK2k7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgIHN1bTA9MDsKKyAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaT03MDA7aTwxMDAwO2krKykKKwlzdW0wPXN1bTAraTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgICAgICAgICAgICAgCisgIH0gICAgICAgIC8qZW5kIG9mIHBhcmFsbGVsIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgora25vd25fc3VtPSg5OTkqMTAwMCkvMis3OworcmV0dXJuIChrbm93bl9zdW09PXN1bSk7IAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX3ByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRlYTZhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNTY4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsJCisJZG91YmxlIGRwdDsKKyAgICBkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtNTsKKwlpbnQgZGlmZjsKKwlkb3VibGUgZGRpZmY7CisJaW50IHByb2R1Y3Q7CisJaW50IGtub3duX3Byb2R1Y3Q7CisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgYml0X2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbMTAwMF07CisJaW50IGk7CisJaW50IHJlc3VsdDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bSA9IDc7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3QgPTE7CisgICAgZHB0ID0gMTsKKwlsb2dpY19hbmQ9MTsKKwliaXRfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfb3I9MDsKKwlleGNsdXNpdl9iaXRfb3I9MDsKKyAgICByZXN1bHQgPTA7CisJLyogIGludCBteV9pc2xhcmdlcjsqLworCS8qaW50IGlzX2xhcmdlcj0xOyovCisJa25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzc7CisKKyAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCXN1bT1zdW0raTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCXN1bT1zdW0raTsKKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsc3VtLCBrbm93bl9zdW0pOworCX0KKworCWRpZmYgPSAoOTk5KjEwMDApLzI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWRpZmY9ZGlmZi1pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWRpZmY9ZGlmZi1pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQl7CisJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQl7CisJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisJfQorCisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQl7CisJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQl7CisJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisJa25vd25fcHJvZHVjdCA9IDM2Mjg4MDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTE7aTwzO2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MztpPDc7aSsrKQorCQkJeworCQkJCXByb2R1Y3QgKj0gaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03O2k8MTE7aSsrKQorCQkJeworCQkJCXByb2R1Y3QgKj0gaTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzWzUwMV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIiKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisJfQorCisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzWzUwMV09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZihleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlleGNsdXNpdl9iaXRfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKzwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI4ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc2hhcmVkIG9wdGlvbiBvZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2hhcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NoYXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBzdW07CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIHN1bSA9IDA7CisgIGludCBrbm93bl9zdW07CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnNoYXJlZChzdW0pPC9vbXB0czpjaGVjaz4gPG9tcHRzOmNyb3NzY2hlY2s+Zmlyc3Rwcml2YXRlKHN1bSk8L29tcHRzOmNyb3NzY2hlY2s+CisgIHsKKyAgICA8b21wdHM6b3JwaGFuPgorICAgIGludCBteXN1bSA9IDA7CisjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKzwvb21wdHM6b3JwaGFuPgorCisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgCWZwcmludGYobG9nRmlsZSwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDM1ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBmaXJzdHByaXZhdGUgZGlyZWN0aXZlIGJ5IGFkZGluZyBhIHZhcmlhYmxlIHdoaWNoIGlzIGRlZmluZWQgYmVmb3JlIHRoZSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKwkgICAgaW50IHN1bTsKKwkgICAgaW50IHN1bTA7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKwlpbnQga25vd25fc3VtOworCisJc3VtMCA9IDExOworCXN1bSA9IDc7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKwkJCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCQkJeworCQkJCQlzdW0gPSBzdW0gKyBzdW0wOworCQkJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkJCX0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9ICAgICAgICAgICAgICAgCisJCX0gLyplbmQgb2Ygc2VjdGlvbnMqLworPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKwlrbm93bl9zdW0gPSAxMSAqIDMgKyA3OworCXJldHVybiAoa25vd25fc3VtID09IHN1bSk7IAorfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNzMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGkwID0gLTE7CisJaW50IHN1bSA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgc3VtMCA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgaTAgPSAtMTsKKyAgICBzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+IHByaXZhdGUoaSxzdW0wKQorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJICAgIH0gLyogZW5kIG9mIHNlY3Rpb24gKi8KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJc3VtMCA9IDA7CisJCWZvcihpID0gNDAwOyBpIDwgNzAwOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJc3VtMCA9IDA7CisJCWZvcihpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9CisJfSAvKiBlbmQgb2Ygc2VjdGlvbnMqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMjsKKyAgICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gOTk5KSApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlhMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gcHJpdmF0ZSBkaXJlY3RpdmUgYnkgdXBjb3VudGluZyBhIHZhcmlhYmxlIGluIGEgdG8gc2V2ZXJhbCBzZWN0aW9ucyBzcGxpdHRlZCBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IHN1bTA7CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gNzsKKyAgICBzdW0wID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wICBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wLGkpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPgorICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorCQkgICAgc3VtMCA9IHN1bTAgKyBpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCSAgICB9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorCSAgICB7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQlzdW0wID0gMDsKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCQlmb3IgKGkgPSA0MDA7IGkgPCA3MDA7IGkrKykKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCSAgICB7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQlzdW0wID0gMDsKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCQlmb3IgKGkgPSA3MDA7IGkgPCAxMDAwOyBpKyspCisJCSAgICBzdW0wID0gc3VtMCArIGk7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJICAgIH0gICAgICAgICAgICAgICAKKwl9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3OworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7IAorfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9wcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxYTM3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19ub3dhaXQuYwpAQCAtMCwwICsxLDY2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czpkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBub3dhaXQgZGlyZWN0aXZlLiBJdCBmaWxscyBhbiBhcnJheSB3aXRoIHZhbHVlcyBhbmQgb3BlcmF0ZXMgb24gdGhlc2UgaW4gdGhlIGZvbGxvd2luZy48L29tcHRzOmRlc2NyaXB0aW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dmVyc2lvbj4xLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHNlY3Rpb25zLCBvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uc19ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCTxvbXB0czpvcnBoYW46dmFycz4KKwkJaW50IHJlc3VsdDsKKwkJaW50IGNvdW50OworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGo7CisKKwlyZXN1bHQgPSAwOworCWNvdW50ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworCTxvbXB0czpvcnBoYW4+CisJaW50IHJhbms7CisKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQorI3ByYWdtYSBvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPm5vd2FpdDwvb21wdHM6Y2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGVudGVycyBmaXJzdCBzZWN0aW9uIGFuZCBnZXRzIHNsZWVwaW5nLlxuIiwgcmFuayk7CisJCQkJbXlfc2xlZXAoU0xFRVBUSU1FKTsKKwkJCQljb3VudCA9IDE7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCB3b2tlIHVwIGFuIHNldCBjb3VudCB0byAxLlxuIiwgcmFuayk7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIGZpcnN0IHNlY3Rpb24uXG4iLCByYW5rKTsKKwkJCX0KKwkJfQorLyogQmVnaW4gb2Ygc2Vjb25kIHNlY3Rpb25zIGVudmlyb25tZW50ICovCisjcHJhZ21hIG9tcCBzZWN0aW9ucworCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSBzZWNvbmQgc2VjdGlvbi5cbiIsIHJhbmspOworCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUgc2Vjb25kIHNlY3Rpb24gYW5kIGNvbnRyb2xzIHRoZSB2YWx1ZSBvZiBjb3VudFxuIiwgcmFuayk7CisJCQkJaWYgKGNvdW50ID09IDApCisJCQkJCXJlc3VsdCA9IDE7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgImNvdXQgd2FzICVkIiwgY291bnQpOworCQkJfQorCQl9CisJPC9vbXB0czpvcnBoYW4+CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzgyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw2MTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25zX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsKKwlkb3VibGUgZHB0LGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworCWludCBsb2dpY19hbmQ7CisJaW50IGJpdF9hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzWzEwMDBdOworCWludCBpOworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKwkvKiAgaW50IG15X2lzbGFyZ2VyOyovCisJLyppbnQgaXNfbGFyZ2VyPTE7Ki8KKworICAgIHN1bSA9NzsKKyAgICBkcHQgPTE7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3QgPTE7CisJbG9naWNfYW5kPTE7CisJYml0X2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0ID0gMDsKKwlkdCA9IDEuLzMuOworCWtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlzdW09c3VtK2k7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlzdW09c3VtK2k7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQkrK3Jlc3VsdDsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLCBzdW0sa25vd25fc3VtKTsKKwl9CisKKwlkaWZmID0gKDk5OSoxMDAwKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJZGlmZj1kaWZmLWk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJZGlmZj1kaWZmLWk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTA7aTw2OysraSkKKwkJCQl7CisJCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCQl7CisJCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTA7aTw2OysraSkKKwkJCQl7CisJCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCQl7CisJCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKwl9CisKKworCWtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTE7aTwzO2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MztpPDc7aSsrKQorCQkJCXsKKwkJCQkJcHJvZHVjdCAqPSBpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03O2k8MTE7aSsrKQorCQkJCXsKKwkJCQkJcHJvZHVjdCAqPSBpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzWzUwMV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJcbkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisJfQorCisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworCX0KKworCisJZm9yKGk9MDtpPDEwMDA7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwliaXRfYW5kID0gMTsKKwlsb2dpY3NbNTAxXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyYjBkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGUuYwpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgZGlyZWN0aXZlIGJ5IGNvbnRyb2xsaW5nIGhvdyBvZnRlbiBhIGRpcmVjdGl2ZSBpcyBjYWxsZWQgaW4gYW4gb21wIHNpbmdsZSByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJaW50IHJlc3VsdDsKKwlpbnQgbnJfaXRlcmF0aW9uczsKKwlpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIHJlc3VsdCA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSA8L29tcHRzOmNoZWNrPgorCQl7ICAKKyNwcmFnbWEgb21wIGZsdXNoCisJCSAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgCisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCSAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworCQkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJCX0gLyogZW5kIG9mIHNpbmdsZSAqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3Y2Q1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfY29weXByaXZhdGUuYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgY29weXByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIGNvcHlwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmxsZWwsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBqOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShqKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlX2NvcHlwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHJlc3VsdCA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwkgICAgeworCQkvKgorCQkgICBpbnQgdGhyZWFkOworCQkgICB0aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCSAqLworI3ByYWdtYSBvbXAgc2luZ2xlIDxvbXB0czpjaGVjaz5jb3B5cHJpdmF0ZShqKTwvb21wdHM6Y2hlY2s+CisJCXsKKwkJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkJICAgIGogPSBpOworCQkgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgYXNzaWducywgaiA9ICVkLCBpID0gJWRcbiIsIHRocmVhZCwgaiwgaSk7Ki8KKwkJfQorCQkvKgkjcHJhZ21hIG9tcCBiYXJyaWVyKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIC8qcHJpbnRmICgidGhyZWFkID0gJWQsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOyovCisJCSAgICByZXN1bHQgPSByZXN1bHQgKyBqIC0gaTsKKwkJfQorI3ByYWdtYSBvbXAgYmFycmllcgorCSAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX25vd2FpdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdhMjUwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYwpAQCAtMCwwICsxLDYwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBhdG9taWM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgbXlfaXRlcmF0aW9uczsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlfaXRlcmF0aW9ucykKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZV9ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQgdG90YWxfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBucl9pdGVyYXRpb25zID0gMDsKKyAgICBteV9pdGVyYXRpb25zID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6Y2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIGF0b21pYyAgCisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCX0gLyogZW5kIG9mIHNpbmdsZSovICAgIAorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBmb3IgICovCisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSAKKyAgICB7CisJbXlfaXRlcmF0aW9ucyA9IDA7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBteV9pdGVyYXRpb25zKys7CisJCX0gLyogZW5kIG9mIHNpbmdsZSovICAgIAorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBmb3IgICovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgdG90YWxfaXRlcmF0aW9ucyArPSBteV9pdGVyYXRpb25zOworCX0KKworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgcmV0dXJuICgobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpICYmICh0b3RhbF9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlX25vd2FpdCovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzUwMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9wcml2YXRlLmMKQEAgLTAsMCArMSw1NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2VsIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZsdXNoLG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15aXQgPSAwOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteWl0KQoraW50IG15cmVzdWx0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlyZXN1bHQpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGVfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgaTsKKworICAgIG15aXQgPSAwOworICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBucl9pdGVyYXRpb25zID0gMDsKKyAgICByZXN1bHQgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgeworCW15cmVzdWx0ID0gMDsKKwlteWl0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBzaW5nbGUgPG9tcHRzOmNoZWNrPnByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpIDwvb21wdHM6Y2hlY2s+bm93YWl0CisJICAgIHsgIAorCQlucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisjcHJhZ21hIG9tcCBmbHVzaAorCQlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgCisJCW15aXQrKzsKKwkJbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8gICAgCisJPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKyAgICAgICAgICAgIHJlc3VsdCArPSBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgbnJfaXRlcmF0aW9ucyArPSBteWl0OworCX0KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSBwcml2YXRlICovIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODk3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFzay5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYSBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBsZXQgcGF1c2UgdGhlIHRhc2tzIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHRocmVhZHMgZ2V0IHNoZWR1bGVkIHRvIHRoZSBuZXdseSBvcGVuZWQgdGFza3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHRpZHNbTlVNX1RBU0tTXTsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKK3sKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgIG15aSA9IGk7CisKKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0YXNrPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICAgIHRpZHNbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KK30gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKHRpZHNbMF0gIT0gdGlkc1tpXSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmluYWwuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwMGM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMKQEAgLTAsMCArMSw1MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGxldCBwYXVzZSB0aGUgdGFza3MgZ2VuZXJhdGVkIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBnZXQgc2hlZHVsZWQgdG8gdGhlIG5ld2x5IG9wZW5lZCB0YXNrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgZmluYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmluYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgdGlkc1tOVU1fVEFTS1NdOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGVycm9yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICBteWkgPSBpOworCisgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5maW5hbChpPj0xMCk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCisgICAgICAgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisvKiBOb3cgd2UgY2tlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIHRhc2tzLiAqLworICAgIGZvciAoaSA9IDEwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKHRpZHNbMTBdICE9IHRpZHNbaV0pCisgICAgICAgICAgICBlcnJvcisrOworICAgIH0KKyAgICByZXR1cm4gKGVycm9yPT0wKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWEwNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBmaXJzdHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB1bmVxdWFsIHplcm8gd2hpY2ggZ2V0cyBkZWNsYXJlZCBmaXJzdHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtID0gMTIzNDsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCByZXN1bHQgPSAwOyAvKiBjb3VudHMgdGhlIHdyb25nIHN1bXMgZnJvbSB0YXNrcyAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBrbm93bl9zdW0gPSAxMjM0ICsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgICAgICAgICAgIHsgcmVzdWx0Kys7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLworCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaWYuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3YWIyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBpZiBjbGF1c2Ugb2YgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWFyIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbiBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZSBwYXJlbnQgdGhyZWFkIG5vdyBzaGFsbCBzZXQgYSBjb3VudGVyIHZhcmlhYmxlIHdoaWNoIHRoZSBwYXVzZWQgdGFzayBzaGFsbCBldmFsdWF0ZSB3aGVuIHdva2UgdXAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGlmPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBjb25kaXRpb25fZmFsc2U7CisgICAgaW50IGNvdW50OworICAgIGludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBjb3VudD0wOworICAgIGNvbmRpdGlvbl9mYWxzZSA9IChsb2dGaWxlID09IE5VTEwpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5pZiAoY29uZGl0aW9uX2ZhbHNlKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChjb3VudCwgcmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FX0xPTkcpOworLy8jcHJhZ21hIG9tcCBmbHVzaCAoY291bnQpCisgICAgICAgICAgICByZXN1bHQgPSAoMCA9PSBjb3VudCk7CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorCisgICAgICAgIGNvdW50ID0gMTsKKy8vI3ByYWdtYSBvbXAgZmx1c2ggKGNvdW50KQorCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCit9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhmMGVmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBwcml2YXRlIHdvcmtzIHByb3Blcmx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKKworCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ltcF9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpPTU7CisgICAgaW50IGsgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCB0YXNrX3Jlc3VsdCA9IDE7CisgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoaSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgIHsKKyAgICAgCisgICAgICAgIAorICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykKKwkgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBzaGFyZWQocmVzdWx0ICwgdGFza19yZXN1bHQ8b21wdHM6Y3Jvc3NjaGVjaz4sIGk8L29tcHRzOmNyb3NzY2hlY2s+KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKKwkJCSAgLy9jaGVjayBpZiBpIGlzIHByaXZhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSAhPSA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfcmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE5VTV9UQVNLUzsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIGZpcnN0cHJpdmF0ZSBpbXBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKworCSAgI3ByYWdtYSBvbXAgdGFza3dhaXQKKwkgIHJlc3VsdCA9ICh0YXNrX3Jlc3VsdCAmJiBpPT01KTsKKyAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19wcml2YXRlLmMKQEAgLTAsMCArMSw1MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gd2hpY2ggZ2V0cyBkZWNsYXJlZCBwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgZmx1c2gsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IGk7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHN1bSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7IC8qIGNvdW50cyB0aGUgd3Jvbmcgc3VtcyBmcm9tIHRhc2tzICovCisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bSk8L29tcHRzOmNoZWNrPiBzaGFyZWQocmVzdWx0LCBrbm93bl9zdW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKwkJICAgIC8vaWYgc3VtIGlzIHByaXZhdGUsIGluaXRpYWxpemUgdG8gMAorCQkgICAgPG9tcHRzOmNoZWNrPnN1bSA9IDA7PC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMT09QQ09VTlQ7IGorKykgeworI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3VtICE9IGtub3duX3N1bSkgeworI3ByYWdtYSBvbXAgY3JpdGljYWwgCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLworCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfc2hhcmVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGMyMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfc2hhcmVkLmMKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPiBUZXN0IHRvIHNlZSBpZiBpbXBsaWVkIHNoYXJlZCB3b3JrcyBjb3JyZWN0bHk8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLCBvbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pbXBfc2hhcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgaTsKKyAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaT0wOworICAgIGludCBrID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgICAgZm9yIChrID0gMDsgayA8IE5VTV9UQVNLUzsgaysrKSAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNyb3NzY2hlY2s+IGZpcnN0cHJpdmF0ZShpKSA8L29tcHRzOmNyb3NzY2hlY2s+IDxvbXB0czpjaGVjaz4gc2hhcmVkKGkpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIHNoYXJlZCBpbXBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+IAorICAgICAgICAgICAgICAgICAgfQorCisgICAgfQorCityZXN1bHQgPSBpOworcmV0dXJuICgocmVzdWx0ID09IE5VTV9UQVNLUykpOworICAgICAKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza191bnRpZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3VudGllZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmViZTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza191bnRpZWQuYwpAQCAtMCwwICsxLDY5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCBmb3IgdW50aWVkIGNsYXVzZS4gRmlyc3QgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGVuIHdlIHJlc3VtZSBoYWxmIG9mIHRoZW0gYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgc2NoZWR1bGVkIGJ5IGRpZmZlcmVudCB0aHJlYWRzPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHVudGllZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza191bnRpZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgaW50IHN0YXJ0X3RpZFtOVU1fVEFTS1NdOworICBpbnQgY3VycmVudF90aWRbTlVNX1RBU0tTXTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgY291bnQgPSAwOworICAKKyAgLyppbml0aWFsaXphdGlvbiovCisgIGZvciAoaT0wOyBpPCBOVU1fVEFTS1M7IGkrKyl7CisgICAgc3RhcnRfdGlkW2ldPTA7CisgICAgY3VycmVudF90aWRbaV09MDsKKyAgfQorICAKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGkpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgaW50IG15aSA9IGk7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPnVudGllZDwvb21wdHM6Y2hlY2s+CisgICAgICAgIHsKKyAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgIHN0YXJ0X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIAorICAgICAgICAgICNwcmFnbWEgb21wIHRhc2t3YWl0CisgICAgICAgICAgCisgICAgICAgICAgPG9tcHRzOmNoZWNrPmlmKChzdGFydF90aWRbbXlpXSAlMikgIT0wKXs8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgfSAvKiBlbmQgb2YgaWYgKi8gCisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisKKyAgICAgICAgfSAvKmVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspCisgIHsKKyAgICBwcmludGYoInN0YXJ0X3RpZFslZF09JWQsIGN1cnJlbnRfdGlkWyVkXT0lZFxuIixpLCBzdGFydF90aWRbaV0sIGkgLCBjdXJyZW50X3RpZFtpXSk7CisgICAgaWYgKGN1cnJlbnRfdGlkW2ldID09IHN0YXJ0X3RpZFtpXSkKKyAgICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIChjb3VudDxOVU1fVEFTS1MpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKworPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t3YWl0LmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc2MWYyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t3YWl0LmMKQEAgLTAsMCArMSw3NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFza3dhaXQgZGlyZWN0aXZlLiBGaXJzdCB3ZSBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcywgd2hpY2ggc2V0IHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byBhIHNwZWNpZmljIHZhbHVlLiBUaGVuIHdlIGRvIGEgdGFza3dhaXQgYW5kIGNoZWNrIGlmIGFsbCB0YXNrcyBmaW5pc2hlZCBtZWFuaW5nIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZS4gVGhlbiB3ZSBnZW5lcmF0ZSBhIHNlY29uZCBzZXQgc2V0dGluZyB0aGUgYXJyYXkgZWxlbWVudHMgdG8gYW5vdGhlciB2YWx1ZS4gQWZ0ZXIgdGhlIHBhcmFsbGVsIHJlZ2lvbiB3ZSBjaGVjayBpZiBhbGwgdGFza3Mgb2YgdGhlIHNlY29uZCBzZXQgZmluaXNoZWQgYW5kIHdlcmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRhc2tzIG9mIHRoZSBmaXJzdCBzZXQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIHRhc2s8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIGludCByZXN1bHQxID0gMDsgICAgIC8qIFN0b3JlcyBudW1iZXIgb2Ygbm90IGZpbmlzaGVkIHRhc2tzIGFmdGVyIHRoZSB0YXNrd2FpdCAqLworICAgIGludCByZXN1bHQyID0gMDsgICAgIC8qIFN0b3JlcyBudW1iZXIgb2Ygd3JvbmcgYXJyYXkgZWxlbWVudHMgYXQgdGhlIGVuZCAqLworCisgICAgaW50IGFycmF5W05VTV9UQVNLU107CisgICAgaW50IGk7CisKKyAgICAvKiBmaWxsIGFycmF5ICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSAKKyAgICAgICAgYXJyYXlbaV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgICAgIG15aSA9IGk7CisjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbbXlpXSA9IDE7CisgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIH0gLyogZW5kIG9mIGZvciAqLworCis8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRhc2t3YWl0PC9vbXB0czpjaGVjaz4KKzwvb21wdHM6b3JwaGFuPgorCisgICAgICAgICAgICAvKiBjaGVjayBpZiBhbGwgdGFza3Mgd2VyZSBmaW5pc2hlZCAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSAKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0gIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0MSsrOworCisgICAgICAgICAgICAvKiBnZW5lcmF0ZSBzb21lIG1vcmUgdGFza3Mgd2hpY2ggbm93IHNoYWxsIG92ZXJ3cml0ZSAKKyAgICAgICAgICAgICAqIHRoZSB2YWx1ZXMgaW4gdGhlIHRpZHMgYXJyYXkgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICAgICAgbXlpID0gaTsKKyNwcmFnbWEgb21wIHRhc2sKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5W215aV0gPSAyOworICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICAvKiBmaW5hbCBjaGVjaywgaWYgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlczogKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKGFycmF5W2ldICE9IDIpCisgICAgICAgICAgICByZXN1bHQyKys7CisgICAgfQorCisgICAgcmV0dXJuICgocmVzdWx0MSA9PSAwKSAmJiAocmVzdWx0MiA9PSAwKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTI3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza3lpZWxkLmMKQEAgLTAsMCArMSw1OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgdGFza3lpZWxkIGRpcmVjdGl2ZS4gRmlyc3QgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGVuIHdlIHJlc3VtZSBoYWxmIG9mIHRoZW0gYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgc2NoZWR1bGVkIGJ5IGRpZmZlcmVudCB0aHJlYWRzPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNreWllbGQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgdGFza3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2t5aWVsZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHN0YXJ0X3RpZFtOVU1fVEFTS1NdOworICBpbnQgY3VycmVudF90aWRbTlVNX1RBU0tTXTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgZm9yIChpPTA7IGk8IE5VTV9UQVNLUzsgaSsrKXsKKyAgICBzdGFydF90aWRbaV09MDsKKyAgICBjdXJyZW50X3RpZFtpXT0wOworICB9CisgIAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIGludCBteWkgPSBpOworICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGFzayB1bnRpZWQ8L29tcHRzOmNoZWNrPgorICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBzdGFydF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIAorICAgICAgICAgICNwcmFnbWEgb21wIHRhc2t5aWVsZAorICAgICAgICAgIAorICAgICAgICAgIGlmKChzdGFydF90aWRbbXlpXSAlMikgPT0wKXsKKyAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfSAvKmVuZCBvZiBpZiovCisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgZm9yIChpPTA7aTxOVU1fVEFTS1M7IGkrKykKKyAgeworICAgIC8vcHJpbnRmKCJzdGFydF90aWRbJWRdPSVkLCBjdXJyZW50X3RpZFslZF09JWRcbiIsaSwgc3RhcnRfdGlkW2ldLCBpICwgY3VycmVudF90aWRbaV0pOworICAgIGlmIChjdXJyZW50X3RpZFtpXSA9PSBzdGFydF90aWRbaV0pCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiAoY291bnQ8TlVNX1RBU0tTKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+CisKKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg5ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbG9jay5jCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3Rsb2NrIGZ1bmN0aW9uLiBUaGUgdGVzdCBjb3VudHMgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdoaWNoIGlzIGJ1aWxkIHdpdGggYSB0ZXN0X2xvY2sgaW4gYW4gZW5kbGVzcyBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90ZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBvbXBfaW5pdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgIAorICAgIHsKKworI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgLypvbXBfc2V0X2xvY2soJmxjayk7Ki8KKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPndoaWxlICghb21wX3Rlc3RfbG9jayAoJmxjaykpCisJCXt9Ozwvb21wdHM6Y2hlY2s+CisJICAgIDwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAKKwkgICAgbnJfaXRlcmF0aW9ucysrOworCSAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworCSAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgPG9tcHRzOmNoZWNrPm9tcF91bnNldF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCX0KKyAgICB9CisgICAgb21wX2Rlc3Ryb3lfbG9jaygmbGNrKTsKKworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X25lc3RfbG9jay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkNmE0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3RfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK3N0YXRpYyBvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgCisgICAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBvbXBfaW5pdF9uZXN0X2xvY2sgKCZsY2spOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKSAKKyAgICB7CisKKyNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIC8qb21wX3NldF9sb2NrKCZsY2spOyovCis8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+d2hpbGUoIW9tcF90ZXN0X25lc3RfbG9jayAoJmxjaykpCisJICAgIHt9Ozwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCX0KKyAgICB9CisgICAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICgmbGNrKTsKKworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRkN2FhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYwpAQCAtMCwwICsxLDk3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0aHJlYWRwcml2YXRlIGRpcmVjdGl2ZSBieSBmaWxsaW5nIGFuIGFycmF5IHdpdGggcmFuZG9tIG51bWJlcnMgaW4gYW4gcGFyYWxsZWxpc2VkIHJlZ2lvbi4gRWFjaCB0aHJlYWQgZ2VuZXJhdGVzIG9uZSBudW1iZXIgb2YgdGhlIGFycmF5IGFuZCBzYXZlcyB0aGlzIGluIGEgdGVtcG9yYXJ5IHRocmVhZHByaXZhdGUgdmFyaWFibGUuIEluIGEgc2Vjb25kIHBhcmFsbGVsaXNlZCByZWdpb24gdGhlIHRlc3QgY29udHJvbHMsIHRoYXQgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSBjb250YWlucyBzdGlsbCB0aGUgZm9ybWVyIHZhbHVlIGJ5IGNvbXBhcmluZyBpdCB3aXRoIHRoZSBvbmUgaW4gdGhlIGFycmF5Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXBfc2V0X2R5bmFtaWMsb21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogVGhyZWFkcHJpdmF0ZSBpcyB0ZXN0ZWQgaW4gMiB3YXlzOgorICogMS4gVGhlIGdsb2JhbCB2YXJpYWJsZSBkZWNsYXJlZCBhcyB0aHJlYWRwcml2YXRlIHNob3VsZCBoYXZlCisgKiAgICBsb2NhbCBjb3B5IGZvciBlYWNoIHRocmVhZC4gT3RoZXJ3aXNlIHJhY2UgY29uZGl0aW9uIGFuZCAKKyAqICAgIHdyb25nIHJlc3VsdC4KKyAqIDIuIElmIHRoZSB2YWx1ZSBvZiBsb2NhbCBjb3B5IGlzIHJldGFpbmVkIGZvciB0aGUgdHdvIGFkamFjZW50CisgKiAgICBwYXJhbGxlbCByZWdpb25zCisgKi8KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBzdW0wPTA7CitzdGF0aWMgaW50IG15dmFsdWUgPSAwOworCis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteXZhbHVlKTwvb21wdHM6Y2hlY2s+CisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3RocmVhZHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisJaW50IHN1bSA9IDA7CisJaW50IGtub3duX3N1bTsKKwlpbnQgaTsgCisJaW50IGl0ZXI7CisJaW50ICpkYXRhOworCWludCBzaXplOworCWludCBmYWlsZWQgPSAwOworCWludCBteV9yYW5kb207CisJb21wX3NldF9keW5hbWljKDApOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSAKKyAgICB7CisJICBzdW0wID0gMDsKKyAgICAgICNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkJeworCQkJc3VtMCA9IHN1bTAgKyBpOworCQl9IC8qZW5kIG9mIGZvciovCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisJICB9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisJa25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCWlmIChrbm93bl9zdW0gIT0gc3VtICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiIGtub3duX3N1bSA9ICVkLCBzdW0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworCX0KKworCS8qIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiBpcyBqdXN0IHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyovCisJb21wX3NldF9keW5hbWljKDApOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworICAgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisJICB7CisJCQlzaXplPW9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwkJCWRhdGE9KGludCopIG1hbGxvYyhzaXplKnNpemVvZihpbnQpKTsKKwkgIH0KKwl9LyogZW5kIHBhcmFsbGVsKi8KKworCisJc3JhbmQoNDUpOworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCAxMDA7IGl0ZXIrKyl7CisJCW15X3JhbmRvbSA9IHJhbmQoKTsJLyogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgY2FsbGVkIGluc2lkZSBzZXJpYWwgcmVnaW9uKi8KKworCS8qIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gaXMgdXNlZCB0byBpbml0aWFsaXllIG15dmFsdWUgYW5kIHRoZSBhcnJheSB3aXRoIG15X3JhbmRvbStyYW5rKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKwkgICAgaW50IHJhbms7CisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCW15dmFsdWUgPSBkYXRhW3JhbmtdID0gbXlfcmFuZG9tICsgcmFuazsKKwl9CisKKwkvKiB0aGUgc2Vjb25kIHBhcmFsbGVsIHJlZ2lvbiB2ZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBvZiAibXl2YWx1ZSIgaXMgcmV0YWluZWQgKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24oKzpmYWlsZWQpCisJeworCSAgICBpbnQgcmFuazsKKwkJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkJZmFpbGVkID0gZmFpbGVkICsgKG15dmFsdWUgIT0gZGF0YVtyYW5rXSk7CisJCWlmKG15dmFsdWUgIT0gZGF0YVtyYW5rXSl7CisJCSAgZnByaW50ZiAobG9nRmlsZSwgIiBteXZhbHVlID0gJWQsIGRhdGFbcmFua109ICVkXG4iLCBteXZhbHVlLCBkYXRhW3JhbmtdKTsKKwkJfQorCX0KKyAgfQorICBmcmVlIChkYXRhKTsKKworCXJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgIWZhaWxlZDsKKworfSAvKiBlbmQgb2YgY2hlY2tfdGhyZWFkcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGVfZm9yLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQzNTlkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGVfZm9yLmMKQEAgLTAsMCArMSw0NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIGlmIGEgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBjYW4gYmUgdXNlZCBhcyBhIGxvb3BpbmRleC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IGk7Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpKTwvb21wdHM6Y2hlY2s+CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlX2Zvcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKwkJaW50IGtub3duX3N1bTsKKwkJaW50IHN1bTsKKwkJa25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCQlzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKwkJaW50IHN1bTAgPSAwOworI3ByYWdtYSBvbXAgZm9yCisJCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJCXN1bTAgPSBzdW0wICsgaTsKKwkJfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCQorCWlmIChrbm93bl9zdW0gIT0gc3VtICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiIGtub3duX3N1bSA9ICVkLCBzdW0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworCX0KKworCXJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2NvbW1vbl91dGlsaXR5LmYgYi9maW5hbC90ZXN0c3VpdGUvY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2NvbW1vbl91dGlsaXR5LmYKQEAgLTAsMCArMSw1NyBAQAorICAgICAgc3Vicm91dGluZSBwcmludF9yZXN1bHQocyxjcm9zc2ZhaWxlZCxNLG5hbWUpICAgICAKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGNoYXJhY3RlciAobGVuPSopOjpuYW1lCisJICAgcmVhbCBjZXJ0CisJICAgaW50ZWdlciBNLGNyb3NzZmFpbGVkCisJICAgaW50ZWdlciBzCisJICAgY2hhcmFjdGVyIChsZW49MTEpIDo6IGMKKyAJICAgY2hhcmFjdGVyIChsZW49MTgpIDo6IGMyCisJICAgY2VydD0xMDAuMCpjcm9zc2ZhaWxlZC9NCishICAgICAgICAgICBwcmludCAqLCAiY2VydCIsIGNlcnQsICJjcm9zcyAiLCBjcm9zc2ZhaWxlZAorIQl0ZXN0MT1odW5kcmVkKmNyb3NzZmFpbGVkCisJICAgYz0iJSBjZXJ0YWludHkiCisJICAgYzI9IiAuLi4gdmVyaWZpZWQgd2l0aCAiCisgICAgICBpZihzLmVxLjEpIHRoZW4KKyAgICAgICAgIHdyaXRlICgqLCIoQSwgQSwgRjcuMiwgQSkiKSBuYW1lLCBjMiwgY2VydCwgYworICAgICAgZWxzZQorICAgICAgICAgd3JpdGUgKCosIihBLEEpIikgbmFtZSwiIC4uLiBGQUlMRUQiCisgICAgICBlbmRpZgorCSAgIGVuZAorCisgICAgICBzdWJyb3V0aW5lIGRvX3Rlc3QodGVzdF9mdW5jLGNyb3NzX3Rlc3RfZnVuYyxuYW1lLE4sZmFpbGVkLAorICAgICB4ICBudW1fdGVzdHMsY3Jvc3NjaGVja2VkKQorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlciBzdWNjZWVkCisgICAgICBpbnRlZ2VyIGNyb3NzZmFpbAorICAgICAgaW50ZWdlciBmYWlsZWQKKyAgICAgIGludGVnZXIsIGV4dGVybmFsOjp0ZXN0X2Z1bmMKKyAgICAgIGludGVnZXIsIGV4dGVybmFsOjpjcm9zc190ZXN0X2Z1bmMKKyAgICAgIGNoYXJhY3RlciAobGVuPSopOjpuYW1lCisgICAgICBpbnRlZ2VyIGZhaWwKKyAgICAgIGludGVnZXIgTixpCisgICAgICBpbnRlZ2VyIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQKKyAgICAgIG51bV90ZXN0cz1udW1fdGVzdHMrMQorICAgICAgc3VjY2VlZD0xCisgICAgICBjcm9zc2ZhaWw9MAorICAgICAgZmFpbD0wCisgICAgICBkbyBpPTEsTgorICAgICAgICAgaWYodGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorICAgICAgICAgICAgc3VjY2VlZD0wCisgICAgICAgICAgICBmYWlsPWZhaWwrMQorICAgICAgICAgICAgZXhpdAorICAgICAgICAgZW5kIGlmCisgICAgICAgICBpZihjcm9zc190ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCishICAgICAgICAgICAgcHJpbnQgKiwgY3Jvc3NmYWlsCisgICAgICAgICAgICBjcm9zc2ZhaWw9Y3Jvc3NmYWlsKzEuMCAKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kZG8KKyAgICAgIAorICAgICAgaWYgKGZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICBmYWlsZWQ9ZmFpbGVkKzEKKyAgICAgIGVsc2UKKyAgICAgICAgIGlmKGNyb3NzZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgICAgIGNyb3NzY2hlY2tlZD1jcm9zc2NoZWNrZWQrMQorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRpZgorICAgICAgY2FsbCBwcmludF9yZXN1bHQoc3VjY2VlZCxjcm9zc2ZhaWwsTixuYW1lKQorICAgICAgZW5kCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NGNlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApAQCAtMCwwICsxLDM2IEBACitoYXNfb3Blbm1wCitvbXBfbmVzdGVkCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK2RvX29yZGVyZWQKK2RvX3JlZHVjdGlvbgorZG9fcHJpdmF0ZQorZG9fZmlyc3Rwcml2YXRlCitkb19sYXN0cHJpdmF0ZQorc2VjdGlvbl9yZWR1Y3Rpb24KK3NlY3Rpb25fcHJpdmF0ZQorc2VjdGlvbl9maXJzdHByaXZhdGUKK3NlY3Rpb25fbGFzdHByaXZhdGUKK3NpbmdsZQorc2luZ2xlX3ByaXZhdGUKK3NpbmdsZV9ub3dhaXQKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcmVkdWN0aW9uCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX2ZpcnN0cHJpdmF0ZQorcGFyX2RvX2xhc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KK3Bhcl9zZWN0aW9uX3ByaXZhdGUKK3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUKK29tcF9tYXN0ZXJfdGhyZWFkCitvbXBfY3JpdGljYWwKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfZmx1c2gKK29tcF90aHJlYWRwcml2YXRlCitvbXBfY29weWluCitvbXBfbG9jaworb21wX3Rlc3Rsb2NrCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jawpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDc2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKQEAgLTAsMCArMSw1IEBACitvbXBfbnVtX3RocmVhZHMKK29tcF93b3Jrc2hhcmUKK29tcF90aW1lCitvbXBfdGlja3NfdGltZQorc2luZ2xlX2NvcHlwcml2YXRlCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9jb21tb25fdXRpbGl0eS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpAQCAtMCwwICsxLDU3IEBACisgICAgICBzdWJyb3V0aW5lIHByaW50X3Jlc3VsdChzLGNyb3NzZmFpbGVkLE0sbmFtZSkgICAgIAorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKwkgICByZWFsIGNlcnQKKwkgICBpbnRlZ2VyIE0sY3Jvc3NmYWlsZWQKKwkgICBpbnRlZ2VyIHMKKwkgICBjaGFyYWN0ZXIgKGxlbj0xMSkgOjogYworIAkgICBjaGFyYWN0ZXIgKGxlbj0xOCkgOjogYzIKKwkgICBjZXJ0PTEwMC4wKmNyb3NzZmFpbGVkL00KKyEgICAgICAgICAgIHByaW50ICosICJjZXJ0IiwgY2VydCwgImNyb3NzICIsIGNyb3NzZmFpbGVkCishCXRlc3QxPWh1bmRyZWQqY3Jvc3NmYWlsZWQKKwkgICBjPSIlIGNlcnRhaW50eSIKKwkgICBjMj0iIC4uLiB2ZXJpZmllZCB3aXRoICIKKyAgICAgIGlmKHMuZXEuMSkgdGhlbgorICAgICAgICAgd3JpdGUgKCosIihBLCBBLCBGNy4yLCBBKSIpIG5hbWUsIGMyLCBjZXJ0LCBjCisgICAgICBlbHNlCisgICAgICAgICB3cml0ZSAoKiwiKEEsQSkiKSBuYW1lLCIgLi4uIEZBSUxFRCIKKyAgICAgIGVuZGlmCisJICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgZG9fdGVzdCh0ZXN0X2Z1bmMsY3Jvc3NfdGVzdF9mdW5jLG5hbWUsTixmYWlsZWQsCisgICAgIHggIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQpCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIHN1Y2NlZWQKKyAgICAgIGludGVnZXIgY3Jvc3NmYWlsCisgICAgICBpbnRlZ2VyIGZhaWxlZAorICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OnRlc3RfZnVuYworICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OmNyb3NzX3Rlc3RfZnVuYworICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKyAgICAgIGludGVnZXIgZmFpbAorICAgICAgaW50ZWdlciBOLGkKKyAgICAgIGludGVnZXIgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZAorICAgICAgbnVtX3Rlc3RzPW51bV90ZXN0cysxCisgICAgICBzdWNjZWVkPTEKKyAgICAgIGNyb3NzZmFpbD0wCisgICAgICBmYWlsPTAKKyAgICAgIGRvIGk9MSxOCisgICAgICAgICBpZih0ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCisgICAgICAgICAgICBzdWNjZWVkPTAKKyAgICAgICAgICAgIGZhaWw9ZmFpbCsxCisgICAgICAgICAgICBleGl0CisgICAgICAgICBlbmQgaWYKKyAgICAgICAgIGlmKGNyb3NzX3Rlc3RfZnVuYygpLmVxLjApIHRoZW4KKyEgICAgICAgICAgICBwcmludCAqLCBjcm9zc2ZhaWwKKyAgICAgICAgICAgIGNyb3NzZmFpbD1jcm9zc2ZhaWwrMS4wIAorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRkbworICAgICAgCisgICAgICBpZiAoZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgIGZhaWxlZD1mYWlsZWQrMQorICAgICAgZWxzZQorICAgICAgICAgaWYoY3Jvc3NmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgICAgY3Jvc3NjaGVja2VkPWNyb3NzY2hlY2tlZCsxCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGlmCisgICAgICBjYWxsIHByaW50X3Jlc3VsdChzdWNjZWVkLGNyb3NzZmFpbCxOLG5hbWUpCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2NvbGxhcHNlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+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+CisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZCB3aGljaCBvbmx5IHN0b3BzIG9uZSB0aHJlYWQuICovCisKK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgc3RydWN0IHRpbWV6b25lIHR6cDsKKyAgZG91YmxlIHN0YXJ0OworICBkb3VibGUgcmVhbDsKKyAgaWYoZ2V0dGltZW9mZGF5KCZ0diwmdHpwKSE9MCkgeworICAgIHBlcnJvcigiZ2V0X3RpbWU6ICIpOworICAgIGV4aXQoLTEpOworICB9CisgIHN0YXJ0ID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIHJlYWw9c3RhcnQ7CisgIHdoaWxlKCAocmVhbC1zdGFydCk8c2xlZXB0aW1lKXsKKyAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCZ0enApIT0wKSB7CisgICAgICBwZXJyb3IoImdldF90aW1lOiAiKTsKKyAgICAgIGV4aXQoLTEpOworICAgIH0KKyAgICByZWFsID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM1MzEzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpAQCAtMCwwICsxLDE0IEBACisgICAgICBJTlRFR0VSIE4gIVRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0ZXN0IGlzIHJ1bgorICAgICAgUEFSQU1FVEVSIChOPTEpCisgICAgICBDSEFSQUNURVIqOCBPTVBUU19WRVJTSU9OCisgICAgICBQQVJBTUVURVIgKE9NUFRTX1ZFUlNJT049IjMuMC5hIikKKyAgICAgIElOVEVHRVIgTE9PUENPVU5UICFUaGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbG9vcCBpcyBydW4KKyAgICAgIFBBUkFNRVRFUiAoTE9PUENPVU5UPTEwMDApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRQorICAgICAgUEFSQU1FVEVSIChTTEVFUFRJTUUgPSAuMDEpCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRV9MT05HCisgICAgICBQQVJBTUVURVIgKFNMRUVQVElNRV9MT05HID0gMC41KQorICAgICAgSU5URUdFUiBOVU1fVEFTS1MKKyAgICAgIFBBUkFNRVRFUiAoTlVNX1RBU0tTPTI1KQorICAgICAgSU5URUdFUiBNQVhfVEFTS1NfUEVSX1RIUkVBRAorICAgICAgUEFSQU1FVEVSIChNQVhfVEFTS1NfUEVSX1RIUkVBRD01KQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuaCBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwOGQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlICovCisKKy8qIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBvbXB0c19tYWtlSGVhZGVyLnBsIHNjcmlwdCB1c2luZyB0aGUgZm9sbG93aW5nIG9waW9uczogKi8KKy8qIC1mPW9tcHRzLWMuY29uZiAtdD1jICAqLworCisKKyNpZm5kZWYgT01QX1RFU1RTVUlURV9ICisjZGVmaW5lIE9NUF9URVNUU1VJVEVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogVmVyc2lvbiBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT01QVFNfVkVSU0lPTiAiMy4wYSIKKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIAkxMDAwCisjZGVmaW5lIFJFUEVUSVRJT05TIAkgIDIwCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FCSAwLjAxCisjZGVmaW5lIFNMRUVQVElNRV9MT05HCSAwLjUKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTICAgICAgICAgICAgICAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCAgICA1CitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBvcmRlcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZCAqLworaW50IHRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCB0ZXN0X29tcF90YXNrd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFza3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2t3YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t3YWl0ICovCitpbnQgdGVzdF9vbXBfYmFycmllcihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgYmFycmllciAqLworaW50IGNyb3NzdGVzdF9vbXBfYmFycmllcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBiYXJyaWVyICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgaWYgKi8KK2ludCB0ZXN0X29tcF9hdG9taWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IGNyb3NzdGVzdF9vbXBfYXRvbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IHRlc3Rfb21wX2dldF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfZ2V0X251bV90aHJlYWRzICovCitpbnQgY3Jvc3N0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfZ2V0X251bV90aHJlYWRzICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9uIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25fcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzZWN0aW9uIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGlmICovCitpbnQgdGVzdF9vbXBfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzaGFyZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzaGFyZWQgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfaW1wX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgdGVzdF9vbXBfdGFza19wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9hdXRvKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgYXV0byAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2F1dG8oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGF1dG8gKi8KK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90aHJlYWRwcml2YXRlX2ZvcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGFza191bnRpZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgdW50aWVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3VudGllZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHVudGllZCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3NpbmdsZV9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdsZSBub3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2luZ2xlIG5vd2FpdCAqLworaW50IHRlc3Rfb21wX2NyaXRpY2FsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBjcml0aWNhbCAqLworaW50IGNyb3NzdGVzdF9vbXBfY3JpdGljYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgY3JpdGljYWwgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGljayAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aWNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGljayAqLworaW50IHRlc3Rfb21wX3NpbmdsZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2xlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2luZ2xlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF90YXNreWllbGQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza3lpZWxkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IHRlc3RfaGFzX29wZW5tcChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBfT1BFTk1QICovCitpbnQgY3Jvc3N0ZXN0X2hhc19vcGVubXAoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBfT1BFTk1QICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3Rlc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfdGVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90ZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfdGVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmVsbGVsIG51bV90aHJlYWRzICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJlbGxlbCBudW1fdGhyZWFkcyAqLworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF9uZXN0ZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX25lc3RlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfbmVzdGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX25lc3RlZCAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRocmVhZHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3RocmVhZHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2VjdGlvbnMgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2VjdGlvbnMgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGZpbmFsICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmluYWwgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZmx1c2goRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZsdXNoICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mbHVzaChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmbHVzaCAqLworaW50IHRlc3Rfb21wX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIG9yZGVyZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBvcmRlcmVkICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF90YXNrX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGlmICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgaWYgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmaXJzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX2NvbGxhcHNlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgY29sbGFwc2UgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9jb2xsYXBzZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgY29sbGFwc2UgKi8KK2ludCB0ZXN0X29tcF9pbl9wYXJhbGxlbChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfaW5fcGFyYWxsZWwgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2luX3BhcmFsbGVsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2luX3BhcmFsbGVsICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShkeW5hbWljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMpICovCitpbnQgdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfbWFzdGVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX21hc3RlcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCB0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2VsIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNpbmdlbCBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGFzayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFzayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZGVmYXVsdCAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBkZWZhdWx0ICovCitpbnQgdGVzdF9vbXBfZm9yX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0ICovCitpbnQgdGVzdF9vbXBfdGVzdF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX3Rlc3RfbmVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90ZXN0X25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF90ZXN0X25lc3RfbG9jayAqLworaW50IHRlc3Rfb21wX25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfbmVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfbmVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCB0ZXN0X29tcF9tYXN0ZXJfMyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgY3Jvc3N0ZXN0X29tcF9tYXN0ZXJfMyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aW1lKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGltZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1jLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGI5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtYy5jb25mCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBWZXJzaW9uIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPTVBUU19WRVJTSU9OICIzLjBhIgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgCTEwMDAKKyNkZWZpbmUgUkVQRVRJVElPTlMgCSAgMjAKKy8qIGZvbGxvd2luZyB0aW1lcyBhcmUgaW4gc2Vjb25kcyAqLworI2RlZmluZSBTTEVFUFRJTUUJIDAuMDEKKyNkZWZpbmUgU0xFRVBUSU1FX0xPTkcJIDAuNQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fVEFTS1MgICAgICAgICAgICAgIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEICAgIDUKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1mLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtZi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWFmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtZi5jb25mCkBAIC0wLDAgKzEgQEAKKyFFbXB0eSBjb25maWcgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzEzNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzLmNvbmYKQEAgLTAsMCArMSwyNiBAQAorPGNvbmZpZz4KKzxnbG9iYWxjb25maWc+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+IHMvWyBcdF0rLy9nOworICB9CisgIHJldHVybiAkc3RyOworfQorCityZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxYjU5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jCkBAIC0wLDAgKzEsNTEgQEAKK2ludCBtYWluKCkKK3sKKwlpbnQgaTsJCQkvKiBMb29wIGluZGV4ICovCisJaW50IHJlc3VsdDsJCS8qIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvZ3JhbSAqLworCWludCBmYWlsZWQ9MDsgCQkvKiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzICovCisJaW50IHN1Y2Nlc3M9MDsJCS8qIG51bWJlciBvZiBzdWNjZWVkZWQgdGVzdHMgKi8KKwlzdGF0aWMgRklMRSAqIGxvZ0ZpbGU7CS8qIHBvaW50ZXIgb250byB0aGUgbG9nZmlsZSAqLworCXN0YXRpYyBjb25zdCBjaGFyICogbG9nRmlsZU5hbWUgPSAiPHRlc3RmdW5jdGlvbm5hbWU+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+KXsgJHNyYyAuPSAkXzsgfQorY2xvc2UoVEVTVCk7CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7ICRtYWlucHJvYyAuPSAkXzsgfQorY2xvc2UgKE1BSU5QUk9DKTsKKworIyBTb21lIHRlbXBvcmFyeSB0ZXN0aW5mb3JtYXRpb246CisoJGRlc2NyaXB0aW9uKSAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3RkZXNjcmlwdGlvbicsJHNyYyk7CisoJGRpcmVjdGl2ZSkgICAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOmRpcmVjdGl2ZScsJHNyYyk7CisoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHNyYyk7CisKK29wZW4gKE9VVEZJTEUsIj4kb3V0ZmlsZSIpIG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiOworCisjIENyZWF0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSB0ZXN0OgorKCRjb2RlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZScsJHNyYyk7CisjIFB1dHRpbmcgdG9nZXRoZXIgdGhlIGZ1bmN0aW9ucyBhbmQgdGhlIG1haW5wcm9ncmFtbToKKyRjb2RlIC49ICRtYWlucHJvYzsKKworI3RoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdCwgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisgKCRwYXJtcykgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnBhcm1zJywoJGNvZGUpKTsKKyAoJHBhcm1zKSA9IGxlYXZlX3NpbmdsZV9zcGFjZSgkcGFybXMpOworICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJGNvZGUpOworCisjIE1ha2UgbW9kaWZpY2F0aW9ucyBmb3IgdGhlIG9ycGhhbmVkIHRlc3R2ZXJzaW9uIGlmIG5lY2Vzc2FyeToKK2lmICgkb3JwaGFuKSB7CisjIEdldCB0aGUgZ2xvYmFsIHZhcmlhYmxlczoKKyAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICRvcnBodmFyc2RlZiA9ICIiOworICAgIGZvcmVhY2ggKEBkZWZzKSB7CisgICAgICAgIGlmIChub3QgL15bIF0qJC9ncykgeyAkb3JwaHZhcnNkZWYgPSBqb2luKCJcbiIsJG9ycGh2YXJzZGVmLCRfKTsgfSAKKyAgICB9CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gc3Vicm91dGluZXM6CisgICAgICAgICRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zICgiIiwgKCRjb2RlKSwoJHBhcm1zKSk7CisjIFJlcGxhY2Ugb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKyAgICAgICAgKCRjb2RlKSA9IG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMgKCIiLCAoJGNvZGUpLCgkcGFybXMpKTsKKyAgICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncyAoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKyMgdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1lbnQgYW5kIGFkZCBwYXJhbWV0ZXJzLCBieSBqb29uCisgICAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgICAgICRjb2RlID0gJGNvZGUgLiAkb3JwaGZ1bmNzOworfQorCisjIFJlbW92ZSByZW1haW5pbmcgbWFya3MgZm9yIHRoZSBvcnBhaG4gcmVnaW9ucyBhbmQgaXRzIHZhcmlhYmxlczoKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5am9vbgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorfQorZWxzaWYoJGNyb3NzdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgY3Jvc3N0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y2hlY2snLCgkY29kZSkpOwkJCit9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCd0ZXN0ZnVuY3Rpb25uYW1lJywidGVzdF8iLiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywidGVzdF8iLCcnLCgkY29kZSkgKTsKKyMJJGNvZGUgPSAgIlwjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRjb2RlOworIyBXcml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIGZpbGUgYW5kIGNsb3NlIGl0OgorcHJpbnQgT1VURklMRSAkY29kZTsKK2Nsb3NlKE9VVEZJTEUpOwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0IGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2EyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKQEAgLTAsMCArMSw2OCBAQAorIyBMaXN0IGNvbnRhaW5pbmcgdGhlIHRlc3RzIG9mIHRoZSBPcGVuTVBWYWxpZGFpb24gU3VpdGUgYXZhaWxhYmxlIHRvIGNoZWNrCisjIHRoZSBjIGltcGxlbWVudGF0aW9uLgoraGFzX29wZW5tcAorb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9jcml0aWNhbAorb21wX2ZsdXNoCitvbXBfZm9yX2ZpcnN0cHJpdmF0ZQorb21wX2Zvcl9sYXN0cHJpdmF0ZQorb21wX2Zvcl9vcmRlcmVkCitvbXBfZm9yX3ByaXZhdGUKK29tcF9mb3JfcmVkdWN0aW9uCitvbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMKK29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkCitvbXBfZm9yX3NjaGVkdWxlX3N0YXRpYworb21wX2Zvcl9ub3dhaXQKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9nZXRfd3RpY2sKK29tcF9nZXRfd3RpbWUKK29tcF9pbl9wYXJhbGxlbAorb21wX2xvY2sKK29tcF9tYXN0ZXIKK29tcF9uZXN0X2xvY2sKK29tcF9wYXJhbGxlbF9jb3B5aW4KK29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQKK29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZQorb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24KK29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcworb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitvbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZQorb21wX3NlY3Rpb25fcHJpdmF0ZQorb21wX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25zX25vd2FpdAorb21wX3BhcmFsbGVsX2Zvcl9pZgorb21wX3NpbmdsZV9jb3B5cHJpdmF0ZQorb21wX3NpbmdsZV9ub3dhaXQKK29tcF9zaW5nbGVfcHJpdmF0ZQorb21wX3NpbmdsZQorb21wX3Rlc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfdGhyZWFkcHJpdmF0ZQorb21wX3BhcmFsbGVsX2RlZmF1bHQKK29tcF9wYXJhbGxlbF9zaGFyZWQKK29tcF9wYXJhbGxlbF9wcml2YXRlCitvbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfaWYKK29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24KKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjAKK29tcF9mb3JfY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKK29tcF90YXNreWllbGQKK29tcF90YXNrX2ZpbmFsCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzODlhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDYzIEBACisjIExpc3QgY29udGFpbmluZyB0aGUgdGVzdHMgb2YgdGhlIE9wZW5NUFZhbGlkYWlvbiBTdWl0ZSBhdmFpbGFibGUgdG8gY2hlY2sKKyMgdGhlIGZvcnRhbiBpbXBsZW1lbnRhdGlvbi4KK2RvX2ZpcnN0cHJpdmF0ZQorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorZG9fc2NoZWR1bGVfZHluYW1pYworZG9fc2NoZWR1bGVfZ3VpZGVkCitkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfY29weWluCitvbXBfY3JpdGljYWwKK29tcF9mbHVzaAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2luX3BhcmFsbGVsCitvbXBfbG9jaworb21wX21hc3Rlcgorb21wX25lc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfbmVzdGVkCitvbXBfbnVtX3RocmVhZHMKK29tcF90ZXN0bG9jaworb21wX3RocmVhZHByaXZhdGUKK29tcF9nZXRfd3RpY2tzCisjIyNvbXBfd29ya3NoYXJlX2RlZmF1bHQKK29tcF93b3Jrc2hhcmUKKyMjIyBCcmF1Y2h0IG1hbiBkZW4gb2RlciBvYmlnZW4gZXJ3ZWl0ZXJuPworb21wX3d0aW1lCitwYXJfZG9fZmlyc3Rwcml2YXRlCitwYXJfZG9fbGFzdHByaXZhdGUKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX3JlZHVjdGlvbgorcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fcHJpdmF0ZQorcGFyX3NlY3Rpb25fcmVkdWN0CitzZWN0aW9uX2ZpcnN0cHJpdmF0ZQorc2VjdGlvbl9sYXN0cHJpdmF0ZQorc2VjdGlvbl9wcml2YXRlCitzZWN0aW9uX3JlZHVjdGlvbgorb21wX3NpbmdsZQorc2luZ2xlX2NvcHlwcml2YXRlCitzaW5nbGVfbm93YWl0CitzaW5nbGVfcHJpdmF0ZQorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMAorZG9fY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKKyNvbXBfdGFza3lpZWxkCisjb21wX3Rhc2tfZmluYWwKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5jIGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwMTUzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIEV4dGVuZGVkIHZlcnNpb24gb2Ygb21wX3NldF91bnNldF9sb2NrLmMgZm9yIHRlc3RpbmcgaGludGVkIGxvY2tzLgorICBDaGVjayB0byBtYWtlIHN1cmUgT3Blbk1QIGxvY2tzIGd1YXJhbnRlZSBtdXR1YWwgCisgIGV4Y2x1c2lvbiBmb3IgbXVsdGlwbGUgdGhyZWFkcy4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKwordm9pZCBjc2NhbGwoaW50IGlkLCBpbnQgblsxMDAwXSwgaW50ICpwYXNzZWQsIG9tcF9sb2NrX3QgKmxvY2spIHsKKyAgICBpbnQgaTsKKworICAgIG9tcF9zZXRfbG9jayggbG9jayApOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgbltpXSA9IGlkOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIGlmICggbltpXSAhPSBpZCApIHsKKyAgICAgICAgICAgICpwYXNzZWQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIG9tcF91bnNldF9sb2NrKCBsb2NrICk7Cit9CisKK2ludCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3QgaGludCkgeworICAgIGludCBwYXNzZWQsIG5bMTAwMF0sIGosIGlkOworICAgIG9tcF9sb2NrX3QgbG9jazsKKyAgICAKKyAgICBwYXNzZWQgPSAxOworCisgICAga21wX2luaXRfbG9ja19oaW50ZWQoJmxvY2ssIGhpbnQpOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKG4sIHBhc3NlZCwgbG9jaykgcHJpdmF0ZShpZCwgaikJCisgICAgeworICAgICAgICBpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICBmb3IgKGogPSAxOyBqIDw9IDEwMDAwOyBqKyspIHsKKyAgICAgICAgICAgIGNzY2FsbCggaWQsIG4sICZwYXNzZWQsICZsb2NrICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvbXBfZGVzdHJveV9sb2NrKCZsb2NrKTsKKworICAgIGlmIChwYXNzZWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitpbnQgbWFpbigpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9ub25lKTsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9jb250ZW5kZWQpOworICAgIHJldCArPSBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3VuY29udGVuZGVkKTsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSk7CisgICAgcmV0ICs9IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpOworICAgIC8vIFRoaXMgb25lIHdpbGwgZW1pdCBXYXJuaW5nIG9uIG1hY2hpbmVzIHdpdGggbm8gVFNYLiAKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9hZGFwdGl2ZSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBwcmludGYoIiBUZXN0ICVzIGZhaWxlZFxuIiwgX19GSUxFX18pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiBUZXN0ICVzIHBhc3NlZFxuIiwgX19GSUxFX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuZgpAQCAtMCwwICsxLDkwIEBACishCishIE1vZGlmaWVkIHZlcnNpb24gb2Ygb21wX3NldF91bnNldF9sb2NrLkYsIHVzaW5nIGhpbnRlZCBsb2NrIEFQSQorIQorICAgICAgcHJvZ3JhbSBvbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkCisKKyAgICAgIGludGVnZXIgcmV0CisjaWYgZGVmaW5lZChfT1BFTk1QKQorICAgICAgaW5jbHVkZSAnb21wX2xpYi5oJworCisgICAgICByZXQgPSAwCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfbm9uZSwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X2NvbnRlbmRlZCwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3VuY29udGVuZGVkLCByZXQpCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUsIHJldCkKKyAgICAgIGNhbGwgaGludGVkX2xvY2soa21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X2FkYXB0aXZlLCByZXQpCisjZWxzZQorICAgICAgcmV0ID0gMAorI2VuZGlmCisKKyAgICAgIGlmIChyZXQgLmVxLiAwKSB0aGVuCisgICAgICAgICAgcHJpbnQgKiwgJ1Rlc3Qgb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mIHBhc3NlZCcKKyAgICAgIGVsc2UKKyAgICAgICAgICBwcmludCAqLCAnVGVzdCBvbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmYgZmFpbGVkJworICAgICAgZW5kaWYKKworICAgICAgc3RvcAorICAgICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgaGludGVkX2xvY2sobG9ja19oaW50LCByZXQpCisjaWYgZGVmaW5lZChfT1BFTk1QKQorICAgICAgaW5jbHVkZSAnb21wX2xpYi5oJworICAgICAgaW50ZWdlcihvbXBfbG9ja19raW5kKSBsb2NrCisgICAgICBpbnRlZ2VyKGttcF9sb2NrX2hpbnRfa2luZCkgbG9ja19oaW50CisjZWxzZQorICAgICAgaW50ZWdlciBsb2NrCisgICAgICBpbnRlZ2VyIGxvY2tfaGludAorI2VuZGlmCisgICAgICBpbnRlZ2VyIHJldAorICAgICAgbG9naWNhbCBwYXNzZWQKKyAgICAgIGludGVnZXIgbigxMDAwKSwgaiwgaWQKKyAgICAgIAorICAgICAgcGFzc2VkID0gLlRSVUUuCisKKyAgICAgIGNhbGwga21wX2luaXRfbG9ja19oaW50ZWQobG9jaywgbG9ja19oaW50KQorCishJG9tcCAgcGFyYWxsZWwKKyEkb21wJiAgICAgc2hhcmVkICAgICAgIChuLHBhc3NlZCxsb2NrKQorISRvbXAmICAgICBwcml2YXRlICAgICAgKGlkLGopICAgICAgCisjaWYgZGVmaW5lZChfT1BFTk1QKSAmJiAhZGVmaW5lZChfQVNTVVJFKQorICAgICAgaWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorI2Vsc2UKKyAgICAgIGlkID0gMAorI2VuZGlmCisjaWYgZGVmaW5lZChfQVNTVVJFKQorICAgICAgZG8gaiA9IDEsIDEwCisjZWxzZQorICAgICAgZG8gaiA9IDEsIDEwMDAwCisjZW5kaWYKKyAgICAgICAgICBjYWxsIGNzY2FsbChpZCwgbiwgcGFzc2VkLCBsb2NrKQorICAgICAgZW5kZG8KKyEkb21wICBlbmQgcGFyYWxsZWwKKworICAgICAgY2FsbCBvbXBfZGVzdHJveV9sb2NrKGxvY2spCisKKyAgICAgIGlmICgubm90LiBwYXNzZWQpIHRoZW4KKyAgICAgICAgICByZXQgPSByZXQgKyAxCisgICAgICBlbmRpZgorCisgICAgICBlbmQKKworICAgICAgc3Vicm91dGluZSBjc2NhbGwoaWQsIG4sIHBhc3NlZCwgbG9jaykKKyNpZiBkZWZpbmVkKF9PUEVOTVApCisgICAgICAgIGluY2x1ZGUgJ29tcF9saWIuaCcKKyAgICAgIGludGVnZXIob21wX2xvY2tfa2luZCkgbG9jaworI2Vsc2UKKyAgICAgIGludGVnZXIgbG9jaworI2VuZGlmCisgICAgICBpbnRlZ2VyIGlkLCBpLCBuKDEwMDApCisgICAgICBsb2dpY2FsIHBhc3NlZAorCisgICAgICBjYWxsIG9tcF9zZXRfbG9jayhsb2NrKQorICAgICAgZG8gaSA9IDEsMTAwMAorICAgICAgICAgIG4oaSkgPSBpZAorICAgICAgZW5kZG8KKyAgICAgIGRvIGkgPSAxLDEwMDAKKyAgICAgICAgICBpZiAobihpKSAubmUuIGlkKSBwYXNzZWQgPSAuRkFMU0UuCisgICAgICBlbmRkbworICAgICAgY2FsbCBvbXBfdW5zZXRfbG9jayhsb2NrKQorICAgICAgZW5kCmRpZmYgLS1naXQgYS9maW5hbC93d3cvUkVBRE1FLnR4dCBiL2ZpbmFsL3d3dy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDNiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvUkVBRE1FLnR4dApAQCAtMCwwICsxLDExNSBAQAorCisgICAgICAgICAgICAgICBSRUFETUUgZm9yIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24KK3Nob3VsZCBjb21lIHdpdGggcHJlLWJ1aWx0IFBERiBkb2N1bWVudGF0aW9uIGluIGRvYy9SZWZlcmVuY2UucGRmLiAgCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoKKworJSBkb3h5Z2VuIGRvYy9kb3h5Z2VuL2NvbmZpZyAKKworaW4gdGhlIHJ1bnRpbWUgZGlyZWN0b3J5LgorCitUaGF0IHdpbGwgcHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvYy9kb3h5Z2VuL2dlbmVyYXRlZAorZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgcG9pbnRpbmcgYSB3ZWIgYnJvd3NlciBhdCB0aGUKK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4KKworSWYgeW91IGRvbid0IGhhdmUgRG94eWdlbiBpbnN0YWxsZWQsIHlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbQord3d3LmRveHlnZW4ub3JnLgorCisKK0hvdyB0byBCdWlsZCB0aGUgTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0luLXRyZWUgYnVpbGQ6CisKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQorQ2hlY2sgb3V0IG9wZW5tcCBpbnRvIGxsdm0vcHJvamVjdHMKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQKKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQKKyQgY21ha2UgcGF0aC90by9sbHZtIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZSBvbXAKKworT3V0LW9mLXRyZWUgYnVpbGQ6CisKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQorQ2hlY2sgb3V0IG9wZW5tcAorJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vb3Blbm1wIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZQorCitGb3IgZGV0YWlscyBhYm91dCBidWlsZGluZywgcGxlYXNlIGxvb2sgYXQgQnVpbGRfV2l0aF9DTWFrZS50eHQKKworQXJjaGl0ZWN0dXJlcyBTdXBwb3J0ZWQKKz09PT09PT09PT09PT09PT09PT09PT09CisqIElBLTMyIGFyY2hpdGVjdHVyZSAKKyogSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisqIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorKiBBUk0qIGFyY2hpdGVjdHVyZQorKiBBYXJjaDY0ICg2NC1iaXQgQVJNKSBhcmNoaXRlY3R1cmUKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAoYmlnIGVuZGlhbikKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAobGl0dGxlIGVuZGlhbikKKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbChSKSA2NCwgYW5kIAorSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgY2xhbmcgICAgICB8CistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgTGludXgqIE9TICAgfCAgIFllcygxLDUpICAgIHwgIFllcygyLDQpICAgfCBZZXMoNCw2LDcpICAgfAorfCBGcmVlQlNEKiAgICB8ICAgTm8gICAgICAgICAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNyw4KSB8Cit8IE9TIFgqICAgICAgIHwgICBZZXMoMSwzLDQpICB8ICBObyAgICAgICAgIHwgWWVzKDQsNiw3KSAgIHwKK3wgV2luZG93cyogT1MgfCAgIFllcygxLDQpICAgIHwgIE5vICAgICAgICAgfCBObyAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKygxKSBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0LCBpY2MvaWNsIHZlcnNpb25zIDEyLnggYXJlIAorICAgIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuCisoMikgR0NDKiB2ZXJzaW9uIDQuNyBpcyBzdXBwb3J0ZWQuCisoMykgRm9yIGljYyBvbiBPUyBYKiwgT1MgWCogdmVyc2lvbiAxMC41LjggaXMgc3VwcG9ydGVkLgorKDQpIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLgorKDUpIE9uIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSwgaWNjL2ljbCB2ZXJzaW9ucyAxMy4wIAorICAgIG9yIGxhdGVyIGFyZSByZXF1aXJlZC4KKyg2KSBDbGFuZyogdmVyc2lvbiAzLjMgaXMgc3VwcG9ydGVkLgorKDcpIENsYW5nKiBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkIAorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZAorICAgIGZyb20gdGhlIGxpYnJhcnkgYW5kIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcKKyAgICBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGU6CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2XyoKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKgorICAgIF9fa21wY19hdG9taWNfKl9mcAorKDgpIENvbW11bml0eSBjb250cmlidXRpb24gcHJvdmlkZWQgQVMgSVMsIG5vdCB0ZXN0ZWQgYnkgSW50ZWwuCisKK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQk0oUikgUG93ZXIgNyBhbmQgUG93ZXIgOAorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIHwgICBnY2MgICAgICB8ICAgY2xhbmcgICAgICB8CistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18Cit8IExpbnV4KiBPUyAgIHwgIFllcygxLDIpICB8IFllcygzLDQpICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKygxKSBPbiBQb3dlciA3LCBnY2MgdmVyc2lvbiA0LjguMiBpcyBzdXBwb3J0ZWQuCisoMikgT24gUG93ZXIgOCwgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLgorKDMpIE9uIFBvd2VyIDcsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC4KKyg0KSBPbiBQb3dlciA4LCBjbGFuZyB2ZXJzaW9uIDMuNyBpcyBzdXBwb3J0ZWQuCisKKworRnJvbnQtZW5kIENvbXBpbGVycyB0aGF0IHdvcmsgd2l0aCB0aGlzIFJUTAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yCit0aGlzIFJUTDogY2xhbmcgKGZyb20gdGhlIE9wZW5NUCBkZXZlbG9wbWVudCBicmFuY2ggYXQKK2h0dHA6Ly9jbGFuZy1vbXAuZ2l0aHViLmlvLyApLCBJbnRlbCBjb21waWxlcnMsIEdDQy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbgorZm9yIG1vcmUgZGV0YWlscy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90aWNlcworPT09PT09PQorCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L1JlZmVyZW5jZS5wZGYgYi9maW5hbC93d3cvUmVmZXJlbmNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdjNDBjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvd3d3L1JlZmVyZW5jZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L2NvbnRlbnQuY3NzIGIvZmluYWwvd3d3L2NvbnRlbnQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTZhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvY29udGVudC5jc3MKQEAgLTAsMCArMSwyNyBAQAoraHRtbCB7IG1hcmdpbjogMHB4OyB9IGJvZHkgeyBtYXJnaW46IDhweDsgfQorCitodG1sLCBib2R5IHsKKyAgcGFkZGluZzowcHg7CisgIGZvbnQtc2l6ZTpzbWFsbDsgZm9udC1mYW1pbHk6Ikx1Y2lkYSBHcmFuZGUiLCAiTHVjaWRhIFNhbnMgVW5pY29kZSIsIEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6ICNmZmY7IGNvbG9yOiAjMjIyOworICBsaW5lLWhlaWdodDoxLjU7Cit9CisKK2gxLCBoMiwgaDMsIHR0IHsgY29sb3I6ICMwMDAgfQorCitoMSB7IHBhZGRpbmctdG9wOjBweDsgbWFyZ2luLXRvcDowcHg7fQoraDIgeyBjb2xvcjojMzMzMzMzOyBwYWRkaW5nLXRvcDowLjVlbTsgfQoraDMgeyBwYWRkaW5nLXRvcDogMC41ZW07IG1hcmdpbi1ib3R0b206IC0wLjI1ZW07IGNvbG9yOiMyZDU4Yjd9CitsaSB7IHBhZGRpbmctYm90dG9tOiAwLjVlbTsgfQordWwgeyBwYWRkaW5nLWxlZnQ6MS41ZW07IH0KKworLyogU2xpZGVzICovCitJTUcuaW1nX3NsaWRlIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICBtYXJnaW4tcmlnaHQ6IGF1dG8KK30KKworLml0ZW1UaXRsZSB7IGNvbG9yOiMyZDU4YjcgfQorCisvKiBUYWJsZXMgKi8KK3RyIHsgdmVydGljYWwtYWxpZ246dG9wIH0KZGlmZiAtLWdpdCBhL2ZpbmFsL3d3dy9pbmRleC5odG1sIGIvZmluYWwvd3d3L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzYTRlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9pbmRleC5odG1sCkBAIC0wLDAgKzEsMjMyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCisgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorPCEtLSBNYXRlcmlhbCB1c2VkIGZyb206IEhUTUwgNC4wMSBzcGVjczogaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS8gLS0+Cis8aHRtbD4KKzxoZWFkPgorICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgPHRpdGxlPk9wZW5NUCogOiBTdXBwb3J0IGZvciB0aGUgT3Blbk1QIGxhbmd1YWdlPC90aXRsZT4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibWVudS5jc3MiPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjb250ZW50LmNzcyI+Cis8L2hlYWQ+CisKKzxib2R5PgorPGRpdiBpZD0ibWVudSI+CisgIDxkaXY+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnLyI+TExWTSBIb21lPC9hPgorICA8L2Rpdj4KKworICA8ZGl2IGNsYXNzPSJzdWJtZW51Ij4KKyAgICA8bGFiZWw+T3Blbk1QIEluZm88L2xhYmVsPgorICAgIDxhIGhyZWY9Ii9pbmRleC5odG1sIj5BYm91dDwvYT4KKyAgPC9kaXY+CisKKyAgPGRpdiBjbGFzcz0ic3VibWVudSI+CisgICAgPGxhYmVsPlF1aWNrIExpbmtzPC9sYWJlbD4KKyAgICA8YSBocmVmPSJodHRwOi8vbGlzdHMubGx2bS5vcmcvbWFpbG1hbi9saXN0aW5mby9vcGVubXAtZGV2Ij5vcGVubXAtZGV2PC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5sbHZtLm9yZy9tYWlsbWFuL2xpc3RpbmZvL29wZW5tcC1jb21taXRzIj5vcGVubXAtY29tbWl0czwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkJ1ZyBSZXBvcnRzPC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9zdm4vbGx2bS1wcm9qZWN0L29wZW5tcC90cnVuay8iPkJyb3dzZSBTVk48L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3ZpZXd2Yy9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rLyI+QnJvd3NlIFZpZXdWQzwvYT4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBpZD0iY29udGVudCI+CisgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKyAgPGgxPk9wZW5NUCZyZWc7OiBTdXBwb3J0IGZvciB0aGUgT3Blbk1QIGxhbmd1YWdlPC9oMT4KKyAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgorCisgIDxwPlRoZSBPcGVuTVAgc3VicHJvamVjdCBvZiBMTFZNIGlzIGludGVuZGVkIHRvIGNvbnRhaW4gYWxsIG9mIHRoZQorICAgICBjb21wb25lbnRzIHJlcXVpcmVkIHRvIGJ1aWxkIGFuIGV4ZWN1dGluZyBPcGVuTVAgcHJvZ3JhbSB0aGF0IGFyZQorICAgICBvdXRzaWRlIHRoZSBjb21waWxlciBpdHNlbGYuCisgIDwvcD4KKworICA8cD5IZXJlIHlvdSBjYW4gZmluZCA6LQorICAgIDx1bD4KKyAgICAgIDxsaT4KKyAgICAgICAgdGhlIGNvZGUgZm9yIHRoZSBydW50aW1lIGxpYnJhcnkgYWdhaW5zdCB3aGljaAorICAgICAgICBjb2RlIGNvbXBpbGVkIGJ5IHRoZSBPcGVuTVAvQ2xhbmcgY29tcGlsZXIgbXVzdCBiZSBsaW5rZWQgYmVmb3JlIGl0CisgICAgICAgIGNhbiBydW4uIFRoaXMgY29kZSBpcyBhbHNvIGF2YWlsYWJsZQorICAgICAgICBhdCA8YSBocmVmPSJodHRwOi8vb3Blbm1wcnRsLm9yZy8iPm9wZW5tcHJ0bC5vcmc8L2E+OyB3ZSBpbnRlbmQgdG8KKyAgICAgICAga2VlcCB0aGUgZGlmZmVyZW50IHNpdGVzIGluIHN5bmMuCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICB0aGUgbGlicmFyeSB0aGF0IHN1cHBvcnRzIG9mZmxvYWQgdG8gdGFyZ2V0IGRldmljZXMgKGluCisgICAgICAgICJvZmZsb2FkIikKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIHRoZSBPcGVuVUggdGVzdC1zdWl0ZSB3aGljaCBpcyBiZWluZyBpbnRlZ3JhdGVkLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICA8L3A+CisKKyAgPHA+U3VwcG9ydCBmb3IgdGhlIHBhcnRzIG9mIHRoZSBPcGVuTVAgNC4wIGxhbmd1YWdlIHRoYXQgYXJlIG5vdAorICBhc3NvY2lhdGVkIHdpdGggdGhlICJ0YXJnZXQiIGNvbnN0cnVjdHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUKKyAgInJ1bnRpbWUiIGRpcmVjdG9yeS4gU3VwcG9ydCBmb3Igb2ZmbG9hZGluZyBjb21wdXRhdGlvbiB2aWEgdGhlCisgICJ0YXJnZXQiIGRpcmVjdGl2ZSBpcyBpbiB0aGUgc2VwYXJhdGUgIm9mZmxvYWQiIGRpcmVjdG9yeS4gVGhhdAorICBidWlsZHMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRyYW5zZmVycmluZyBjb2RlCisgIGFuZCBkYXRhIHRvIGFuIGF0dGFjaGVkIGNvbXB1dGF0aW9uYWwgZGV2aWNlLiBJbml0aWFsIHN1cHBvcnQgaGVyZQorICBpcyBmb3IgdGhlIEludGVsJnJlZyBYZW9uIFBoaSYjMDE1MyBjb3Byb2Nlc3NvciwgYnV0IHdvcmsgaXMKKyAgYmVnaW5uaW5nIHRvIHN1cHBvcnQgb3RoZXIgYXR0YWNoZWQgY29tcHV0aW5nIGRldmljZXMsIGFuZCB0aGUKKyAgZGVzaWduIGlzIGludGVuZGVkIHRvIGJlIGdlbmVyYWwuIFRoZSBSRUFETUUudHh0IGluIHRoZSAib2ZmbG9hZCIKKyAgZGlyZWN0b3J5IGRlc2NyaWJlcyBob3cgdG8gYnVpbGQgdGhlIG9mZmxvYWQgbGlicmFyeS4KKyAgPC9wPgorCisgIDxwPkFsbCBvZiB0aGUgY29kZSBoZXJlIGlzIDxhCisgICAgIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9kb2NzL0RldmVsb3BlclBvbGljeS5odG1sI2xpY2Vuc2UiPmR1YWwgbGljZW5zZWQ8L2E+CisgICAgIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBhbmQgdGhlIFVJVUMgTGljZW5zZSAoYSBCU0QtbGlrZSBsaWNlbnNlKS4KKyAgICAgVGhlIExJQ0VOU0UudHh0IGZpbGUgYXQgdGhlIHRvcCBvZiB0aGUgT3Blbk1QIHByb2plY3QgY29udGFpbnMKKyAgICAgdGhlIGxpY2Vuc2UgdGV4dCBhbmQgYXNzb2NpYXRlZCBwYXRlbnQgZ3JhbnRzLgorICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9ImdvYWxzIj5GZWF0dXJlcyBhbmQgR29hbHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgICA8dWw+CisgICAgICAgIDxsaT5Db3JyZWN0bmVzcyBhcyBkZWZpbmVkIGJ5IHRoZSAKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5tcC5vcmcvbXAtZG9jdW1lbnRzL09wZW5NUDMuMS5wZGYiPk9wZW5NUAorICAgICAgICAgIDMuMSBzdGFuZGFyZCAoUERGKTwvYT4gbm93LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVubXAub3JnL21wLWRvY3VtZW50cy9PcGVuTVA0LjAuMC5wZGYiPk9wZW5NUAorICAgICAgICAgIDQuMCBzdGFuZGFyZCAoUERGKTwvYT4gaW4gdGhlIGZ1dHVyZS48L2xpPgorICAgICAgICA8bGk+SGlnaCBwZXJmb3JtYW5jZS48L2xpPgorICAgICAgICA8bGk+QUJJIGNvbXBhdGliaWxpdHkgd2l0aCA8YSBocmVmPSJodHRwOi8vZ2NjLmdudS5vcmciPkdjYzwvYT4gYW5kCisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvaW50ZWwtY29tcGlsZXJzIj5JbnRlbCdzCisgICAgICAgIGV4aXN0aW5nIE9wZW5NUCBjb21waWxlcnMuPC9hPiAKKyAgICAgICAgV2l0aCB0aGlzIHJlbGVhc2Ugd2UgaGF2ZSByZXN0b3JlZCBjb21wYXRpYmlsaXR5IHdpdGggT3Blbk1QCisgICAgICAgIDMuMSBjb2RlIGNvbXBpbGVkIGJ5IGdjYyA0LjksIGhvd2V2ZXIgd2UgZG8gbm90IGhhdmUgc3VwcG9ydAorICAgICAgICBmb3IgT3Blbk1QIDQuMCBjb2RlIHRoYXQgdXNlcyB0YXNrIGNhbmNlbGxhdGlvbiB3aGVuIGNvbXBpbGVkCisgICAgICAgIGJ5IGdjYyA0LjkuIEhvdyB3ZSB3aWxsIHN1cHBvcnQgc3VjaCBjb2RlIHJlbWFpbnMgYSByZXNlYXJjaCBpc3N1ZS4KKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJ3aHkiPldoeSBoYXZlIHRoZSBydW50aW1lIGNvZGUgaGVyZT88L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+SXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSB0aGUgcnVudGltZSBzb3VyY2VzIGluIHRoZSBzYW1lIHBsYWNlCisgICAgKGFuZCB3aXRoIHRoZSBzYW1lIGxpY2Vuc2UpIGFzIHRoZSBjb21waWxlci4KKyAgPC9wPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJyZXF1aXJlbWVudHMiPlBsYXRmb3JtIFN1cHBvcnQ8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+VGhlIE9wZW5NUCBydW50aW1lIGlzIGtub3duIHRvIHdvcmsgb24gCisgICAgPHVsPgorICAgICAgPGxpPkFSTSZyZWc7Jm5ic3A7IGFyY2hpdGVjdHVyZSBwcm9jZXNzb3JzPC9saT4KKyAgICAgIDxsaT5Qb3dlclBDJnRyYWRlOyZuYnNwOyBwcm9jZXNzb3JzPC9saT4KKyAgICAgIDxsaT4zMiBhbmQgNjQgYml0IFg4NgorICAgICAgICBwcm9jZXNzb3JzIHdoZW4gY29tcGlsZWQgd2l0aCBjbGFuZywgd2l0aCB0aGUgSW50ZWwgY29tcGlsZXIKKyAgICAgICAgb3Igd2l0aCBnY2MsIGFuZCBhbHNvIHRoZSBJbnRlbCZyZWc7Jm5ic3A7WGVvbiBQaGkmdHJhZGU7IHByb2R1Y3QgZmFtaWx5LCB3aGVuIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgdGhlIEludGVsIGNvbXBpbGVyLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIFBvcnRzIHRvIG90aGVyIGFyY2hpdGVjdHVyZXMgYW5kIG9wZXJhdGluZyBzeXN0ZW1zIGFyZSB3ZWxjb21lLgorICA8L3A+CisgIAorICA8cD5BIGZ1bGwgT1MgYW5kIGFyY2hpZWN0dXJlIGNvbXBhdGliaWxpdHkgbWF0cml4IGlzIGluIAorICAgIDxhIGhyZWY9IlJFQURNRS50eHQiPlJFQURNRS50eHQ8L2E+CisgIDwvcD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJkaXItc3RydWN0dXJlIj5TdGF0dXM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgIDxwPlRoZSBydW50aW1lIGNhbiBiZSBidWlsdCB3aXRoIGdjYywgaWNjIG9yIGNsYW5nLiBIb3dldmVyLCBub3RlCisgICB0aGF0IGEgcnVudGltZSBidWlsdCB3aXRoIGNsYW5nIGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIHdvcmsgd2l0aAorICAgT3Blbk1QIGNvZGUgY29tcGlsZWQgYnkgdGhlIG90aGVyIGNvbXBpbGVycywgc2luY2UgY2xhbmcgZG9lcyBub3Qgc3VwcG9ydAorICAgYSAxMjgtYml0IGZsb2F0IHR5cGUsIGFuZCBjYW5ub3QgdGhlcmVmb3JlIGdlbmVyYXRlIHRoZSBjb2RlIHVzZWQKKyAgIGZvciByZWR1Y3Rpb25zIG9mIHRoYXQgdHlwZSAod2hpY2ggbWF5IG9jY3VyIGluIHVzZXIgY29kZSBjb21waWxlZAorICAgYnkgdGhlIG90aGVyIGNvbXBpbGVycykuCisgICA8L3A+CisgCisgICA8cD5UaGUgVW5pdmVyc2l0eSBvZiBIb3VzdG9uIGhhcyBraW5kbHkgY29udHJpYnV0ZWQgdGhlaXIgdGVzdAorICAgc3VpdGUgKGluIHRoZSAidGVzdHN1aXRlIiBkaXJlY3RvcnkpLiBJbnRlZ3JhdGlvbiBhbmQgdXNlIG9mIHRoaXMKKyAgIGZvciBhdXRvbWF0aWMgdGVzdGluZyBpcyBpbiBwcm9ncmVzcy4KKyAgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5HZXQgaXQgYW5kIGdldCBpbnZvbHZlZCE8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+Rmlyc3QgcGxlYXNlIHJldmlldyBvdXIKKyAgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2RvY3MvRGV2ZWxvcGVyUG9saWN5Lmh0bWwiPkRldmVsb3BlcidzIFBvbGljeTwvYT4uCisKKyAgPHA+VG8gY2hlY2sgb3V0IHRoZSBjb2RlLCB1c2U6PC9wPgorCisgIDx1bD4KKyAgPGxpPjxjb2RlPnN2biBjbyBodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsgb3Blbm1wPC9jb2RlPjwvbGk+CisgIDwvdWw+CisKKyAgPHA+CisgICAgIE5vdGUgdGhhdCBmb3IgYW4gaW4tdHJlZSBidWlsZCwgeW91IHNob3VsZCBjaGVjayBvdXQgb3Blbm1wIHRvIGxsdm0vcHJvamVjdHMuCisgIDwvcD4KKworICA8cD5Jbi10cmVlIGJ1aWxkOjwvcD4KKyAgPHVsPgorICAgIDxsaT48Y29kZT5jZCB3aGVyZS15b3Utd2FudC10by1saXZlPC9jb2RlPjwvbGk+CisgICAgPGxpPkNoZWNrIG91dCBvcGVubXAgaW50byBsbHZtL3Byb2plY3RzPC9saT4KKyAgICA8bGk+PGNvZGU+Y2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQ8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWtkaXIgYnVpbGQgJmFtcDsmYW1wOyBjZCBidWlsZDwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5jbWFrZSBwYXRoL3RvL2xsdm0gLURDTUFLRV9DX0NPTVBJTEVSPSZsdDtDIGNvbXBpbGVyJmd0OyAtRENNQUtFX0NYWF9DT01QSUxFUj0mbHQ7QysrIGNvbXBpbGVyJmd0OzwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5tYWtlIG9tcDwvY29kZT48L2xpPgorICA8L3VsPgorCisgIDxwPk91dC1vZi10cmVlIGJ1aWxkOjwvcD4KKyAgPHVsPgorICAgIDxsaT48Y29kZT5jZCB3aGVyZS15b3Utd2FudC10by1saXZlPC9jb2RlPjwvbGk+CisgICAgPGxpPkNoZWNrIG91dCBvcGVubXA8L2xpPgorICAgIDxsaT48Y29kZT5jZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPm1rZGlyIGJ1aWxkICZhbXA7JmFtcDsgY2QgYnVpbGQ8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+Y21ha2UgcGF0aC90by9vcGVubXAgLURDTUFLRV9DX0NPTVBJTEVSPSZsdDtDIGNvbXBpbGVyJmd0OyAtRENNQUtFX0NYWF9DT01QSUxFUj0mbHQ7QysrIGNvbXBpbGVyJmd0OzwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5tYWtlPC9jb2RlPjwvbGk+CisgIDwvdWw+CisgIAorICA8cD5GdWxsIGRldGFpbHMgb2YgaG93IHRvIGJ1aWxkIGFyZSBpbiB0aGUKKyAgICA8YSBocmVmPSJSRUFETUUudHh0Ij5SRUFETUUudHh0PC9hPiBhbmQgQnVpbGRfV2l0aF9DTWFrZS50eHQgKGluc2lkZSB0aGUgcnVudGltZS8gc3ViZGlyZWN0b3J5KQorICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDM+Tm90ZXM8L2gzPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzxwPgorCis8L3A+CisKKyAgPHA+U2VuZCBkaXNjdXNzaW9ucyB0byB0aGUKKyAgKDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5sbHZtLm9yZy9tYWlsbWFuL2xpc3RpbmZvL29wZW5tcC1kZXYiPk9wZW5NUCBtYWlsaW5nIGxpc3Q8L2E+KS48L3A+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5EZXNpZ24gRG9jdW1lbnRzPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCis8dWw+Cis8bGk+PGEgaHJlZj0iUmVmZXJlbmNlLnBkZiI+UnVudGltZSBkZXNpZ24gKFBERik8L2E+PC9saT4KKzwvdWw+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDI+Q29weXJpZ2h0IG5vdGljZXM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cis8dWw+Cis8bGk+CisgIFRoZSBPcGVuTVAgbmFtZSBhbmQgdGhlIE9wZW5NUCBsb2dvIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgdGhlCisgIE9wZW5NUCBBcmNoaXRlY3R1cmUgUmV2aWV3IEJvYXJkLgorPC9saT4KKzxsaT4KKyAgSW50ZWwgaXMgYSB0cmFkZW1hcmsgb2YgSW50ZWwgQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyCisgIGNvdW50cmllcy4KKzwvbGk+Cis8bGk+CisgIFBvd2VyUEMgaXMgYSB0cmFkZW1hcmsgb2YgSUJNIENvcnBvcmF0aW9uIGluIHRoZSBVLlMuIGFuZC9vciBvdGhlcgorICBjb3VudHJpZXMuCis8L2xpPgorPGxpPgorICBBUk0gaXMgYSB0cmFkZW1hcmsgb2YgQVJNIENvcnBvcmF0aW9uIGluIHRoZSBVLlMuIGFuZC9vcgorICBvdGhlciBjb3VudHJpZXMuCis8L2xpPgorPC91bD4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L21lbnUuY3NzIGIvZmluYWwvd3d3L21lbnUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODg3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvbWVudS5jc3MKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKi8KKy8qIHBhZ2UgbGF5b3V0ICovCisvKioqKioqKioqKioqKioqLworCitbaWQ9bWVudV0geworCXBvc2l0aW9uOmZpeGVkOworCXdpZHRoOjI1ZXg7Cit9CitbaWQ9Y29udGVudF0geworCS8qICoqKioqICBFRElUIFRISVMgVkFMVUUgSUYgQ09OVEVOVCBPVkVSTEFQUyBNRU5VICoqKioqICovCisJcG9zaXRpb246YWJzb2x1dGU7CisgIGxlZnQ6MjlleDsKKwlwYWRkaW5nLXJpZ2h0OjRleDsKK30KKworLyoqKioqKioqKioqKioqLworLyogbWVudSBzdHlsZSAqLworLyoqKioqKioqKioqKioqLworCisjbWVudSAuc3VibWVudSB7CisJcGFkZGluZy10b3A6MWVtOworCWRpc3BsYXk6YmxvY2s7Cit9CisKKyNtZW51IGxhYmVsIHsKKwlkaXNwbGF5OmJsb2NrOworCWZvbnQtd2VpZ2h0OiBib2xkOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTkyLDE5MiwxOTIpOworfQorI21lbnUgYSB7CisJcGFkZGluZzowIC4yZW07CisJZGlzcGxheTpibG9jazsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNSwyMzUsMjM1KTsKK30KKyNtZW51IGE6dmlzaXRlZCB7CisJY29sb3I6cmdiKDEwMCw1MCwxMDApOworfQo=