LyoKICogQ29weXJpZ2h0IChjKSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgKGMpIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMaW1pdGVkLCBVSwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgRWxhaW5lIFdhbmcgPGVsYWluZS53YW5nQGludGVsLmNvbT4KICogICAgWmVuZyBMaSA8emVuZy5saUBpbnRlbC5jb20+CiAqCiAqLwoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJpbWdfdHlwZXMuaCIKI2luY2x1ZGUgInBzYl9kZWYuaCIKI2luY2x1ZGUgInBzYl9kcnZfZGVidWcuaCIKI2luY2x1ZGUgInBud19ob3N0aGVhZGVyLmgiCgoKLyogR2xvYmFsIHN0b3JlcyB0aGUgbGF0ZXN0IFFQIGluZm9ybWF0aW9uIGZvciB0aGUgRG9IZWFkZXIoKQogKiByb3V0aW5lLCBzaG91bGQgYmUgZmlsbGVkIGluIGJ5IHRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtLgogKi8KI2RlZmluZSBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUIDAKCi8qICNkZWZpbmUgVVNFU1RBVElDV0hFUkVQT1NTSUJMRSAxICovCgojZGVmaW5lIE1BWE5VTUJFUkVMRU1FTlRTIDE2CiNkZWZpbmUgSEVBREVSX1NJWkUgKDEyOCoyKQoKLyogU09NRSBVU0VGVUwgVEVTVCBGVU5DVElPTlMgKi8KI2lmIDAKCnN0YXRpYyB2b2lkIFNob3dfQml0cygKICAgIElNR19VSU5UOCAqdWNCaXRTdHJlYW0sCiAgICBJTUdfVUlOVDMyIEJ5dGVTdGFydEJpdCwKICAgIElNR19VSU5UMzIgQml0cykKewogICAgY2hhciBUeHRbMTAyNF07CiAgICBJTUdfVUlOVDMyIHVpQnl0ZVNpemU7CiAgICBJTUdfVUlOVDMyIHVpTHAsIHVpQnQsIEJjbnQ7CiAgICBCY250ID0gMDsKICAgIHVpQnl0ZVNpemUgPSAoQml0cyArIEJ5dGVTdGFydEJpdCArIDcpID4+IDM7CiAgICBmb3IgKHVpTHAgPSAwOyB1aUxwIDwgdWlCeXRlU2l6ZTsgdWlMcCsrKSB7CiAgICAgICAgc25wcmludGYoVHh0LCBzdHJsZW4oIiAiKSwgIiAiKTsKICAgICAgICBmb3IgKHVpQnQgPSAxMjg7IHVpQnQgPj0gMTsgdWlCdCA9IHVpQnQgPj4gMSkgewogICAgICAgICAgICBCY250Kys7CiAgICAgICAgICAgIGlmIChCY250ID4gQml0cyArIEJ5dGVTdGFydEJpdCB8fCBCY250IDw9IEJ5dGVTdGFydEJpdCkKICAgICAgICAgICAgICAgIHNucHJpbnRmKFR4dCwgc2l6ZW9mKFR4dCksICIlc1giLCBUeHQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzbnByaW50ZihUeHQsIHNpemVvZihUeHQpLCAiJXMlaSIsIFR4dCwgKHVjQml0U3RyZWFtW3VpTHBdICYgdWlCdCkgPiAwKTsKICAgICAgICB9CgogICAgICAgIHNucHJpbnRmKFR4dCwgc2l6ZW9mKFR4dCksICIlcyAiLCBUeHQpOwogICAgICAgIHByaW50ZigiJXMiLCBUeHQpOwogICAgICAgIGlmICgodWlMcCArIDEpICUgOCA9PSAwKSBwcmludGYoIlxuIik7CiAgICB9CgogICAgcHJpbnRmKCJcblxuIik7Cn0KI2VuZGlmCgojaWYgMAoKc3RhdGljIHZvaWQgU2hvd19FbGVtZW50cygKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3ApCnsKICAgIElNR19VSU5UOCBmOwogICAgSU1HX1VJTlQzMiBUb3RhbEJ5dGVTaXplOwogICAgSU1HX1VJTlQzMiBSVG90YWxCeXRlU2l6ZTsKCiAgICBSVG90YWxCeXRlU2l6ZSA9IFRvdGFsQnl0ZVNpemUgPSAwOwogICAgZm9yIChmID0gMDsgZiA8IG10eF9oZHItPkVsZW1lbnRzOyBmKyspIHsKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJFbmNvZGluZyBFbGVtZW50IFslaV0gLSBUeXBlOiVpXG4iLCBmLCBlbHRfcFtmXS0+RWxlbWVudF9UeXBlKTsKI2VuZGlmCiAgICAgICAgaWYgKGVsdF9wW2ZdLT5FbGVtZW50X1R5cGUgPT0gRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSB8fAogICAgICAgICAgICBlbHRfcFtmXS0+RWxlbWVudF9UeXBlID09IEVMRU1FTlRfUkFXREFUQSkgewogICAgICAgICAgICBUb3RhbEJ5dGVTaXplID0gZWx0X3BbZl0tPlNpemU7CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIldyaXRpbmcgJWkgUkFXIGJpdHMgdG8gZWxlbWVudC5cbiIsIGVsdF9wW2ZdLT5TaXplKTsKICAgICAgICAgICAgU2hvd19CaXRzKChJTUdfVUlOVDggKikoJmVsdF9wW2ZdLT5TaXplKSArIDEsIDAsIFRvdGFsQnl0ZVNpemUpOwojZW5kaWYKICAgICAgICAgICAgVG90YWxCeXRlU2l6ZSArPSA4OwoKICAgICAgICAgICAgUlRvdGFsQnl0ZVNpemUgKz0gKCgoSU1HX1VJTlQzMikoKFRvdGFsQnl0ZVNpemUgKyA3KSAvIDgpKSAqIDgpOwogICAgICAgICAgICBSVG90YWxCeXRlU2l6ZSArPSAzMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUb3RhbEJ5dGVTaXplID0gMDsKICAgICAgICAgICAgc3dpdGNoIChlbHRfcFtmXS0+RWxlbWVudF9UeXBlKSB7CiAgICAgICAgICAgIGNhc2UgRUxFTUVOVF9RUDoKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgICAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIkluc2VydCB0b2tlbiBFTEVNRU5UX1FQIChIMjY0KS0gZm9yIE1UWCB0byBnZW5lcmF0ZSBhbmQgaW5zZXJ0IHRoaXMgdmFsdWVcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEVMRU1FTlRfU1FQOgojaWYgSEVBREVSU19WRVJCT1NFX09VVFBVVAogICAgICAgICAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiSW5zZXJ0IHRva2VuIEVMRU1FTlRfU1FQIChIMjY0KS0gZm9yIE1UWCB0byBnZW5lcmF0ZSBhbmQgaW5zZXJ0IHRoaXMgdmFsdWVcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEVMRU1FTlRfRlJBTUVRU0NBTEU6CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJJbnNlcnQgdG9rZW4gRUxFTUVOVF9GUkFNRVFTQ0FMRSAoSDI2My9NUEVHNCkgLSBmb3IgTVRYIHRvIGdlbmVyYXRlIGFuZCBpbnNlcnQgdGhpcyB2YWx1ZVxuIik7CiNlbmRpZgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRUxFTUVOVF9TTElDRVFTQ0FMRToKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgICAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIkluc2VydCB0b2tlbiBFTEVNRU5UX1NMSUNFUVNDQUxFIChIMjYzL01QRUc0KSAtIGZvciBNVFggdG8gZ2VuZXJhdGUgYW5kIGluc2VydCB0aGlzIHZhbHVlXG4iKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9IMjY0OgojaWYgSEVBREVSU19WRVJCT1NFX09VVFBVVAogICAgICAgICAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiSW5zZXJ0IHRva2VuIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX0gyNjQgLSAgTVRYIHRvIGdlbmVyYXRlICdyYnNwX3RyYWlsaW5nX2JpdHMoKScgZmllbGRcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX01QRzQ6CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJJbnNlcnQgdG9rZW4gRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fTVBHNCAtICBNVFggdG8gZ2VuZXJhdGUgTVBFRzQgJ2J5dGVfYWxpZ25lZF9iaXRzJyBmaWVsZFxuIik7CiNlbmRpZgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUlRvdGFsQnl0ZVNpemUgKz0gMzI7CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIk5vIFJBVyBiaXRzXG5cbiIpOwojZW5kaWYKICAgICAgICB9CiAgICB9CgogICAgLyogVG90YWxCeXRlU2l6ZT1Ub3RhbEJ5dGVTaXplKzMyKygmZWx0X3BbZi0xXS0+RWxlbWVudF9UeXBlLSZlbHRfcFswXS0+RWxlbWVudF9UeXBlKSo4OyAqLwoKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIlxuQ29tYmluZWQgRUxFTUVOVFMgU3RyZWFtOlxuIik7CiAgICBTaG93X0JpdHMoKElNR19VSU5UOCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW0sIDAsIFJUb3RhbEJ5dGVTaXplKTsKI2VuZGlmCn0KI2VuZGlmCgoKLyoqCiAqIEhlYWRlciBXcml0aW5nIEZ1bmN0aW9ucwogKiBMb3cgbGV2ZWwgYml0IHdyaXRpbmcgYW5kIHVlLCBzZSBmdW5jdGlvbnMKICogSE9TVCBDT0RFCiAqLwpzdGF0aWMgdm9pZCBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBJTUdfVUlOVDggd3J0X2JpdHMsCiAgICBJTUdfVUlOVDE2IGJpdF9jbnQpCnsKICAgIC8qIFRoaXMgaXMgdGhlIGNvcmUgZnVuY3Rpb24gdG8gd3JpdGUgYml0cy9ieXRlcwogICAgICogdG8gYSBoZWFkZXIgc3RyZWFtLCBpdCB3cml0ZXMgdGhlbSBkaXJlY3RseSB0byBFTEVNRU5UIHN0cnVjdHVyZXMuCiAgICAgKi8KICAgIElNR19VSU5UOCAqd3J0X2J5dGVzX3A7CiAgICBJTUdfVUlOVDggKnNpemVfYml0c19wOwogICAgdW5pb24gewogICAgICAgIElNR19VSU5UMzIgVUkxNklucHV0OwogICAgICAgIElNR19VSU5UOCBVSThJbnB1dFsyXTsKICAgIH0gSW5wdXRWYWwgPSB7MCwgfTsKICAgIElNR19VSU5UOCBPdXRCeXRlSW5kZXg7CiAgICBJTUdfSU5UMTYgU2hpZnQ7CgogICAgaWYgKGJpdF9jbnQgPT0gMCkgcmV0dXJuOwoKICAgIC8qIFdBIGZvciBrbG9ja3dvcmsgKi8KICAgIGlmIChtdHhfaGRyLT5FbGVtZW50cyA+PSBNQVhOVU1CRVJFTEVNRU5UUykgewogICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfRVJST1IsICJtdHhfaGRyLT5FbG1lbnRzIG92ZXJmbG93XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogRmlyc3QgZW5zdXJlIHRoYXQgdW51c2VkIGJpdHMgaW4gd3J0X2JpdHMgYXJlIHplcm9lZCAqLwogICAgd3J0X2JpdHMgJj0gKDB4MDBmZiA+PiAoOCAtIGJpdF9jbnQpKTsKCiAgICBJbnB1dFZhbC5VSTE2SW5wdXQgPSAwOwoKICAgIC8qIFBvaW50ZXIgdG8gdGhlIGJpdCBjb3VudCBmaWVsZCAqLwogICAgc2l6ZV9iaXRzX3AgPSAmKGVsdF9wW210eF9oZHItPkVsZW1lbnRzXS0+U2l6ZSk7CgogICAgLyogUG9pbnRlciB0byB0aGUgc3BhY2Ugd2hlcmUgaGVhZGVyIGJpdHMgYXJlIHRvIGJlIHdyaXR0ZW4gKi8KICAgIHdydF9ieXRlc19wID0gJihlbHRfcFttdHhfaGRyLT5FbGVtZW50c10tPkJpdHMpOwoKICAgIE91dEJ5dGVJbmRleCA9IChzaXplX2JpdHNfcFswXSAvIDgpOwoKICAgIGlmICghKHNpemVfYml0c19wWzBdICYgNykpIHsKICAgICAgICBpZiAoc2l6ZV9iaXRzX3BbMF0gPj0gMTIwKSB7CiAgICAgICAgICAgIC8qIEVsZW1lbnQgbWF4aW11bSBiaXRzIHNlbmQgdG8gZWxlbWVudCwgdGltZSB0byBzdGFydCBhIG5ldyBvbmUgKi8KICAgICAgICAgICAgbXR4X2hkci0+RWxlbWVudHMrKzsgLyogSW5jcmVtZW50IGVsZW1lbnQgaW5kZXggKi8KICAgICAgICAgICAgLyogRWxlbWVudCBwb2ludGVyIHNldCB0byBwb3NpdGlvbiBvZiBuZXh0IGVsZW1lbnQgKDEyMC84ID0gMTUgYnl0ZXMpICovCiAgICAgICAgICAgIGVsdF9wW210eF9oZHItPkVsZW1lbnRzXSA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgJiB3cnRfYnl0ZXNfcFsxNV07CgogICAgICAgICAgICAvKiBXcml0ZSBFTEVNRU5UX1RZUEUgKi8KICAgICAgICAgICAgZWx0X3BbbXR4X2hkci0+RWxlbWVudHNdLT5FbGVtZW50X1R5cGUgPSBFTEVNRU5UX1JBV0RBVEE7CgogICAgICAgICAgICAvKiBTZXQgbmV3IGVsZW1lbnQgc2l6ZSAoYml0cykgdG8gemVybyAqLwogICAgICAgICAgICBlbHRfcFttdHhfaGRyLT5FbGVtZW50c10tPlNpemUgPSAwOwoKICAgICAgICAgICAgLyogQmVnaW4gd3JpdGluZyB0byB0aGUgbmV3IGVsZW1lbnQgKi8KICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIHdydF9iaXRzLCBiaXRfY250KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgd3J0X2J5dGVzX3BbT3V0Qnl0ZUluZGV4XSA9IDA7IC8qIEJlZ2lubmluZyBhIG5ldyBieXRlLCBjbGVhciBieXRlICovCiAgICB9CgogICAgU2hpZnQgPSAoSU1HX0lOVDE2KSgoOCAtIGJpdF9jbnQpIC0gKHNpemVfYml0c19wWzBdICYgNykpOwoKICAgIGlmIChTaGlmdCA+PSAwKSB7CiAgICAgICAgd3J0X2JpdHMgPDw9IFNoaWZ0OwogICAgICAgIHdydF9ieXRlc19wW091dEJ5dGVJbmRleF0gfD0gd3J0X2JpdHM7CiAgICAgICAgc2l6ZV9iaXRzX3BbMF0gPSBzaXplX2JpdHNfcFswXSArIGJpdF9jbnQ7CiAgICB9IGVsc2UgewogICAgICAgIElucHV0VmFsLlVJOElucHV0WzFdID0gKElNR19VSU5UOCkgd3J0X2JpdHMgKyAyNTY7CiAgICAgICAgSW5wdXRWYWwuVUkxNklucHV0ID4+PSAtU2hpZnQ7CgogICAgICAgIHdydF9ieXRlc19wW091dEJ5dGVJbmRleF0gfD0gSW5wdXRWYWwuVUk4SW5wdXRbMV07CgogICAgICAgIHNpemVfYml0c19wWzBdID0gc2l6ZV9iaXRzX3BbMF0gKyBiaXRfY250OwogICAgICAgIHNpemVfYml0c19wWzBdID0gc2l6ZV9iaXRzX3BbMF0gLSAoKElNR19VSU5UOCkgLSBTaGlmdCk7CiAgICAgICAgSW5wdXRWYWwuVUk4SW5wdXRbMF0gPSBJbnB1dFZhbC5VSThJbnB1dFswXSA+PiAoOCArIFNoaWZ0KTsKCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIElucHV0VmFsLlVJOElucHV0WzBdLCAoSU1HX1VJTlQxNikgLSBTaGlmdCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cygKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBJTUdfVUlOVDMyIHdydF9iaXRzLAogICAgSU1HX1VJTlQzMiBiaXRfY250KQp7CiAgICBJTUdfVUlOVDMyIEJpdExwOwogICAgSU1HX1VJTlQzMiBFbmRCeXRlOwogICAgSU1HX1VJTlQ4IEJ5dGVzWzRdOwoKICAgIGZvciAoQml0THAgPSAwOyBCaXRMcCA8IDQ7IEJpdExwKyspIHsKICAgICAgICBCeXRlc1tCaXRMcF0gPSAoSU1HX1VJTlQ4KSh3cnRfYml0cyAmIDI1NSk7CiAgICAgICAgd3J0X2JpdHMgPSB3cnRfYml0cyA+PiA4OwogICAgfQoKICAgIEVuZEJ5dGUgPSAoKGJpdF9jbnQgKyA3KSAvIDgpOwoKICAgIGlmICgoYml0X2NudCkgJSA4KQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBCeXRlc1tFbmRCeXRlLTFdLCAoSU1HX1VJTlQ4KSgoYml0X2NudCkgJSA4KSk7CiAgICBlbHNlCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIEJ5dGVzW0VuZEJ5dGUtMV0sIDgpOwoKICAgIGlmIChFbmRCeXRlID4gMSkKICAgICAgICBmb3IgKEJpdExwID0gRW5kQnl0ZSAtIDE7IEJpdExwID4gMDsgQml0THAtLSkgewogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgQnl0ZXNbQml0THAtMV0sIDgpOwogICAgICAgIH0KfQoKc3RhdGljIHZvaWQgcG53X19nZW5lcmF0ZV91ZSgKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBJTUdfVUlOVDMyIHVpVmFsKQp7CiAgICBJTUdfVUlOVDMyIHVpTHA7CiAgICBJTUdfVUlOVDggdWNaZXJvczsKICAgIElNR19VSU5UMzIgdWlDaHVuazsKCiAgICBmb3IgKHVpTHAgPSAxLCB1Y1plcm9zID0gMDsgKHVpTHAgLSAxKSA8IHVpVmFsIDsgdWlMcCA9IHVpTHAgKyB1aUxwLCB1Y1plcm9zKyspCiAgICAgICAgdWlWYWwgPSB1aVZhbCAtIHVpTHA7CgogICAgLyogdWNaZXJvcyA9IG51bWJlciBvZiBwcmVjZWRpbmcgemVyb3MgcmVxdWlyZWQKICAgICAqIHVpVmFsID0gdmFsdWUgdG8gYXBwZW5kIGFmdGVyIHplcm9zIGFuZCAxIGJpdAogICAgICovCgogICAgLyogV3JpdGUgcHJlY2VkaW5nIHplcm9zICovCiAgICBmb3IgKHVpTHAgPSAoSU1HX1VJTlQzMikgdWNaZXJvczsgdWlMcCArIDEgPiA4OyB1aUxwIC09IDgpCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDgpOwoKICAgIC8qIFdyaXRlIHplcm9zIGFuZCAxIGJpdCBzZXQgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAoSU1HX1VJTlQ4KSAxLCAoSU1HX1VJTlQ4KSh1aUxwICsgMSkpOwoKICAgIC8qIFdyaXRlIE51bWVyaWMgcGFydCAqLwogICAgd2hpbGUgKHVjWmVyb3MgPiA4KSB7CiAgICAgICAgdWNaZXJvcyAtPSA4OwogICAgICAgIHVpQ2h1bmsgPSAodWlWYWwgPj4gdWNaZXJvcyk7CiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIChJTUdfVUlOVDgpIHVpQ2h1bmssIDgpOwogICAgICAgIHVpVmFsID0gdWlWYWwgLSAodWlDaHVuayA8PCB1Y1plcm9zKTsKICAgIH0KCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgKElNR19VSU5UOCkgdWlWYWwsIHVjWmVyb3MpOwp9CgoKc3RhdGljIHZvaWQgcG53X19nZW5lcmF0ZV9zZSgKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBpbnQgaVZhbCkKewogICAgSU1HX1VJTlQzMiB1aUNvZGVOdW07CgogICAgaWYgKGlWYWwgPiAwKQogICAgICAgIHVpQ29kZU51bSA9IChJTUdfVUlOVDMyKShpVmFsICsgaVZhbCAtIDEpOwogICAgZWxzZQogICAgICAgIHVpQ29kZU51bSA9IChJTUdfVUlOVDMyKSgtaVZhbCAtIGlWYWwpOwoKICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIHVpQ29kZU51bSk7Cn0KCgpzdGF0aWMgdm9pZCBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiplbHRfcCwKICAgIEhFQURFUl9FTEVNRU5UX1RZUEUgVG9rZW4pCnsKICAgIElNR19VSU5UOCBPZmZzZXQ7CiAgICBJTUdfVUlOVDggKlA7CgogICAgaWYgKG10eF9oZHItPkVsZW1lbnRzICE9IEVMRU1FTlRTX0VNUFRZICYmCgkgICAgbXR4X2hkci0+RWxlbWVudHMgPiAoTUFYTlVNQkVSRUxFTUVOVFMgLSAxKSkKCXJldHVybjsKCiAgICBpZiAobXR4X2hkci0+RWxlbWVudHMgIT0gRUxFTUVOVFNfRU1QVFkpIHsKICAgICAgICBpZiAoZWx0X3BbbXR4X2hkci0+RWxlbWVudHNdLT5FbGVtZW50X1R5cGUgPT0gRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQQogICAgICAgICAgICB8fCBlbHRfcFttdHhfaGRyLT5FbGVtZW50c10tPkVsZW1lbnRfVHlwZSA9PSBFTEVNRU5UX1JBV0RBVEEpIHsKICAgICAgICAgICAgLypBZGQgYSBuZXcgZWxlbWVudCBhbGlnbmVkIHRvIHdvcmQgYm91bmRhcnkKICAgICAgICAgICAgICpGaW5kIFJBV0JpdCBzaXplIGluIGJ5dGVzIChyb3VuZGVkIHRvIHdvcmQgYm91bmRhcnkpKQogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8qIE51bWJlcm9mUmF3Yml0cyAoZXhjbHVkaW5nIHNpemUgb2YgYml0IGNvdW50IGZpZWxkKSsgc2l6ZSBvZiB0aGUgYml0Y291bnQgZmllbGQgICovCiAgICAgICAgICAgIE9mZnNldCA9IGVsdF9wW210eF9oZHItPkVsZW1lbnRzXS0+U2l6ZSArIDggKyAzMTsKICAgICAgICAgICAgT2Zmc2V0IC89IDMyOy8qIE5vdyBjb250YWlucyByYXdiaXRzIHNpemUgaW4gd29yZHMgKi8KICAgICAgICAgICAgT2Zmc2V0ICs9IDE7LyogTm93IGNvbnRhaW5zIHJhd2JpdHMrZWxlbWVudF90eXBlIHNpemUgaW4gd29yZHMgKi8KICAgICAgICAgICAgT2Zmc2V0ICo9IDQ7LyogQ29udmVydCB0byBudW1iZXIgb2YgYnl0ZXMgKHRvdGFsIHNpemUgb2Ygc3RydWN0dXJlIGluIGJ5dGVzLCBhbGlnbmVkIHRvIHdvcmQgYm91bmRhcnkpICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgT2Zmc2V0ID0gNDsKICAgICAgICB9CgogICAgICAgIG10eF9oZHItPkVsZW1lbnRzKys7CgoJaWYgKG10eF9oZHItPkVsZW1lbnRzID4gKE1BWE5VTUJFUkVMRU1FTlRTIC0gMSkpCgkgICAgcmV0dXJuOwogICAgICAgIFAgPSAoSU1HX1VJTlQ4ICopIGVsdF9wW210eF9oZHItPkVsZW1lbnRzLTFdOwogICAgICAgIFAgKz0gT2Zmc2V0OwogICAgICAgIGVsdF9wW210eF9oZHItPkVsZW1lbnRzXSA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgUDsKICAgIH0gZWxzZQogICAgICAgIG10eF9oZHItPkVsZW1lbnRzID0gMDsKCiAgICBlbHRfcFttdHhfaGRyLT5FbGVtZW50c10tPkVsZW1lbnRfVHlwZSA9IFRva2VuOwogICAgZWx0X3BbbXR4X2hkci0+RWxlbWVudHNdLT5TaXplID0gMDsKfQoKLyoKICogSW50ZXJtZWRpYXJ5IGZ1bmN0aW9ucyB0byBidWlsZCBIMjY0IGhlYWRlcnMKICovCnN0YXRpYyB2b2lkIHBud19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiplbHRfcCwKICAgIElNR19VSU5UMzIgQnl0ZVNpemUpCnsKICAgIC8qIEdFTkVSQVRFUyBUSEUgRklSU1QgRUxFTUVOVCBPRiBUSEUgSDI2NF9TRVFVRU5DRV9IRUFERVIoKSBTVFJVQ1RVUkUgKi8KICAgIElNR19VSU5UMzIgTHA7CgogICAgLyoKICAgICAqIEJ5dGUgYWxpZ25lZCAoYml0IDApCiAgICAgKiAoMyBieXRlcyBpbiBzbGljZSBoZWFkZXIgd2hlbiBzbGljZSBpcyBmaXJzdCBpbiBhIHBpY3R1cmUKICAgICAqIHdpdGhvdXQgc2VxdWVuY2UvcGljdHVyZV9oZWFkZXIgYmVmb3JlIHBpY3R1cmUKICAgICAqLwoKICAgIGZvciAoTHAgPSAwOyBMcCA8IEJ5dGVTaXplIC0gMTsgTHArKykKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgOCk7CgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDgpOwoKICAgIC8qIEJ5dGUgYWxpZ25lZCAoYml0IDMyIG9yIDI0KSAqLwogICAgcmV0dXJuOwp9CgoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19WVUlfcGFyYW1zKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiplbHRfcCwKICAgIEgyNjRfVlVJX1BBUkFNUyAqVlVJUGFyYW1zKQp7CiAgICAvKiBCdWlsZHMgVlVJIFBhcmFtcyBmb3IgdGhlIFNlcXVlbmNlIEhlYWRlciAob25seSBwcmVzZW50IGluIHRoZSAxc3Qgc2VxdWVuY2Ugb2Ygc3RyZWFtKSAqLwogICAgaWYgKFZVSVBhcmFtcy0+YXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnICYmIChWVUlQYXJhbXMtPmFzcGVjdF9yYXRpb19pZGMgPT0gMHhmZikpIHsKICAgICAgICAvKiBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcgdSgxKSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKICAgICAgICAvKiBhc3BlY3RfcmF0aW9faWRjIHUoOCkgRXh0ZW5kZWRfU0FSICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDB4ZmYsIDgpOwogICAgICAgIC8qIHNhcl93aWR0aCB1KDE2KSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgVlVJUGFyYW1zLT5zYXJfd2lkdGgsIDE2KTsKICAgICAgICAvKiBzYXJfaGVpZ2h0IHUoMTYpICovCiAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBWVUlQYXJhbXMtPnNhcl9oZWlnaHQsIDE2KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnIHUoMSkgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiAgICB9CgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICAgICAgICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICAgICAgICAgICgwIDw8IDMpIHwgLyogb3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXogKi8KICAgICAgICAgICAgICAgICgwIDw8IDIpIHwgLyogdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6ICovCiAgICAgICAgICAgICAgICAoMCA8PCAxKSB8IC8qIGNocm9tYV9sb2NfaW5mb19wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXogKi8KICAgICAgICAgICAgICAgICgxKSwvKiB0aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDEgaW4gVG9wYXogKi8KICAgICAgICAgICAgICAgIDQpOwoKICAgIC8qIG51bV91bml0c19pbl90aWNrICgzMiBiaXRzKSA9IDEgaW4gVG9wYXogKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgVlVJUGFyYW1zLT5udW1fdW5pdHNfaW5fdGljaywgMzIpOwoKICAgIC8qIHRpbWVfc2NhbGUgKDMyIGJpdHMpID0gZnJhbWUgcmF0ZSAqLwogICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBWVUlQYXJhbXMtPlRpbWVfU2NhbGUsIDMyKTsKCiAgICAvKiBmaXhlZF9mcmFtZV9yYXRlX2ZsYWcgKDEgYml0KSA9IDEgaW4gVG9wYXogKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKICAgIC8qIG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDEgaW4gVG9wYXogKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKCiAgICAvKiogRGVmaW5pdGlvbnMgZm9yIG5hbF9ocmRfcGFyYW1ldGVycygpIGNvbnRhaW5lZCBpbiBWVUkgc3RydWN0dXJlIGZvciBUb3BhegogICAgICogIGNwYl9jbnRfbWludXMxIHVlKHYpID0gMCBpbiBUb3BheiA9IDFiCiAgICAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKICAgIC8qIGJpdF9yYXRlX3NjYWxlICg0IGJpdHMpID0gMCBpbiBUb3BheiwgY3BiX3NpemVfc2NhbGUgKDQgYml0cykgPSAwIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgNCk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMiwgNCk7CgogICAgLyogYml0X3JhdGVfdmFsdWVfbWludXMxWzBdIHVlKHYpID0gKEJpdHJhdGUvNjQpLTEgW1JBTkdFOjAgdG8gKDJeMzIpLTJdICovCiAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCBWVUlQYXJhbXMtPmJpdF9yYXRlX3ZhbHVlX21pbnVzMSk7CiAgICAvKiBjcGJfc2l6ZV92YWx1ZV9taW51czFbMF0gdWUodikgPSAoQ1BCX0JpdHNfU2l6ZS8xNiktMQogICAgICogd2hlcmUgQ1BCX0JpdHNfU2l6ZSA9IDEuNSAqIEJpdHJhdGUgIFtSQU5HRTowIHRvICgyXjMyKS0yXQogICAgICovCiAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCBWVUlQYXJhbXMtPmNicF9zaXplX3ZhbHVlX21pbnVzMSk7CgogICAgLyogY2JyX2ZsYWdbMF0gKDEgYml0KSA9IDAgZm9yIFZCUiwgMSBmb3IgQ0JSICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgVlVJUGFyYW1zLT5DQlIsIDEpOwoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgIFZVSVBhcmFtcy0+aW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgICAgIDUpOyAvKiBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEgKDUgYml0cykgPSA/Pz8gKi8KCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLAogICAgICAgIGVsdF9wLAogICAgICAgIFZVSVBhcmFtcy0+Y3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSwKICAgICAgICA1KTsgLyogY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSAoNSBiaXRzKSA9ID8/PyAqLwoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgIFZVSVBhcmFtcy0+ZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgICAgIDUpOyAvKiBkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKDUgYml0cykgPSA/Pz8gKi8KCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLAogICAgICAgIGVsdF9wLAogICAgICAgIFZVSVBhcmFtcy0+dGltZV9vZmZzZXRfbGVuZ3RoLAogICAgICAgIDUpOyAvKiB0aW1lX29mZnN0X2xlbmd0aCAoNSBiaXRzKSA9ID8/PyAqLwoKICAgIC8qIEVuZCBvZiBuYWxfaHJkX3BhcmFtZXRlcnMoKSAgKi8KCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLAogICAgICAgIGVsdF9wLAogICAgICAgIDAsIDEpOy8qIHZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXogKi8KCiAgICAvKiBpZiggbmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAgfHwgIHZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgKQogICAgICogRklYIGZvciBCUk4yMzAzOQogICAgICogbG93X2RlbGF5X2hyZF9mbGFnCiAgICAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgIDAsIDEpOy8qIGxvd19kZWxheV9ocmRfZmxhZyAqLwoKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICAwLCAxKTsvKiBwaWNfc3RydWN0X3ByZXNlbnRfZmxhZyAoMSBiaXQpID0gMCBpbiBUb3BheiAqLwoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgIDAsIDEpOy8qIGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6ICovCn0KCgpzdGF0aWMgdm9pZCBwbndfX0gyNjRfd3JpdGViaXRzX3BpY3R1cmVfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfQk9PTCBiQ2FiYWNFbmFibGVkLAogICAgSU1HX0JPT0wgYl84eDh0cmFuc2Zvcm0sCiAgICBJTUdfQk9PTCBiSW50cmFDb25zdHJhaW5lZCwKICAgIElNR19JTlQ4IGk4Q2JRUE9mZnNldCwKICAgIElNR19JTlQ4IGk4Q3JRUE9mZnNldCkKewogICAgLy8qKi0tIEJlZ2luIGJ1aWxkaW5nIHRoZSBwaWN0dXJlIGhlYWRlciBlbGVtZW50CiAgICBJTUdfVUlOVDggdWk4RUNNRiA9IChiQ2FiYWNFbmFibGVkID8gMSA6IDApOwoKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudChwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDQpOwoKICAgIC8vLyogR0VORVJBVEVTIFRIRSBGSVJTVCAoU1RBVElDKSBFTEVNRU5UIE9GIFRIRSBIMjY0X1BJQ1RVUkVfSEVBREVSKCkgU1RSVUNUVVJFICovLy8KICAgIC8vLyoqKiogRUxFTUVOVCBCSVRDT1VOVDogMTgKCiAgICAvLyA0IEJ5dGUgU3RhcnRDb2RlUHJlZml4IFByZWdlbmVyYXRlZCBpbjogSDI2NF9Xcml0ZUJpdHNfU3RhcnRDb2RlUHJlZml4X0VsZW1lbnQoKQogICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgMzIpCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgNykgfCAgICAvLyBmb3JiaWRkZW5femVyb19iaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDUpIHwgICAgLy8gbmFsX3JlZl9pZGMgKDIgYml0cykgPSAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCksICAvLyBuYWxfdW5pdF90cHllICg1IGJpdHMpID0gOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CiAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA0MCkKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA3KSB8ICAgICAgICAgICAgLy8gcGljX3BhcmFtZXRlcl9zZXRfaWQgdWUodikgPSAwIGluIFRvcGF6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA2KSB8ICAgICAgICAgICAgLy8gc2VxX3BhcmFtZXRlcl9zZXRfaWQgdWUodikgPSAwIGluIFRvcGF6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWk4RUNNRiA8PCA1KSB8ICAgICAgLy8gZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICgxIGJpdCkgMCBmb3IgQ0FWTEMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDQpIHwgICAgICAgICAgICAvLyBwaWNfb3JkZXJfcHJlc2VudF9mbGFnICgxIGJpdCkgPSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKSB8ICAgICAgICAgICAgLy8gbnVtX3NsaWNlX2dyb3VwX21pbnVzMSB1ZSh2KSA9IDAgaW4gVG9wYXoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIpIHwgICAgICAgICAgICAvLyBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIHVlKHYpID0gMCBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkgfCAgICAgICAgICAgIC8vIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgdWUodikgPSAwIGluIFRvcGF6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCksICAgICAgICAgIC8vIHdlaWdodGVkX3ByZWRfZmxhZyAoMSBiaXQpID0gMCBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CiAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA0OCkKICAgIC8vIHdlaWdodGVkX2JpcHJlZF9mbGFnICgyIGJpdHMpID0gMCBpbiBUb3BhegogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAyKTsKCiAgICAvL01UWCBmaWxscyB0aGlzIHZhbHVlIGluCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9RUCk7CiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKCiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgU0VDT05EIEVMRU1FTlQgT0YgVEhFIEgyNjRfUElDVFVSRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLy8vKioqKiBFTEVNRU5UIEJJVENPVU5UOiA1CiAgICAvL1RoZSBmb2xsb3dpbmcgZmllbGQgd2lsbCBiZSBnZW5lcmF0ZWQgYXMgYSBzcGVjaWFsIGNhc2UgYnkgTVRYIC0gc28gbm90IGhlcmUKICAgIC8vIHBud19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIHBQSFBhcmFtcy0+cGljX2luaXRfcXBfbWludXMyNik7CiAgICAvLyBwaWNfaW50X3FwX21pbnVzMjYgc2UodikgPSAtMjYgdG8gMjUgaW4gVG9wYXoKICAgIC8vIHBpY19pbnRfcXNfbWludXMyNiBzZSh2KSA9IDAgaW4gVG9wYXoKICAgIC8vY2hyb21hX3FwX2luZGV4X29mZnNldCBzZSh2KSA9IDAgaW4gVG9wYXoKICAgIHBud19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsKICAgIHBud19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBpOENiUVBPZmZzZXQpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnICgxIGJpdCkgPSAxIGluIFRvcGF6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJhaW5lZF9pbnRyYV9wcmVkX0ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYkludHJhQ29uc3RyYWluZWQgPyAxIDogMCkgPDwgMSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApLC8vIHJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyAoMSBiaXQpID0gMCBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7CiAgICAvLyBCeXRlIGFsaWduIGlzIGRvbmUgdXNpbmcgYW4gZWxlbWVudCBjb21tYW5kIChNVFggZWxlbWVudHMgaW4gdGhpcyBzdHJ1Y3R1cmUsIHdlIGRvbid0IGtub3cgaXQncyBzaXplKQoKICAgIGlmIChiXzh4OHRyYW5zZm9ybSB8fCAoaThDYlFQT2Zmc2V0ICE9IGk4Q3JRUE9mZnNldCkpIHsKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJfOHg4dHJhbnNmb3JtIDw8IDEpIHwgICAvLyA4eDggdHJhbnNmb3JtIGZsYWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCksICAgICAgLy8gcGljX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOwogICAgICAgIHBud19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBpOENyUVBPZmZzZXQpOwogICAgICAgIC8vIHNlY29uZF9jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0IHNlKHYpID0gMCBpbiBUb3BhegogICAgfQogICAgLy8gVGVsbCBNVFggdG8gaW5zZXJ0IHRoZSBieXRlIGFsaWduIGZpZWxkICh3ZSBkb24ndCBrbm93IGZpbmFsIHN0cmVhbSBzaXplIGZvciBhbGlnbm1lbnQgYXQgdGhpcyBwb2ludCkKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9IMjY0KTsKCiAgICByZXR1cm47Cn0KCgpzdGF0aWMgdm9pZCBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcjAoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSDI2NF9TTElDRV9IRUFERVJfUEFSQU1TICpwU2xIUGFyYW1zKQp7CiAgICAvKiBHRU5FUkFURVMgVEhFIEZJUlNUIEVMRU1FTlQgT0YgVEhFIEgyNjRfU0xJQ0VfSEVBREVSKCkgU1RSVUNUVVJFCiAgICAgKiBFTEVNRU5UIEJJVENPVU5UOiA4CiAgICAgKgogICAgICogU3RhcnRDb2RlUHJlZml4IFByZWdlbmVyYXRlZCBpbjogQnVpbGRfSDI2NF80Qnl0ZV9TdGFydENvZGVQcmVmaXhfRWxlbWVudCgpICg0IG9yIDMgYnl0ZXMpCiAgICAgKiAoMyBieXRlcyB3aGVuIHNsaWNlIGlzIGZpcnN0IGluIGEgcGljdHVyZSB3aXRob3V0IHNlcXVlbmNlL3BpY3R1cmVfaGVhZGVyIGJlZm9yZSBwaWN0dXJlCiAgICAgKiBCeXRlIGFsaWduZWQgKGJpdCAzMiBvciAyNCkKICAgICAqIE5PVEU6IFNsaWNlX1R5cGUgYW5kIEZyYW1lX1R5cGUgYXJlIGFsd2F5cyB0aGUgc2FtZSwgaGVuY2UgU2xpY2VGcmFtZV9UeXBlCiAgICAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgICgwIDw8IDcpIHwvKiBmb3JiaWRkZW5femVyb19iaXQgKi8KICAgICAgICAoKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFID8gMCA6IDEpIDw8IDUpIHwgLyogbmFsX3JlZl9pZGMgKDIgYml0cykgPSAwIGZvciBCLWZyYW1lIGFuZCAxIGZvciBJIG9yIFAtZnJhbWUgKi8KICAgICAgICAoKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEUgPyA1IDogMSkpLC8qIG5hbF91bml0X3RweWUgKDUgYml0cykgPSBJLWZyYW1lIElEUiwgYW5kIDEgZm9yICByZXN0ICovCiAgICAgICAgOCk7Cn0KCgpzdGF0aWMgdm9pZCBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcjEoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSDI2NF9TTElDRV9IRUFERVJfUEFSQU1TICpwU2xIUGFyYW1zLAogICAgSU1HX1VJTlQxNiB1aUlkclBpY0lkKQp7CiAgICAvKiBHRU5FUkFURVMgVEhFIFNFQ09ORCBFTEVNRU5UIE9GIFRIRSBIMjY0X1NMSUNFX0hFQURFUigpIFNUUlVDVFVSRQogICAgICogVGhlIGZvbGxvd2luZyBpcyBzbGljZSBwYXJhbWV0ZXIgc2V0IGluIEJQL01QCiAgICAgKi8KCiAgICAvKiBmaXJzdF9tYl9pbl9zbGljZSA9IEZpcnN0IE1CIGFkZHJlc3MgaW4gc2xpY2U6IHVlKFJhbmdlIDAgLSAgMTYxOSkgKi8KICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIChJTUdfVUlOVDMyKSBwU2xIUGFyYW1zLT5GaXJzdF9NQl9BZGRyZXNzKTsKCiAgICBwbndfX2dlbmVyYXRlX3VlKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgIChJTUdfVUlOVDMyKSgocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkgPyBTTEhQX0lfU0xJQ0VGUkFNRV9UWVBFIDogcFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlKSk7ICAvKiBzbGljZV90eXBlIHVlKHYpOiAwIGZvciBQLXNsaWNlLCAxIGZvciBCLXNsaWNlLCAyIGZvciBJLXNsaWNlICovCgogICAgLyoga2FiOiBub3QgY2xlYW4gY2hhbmdlIGZyb20gSURSIHRvIGludHJhLCBJRFIgc2hvdWxkIGhhdmUgc2VwYXJhdGUgZmxhZyAqLwoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgICgxIDw8IDUpIHwgLyogcGljX3BhcmFtZXRlcl9zZXRfaWQsIHVlKHYpID0gMCAgKD0xYikgaW4gVG9wYXogKi8KICAgICAgICBwU2xIUGFyYW1zLT5GcmFtZV9OdW1fRE8sLyogZnJhbWVfbnVtICg1IGJpdHMpID0gZnJhbWUgbnVvLiBpbiBkZWNvZGluZyBvcmRlciAqLwogICAgICAgIDYpOwoKICAgIC8qIGZyYW1lX21iX29ubHlfZmxhZyBpcyBhbHdheXMgMSwgc28gbm8gbmVlZCBmb3IgZmllbGRfcGljX2ZsYWcgb3IgYm90dG9tX2ZpZWxkX2ZsYWcgKi8KICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKQogICAgICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIHVpSWRyUGljSWQpOy8qIGlkcl9waWNfaWQgdWUodikgPSAwICgxYikgaW4gVG9wYXogKi8KCiAgICAvKiBrYWI6IElkcl9waWNfaWQgb25seSBmb3IgSURSLCBub3QgbmVzc2VzYXJlbHkgZm9yIGFsbCBJIHBpY3R1cmVzICovCgogICAgLyogY3VzdG9tZXIgcmVxdWVzdCBQT0MgdHlwZSBzaG91bGQgYmUgMiovCiAgICAvKiBpZiAocGljX29yZGVyX2NudF90eXBlID09IDApIE5vdGU6IChwaWNfb3JkZXJfY250X3R5cGUgYWx3YXlzIDAgaW4gVG9wYXopCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICBwU2xIUGFyYW1zLT5QaWN0dXJlX051bV9ETywKICAgICAgICA2KTsgIHBpY19vcmRlcl9jbnRfbHNiICg2IGJpdHMpIC0gcGljdHVyZSBubyBpbiBkaXNwbGF5IG9yZGVyICovCgojaWYgMAogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICBtdHhfaGRyLAogICAgICAgICAgICBlbHRfcCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSk7LyogZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnICgxIGJpdCkgPSAwLCBzcGF0aWFsIGRpcmVjdCBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gVG9wYXogKi8KI2VuZGlmCgogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX1BfU0xJQ0VGUkFNRV9UWVBFIHx8IHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICBtdHhfaGRyLAogICAgICAgICAgICBlbHRfcCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSk7LyogbnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXogKi8KCiAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlICE9IFNMSFBfSV9TTElDRUZSQU1FX1RZUEUgJiYKICAgICAgICBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgIT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKSB7CiAgICAgICAgLyoKICAgICAgICBpZiAocFNsSFBhcmFtcy0+VXNlc0xvbmdUZXJtUmVmKSB7CiAgICAgICAgICAgIC8vIHJlZl9waWNfbGlzdF9vcmRlcmluZ19mbGFnX0kwICgxIGJpdCkgPSAxLCBMMCByZWZlcmVuY2UgcGljdHVyZSBvcmRlcmluZwogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiAgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMgPSAyCiAgICAgICAgICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIDIpOwogICAgICAgICAgICAvLyBsb25nX3Rlcm1fcGljX251bSA9IDAKICAgICAgICAgICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgMCk7CiAgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMgPSAzCiAgICAgICAgICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIDMpOwogICAgICAgIH0gZWxzZQogICAgICAgICovCiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICAgICAgbXR4X2hkciwKICAgICAgICAgICAgICAgIGVsdF9wLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDEpOy8qIHJlZl9waWNfbGlzdF9vcmRlcmluZ19mbGFnX0kwICgxIGJpdCkgPSAwICovCiAgICB9CgojaWYgMCAgICAKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICAgICAgbXR4X2hkciwKICAgICAgICAgICAgZWx0X3AsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEpOyAvKiByZWZfcGljX2xpc3Rfb3JkZXJpbmdfZmxhZ19JMSAoMSBiaXQpID0gMCwgbm8gcmVmZXJlbmNlIHBpY3R1cmUgb3JkZXJpbmcgaW4gVG9wYXogKi8KI2VuZGlmCgogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEUpIHsKICAgICAgICAvKiBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnICgxIGJpdCkgPSAwICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwogICAgICAgIC8qIGxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyAoMSBiaXQpKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2xIUGFyYW1zLT5Jc0xvbmdUZXJtUmVmID8gMSA6IDAsIDEpOwogICAgfSAKI2lmIDAKICAgIGVsc2UgaWYgKHBTbEhQYXJhbXMtPlVzZXNMb25nVGVybVJlZikgewogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsvKiBsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcgKDEgYml0KSA9IDAgKi8KICAgICAgICAvLyBBbGxvdyBhIHNpbmdsZSBsb25nLXRlcm0gcmVmZXJlbmNlCiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgNCk7CiAgICAgICAgLy8gbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24KICAgICAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCAxKTsKCiAgICAgICAgLy8gU2V0IGN1cnJlbnQgcGljdHVyZSBhcyB0aGUgbG9uZy10ZXJtIHJlZmVyZW5jZQogICAgICAgIC8vIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uCiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgNik7CiAgICAgICAgLy8gbG9uZ190ZXJtX2ZyYW1lX2lkeAogICAgICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIDApOwoKICAgICAgICAvLyBFbmQKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCAwKTsKICAgIH0gCiNlbmRpZgogICAgZWxzZSB7CiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOy8qIGFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcgKDEgYml0KSA9IDAgKi8KICAgIH0KfQoKCnN0YXRpYyB2b2lkIHBud19fSDI2NF93cml0ZWJpdHNfc2xpY2VfaGVhZGVyMigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBIMjY0X1NMSUNFX0hFQURFUl9QQVJBTVMgKnBTbEhQYXJhbXMpCnsKICAgIC8qIEdFTkVSQVRFUyBFTEVNRU5UIE9GIFRIRSBIMjY0X1NMSUNFX0hFQURFUigpIFNUUlVDVFVSRQogICAgICogRUxFTUVOVCBCSVRDT1VOVDogMTEKICAgICAqLwoKI2lmIDAKICAgIC8qIE5leHQgZmllbGQgaXMgZ2VuZXJhdGVkIG9uIE1UWCB3aXRoIGEgc3BlY2lhbCBjb21tbmFkIChub3QgRUxFTUVOVF9SQVcpIC0gc28gbm90IGRlZmluZWQgaGVyZSAqLwoKICAgIC8qIHNsaWNlX3FwX2RlbHRhIHNlKHYpID0gU2xpY2VRUHkgLSAocGljX2luaXRfcXBfbWludXMyNisyNikgKi8KICAgIC8qIHB1Y0hTPXBud19fZ2VuZXJhdGVfc2UocHVjSFMsIHB1aUJpdFBvcywgcFNsSFBhcmFtcy0+U2xpY2VfUVBfRGVsdGEpOyAgKi8KI2VuZGlmCgogICAgcG53X19nZW5lcmF0ZV91ZSgKICAgICAgICBtdHhfaGRyLAogICAgICAgIGVsdF9wLAogICAgICAgIHBTbEhQYXJhbXMtPkRpc2FibGVfRGVibG9ja2luZ19GaWx0ZXJfSWRjKTsgLyogZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgdWUodikgPSAyPyAgKi8KCiAgICBpZiAocFNsSFBhcmFtcy0+RGlzYWJsZV9EZWJsb2NraW5nX0ZpbHRlcl9JZGMgIT0gMSkgewogICAgICAgIHBud19fZ2VuZXJhdGVfc2UobXR4X2hkciwgZWx0X3AsIDApOyAvKiBzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiBzZSh2KSA9IDAgKDFiKSBpbiBUb3BheiAqLwogICAgICAgIHBud19fZ2VuZXJhdGVfc2UobXR4X2hkciwgZWx0X3AsIDApOyAvKiBzbGljZV9iZXRhX29mZnNldF9kaXYyIHNlKHYpID0gMCAoMWIpIGluIFRvcGF6ICovCiAgICB9CgogICAgLyogbnVtX3NsaWNlX2dyb3Vwc19taW51czEgPT0wIGluIFRvcGF6LCBzbyBubyBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgZmllbGQgaGVyZQogICAgICogbm8gYnl0ZSBhbGlnbm1lbnQgYXQgZW5kIG9mIHNsaWNlIGhlYWRlcnMKICAgICAqLwp9CgpzdGF0aWMgdm9pZCBwbndfX0gyNjRfd3JpdGViaXRzX3NlcXVlbmNlX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgSDI2NF9TRVFVRU5DRV9IRUFERVJfUEFSQU1TICpwU0hQYXJhbXMsIEgyNjRfQ1JPUF9QQVJBTVMgKnBzQ3JvcCkKewogICAgSU1HX1VJTlQ4IHVpOFNCUDsKCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgogICAgcG53X19IMjY0X3dyaXRlYml0c19zdGFydGNvZGVfcHJlZml4X2VsZW1lbnQocE1UWF9IZWFkZXIsCiAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICA0KTsKCiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgRklSU1QgRUxFTUVOVCBPRiBUSEUgSDI2NF9TRVFVRU5DRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwoKICAgIC8vIDQgQnl0ZSBTdGFydENvZGVQcmVmaXggUHJlZ2VuZXJhdGVkIGluOiBIMjY0X1dyaXRlQml0c19TdGFydENvZGVQcmVmaXhfRWxlbWVudCgpCiAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCAzMikKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsICgwIDw8IDcpIHwgICAgICAvLyBmb3JiaWRkZW5femVyb19iaXQ9MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MyA8PCA1KSB8ICAgICAgICAgICAgICAgICAgLy8gbmFsX3JlZl9pZGM9MDEgKG1heSBiZSAxMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg3KSwgICAgICAgICAgLy8gbmFsX3VuaXRfdHlwZT0wMDExMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CgogICAgaWYgKHBTSFBhcmFtcy0+dWNQcm9maWxlICE9IFNIX1BST0ZJTEVfSFApIHsKICAgICAgICAvLyBwcm9maWxlX2lkYyA9IDggYml0cyA9IDY2IGZvciBCUCAoUFJPRklMRV9JRENfQlApLCA3NyBmb3IgTVAgKFBST0ZJTEVfSURDX01QKQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU0hQYXJhbXMtPnVjUHJvZmlsZSA9PSBTSF9QUk9GSUxFX0JQID8gNjYgOiA3NyksIDgpOwoKICAgICAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA0OCkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJhaW5fc2V0MF9mbGFnID0gMSBmb3IgQlAgY29uc3RyYWludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgKDAgPDwgNykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cmFpbl9zZXQxX2ZsYWcgID0gMSBmb3IgTVAgY29uc3RyYWludHMgYW5kIENvbnN0cmFpbmVkIEJhc2VsaW5lIHByb2ZpbGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwU0hQYXJhbXMtPnVjUHJvZmlsZSA9PSBTSF9QUk9GSUxFX0JQID8gMSA6IDApIDw8IDYpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCA1KSB8ICAgICAgICAvLyBjb25zdHJhaW5fc2V0Ml9mbGFnID0gMSBmb3IgSFAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJhaW5fc2V0M19mbGFnID0gMSBmb3IgbGV2ZWwgMWIsIDAgZm9yIG90aGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocFNIUGFyYW1zLT51Y0xldmVsID09IFNIX0xFVkVMXzFCID8gICAgIDEgOiAwKSA8PCAgICAgICA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNlcnZlZF96ZXJvXzRiaXRzID0gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOwogICAgICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDU2KQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldmVsX2lkYyAoOCBiaXRzKSA9IDExIGZvciAxYiwgMTB4bGV2ZWwgZm9yIG90aGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTUdfVUlOVDgpIHBTSFBhcmFtcy0+dWNMZXZlbCwgOCk7CiNpZiAwCiAgICAgICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgNjQpCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxX3BhcmFtZXRlcl9TZXRfaWQgPSAwIGluIFRvcGF6IC0+ICB1ZSgwKT0gMWIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgKDEgPDwgNykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyIDw8IDQpIHwvLyBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0gMSBpbiBUb3BheiAtPiAgdWUoMSk9IDAxMGIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKSB8ICAgICAgICAvLyBwaWNfb3JkZXJfY250X3R5cGUgPSAwIGluIFRvcGF6IC0+ICB1ZSgwKT0gMWIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyksICAgICAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9Jc2JfbWludXM0ID0gMiBpbiBUb3BheiAtPiAgdWUoMik9IDAxMWIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKICAgICAgICAvLyBCeXRlcyBhbGlnbmVkIChiaXQgNzIpCiNlbHNlCiAgICAgICAgLypDdXN0b21lciByZXF1ZXN0IFBPQyB0eXBlIHNob3VsZCBiZSAyKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXFfcGFyYW1ldGVyX1NldF9pZCA9IDAgaW4gVG9wYXogLT4gIHVlKDApPSAxYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoMSA8PCA2KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPDwgMykgfC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSAxIGluIFRvcGF6IC0+ICB1ZSgxKT0gMDEwYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzKSwvLyBsb2cyX21heF9waWNfb3JkZXJfY250X0lzYl9taW51czQgPSAyIGluIFRvcGF6IC0+ICB1ZSgyKT0gMDExYiQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3KTsKI2VuZGlmCiAgICB9IGVsc2UgewojaWYgUFNCX01GTERfRFVNTVlfQ09ERQogICAgICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDQwKQogICAgICAgIC8vIHByb2ZpbGVfaWRjID0gOCBiaXRzID0gNjYgZm9yIEJQIChQUk9GSUxFX0lEQ19CUCksIDc3IGZvciBNUCAoUFJPRklMRV9JRENfTVApCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxMDAsIDgpOwoKICAgICAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA0OCkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgKDEgPDwgNykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cmFpbl9zZXQwX2ZsYWcgPSAxIGZvciBNUCArIEJQIGNvbnN0cmFpbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNikgfCAgICAgICAgLy8gY29uc3RyYWluX3NldDFfZmxhZyAgPSAxIGZvciBNUCArIEJQIGNvbnN0cmFpbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgNSkgfCAgICAgICAgLy8gY29uc3RyYWluX3NldDJfZmxhZyA9IGFsd2F5cyAwIGluIEJQL01QCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgNCksIC8vIGNvbnN0cmFpbl9zZXQzX2ZsYWcgPSAxIGZvciBsZXZlbCAxYiwgMCBmb3Igb3RoZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZWRfemVyb180Yml0cyA9IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKCiAgICAgICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgNTYpCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsIChJTUdfVUlOVDgpIHBTSFBhcmFtcy0+dWNMZXZlbCwgOCk7CiAgICAgICAgLy8gbGV2ZWxfaWRjICg4IGJpdHMpID0gMTEgZm9yIDFiLCAxMHhsZXZlbCBmb3Igb3RoZXJzCgogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsKICAgICAgICAvLyBzZXFfcGFyYW1ldGVyX1NldF9pZCA9IDAKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSk7CiAgICAgICAgLy8gY2hyb21hX2Zvcm1hdF9pZGMgPSAxCiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOwogICAgICAgIC8vIGJpdF9kZXB0aF9sdW1hX21pbnVzOCA9IDAKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7CiAgICAgICAgLy8gYml0X2RlcHRoX2Nocm9tYV9taW51czggPSAwCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKICAgICAgICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcgPSAwCgogICAgICAgIC8vaWYgKHBTSFBhcmFtcy0+YlVzZURlZmF1bHRTY2FsaW5nTGlzdCkKICAgICAgICAvL3sKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwogICAgICAgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOwogICAgICAgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWdbaV0gPSAwOyAwIDwgaSA8IDgKICAgICAgICAvL30KICAgICAgICAvL2Vsc2UKICAgICAgICAvL3sKICAgICAgICAvLyAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7ICAgICAgICAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZwogICAgICAgIC8vfQoKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSk7CiAgICAgICAgLy8gbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IDEKICAgICAgICAvLyBDdXN0b21lciByZXF1ZXN0IFBPQyB0eXBlIHNob3VsZCBiZSAyLgogICAgICAgIC8vcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOwogICAgICAgIC8vIHBpY19vcmRlcl9jbnRfdHlwZSA9IDAKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMik7CiAgICAgICAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9Jc2JfbWludXM0ID0gMgoKICAgICAgICAvLyBCeXRlcyBhbGlnbmVkIChiaXQgNzIpCiNlbmRpZgogICAgfQogICAgLy8gbWF4X251bV9yZWZfZnJhbWVzLiBsb25nIHRlcm0gcmVmZXJlbmNlIGlzbid0IHVzZWQuCiAgICAvL3Bud19fZ2VuZXJhdGVfdShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTSFBhcmFtcy0+bWF4X251bV9yZWZfZnJhbWVzKTsKICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxKTsKICAgIC8vIGdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfRmxhZyAtICgxIGJpdCkKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNIUGFyYW1zLT5nYXBzX2luX2ZyYW1lX251bV92YWx1ZSwgMSk7CgoKICAgIC8vLyoqKiogR0VORVJBVEVTIFRIRSBTRUNPTkQsIFZBUklBQkxFIExFTkdUSCwgRUxFTUVOVCBPRiBUSEUgSDI2NF9TRVFVRU5DRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLy8vKioqKiBFTEVNRU5UIEJJVENPVU5UOiB4eAogICAgcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTSFBhcmFtcy0+dWNXaWR0aF9pbl9tYnNfbWludXMxKTsKICAgIC8vcGljX3dpZHRoX2luX21ic19taW51czE6IHVlKHYpIGZyb20gMTAgdG8gNDQgKDE3NiB0byA3MjAgcGl4ZWwgcGVyIHJvdykKICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU0hQYXJhbXMtPnVjSGVpZ2h0X2luX21hcHNfdW5pdHNfbWludXMxKTsKICAgIC8vcGljX2hlaWdodF9pbl9tYXBzX3VuaXRzX21pbnVzMTogdWUodikgVmFsdWUgZnJvbSA4IHRvIDM1ICgxNDQgdG8gNTc2IHBpeGVscyBwZXIgY29sdW1uKQoKICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGFsaWdubWVudCBhdCB0aGlzIHBvaW50LCBzbyB3aWxsIGhhdmUgdG8gdXNlIGJpdCB3cml0aW5nIGZ1bmN0aW9ucwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU0hQYXJhbXMtPnVjRnJhbWVfbWJzX29ubHlfZmxhZywgMSk7CiAgICAvLyBmcmFtZV9tYl9vbmx5X2ZsYWcgMT1mcmFtZSBlbmNvZGluZywgMD1maWVsZCBlbmNvZGluZwoKI2lmIDAKICAgIGlmICghcFNIUGFyYW1zLT51Y0ZyYW1lX21ic19vbmx5X2ZsYWcpIC8vIGluIHRoZSBjYXNlIG9mIGludGVybGFjZWQgZW5jb2RpbmcKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwogICAgLy8gbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9IDAgaW4gVG9wYXooZmllbGQgZW5jb2RpbmcgYXQgdGhlIHNlcXVlbmNlIGxldmVsKQojZW5kaWYKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwogICAgLy8gZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZz0xIGluIFRvcGF6CgogICAgaWYgKHBzQ3JvcC0+YkNsaXApIHsKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwc0Nyb3AtPkxlZnRDcm9wT2Zmc2V0KTsKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcHNDcm9wLT5SaWdodENyb3BPZmZzZXQpOwogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwc0Nyb3AtPlRvcENyb3BPZmZzZXQpOwogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwc0Nyb3AtPkJvdHRvbUNyb3BPZmZzZXQpOwoKICAgIH0gZWxzZSB7CiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKICAgIH0KCiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgVEhJUkQgRUxFTUVOVCBPRiBUSEUgSDI2NF9TRVFVRU5DRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLy8vKioqKiBFTEVNRU5UIEJJVENPVU5UOiB4eAogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBTSFBhcmFtcy0+VlVJX1BhcmFtc19QcmVzZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAoVlVJIG9ubHkgaW4gMXN0IHNlcXVlbmNlIG9mIHN0cmVhbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgaWYgKHBTSFBhcmFtcy0+VlVJX1BhcmFtc19QcmVzZW50ID4gMCkKICAgICAgICBwbndfX0gyNjRfd3JpdGViaXRzX1ZVSV9wYXJhbXMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAmKHBTSFBhcmFtcy0+VlVJX1BhcmFtcykpOwoKICAgIC8vIEZpbmFsbHkgd2UgbmVlZCB0byBhbGlnbiB0byB0aGUgbmV4dCBieXRlCiAgICAvLyBXZSBrbm93IHRoZSBzaXplIG9mIHRoZSBkYXRhIGluIHRoZSBzZXF1ZW5jZSBoZWFkZXIgKG5vIE1UWCB2YXJpYWJsZXMpICBhbmQgc3RhcnQgaXMgYnl0ZSBhbGlnbmVkLCBzbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCB0aGlzIGZpZWxkIGhlcmUgcmF0aGVyIHRoYW4gTVRYIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX0gyNjQgY29tbWFuZC4KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CiAgICB1aThTQlAgPSAoYXVpMzJFbGVtZW50UG9pbnRlcnNbcE1UWF9IZWFkZXItPkVsZW1lbnRzXS0+U2l6ZSkgJiA3OwogICAgaWYgKHVpOFNCUCA+IDApCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCA4IC0gKHVpOFNCUCkpOwogICAgcmV0dXJuOwp9CgoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19zbGljZV9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSDI2NF9TTElDRV9IRUFERVJfUEFSQU1TICpwU2xIUGFyYW1zLAogICAgSU1HX0JPT0wgX19tYXliZV91bnVzZWQgYkNhYmFjRW5hYmxlZCwKICAgIElNR19VSU5UMTYgdWlJZHJQaWNJZCkKewojaWZkZWYgVVNFU1RBVElDV0hFUkVQT1NTSUJMRQogICAgSU1HX1VJTlQzMiAqcDsKICAgIHAgPSAoSU1HX1VJTlQzMiAqKSBtdHhfaGRyOwoKICAgIHBbMF0gPSBwWzFdID0gMDsKICAgIHBbMl0gPSA0MDsKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSkgcFszXSA9IDI1NzsKICAgIGVsc2UgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEUpIHBbM10gPSA5NDczOwogICAgZWxzZSBwWzNdID0gODQ0OTsKI2Vsc2UKICAgIC8qIC0tIEJlZ2luIGJ1aWxkaW5nIHRoZSBwaWN0dXJlIGhlYWRlciBlbGVtZW50ICovCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudCgKICAgICAgICBtdHhfaGRyLAogICAgICAgIGVsdF9wLAogICAgICAgIHBTbEhQYXJhbXMtPlN0YXJ0X0NvZGVfUHJlZml4X1NpemVfQnl0ZXMpOyAvKiBDYW4gYmUgMyBvciA0IGJ5dGVzIC0gYWx3YXlzIDQgYnl0ZXMgaW4gb3VyIGltcGxlbWVudGF0aW9ucyAqLwogICAgcG53X19IMjY0X3dyaXRlYml0c19zbGljZV9oZWFkZXIwKG10eF9oZHIsIGVsdF9wLCBwU2xIUGFyYW1zKTsKI2VuZGlmCgogICAgcG53X19IMjY0X3dyaXRlYml0c19zbGljZV9oZWFkZXIxKG10eF9oZHIsIGVsdF9wLCBwU2xIUGFyYW1zLCB1aUlkclBpY0lkKTsKCiNpZiAwCiAgICBpZiAoYkNhYmFjRW5hYmxlZCAmJiAoKFNMSFBfUF9TTElDRUZSQU1FX1RZUEUgPT0gcFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgIChTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFID09IHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSkpKSB7CiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgMCk7ICAgIC8qIGhhcmQgY29kZSBjYWJhY19pbml0X2lkYyB2YWx1ZSBvZiAwICovCiAgICB9CiNlbmRpZgoKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfU1FQKTsgLyogTVRYIGZpbGxzIHRoaXMgdmFsdWUgaW4gKi8KCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX1JBV0RBVEEpOwogICAgcG53X19IMjY0X3dyaXRlYml0c19zbGljZV9oZWFkZXIyKG10eF9oZHIsIGVsdF9wLCBwU2xIUGFyYW1zKTsKCiAgICAvKiBubyBieXRlIGFsaWdubWVudCBhdCBlbmQgb2Ygc2xpY2UgaGVhZGVycyAqLwp9CgoKc3RhdGljIHZvaWQgcG53X19IMjY0X2dldGVsZW1lbnRzX3NraXBfUF9zbGljZSgKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgSDI2NF9TTElDRV9IRUFERVJfUEFSQU1TICpwU2xIUGFyYW1zLAogICAgSU1HX1VJTlQzMiBNQl9Ob19Jbl9TbGljZSwKICAgIElNR19CT09MIGJDYWJhY0VuYWJsZWQpCnsKICAgIC8qIFNraXBwZWQgUC1TbGljZQogICAgICogRW5zdXJlIHBTbEhQYXJhbXMgaXMgZmlsbGVkIHdpdGggYXBwcm9wcmlhdGUgcGFyYW1ldGVycyBmb3IgYSBCLXNsaWNlCiAgICAgKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICAgKi8KICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICplbHRfcFtNQVhOVU1CRVJFTEVNRU5UU107CiAgICBtdHhfaGRyLT5FbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBlbHRfcFswXSA9IFRoaXNfRWxlbWVudDsKCiAgICAvKiBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIEVMRU1FTlRfU1RBUlRDT1VOVEVSKTsgKi8KICAgIC8qIE5vdCBzdXJlIGlmIHRoaXMgd2lsbCBiZSByZXF1aXJlZCBpbiB0aGUgZmluYWwgc3BlYyAqLwogICAgcG53X19IMjY0X3dyaXRlYml0c19zbGljZV9oZWFkZXIobXR4X2hkciwgZWx0X3AsIHBTbEhQYXJhbXMsIGJDYWJhY0VuYWJsZWQsIDApOwogICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgTUJfTm9fSW5fU2xpY2UpOyAvKiBtYl9za2lwX3J1biA9IG1iX25vX2luX3NsaWNlICovCgogICAgLyogVGVsbCBNVFggdG8gaW5zZXJ0IHRoZSBieXRlIGFsaWduIGZpZWxkICh3ZSBkb24ndCBrbm93IGZpbmFsIHN0cmVhbSBzaXplIGZvciBhbGlnbm1lbnQgYXQgdGhpcyBwb2ludCkgKi8KICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX0gyNjQpOwogICAgbXR4X2hkci0+RWxlbWVudHMrKzsgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCn0KCgoKc3RhdGljIHZvaWQgcG53X19IMjY0X2dldGVsZW1lbnRzX3NlcXVlbmNlX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgSDI2NF9TRVFVRU5DRV9IRUFERVJfUEFSQU1TICpwU0hQYXJhbXMsCiAgICBIMjY0X0NST1BfUEFSQU1TICpwc0Nyb3BQYXJhbXMpCnsKICAgIC8qIEJ1aWxkcyBhIHNlcXVlbmNlLCBwaWN0dXJlIGFuZCBzbGljZSBoZWFkZXIgd2l0aCBmcm9tIHRoZSBnaXZlbiBpbnB1dHMgcGFyYW1ldGVycyAoc3RhcnQgb2YgbmV3IGZyYW1lKQogICAgICogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZwogICAgICovCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqZWx0X3BbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgbXR4X2hkci0+RWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwogICAgZWx0X3BbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgcG53X19IMjY0X3dyaXRlYml0c19zZXF1ZW5jZV9oZWFkZXIobXR4X2hkciwgZWx0X3AsIHBTSFBhcmFtcywgcHNDcm9wUGFyYW1zKTsKICAgIG10eF9oZHItPkVsZW1lbnRzKys7IC8qIEhhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudCAqLwp9CgoKCnN0YXRpYyB2b2lkIHBud19fSDI2NF9nZXRlbGVtZW50c19zbGljZV9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUyAqcFNsSFBhcmFtcywKICAgIElNR19CT09MIGJDYWJhY0VuYWJsZWQsCiAgICBJTUdfVUlOVDE2IHVpSWRyUGljSWQpCnsKICAgIC8qIEJ1aWxkcyBhIHNpbmdsZSBzbGljZSBoZWFkZXIgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyAobWlkIGZyYW1lKQogICAgICogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZwogICAgICovCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqZWx0X3BbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgbXR4X2hkci0+RWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwogICAgZWx0X3BbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgLyogTm90IHN1cmUgaWYgdGhpcyB3aWxsIGJlIHJlcXVpcmVkIGluIHRoZSBmaW5hbCBzcGVjICovCiAgICAvKiBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIEVMRU1FTlRfU1RBUlRDT1VOVEVSKTsqLwogICAgcG53X19IMjY0X3dyaXRlYml0c19zbGljZV9oZWFkZXIobXR4X2hkciwgZWx0X3AsIHBTbEhQYXJhbXMsIGJDYWJhY0VuYWJsZWQsIHVpSWRyUGljSWQpOwoKICAgIG10eF9oZHItPkVsZW1lbnRzKys7IC8qIEhhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudCAqLwp9CgoKc3RhdGljIElNR19VSU5UOCBCaXRzMkNvZGUoSU1HX1VJTlQzMiBDb2RlVmFsKQp7CiAgICBJTUdfVUlOVDggQml0cyA9IDMyOwogICAgaWYgKENvZGVWYWwgPT0gMCkKICAgICAgICByZXR1cm4gMTsKICAgIHdoaWxlICghKENvZGVWYWwgJiAweDgwMDAwMDAwKSkgewogICAgICAgIENvZGVWYWwgPDw9IDE7CiAgICAgICAgQml0cy0tOwogICAgfQogICAgcmV0dXJuIEJpdHM7Cn0KCi8qCiAqIEludGVybWVkaWFyeSBmdW5jdGlvbnMgdG8gYnVpbGQgTVBFRzQgaGVhZGVycwogKi8KI2RlZmluZSBNQVRDSF9UT19FTkMKCgpzdGF0aWMgdm9pZCBwbndfX01QRUc0X3dyaXRlYml0c19zZXF1ZW5jZV9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSU1HX0JPT0wgX19tYXliZV91bnVzZWQgYkJGcmFtZSwKICAgIE1QRUc0X1BST0ZJTEVfVFlQRSBiUHJvZmlsZSwKICAgIElNR19VSU5UOCBQcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uLAogICAgRklYRURfVk9QX1RJTUVfVFlQRSBfX21heWJlX3VudXNlZCBzRml4ZWRfdm9wX3RpbWVfaW5jcmVtZW50LAogICAgSU1HX1VJTlQzMiBQaWN0dXJlX1dpZHRoX1BpeGVscywKICAgIElNR19VSU5UMzIgUGljdHVyZV9IZWlnaHRfUGl4ZWxzLAogICAgVkJWUEFSQU1TIF9fbWF5YmVfdW51c2VkICogc1ZCVlBhcmFtcywKICAgIElNR19VSU5UMzIgVm9wVGltZVJlc29sdXRpb24pIC8qIFNlbmQgTlVMTCBwb2ludGVyIGlmIHRoZXJlIGFyZSBubyBWQlZQYXJhbXMgKi8KewogICAgLyogRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhICovCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICAvKiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgICAgICAgID0gMzIgQml0cyAgICAgICA9IDB4MUIwICovCiAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDQzMiwgMzIpOwoKICAgIC8qIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gPSA4IEJpdHMgPSBTUCBMMC1MMyBhbmQgU1AgTDQtTDUgYXJlIHN1cHBvcnRlZCAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24sIDgpOwoKICAgIC8qIHZpc3VhbF9vYmplY3Rfc3RhcnRfY29kZSA9IDMyIEJpdHMgICAgICAgPSAweDFCNSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDgpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDgpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDgpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDE4MSwgOCk7CgogICAgLyogaXNfdmlzdWFsX29iamVjdF9pZGVudGlmaWVyID0gMSBCaXQgICAgICA9IDAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICAvKiB2aXN1YWxfb2JqZWN0X3R5cGUgPSA0IEJpdHMgICAgICA9IFZpZGVvIElEID0gMSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDQpOwoKICAgIC8qIHZpZGVvX3NpZ25hbF90eXBlID0gMSBCaXQgICAgICAgICAgICAgICAgPSAxICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogYnl0ZV9hbGlnbmVkX2JpdHMgPSAyIEJpdHMgICAgICAgPSAwMWIgKGJ5dGVfYWxpZ25lZF9iaXRzIGlzIDItYml0IHN0dWZmaW5nIGJpdCBmaWVsZCAwMSkgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAyKTsKCiAgICAvKiB2aWRlb19vYmplY3Rfc3RhcnRfY29kZSA9IDMyIEJpdHMgICAgICAgID0gMHgxMDAgT25lIFZPIG9ubHkgaW4gYSBUb3BheiB2aWRlbyBzdHJlYW0gKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCA4KTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCA4KTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCA4KTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCA4KTsKCiAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfc3RhcnRfY29kZSA9IDMyIEJpdHMgID0gMHgxMjAgT25lIFZPTCBvbmx5IGluIGEgVG9wYXogc3RyZWFtICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgOCk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgOCk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgOCk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMzIsIDgpOwoKICAgIC8qIHJhbmRvbV9hY2Nlc3NpYmxlX3ZvbCA9IDEgQml0ICAgICAgICAgICAgPSAwIChQLUZyYW1lIGluIEdPUCkgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICBpZiAoYlByb2ZpbGUgPT0gU1ApIHsKICAgICAgICAvKiB2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uID0gOCBCaXRzICAgICAgICA9IDB4MDEgZm9yIFNQICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDgpOwojaWZuZGVmIE1BVENIX1RPX0VOQwogICAgICAgIC8qIGlzX29iamVjdF9sYXllcl9pZGVudGlmaWVyICAgPSAxIEJpdCAgICAgICAgID0gMCBmb3IgU1AgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiNlbHNlCiAgICAgICAgLyogdG8gbWF0Y2ggdGhlIGVuY29kZXIgKi8KCiAgICAgICAgLyogaXNfb2JqZWN0X2xheWVyX2lkZW50aWZpZXIgICA9IDEgQml0ICAgICAgICAgICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwoKICAgICAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgICAgID0gNCBCaXRzICAgICAgICAgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgNCk7CgogICAgICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSAgPSAzIEJpdHMgICAgICAgICAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAzKTsgIC8vIDAgaXMgcmVzZXJ2ZWQuLi4KI2VuZGlmCiAgICB9IGVsc2UgewogICAgICAgIC8qIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gPSA4IEJpdHMgICAgICAgID0gMHgxMSBmb3IgQVNQICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDMsIDgpOwoKICAgICAgICAvKiBpc19vYmplY3RfbGF5ZXJfaWRlbnRpZmllciAgID0gMSBCaXQgICAgICAgICA9IDEgZm9yIEFTUCAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKCiAgICAgICAgLyogdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkICAgICA9IDQgQml0cyAgICAgICAgPSA1IGlzIGZvciBBU1AgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgNSwgNCk7CgogICAgICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSAgPSAzIEJpdHMgICAgICAgID0gMSAoSGlnaGVzdCBwcmlvcml0eSkgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMyk7CiAgICB9CgogICAgLyogYXNwZWN0X3JhdGlvX2luZm8gICAgICAgICAgICAgICAgPSA0IEJpdHMgICAgICAgID0weDEgKFNxdWFyZSBwaXhlbCkgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCA0KTsKI2lmbmRlZiBNQVRDSF9UT19FTkMKICAgIC8qIHZvbF9jb250cm9sX3BhcmFtZXRlcnMgICAgICAgICAgID0gMSBCaXQgICAgICAgICA9IDEgKEFsd2F5cyBzZW5kIFZPTCBjb250cm9sIHBhcmFtZXRlcnMpICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiNlbHNlCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgojZW5kaWYKCiNpZm5kZWYgTUFUQ0hfVE9fRU5DCiAgICAvKiBjaHJvbWFfZm9ybWF0ICAgICAgICAgICAgICAgICAgICA9IDIgQml0cyAgICAgICAgPSAwMWIgKDQ6MjowKSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDIpOwoKICAgIC8qIGxvd19kZWxheSA9IDEgQml0ID0gMCB3aXRoIEItZnJhbWUgYW5kIDEgd2l0aG91dCBCLWZyYW1lICovCiAgICBpZiAoYkJGcmFtZSkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiAgICBlbHNlCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwoKICAgIC8qIHZidl9wYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgID0gMSBCaXQgICAgICAgICAgICAgICAgID0wLzEgICovCiAgICBpZiAoc1ZCVlBhcmFtcykgewogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKCiAgICAgICAgLyogRm9yIHJlY29yZGluZywgb25seSBzZW5kIHZidiBwYXJhbWV0ZXJzIGluIDFzdCBzZXF1ZW5jZSBoZWFkZXIuCiAgICAgICAgICogRm9yIHZpZGVvIHBob25lLCBpdCBzaG91bGQgYmUgc2VudCBtb3JlIG9mdGVuLCBzdWNoIGFzIG9uY2UgcGVyIHNlcXVlbmNlCiAgICAgICAgICovCiAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICBtdHhfaGRyLAogICAgICAgICAgICBlbHRfcCwKICAgICAgICAgICAgc1ZCVlBhcmFtcy0+Rmlyc3RfaGFsZl9iaXRfcmF0ZSwKICAgICAgICAgICAgMTUpOyAvKiBmaXJzdF9oYWxmX2JpdF9yYXRlICovCgogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsvKiBNYXJrZXIgQml0ID0gMSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cygKICAgICAgICAgICAgbXR4X2hkciwKICAgICAgICAgICAgZWx0X3AsCiAgICAgICAgICAgIHNWQlZQYXJhbXMtPkxhdHRlcl9oYWxmX2JpdF9yYXRlLAogICAgICAgICAgICAxNSk7IC8qIGxhdHRlcl9oYWxmX2JpdF9yYXRlICovCgogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsvKiBNYXJrZXIgQml0ID0gMSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cygKICAgICAgICAgICAgbXR4X2hkciwKICAgICAgICAgICAgZWx0X3AsCiAgICAgICAgICAgIHNWQlZQYXJhbXMtPkZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplLAogICAgICAgICAgICAxNSk7LyogZmlyc3RfaGFsZl92YnZfYnVmZmVyX3NpemUgKi8KCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOyAvKiBNYXJrZXIgQml0ID0gMSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cygKICAgICAgICAgICAgbXR4X2hkciwgZWx0X3AsCiAgICAgICAgICAgIHNWQlZQYXJhbXMtPkxhdHRlcl9oYWxmX3Zidl9idWZmZXJfc2l6ZSwKICAgICAgICAgICAgMTUpOyAvKiBsYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7LyogTWFya2VyIEJpdCA9IDEgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMoCiAgICAgICAgICAgIG10eF9oZHIsCiAgICAgICAgICAgIGVsdF9wLAogICAgICAgICAgICBzVkJWUGFyYW1zLT5GaXJzdF9oYWxmX3Zidl9vY2N1cGFuY3ksCiAgICAgICAgICAgIDE1KTsgIC8qIGZpcnN0X2hhbGZfdmJ2X29jY3VwYW5jeSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsvKiBNYXJrZXIgQml0ID0gMSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cygKICAgICAgICAgICAgbXR4X2hkciwKICAgICAgICAgICAgZWx0X3AsCiAgICAgICAgICAgIHNWQlZQYXJhbXMtPkxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3ksCiAgICAgICAgICAgIDE1KTsgLyogbGF0dGVyX2hhbGZfdmJ2X29jY3VwYW5jeSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsvKiBNYXJrZXIgQml0ID0gMSAqLwogICAgfSBlbHNlCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOyAvKiBObyB2YnYgcGFyYW1ldGVycyBwcmVzZW50ICovCiNlbmRpZgogICAgLyogdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gMiBCaXRzID0gICAgICAwMGIgICAgIFJlY3Rhbmd1bGFyIHNoYXBlICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMik7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7IC8qIE1hcmtlciBCaXQgPSAxICovCgogICAgLyogdm9wX3RpbWVfaW5jcmVtZW50X3NvbHV0aW9uID0gMTYgQml0cyAqLwogICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBWb3BUaW1lUmVzb2x1dGlvbiwgMTYpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOyAvKiBNYXJrZXIgQml0ID0gMSAqLwoKI2lmbmRlZiBNQVRDSF9UT19FTkMKICAgIC8qIGZpeGVkX3ZvcF9yYXRlID0gMSBCaXRzICA9IDEgQWx3YXlzIGZpeGVkIGZyYW1lIHJhdGUgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKCiAgICAvKiBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQgICAgICAgICA9IFZhcmlhYmxlIG51bWJlciBvZiBiaXRzIGJhc2VkIG9uIHRoZSB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uLiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIEJpdHMyQ29kZShWb3BUaW1lUmVzb2x1dGlvbiAtIDEpKTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsgLyogTWFya2VyIEJpdCA9IDEgKi8KI2Vsc2UKICAgIC8qIGZpeGVkX3ZvcF9yYXRlICAgPSAxIEJpdHMgPSAgICAgIDAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsgLyogTWFya2VyIEJpdCA9IDEgKi8KCiNlbmRpZgogICAgLyogdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoID0gMTMgQml0cyAgUGljdHVyZSB3aWR0aCBpbiBwaXhlbCB1bml0cyAqLwogICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBQaWN0dXJlX1dpZHRoX1BpeGVscywgMTMpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOyAvKiBNYXJrZXIgQml0ID0gMSAqLwoKICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgPSAxMyBCaXRzIFBpY3R1cmUgaGVpZ2h0IGluIHBpeGVsIHVuaXRzICovCiAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFBpY3R1cmVfSGVpZ2h0X1BpeGVscywgMTMpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOyAvKiBNYXJrZXIgQml0ID0gMSAqLwoKICAgIC8qIGludGVybGFjZWQgPSAxIEJpdCA9IDAgVG9wYXogb25seSBlbmNvZGVzIHByb2dyZXNzaXZlIGZyYW1lcyAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIC8qIG9ibWNfZGlzYWJsZSA9IDEgQml0ID0gMSBObyBvdmVybGFwcGVkIE1DIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CgogICAgLyogc3ByaXRlX2VuYWJsZSA9IDEgQml0ID0gMCBOb3QgdXNlIHNwcml0ZSBpbiBUb3BheiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIC8qIG5vdF84X2JpdCA9IDEgICAgQml0ID0gMCA4LWJpdCB2aWRlbyBpbiBUb3BheiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIC8qIHF1YW50X3R5cGUgPSAxIEJpdCA9IDAgMm5kIHF1YW50aXphdGlvbiBtZXRob2QgaW4gVG9wYXogKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICBpZiAoYlByb2ZpbGUgPT0gQVNQKSB7CiAgICAgICAgLyogcXVhcnRlcl9zYW1wbGUgPSAxIEJpdCA9IDAgTm8gvC1wZWwgTUMgaW4gVG9wYXogKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiAgICB9CgogICAgLyogY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgICAgPSAxIEJpdCA9IDEgTm8gY29tcGxleGl0eSBlc3RpbWF0aW9uIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiNpZm5kZWYgTUFUQ0hfVE9fRU5DCgogICAgLyogcmVzeW5jX21hcmtlcl9kaXNhYmxlID0gMSBCaXQgPSAwIEFsd2F5cyBlbmFibGUgcmVzeW5jIG1hcmtlciBpbiBUb3BheiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwojZWxzZQogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwojZW5kaWYKICAgIC8qIGRhdGFfcGFydGl0aW9uZWQgPSAxIEJpdCA9IDAgTm8gZGF0YSBwYXJ0aXRpb25pbmcgaW4gVG9wYXogKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICBpZiAoYlByb2ZpbGUgPT0gQVNQKSB7CiAgICAgICAgLyogbmV3cHJlZF9lbmFibGUgPSAxIEJpdCA9IDAgTm8gbmV3cHJlZCBtb2RlIGluIFNQL0FTUCAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKICAgICAgICAvKiByZWR1Y2VkX3ZvcF9yZXNvbHV0aW9uX2VuYWJsZT0xIEJpdCA9IDAgICAgICBObyByZWR1Y2VkIHJlc29sdXRpb24gZnJhbWUgaW4gU1AvQVNQICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwogICAgfQoKICAgIC8qIHNjYWxhYmlsaXR5ID0gMSBCaXQgPSAwICBObyBzY2FsYWJpbGl0eSBpbiBTUC9BU1AgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICAvKiBieXRlX2FsaWduZWRfYml0cyAqLwoKICAgIC8qIFRlbGwgTVRYIHRvIGluc2VydCB0aGUgYnl0ZSBhbGlnbiBmaWVsZAogICAgICogKHdlIGRvbid0IGtub3cgZmluYWwgc3RyZWFtIHNpemUgZm9yIGFsaWdubWVudCBhdCB0aGlzIHBvaW50KQogICAgICovCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKAogICAgICAgIG10eF9oZHIsCiAgICAgICAgZWx0X3AsCiAgICAgICAgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fTVBHNCk7CgogICAgcmV0dXJuOwp9CgoKLyogVXRpbGl0eSBmdW5jdGlvbiAqLwovKgogIElNR19VSU5UOCBCaXRzMkNvZGUoSU1HX1VJTlQzMiBDb2RlVmFsKQogIHsKICBJTUdfVUlOVDggQml0cz0zMjsKICBpZihDb2RlVmFsPT0wKQogIHJldHVybiAxOwogIHdoaWxlKCEoQ29kZVZhbCAmIDB4ODAwMDAwMDApKQogIHsKICBDb2RlVmFsPDw9MTsKICBCaXRzLS07CiAgfQogIHJldHVybiBCaXRzOwogIH0KKi8KCi8qIE1QRUcgNCBWT1AgKFBpY3R1cmUpIEhlYWRlciAqLwpzdGF0aWMgdm9pZCBwbndfX01QRUc0X3dyaXRlYml0c19WT1BfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiplbHRfcCwKICAgIElNR19CT09MICAgIGJJc1ZPUF9jb2RlZCwKICAgIElNR19VSU5UOCAgIFZPUF90aW1lX2luY3JlbWVudCwKICAgIFNFQVJDSF9SQU5HRV9UWVBFIHNTZWFyY2hfcmFuZ2UsCiAgICBWT1BfQ09ESU5HX1RZUEUgc1ZvcENvZGluZ1R5cGUsCiAgICBJTUdfVUlOVDMyIFZvcFRpbWVSZXNvbHV0aW9uKQp7CiAgICBJTUdfQk9PTCBiSXNTeW5jUG9pbnQ7CiAgICAvKiBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEgKi8KICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIC8qIHZpc3VhbF9vYmplY3Rfc2VxdWVuY2Vfc3RhcnRfY29kZSAgICAgICAgPSAzMiBCaXRzICAgICAgID0gMHgxQjYgKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgNDM4LCAzMik7CgogICAgLyogdm9wX2NvZGluZ190eXBlICA9IDIgQml0cyA9IDAgZm9yIEktZnJhbWUgYW5kIDEgZm9yIFAtZnJhbWUgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBzVm9wQ29kaW5nVHlwZSwgMik7CiAgICBiSXNTeW5jUG9pbnQgPSAoVk9QX3RpbWVfaW5jcmVtZW50ID4gMSkgJiYgKChWT1BfdGltZV9pbmNyZW1lbnQpICUgVm9wVGltZVJlc29sdXRpb24gPT0gMCk7CgojaWZuZGVmIE1BVENIX1RPX0VOQwogICAgLyogbW9kdWxvX3RpbWVfYmFzZSA9IDEgQml0ID0gMCBBcyBhdCBsZWFzdCAgMSBzeW5jaHJvbml6YXRpb24gcG9pbnQgKEktZnJhbWUpIHBlciBzZWNvbmQgaW4gVG9wYXogKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKI2Vsc2UKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgYklzU3luY1BvaW50ICA/IDIgOiAwICwgYklzU3luY1BvaW50ID8gMiA6IDEpOwoKI2VuZGlmCgogICAgLyogbWFya2VyX2JpdCA9IDEgICBCaXRzICAgID0gMSAgICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CgojaWZuZGVmIE1BVENIX1RPX0VOQwogICAgLyogdm9wX3RpbWVfaW5jcmVtZW50ID0gVmFyaWFibGUgYml0cyBiYXNlZCBvbiByZXNvbHV0aW9uCiAgICAgKiAgPSB4IFJlc2V0IHRvIDAgYXQgSS1mcmFtZSBhbmQgcGx1cyBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQgZWFjaCBmcmFtZQogICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgVk9QX3RpbWVfaW5jcmVtZW50LCA1KTsKI2Vsc2UKICAgIC8qIHdpbGwgY2hyYXNoIGhlcmUuLi4gKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgIChWT1BfdGltZV9pbmNyZW1lbnQpICUgVm9wVGltZVJlc29sdXRpb24sCiAgICAgICAgQml0czJDb2RlKFZvcFRpbWVSZXNvbHV0aW9uIC0gMSkpOwoKI2VuZGlmCiAgICAvKiBtYXJrZXJfYml0ID0gMSBCaXQgICAgICAgICAgICAgICA9IDEgICAgICAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwoKICAgIGlmICghYklzVk9QX2NvZGVkKSB7CiAgICAgICAgLyogdm9wX2NvZGVkICAgID0gMSBCaXQgICAgICAgICA9IDAgZm9yIHNraXBwZWQgZnJhbWUgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgICAgIC8qIGJ5dGVfYWxpZ25lZF9iaXRzIChza2lwcGVkIHBpY3R1cmVzIGFyZSBieXRlIGFsaWduZWQpICovCiAgICAgICAgLyogVGVsbCBNVFggdG8gaW5zZXJ0IHRoZSBieXRlIGFsaWduIGZpZWxkICh3ZSBkb24ndCBrbm93IGZpbmFsIHN0cmVhbSBzaXplIGZvciBhbGlnbm1lbnQgYXQgdGhpcyBwb2ludCkKICAgICAgICAgKiBFbmQgb2YgVk9QIC0gc2tpcHBlZCBwaWN0dXJlCiAgICAgICAgICovCiAgICAgICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBlbHRfcCwgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fTVBHNCk7CiAgICB9IGVsc2UgewogICAgICAgIC8qIHZvcF9jb2RlZCA9IDEgQml0ICAgICAgICAgICAgPSAxIGZvciBub3JtYWwgY29kZWQgZnJhbWUgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CgogICAgICAgIGlmIChzVm9wQ29kaW5nVHlwZSA9PSBQX0ZSQU1FKSB7CiAgICAgICAgICAgIC8qIHZvcF9yb3VuZGluZ190eXBlID0gMSBCaXQgPSAwIHZvcF9yb3VuZGluZ190eXBlIGlzIDAgaW4gVG9wYXogKi8KICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwogICAgICAgIH0KCiAgICAgICAgLyogaW50cmFfZGNfdmxjX3RociA9IDMgQml0cyA9IDAgVXNlIGludHJhIERDIFZMQyBpbiBUb3BheiAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAzKTsKCiAgICAgICAgLyogdm9wX3F1YW50ID0gNSBCaXRzICAgPSB4ICAgICA1LWJpdCBmcmFtZSBRX3NjYWxlIGZyb20gcmF0ZSBjb250cm9sIC0gR0VORVJBVEVEIEJZIE1UWCAqLwogICAgICAgIC8qIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBGcmFtZV9RX3NjYWxlLCA1KTsgKi8KICAgICAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX0ZSQU1FUVNDQUxFKTsKCiAgICAgICAgaWYgKHNWb3BDb2RpbmdUeXBlID09IFBfRlJBTUUpIHsKICAgICAgICAgICAgLyogdm9wX2Zjb2RlX2ZvcndhcmQgPSAzIGJpdHMgICAgICAgPSAyIGZvciArLy0zMiBhbmQgMyBmb3IgKy8tNjQgc2VhcmNoIHJhbmdlICAqLwogICAgICAgICAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX1JBV0RBVEEpOwogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgc1NlYXJjaF9yYW5nZSwgMyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICoqKiogVEhFIEZJTkFMIFBBUlQgT0YgVk9QIFNUUlVDVFVSRSBDQU4nVCBCRSBHRU5FUkFURUQgSEVSRQogICAgICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfUkFXREFUQSk7CiAgICAgICAgdmlkZW9fcGFja2V0X2RhdGEgKCApICAgICAgICAgICAgICAgICAgID0gMXN0ICBWUCB0aGF0IGRvZXNuknQgaGF2ZSB0aGUgVlAgaGVhZGVyCgogICAgICAgIHdoaWxlIChuZXh0Yml0c19ieXRlYWxpZ25lZCAoICkgPT0gcmVzeW5jX21hcmtlcikKICAgICAgICB7CiAgICAgICAgdmlkZW9fcGFja2V0IF9oZWFkZXIoICkKICAgICAgICB2aWRlb19wYWNrZXQgX2RhdGEoICkgICAgICAgICAgICAgICAgICAgQWxsIE1CIGluIHRoZSBzbGljZQogICAgICAgIH0KICAgICAgICAqLwogICAgfQp9CgojaWYgUFNCX01GTERfRFVNTVlfQ09ERQovKgogKiBJbnRlcm1lZGlhcnkgZnVuY3Rpb25zIHRvIGJ1aWxkIEgyNjMgaGVhZGVycwogKi8Kc3RhdGljIHZvaWQgSDI2M193cml0ZWJpdHNfVmlkZW9TZXF1ZW5jZUhlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBJTUdfVUlOVDggUHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbikKewogICAgLyogRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhICovCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICAvKiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgICAgICAgID0gMzIgQml0cyAgICAgICA9IDB4MUIwICovCiAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDQzMiwgMzIpOwoKICAgIC8qIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gPSA4IEJpdHMgPSAgeCBTUCBMMC1MMyBhbmQgU1AgTDQtTDUgYXJlIHN1cHBvcnRlZCAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24sIDgpOwoKICAgIC8qIHZpc3VhbF9vYmplY3Rfc3RhcnRfY29kZSA9IDMyIEJpdHMgICAgICAgPSAweDFCNSAqLwoKICAgIC8qIDQzNyB0b28gbGFyZ2UgZm9yIHRoZSAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyBmdW5jdGlvbiAqLwogICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCA0MzcsIDMyKTsKCiAgICAvKiBpc192aXN1YWxfb2JqZWN0X2lkZW50aWZpZXIgPSAxIEJpdCAgICAgICAgICAgICAgPSAwICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogaXNfdmlzdWFsX29iamVjdF90eXBlICAgID0gNCBCaXRzICAgICAgICA9IDEgVmlkZW8gSUQgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCA0KTsKCiAgICAvKiB2aWRlb19zaWduYWxfdHlwZSA9IDEgQml0ICAgICAgICAgICAgICAgID0gMCAgICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogYnl0ZV9hbGlnbmVkX2JpdHMgPSAyIEJpdHMgPSAwMWIgYnl0ZV9hbGlnbmVkX2JpdHMgaXMgMi1iaXQgc3R1ZmZpbmcgYml0IGZpZWxkIDAxICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMik7CgogICAgLyogdmlkZW9fb2JqZWN0X3N0YXJ0X2NvZGUgID0zMiBCaXRzICAgICAgICA9IDB4MTAwIE9uZSBWTyBvbmx5IGluIGEgVG9wYXogdmlkZW8gc3RyZWFtICovCiAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDI1NiwgMzIpOwoKICAgIHJldHVybjsKfQojZW5kaWYKCgpzdGF0aWMgdm9pZCBIMjYzX3dyaXRlYml0c19WaWRlb1BpY3R1cmVIZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSU1HX1VJTlQ4IFRlbXBvcmFsX1JlZiwKICAgIEgyNjNfUElDVFVSRV9DT0RJTkdfVFlQRSBQaWN0dXJlQ29kaW5nVHlwZSwKICAgIC8vSU1HX1VJTlQ4IFFfU2NhbGUsCiAgICBIMjYzX1NPVVJDRV9GT1JNQVRfVFlQRSBTb3VyY2VGb3JtYXRUeXBlLAogICAgSU1HX1VJTlQ4IEZyYW1lUmF0ZSwKICAgIElNR19VSU5UMzIgUGljdHVyZVdpZHRoLAogICAgSU1HX1VJTlQzMiBQaWN0dXJlSGVpZ2h0KQp7CiAgICBJTUdfVUlOVDggVUZFUDsKICAgIElNR19VSU5UOCBPQ1BDRiA9IDA7CgogICAgLyogRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhICovCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICAvKiBzaG9ydF92aWRlb19zdGFydF9tYXJrZXIgPSAyMiBCaXRzICAgICAgID0gMHgyMCBQaWN0dXJlIHN0YXJ0IGNvZGUgKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMzIsIDIyKTsKCiAgICAvKiB0ZW1wb3JhbF9yZWZlcmVuY2UgPSA4IEJpdHMgICAgICA9IDAtMjU1IEVhY2ggcGljdHVyZSBpbmNyZWFzZWQgYnkgMSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFRlbXBvcmFsX1JlZiwgOCk7CgogICAgLyogbWFya2VyX2JpdCA9IDEgQml0ID0gMSAgICAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwoKICAgIC8qIHplcm9fYml0ID0gMSBCaXRzICAgICAgICA9IDAgICAgICAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIC8qIHNwbGl0X3NjcmVlbl9pbmRpY2F0b3IgICA9IDEgICAgIEJpdHMgICAgPSAwICAgICBObyBkaXJlY3QgZWZmZWN0IG9uIGVuY29kaW5nIG9mIHBpY3R1cmUgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICAvKiBkb2N1bWVudF9jYW1lcmFfaW5kaWNhdG9yPSAxICAgICBCaXRzICAgID0gMCAgICAgTm8gZGlyZWN0IGVmZmVjdCBvbiBlbmNvZGluZyBvZiBwaWN0dXJlICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogZnVsbF9waWN0dXJlX2ZyZWV6ZV9yZWxlYXNlPTEgQml0cyAgICAgICA9IDAgICAgIE5vIGRpcmVjdCBlZmZlY3Qgb24gZW5jb2Rpbmcgb2YgcGljdHVyZSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIC8qIHNvdXJjZV9mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICBCaXRzICAgID0gMS00ICAgU2VlIG5vdGUgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBTb3VyY2VGb3JtYXRUeXBlLCAzKTsKCiAgICAvKldyaXRlIG9wdGlvbmFsIEN1c3RvbSBQaWN0dXJlIENsb2NrIEZyZXF1ZW5jeShPQ1BDRikqLwogICAgaWYgKEZyYW1lUmF0ZSA9PSAzMCB8fCBGcmFtZVJhdGUgPT0gMC8qIHVuc3BlY2lmaWVkICovKSB7CiAgICAgICAgT0NQQ0YgPSAwOyAvLyAwIGZvciBDSUYgUENGCiAgICB9IGVsc2UgewogICAgICAgIE9DUENGID0gMTsgLy8xIGZvciBDdXN0b20gUENGCiAgICB9CgogICAgaWYgKFNvdXJjZUZvcm1hdFR5cGUgIT0gNykgewogICAgICAgIC8vIHBpY3R1cmVfY29kaW5nX3R5cGUgICAgICAgICAgPSAxIEJpdCAgICAgICAgID0gMC8xICAgMCBmb3IgSS1mcmFtZSBhbmQgMSBmb3IgUC1mcmFtZQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBQaWN0dXJlQ29kaW5nVHlwZSwgMSk7CiAgICAgICAgLy8gZm91cl9yZXNlcnZlZF96ZXJvX2JpdHMgICAgICA9IDQgQml0cyAgICAgICAgPSAwCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDQpOwogICAgfSBlbHNlIHsKICAgICAgICBzdGF0aWMgdW5zaWduZWQgY2hhciAgUlRZUEUgPSAwOwoKICAgICAgICAvLyBpZiBJLSBGcmFtZSBzZXQgVXBkYXRlIEZ1bGwgRXh0ZW5kZWQgUFRZUEUgdG8gdHJ1ZQogICAgICAgIGlmICgoUGljdHVyZUNvZGluZ1R5cGUgPT0gSV9GUkFNRSkgfHwgKFNvdXJjZUZvcm1hdFR5cGUgPT0gNykgfHwgT0NQQ0YpIHsKICAgICAgICAgICAgVUZFUCA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVUZFUCA9IDA7CiAgICAgICAgfQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBVRkVQLCAzKTsKICAgICAgICBpZiAoVUZFUCA9PSAxKSB7CiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCA2LCAzKTsKICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIE9DUENGICwgMSk7CgogICAgICAgICAgICAvKiAxMCByZXNlcnZlIGJpdHMgKCBPcHRpb25hbCBzdXBwb3J0IGZvciB0aGUgZW5jb2RpbmcpLiBBbGwgYXJlIE9GRigwKS4KICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgVW5yZXN0cmljdGVkIE1vdGlvbiBWZWN0b3IgKFVNVikKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgU3ludGF4LWJhc2VkIEFyaXRobWV0aWMgQ29kaW5nIChTQUMpCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIEFkdmFuY2VkIFByZWRpY3Rpb24gKEFQKSBtb2RlCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIEFkdmFuY2VkIElOVFJBIENvZGluZyAoQUlDKSBtb2RlCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIERlYmxvY2tpbmcgRmlsdGVyIChERikgbW9kZQogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBTbGljZSBTdHJ1Y3R1cmVkIChTUykgbW9kZQogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBSZWZlcmVuY2UgUGljdHVyZSBTZWxlY3Rpb24oUlBTKSBtb2RlLgogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBJbmRlcGVuZGVudCBTZWdtZW50IERlY29kaW5nIChJU0QpIG1vZGUKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgQWx0ZXJuYXRpdmUgSU5URVIgVkxDIChBSVYpIG1vZGUKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgTW9kaWZpZWQgUXVhbnRpemF0aW9uIChNUSkgbW9kZSAqLwoKICAgICAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxMCk7CiAgICAgICAgICAgIC8vIDEwIHJlc2VydmUgYml0cwogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgOCwgNCk7CiAgICAgICAgICAgIC8vIDQgcmVzZXJ2ZSBiaXRzCiAgICAgICAgfQogICAgICAgIC8vIHBpY3R1cmVfY29kaW5nX3R5cGUgICAgICAgICAgPSAxIEJpdCAgICAgICAgID0gMC8xICAgMCBmb3IgSS1mcmFtZSBhbmQgMSBmb3IgUC1mcmFtZQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBQaWN0dXJlQ29kaW5nVHlwZSwgMyk7CgogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAyKTsKICAgICAgICAvLyB0d29fcmVzZXJ2ZV9iaXRzLCAgICAgIHJvdW5kaW5nX3R5cGUsICAgICAgIHR3b19yZXNlcnZlX2JpdHMgICAgICAgbWFya2VyX2JpdCAgICAgICBDUE0KICAgICAgICAvLyBSb3VuZGluZyBUeXBlIChSVFlQRSkgKDEgZm9yIFAgUGljdHVyZSwgMCBmb3IgYWxsIG90aGVyIFBpY3R1cmUgZnJhbWVzLgogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBSVFlQRSwgMSk7CiAgICAgICAgLy8yIHJlc2VydmUgYml0cwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAyKTsKICAgICAgICAvLyAgIC0gMSAoT04pIHRvIHByZXZlbnQgc3RhcnQgY29kZSBlbXVsYXRpb24uCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEgLCAxKTsKICAgICAgICAvLyBDUE0gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgUFBUWVBFIHBhcnQgb2YgdGhlIGhlYWRlci4KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCAsIDEpOwoKCiAgICAgICAgaWYgKFVGRVAgPT0gMSkgewogICAgICAgICAgICBJTUdfVUlOVDE2IHVpMTZQV0ksIHVpMTZQSEk7CiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCA0KTsKICAgICAgICAgICAgLy8gYXNwZWN0IHJhdGlvCiAgICAgICAgICAgIC8vUGljdHVyZVdpZHRoLS07CiAgICAgICAgICAgIC8vcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIChJTUdfVUlOVDgpKFBpY3R1cmVXaWR0aCA+PiA4KSwgMSk7CiAgICAgICAgICAgIC8vcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIChJTUdfVUlOVDgpKFBpY3R1cmVXaWR0aCAmIDB4RkYpLCA4KTsKICAgICAgICAgICAgLy9XaWR0aCA9IChQV0ktMSkqNCwgSGVpZ2h0ID0gUEhJKjQsIHNlZSBIMjYzIHNwZWMgNS4xLjUKICAgICAgICAgICAgdWkxNlBXSSA9IChQaWN0dXJlV2lkdGggPj4gMikgLSAxOwogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIChJTUdfVUlOVDgpdWkxNlBXSSwgOSk7CgogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiAgICAgICAgICAgIC8vIG1hcmtlcl9iaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxIEJpdCAgICAgICAgID0gMQogICAgICAgICAgICAvL3Bud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAoSU1HX1VJTlQ4KShQaWN0dXJlSGVpZ2h0ID4+IDgpLCAxKTsKICAgICAgICAgICAgLy9wbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgKElNR19VSU5UOCkoUGljdHVyZUhlaWdodCAmIDB4RkYpLCA4KTsKCiAgICAgICAgICAgIHVpMTZQSEkgPSBQaWN0dXJlSGVpZ2h0ID4+IDI7CiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgKElNR19VSU5UOCl1aTE2UEhJLCA5KTsKICAgICAgICAgICAgLy8gZ29vZCB1cCB0byB0aGF0IHBvaW50CiAgICAgICAgICAgIC8vICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiAgICAgICAgICAgIC8vIG1hcmtlcl9iaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxIEJpdCAgICAgICAgID0gMQogICAgICAgICAgICAvLyBqdXN0IGNoZWNraW5nCiAgICAgICAgICAgIGlmIChPQ1BDRiA9PSAxKSB7CiAgICAgICAgICAgICAgICAvL0lNR19VSU5UOCBDUENGQzsKICAgICAgICAgICAgICAgIC8vQ1BDRkMgPSAoSU1HX1VJTlQ4KSgxODAwLyhJTUdfVUlOVDE2KUZyYW1lUmF0ZSk7CiAgICAgICAgICAgICAgICAvKiB5b3UgY2FuIHVzZSB0aGUgdGFibGUgZm9yIGRpdmlzaW9uICovCiAgICAgICAgICAgICAgICAvL0NQQ0ZDIDw8PSAxOyAvKiBmb3IgQ2xvY2sgQ29udmVyc2lvbiBDb2RlICovCiAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiAgICAgICAgICAgICAgICAvLyBDbG9jayBEaXZpc29yIDogNyBiaXRzIFRoZSBuYXR1cmFsIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIGNsb2NrIGRpdmlzb3IuCiAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMTgwMDAwMCAvIChGcmFtZVJhdGUgKiAxMDAwKSwgNyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKE9DUENGID09IDEpIHsKICAgICAgICAgICAgSU1HX1VJTlQ4IHVpOEVUUjsgLy8gZXh0ZW5kZWQgVGVtcG9yYWwgcmVmZXJlbmNlCiAgICAgICAgICAgIC8vIFR3byBNU0JzIG9mIDEwIGJpdCB0ZW1wb3JhbF9yZWZlcmVuY2UgOiB2YWx1ZSAwCiAgICAgICAgICAgIHVpOEVUUiA9IFRlbXBvcmFsX1JlZiA+PiA4OwoKICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIHVpOEVUUiwgMik7CiAgICAgICAgICAgIC8qIFR3byBNU0JzIG9mIHRlbXBvcmFsX3JlZmVyZW5jZSAqLwogICAgICAgIH0KICAgIH0KICAgIC8vIHZvcF9xdWFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1IEJpdHMgICAgICAgID0geCAgICAgNS1iaXQgZnJhbWUgUV9zY2FsZSBmcm9tIHJhdGUgY29udHJvbCAtIEdFTkVSQVRFRCBCWSBNVFgKICAgIC8vcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIHVpOFFfU2NhbGUsIDUpOwogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBlbHRfcCwgRUxFTUVOVF9GUkFNRVFTQ0FMRSk7IC8vIEluc2VydCB0b2tlbiB0byB0ZWxsIE1UWCB0byBpbnNlcnQgcmF0ZS1jb250cm9sIHZhbHVlIChRU2NhbGUgaXMgc2VudCBhcyBhbiBhcmd1bWVudCBpbiBNVFhfU2VuZF9FbGVtZW50c19Ub19WTEMoJk1UWF9IZWFkZXIsIEZyYW1lUVNjYWxlKSkKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfUkFXREFUQSk7CiAgICAvLyB6ZXJvX2JpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSBCaXQgICAgICAgICA9IDAKICAgIC8vIHBlaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgQml0ICAgICAgICAgPSAwICAgICBObyBkaXJlY3QgZWZmZWN0IG9uIGVuY29kaW5nIG9mIHBpY3R1cmUKICAgIGlmIChTb3VyY2VGb3JtYXRUeXBlICE9IDcpIHsKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiAgICB9CgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwogICAgLy8gRk9MTE9XSU5HIFNFQ1RJT04gQ0FOJ1QgQkUgR0VORVJBVEVEIEhFUkUKICAgIC8vZ29iX2RhdGEoICkKICAgIC8vZm9yKGk9MTsgaTxudW1fZ29iX2luX3BpY3R1cmU7IGkrKykgewogICAgLy8gICAgICBnb2JfaGVhZGVyKCApCiAgICAvLyAgICAgIGdvYl9kYXRhKCApCiAgICAvLyB9CiAgICByZXR1cm47Cn0KCnN0YXRpYyB2b2lkIEgyNjNfd3JpdGViaXRzX0dPQlNsaWNlSGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiplbHRfcCwKICAgIElNR19VSU5UOCBHT0JOdW1iZXIsCiAgICBJTUdfVUlOVDggR09CRnJhbWVJZCkKewogICAgLyogRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhICovCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICAvKiBnb2JfcmVzeW5jX21hcmtlciAgICAgICAgICAgICAgICA9IDE3ICAgICAgICAgICAgPSAweDEgKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMTcpOwoKICAgIC8qIGdvYl9udW1iZXIgPSA1ICAgPSAwLTE3ICBJdCBpcyBnb2IgbnVtYmVyIGluIGEgcGljdHVyZSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIEdPQk51bWJlciwgNSk7CgogICAgLyogZ29iX2ZyYW1lX2lkICAgICA9IDIgPSAwLTMgICAgICAgU2VlIG5vdGUgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBHT0JGcmFtZUlkLCAyKTsKCiAgICAvKiBxdWFudF9zY2FsZSAgICAgID0gNSAgICAgPSAxLTMyICBnb2IgKFNsaWNlKSBRX3NjYWxlICAqLwogICAgLyogcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIEdPQl9RX1NjYWxlLCA1KTsgKi8KCiAgICAvKiBJbnNlcnQgdG9rZW4gdG8gdGVsbCBNVFggdG8gaW5zZXJ0IHJhdGUtY29udHJvbCB2YWx1ZQogICAgICogIChRU2NhbGUgaXMgc2VudCBhcyBhbiBhcmd1bWVudCBpbiBNVFhfU2VuZF9FbGVtZW50c19Ub19WTEMoJk1UWF9IZWFkZXIsIFNsaWNlUVNjYWxlKSkKICAgICAqLwogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBlbHRfcCwgRUxFTUVOVF9TTElDRVFTQ0FMRSk7CiAgICByZXR1cm47Cn0KCi8qCiAqIEhpZ2ggbGV2ZWwgZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiBhIEgyNjMgaGVhZGVyIGlzIHJlcXVpcmVkIC0gSE9TVCBST1VUSU5FUwogKi8KCi8vIFNFSV9JTlNFUlRJT04KI2lmIFBTQl9NRkxEX0RVTU1ZX0NPREUKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19BVURfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMpCnsKICAgIC8vIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0IQogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIHBud19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KHBNVFhfSGVhZGVyLAogICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgNCk7IC8vIDAwIDAwIDAwIDAxIHN0YXJ0IGNvZGUgcHJlZml4CgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsgLy8gQVVEIG5hbF91bml0X3R5cGUgPSAwOQoKICAgIC8vIHByaW1hcnlfcGljX3R5cGUgIHUoMykgMD1JIHNsaWNlLCAxPVAgb3IgSSBzbGljZSwgMj1QLEIgb3IgSSBzbGljZQogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCA0LCA1KTsgLy8gcmJzcF90cmFpbGluZ19iaXRzCgogICAgLy8gV3JpdGUgdGVybWluYXRvcgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgMHg4MCwgOCk7CiAgICByZXR1cm47Cn0KI2VuZGlmCiNkZWZpbmUgU0VJX05PVF9VU0VfVE9LRU5fQUxJR04KCnN0YXRpYyB2b2lkIHBud19fSDI2NF93cml0ZWJpdHNfU0VJX2J1ZmZlcmluZ19wZXJpb2RfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfVUlOVDggdWk4TmFsSHJkQnBQcmVzZW50RmxhZywKICAgIElNR19VSU5UOCB1aThuYWxfY3BiX2NudF9taW51czEsCiAgICBJTUdfVUlOVDggdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoLAogICAgSU1HX1VJTlQzMiB1aTMybmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXksCiAgICBJTUdfVUlOVDMyIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQsCiAgICBJTUdfVUlOVDggdWk4VmNsSHJkQnBQcmVzZW50RmxhZywKICAgIElNR19VSU5UOCB1aTh2Y2xfY3BiX2NudF9taW51czEsCiAgICBJTUdfVUlOVDMyIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgIElNR19VSU5UMzIgdWkzMnZjbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldCkKewogICAgSU1HX1VJTlQ4IHVpOFNjaGVkU2VsSWR4OwogICAgSU1HX1VJTlQ4IHVpOFBheWxvYWRTaXplQml0czsKI2lmZGVmIFNFSV9OT1RfVVNFX1RPS0VOX0FMSUdOCiAgICBJTUdfVUlOVDggdWk4UGFkOwojZW5kaWYKICAgIC8vIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0IQogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIHBud19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KHBNVFhfSGVhZGVyLAogICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgNCk7IC8vIDAwIDAwIDAxIHN0YXJ0IGNvZGUgcHJlZml4CgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDgpOyAvLyBuYWxfdW5pdF90eXBlID0gMDYgKFNFSSBNZXNzYWdlKQoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA4KTsgLy8gU0VJIHBheWxvYWQgdHlwZSAoYnVmZmVyaW5nIHBlcmlvZCkKCiAgICB1aThQYXlsb2FkU2l6ZUJpdHMgPSAxOyAvLyBzZXFfcGFyYW1ldGVyX3NldF9pZCBiaXRzaXplID0gMQogICAgaWYgKHVpOE5hbEhyZEJwUHJlc2VudEZsYWcpCiAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9ICgodWk4bmFsX2NwYl9jbnRfbWludXMxICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoICogMik7CiAgICBpZiAodWk4VmNsSHJkQnBQcmVzZW50RmxhZykKICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gKCh1aTh2Y2xfY3BiX2NudF9taW51czEgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGggKiAyKTsKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aThQYXlsb2FkU2l6ZUJpdHMgKyA3KSAvIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CiAgICAvLyBTRUkgcGF5bG9hZCBzaXplID0gTm8gb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIFNFSSBwYXlsb2FkCiAgICAvLyAoaW5jbHVkaW5nIHNlcV9wYXJhbWV0ZXJfc2V0X2lkKQoKICAgIC8vc2VxX3BhcmFtZXRlcl9zZXRfaWQgICAgICB1ZSh2KSA9IDAgZGVmYXVsdD8gPSAxIChiaW5hcnkpCiAgICAvLz0gc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBjb250YWluaW5nIEhSRCBhdHRyaWJ1dGVzCiAgICBwbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7CgogICAgaWYgKHVpOE5hbEhyZEJwUHJlc2VudEZsYWcpIHsKICAgICAgICBmb3IgKHVpOFNjaGVkU2VsSWR4ID0gMDsgdWk4U2NoZWRTZWxJZHggPD0gdWk4bmFsX2NwYl9jbnRfbWludXMxOyB1aThTY2hlZFNlbElkeCsrKSB7CiAgICAgICAgICAgIC8vIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSA9IGRlbGF5IGJldHdlZW4gdGltZSBvZiBhcnJpdmFsIGluIENPREVEIFBJQ1RVUkUgQlVGRkVSIG9mIGNvZGVkIGRhdGEgb2YgdGhpcyBhY2Nlc3MKICAgICAgICAgICAgLy8gdW5pdCBhbmQgdGltZSBvZiByZW1vdmFsIGZyb20gQ09ERUQgUElDVFVSRSBCVUZGRVIgb2YgdGhlIGNvZGVkIGRhdGEgb2YgdGhlIHNhbWUgYWNjZXNzIHVuaXQuCiAgICAgICAgICAgIC8vIERlbGF5IGlzIGJhc2VkIG9uIHRoZSB0aW1lIHRha2VuIGZvciBhIDkwIGtIeiBjbG9jay4KICAgICAgICAgICAgLy8gUmFuZ2UgPjAgYW5kIDwgOTAwMDAgKiAoQ1BCc2l6ZSAvIEJpdFJhdGUpCiAgICAgICAgICAgIC8vIEZvciB0aGUgMXN0IGJ1ZmZlcmluZyBwZXJpb2QgYWZ0ZXIgSEFSRFdBUkUgUkVGRVJFTkNFIERFQ09ERVIgaW5pdGlhbGlzYXRpb24uCiAgICAgICAgICAgIC8vIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX05BTF9JTklUX0NQQl9SRU1PVkFMX0RFTEFZKTsgLy8gRXZlbnR1YWxseSB1c2UgdGhpcyBpZiBmaXJtd2FyZSB2YWx1ZSByZXF1aXJlZAoKICAgICAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKCQkgICAgdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5LAoJCSAgICB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgpOwoKLyoKICAgICAgICAgICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUEhfU0VJX05BTF9JTklUSUFMX0NQQl9SRU1PVkFMX0RFTEFZKTsqLwoKICAgICAgICAgICAgLy8gdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldCA9IHVzZWQgZm9yIHRoZSBTY2hlZFNlbElkeC10aCBDUEIgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgY3BiX3JlbW92YWxfZGVsYXkgdG8KICAgICAgICAgICAgLy8gc3BlY2lmeSB0aGUgaW5pdGlhbCBkZWxpdmVyeSB0aW1lIG9mIGNvZGVkIGFjY2VzcyB1bml0cyB0byB0aGUgQ09ERUQgUElDVFVSRSBCVUZGRVIgaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQKICAgICAgICAgICAgLy8gRGVsYXkgaXMgYmFzZWQgb24gdGhlIHRpbWUgdGFrZW4gZm9yIGEgOTAga0h6IGNsb2NrLgogICAgICAgICAgICAvLyBOT1QgVVNFRCBCWSBERUNPREVSUyBhbmQgaXMgbmVlZGVkIG9ubHkgZm9yIHRoZSBkZWxpdmVyeSBzY2hlZHVsZXIgKEhTUykgc3BlY2lmaWVkIGluIEFubmV4IEMKCiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCgkJICAgIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQsCgkJICAgIHVpOG5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCk7CgogICAgICAgICAgICAvKnBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBIX1NFSV9OQUxfSU5JVElBTF9DUEJfUkVNT1ZBTF9ERUxBWV9PRkZTRVQpOyovCgogICAgICAgIH0KICAgIH0KICAgIGlmICh1aThWY2xIcmRCcFByZXNlbnRGbGFnKSB7CiAgICAgICAgZm9yICh1aThTY2hlZFNlbElkeCA9IDA7IHVpOFNjaGVkU2VsSWR4IDw9IHVpOHZjbF9jcGJfY250X21pbnVzMTsgdWk4U2NoZWRTZWxJZHgrKykgewogICAgICAgICAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgICAgICAgICAvLyBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9WQ0xfSU5JVF9DUEJfUkVNT1ZBTF9ERUxBWSk7IC8vIEV2ZW50dWFsbHkgdXNlIHRoaXMgaWYgZmlybXdhcmUgdmFsdWUgcmVxdWlyZWQKICAgICAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTMydmNsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgpOwogICAgICAgICAgICAvLyBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9WQ0xfSU5JVF9DUEJfUkVNT1ZBTF9ERUxBWV9DUEIpOyAvLyBFdmVudHVhbGx5IHVzZSB0aGlzIGlmIGZpcm13YXJlIHZhbHVlIHJlcXVpcmVkCiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkzMnZjbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIFBhZCB0byBlbmQgb2YgYnl0ZQojaWZkZWYgU0VJX05PVF9VU0VfVE9LRU5fQUxJR04KICAgIGlmICghdWk4VmNsSHJkQnBQcmVzZW50RmxhZykKICAgICAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKICAgIHVpOFBhZCA9ICh1aThQYXlsb2FkU2l6ZUJpdHMgKyA3KSAvIDg7CiAgICB1aThQYWQgPSAodWk4UGFkICogOCkgLSB1aThQYXlsb2FkU2l6ZUJpdHM7CiAgICBpZiAodWk4UGFkID4gMCkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8ICh1aThQYWQgLSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThQYWQpOyAvLyBTRUkgcGF5bG9hZCB0eXBlIChidWZmZXJpbmcgcGVyaW9kKQojZWxzZQogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEpOyAvLyByYnNwX3RyYWlsaW5nX2JpdHMKCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NCk7CiAgICAvLyBUZWxsIE1UWCB0byBpbnNlcnQgdGhlIGJ5dGUgYWxpZ24gZmllbGQKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKI2VuZGlmCgogICAgLy8gV3JpdGUgdGVybWluYXRvcgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAweDgwLCA4KTsKCiAgICByZXR1cm47Cn0KCiNkZWZpbmUgU0VJX0hPU1RDQUxDX0NQQl9EUEIKCnN0YXRpYyB2b2lkIHBud19fSDI2NF93cml0ZWJpdHNfU0VJX3BpY3R1cmVfdGltaW5nX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfVUlOVDggdWk4Q3BiRHBiRGVsYXlzUHJlc2VudEZsYWcsCiAgICBJTUdfVUlOVDMyIHVpMzJjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgSU1HX1VJTlQzMiB1aTMyZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgSU1HX1VJTlQzMiB1aTMyY3BiX3JlbW92YWxfZGVsYXksCiAgICBJTUdfVUlOVDMyIHVpMzJkcGJfb3V0cHV0X2RlbGF5LAogICAgSU1HX1VJTlQ4IHVpOHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOHBpY19zdHJ1Y3QsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4TnVtQ2xvY2tUUywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCAqIGF1aThjbG9ja190aW1lc3RhbXBfZmxhZywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThmdWxsX3RpbWVzdGFtcF9mbGFnLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOHNlY29uZHNfZmxhZywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThtaW51dGVzX2ZsYWcsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4aG91cnNfZmxhZywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThzZWNvbmRzX3ZhbHVlLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOG1pbnV0ZXNfdmFsdWUsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4aG91cnNfdmFsdWUsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4Y3RfdHlwZSwKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThudWl0X2ZpZWxkX2Jhc2VkX2ZsYWcsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4Y291bnRpbmdfdHlwZSwKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThkaXNjb250aW51aXR5X2ZsYWcsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4Y250X2Ryb3BwZWRfZmxhZywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThuX2ZyYW1lcywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aTh0aW1lX29mZnNldF9sZW5ndGgsCiAgICBJTUdfVUlOVDMyIF9fbWF5YmVfdW51c2VkIGkzMnRpbWVfb2Zmc2V0KQp7CiAgICBJTUdfVUlOVDggdWk4UGF5bG9hZFNpemVCaXRzLCB1aThUbXA7CiNpZmRlZiBTRUlfTk9UX1VTRV9UT0tFTl9BTElHTgogICAgSU1HX1VJTlQ4IHVpOFBhZDsKI2VuZGlmCgogICAgLy8gRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgogICAgcG53X19IMjY0X3dyaXRlYml0c19zdGFydGNvZGVfcHJlZml4X2VsZW1lbnQocE1UWF9IZWFkZXIsCiAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICA0KTsgLy8gMDAgMDAgMDEgc3RhcnQgY29kZSBwcmVmaXgKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgOCk7IC8vIG5hbF91bml0X3R5cGUgPSAwNiAoU0VJIE1lc3NhZ2UpCgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDgpOyAvLyBTRUkgcGF5bG9hZCB0eXBlIChwaWN0dXJlIHRpbWluZykKCgogICAgLy8gUHJlY2FsY3VsYXRlIHRoZSBwYXlsb2FkIGJpdCBzaXplCiAgICB1aThQYXlsb2FkU2l6ZUJpdHMgPSAwOwogICAgaWYgKHVpOENwYkRwYkRlbGF5c1ByZXNlbnRGbGFnKQogICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSB1aTMyY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEgKyB1aTMyZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxICsgMTsKCiNpZiAwCiAgICBpZiAodWk4cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcpIHsKICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gNDsKICAgICAgICBmb3IgKHVpOFRtcCA9IDA7IHVpOFRtcCA8IHVpOE51bUNsb2NrVFMgOyB1aThUbXArKykgewogICAgICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gMTsKCiAgICAgICAgICAgIGlmIChhdWk4Y2xvY2tfdGltZXN0YW1wX2ZsYWdbdWk4VG1wXSkgewogICAgICAgICAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IDIgKyAxICsgNSArIDEgKyAxICsgMSArIDg7CiAgICAgICAgICAgICAgICBpZiAodWk4ZnVsbF90aW1lc3RhbXBfZmxhZykKICAgICAgICAgICAgICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gNiArIDYgKyA1OwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHVpOHNlY29uZHNfZmxhZykgewogICAgICAgICAgICAgICAgICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gNiArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aThtaW51dGVzX2ZsYWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSA2ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aThob3Vyc19mbGFnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSA1OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aTh0aW1lX29mZnNldF9sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSB1aTh0aW1lX29mZnNldF9sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiNlbmRpZgoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpOFBheWxvYWRTaXplQml0cyArIDcpIC8gOCksIDgpOwogICAgLy8gU0VJIHBheWxvYWQgc2l6ZSA9IE5vIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciBTRUkgcGF5bG9hZCAoaW5jbHVkaW5nIHNlcV9wYXJhbWV0ZXJfc2V0X2lkKQoKCiAgICBpZiAodWk4Q3BiRHBiRGVsYXlzUHJlc2VudEZsYWcpIHsKICAgICAgICAvL1NFSV9JTlNFUlRJT04KI2lmZGVmIFNFSV9IT1NUQ0FMQ19DUEJfRFBCCiAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkzMmNwYl9yZW1vdmFsX2RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTMyY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEpOyAvLyBjcGJfcmVtb3ZhbF9kZWxheQogICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpMzJkcGJfb3V0cHV0X2RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTMyZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxICsgMSk7IC8vIGRwYl9vdXRwdXRfZGVsYXkKI2Vsc2UKICAgICAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhfU0VJX05BTF9DUEJfUkVNT1ZBTF9ERUxBWSk7CiAgICAgICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRIX1NFSV9OQUxfRFBCX09VVFBVVF9ERUxBWSk7CiNlbmRpZgogICAgfQoKI2lmIDAKICAgIGlmICh1aThwaWNfc3RydWN0X3ByZXNlbnRfZmxhZykgewogICAgICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOHBpY19zdHJ1Y3QsIDQpOyAvLyBTZWUgVFJNIGFibGUgRCAxIJYgSW50ZXJwcmV0YXRpb24gb2YgcGljX3N0cnVjdAoKICAgICAgICBmb3IgKHVpOFRtcCA9IDA7IHVpOFRtcCA8IHVpOE51bUNsb2NrVFMgOyB1aThUbXArKykgewogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aThjbG9ja190aW1lc3RhbXBfZmxhZ1t1aThUbXBdLCAxKTsKCiAgICAgICAgICAgIGlmIChhdWk4Y2xvY2tfdGltZXN0YW1wX2ZsYWdbdWk4VG1wXSkgewogICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOGN0X3R5cGUsIDIpOwogICAgICAgICAgICAgICAgLy8gKDI9VW5rbm93bikgU2VlIFRSTSBUYWJsZSBEIDIgliBNYXBwaW5nIG9mIGN0X3R5cGUgdG8gc291cmNlIHBpY3R1cmUgc2NhbgogICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG51aXRfZmllbGRfYmFzZWRfZmxhZywgMSk7CiAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4Y291bnRpbmdfdHlwZSwgNSk7CiAgICAgICAgICAgICAgICAvLyBTZWUgVFJNIFRhYmxlIEQgMyCWIERlZmluaXRpb24gb2YgY291bnRpbmdfdHlwZSB2YWx1ZXMKICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThmdWxsX3RpbWVzdGFtcF9mbGFnLCAxKTsKICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThkaXNjb250aW51aXR5X2ZsYWcsIDEpOwogICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOGNudF9kcm9wcGVkX2ZsYWcsIDEpOwogICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG5fZnJhbWVzLCA4KTsKCiAgICAgICAgICAgICAgICBpZiAodWk4ZnVsbF90aW1lc3RhbXBfZmxhZykgewogICAgICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOHNlY29uZHNfdmFsdWUsIDYpOyAvLyAwIC0gNTkKICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThtaW51dGVzX3ZhbHVlLCA2KTsgLy8gMCAtIDU5CiAgICAgICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4aG91cnNfdmFsdWUsIDUpOyAvLyAwIC0gMjMKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4c2Vjb25kc19mbGFnLCAxKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHVpOHNlY29uZHNfZmxhZykgewogICAgICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOHNlY29uZHNfdmFsdWUsIDYpOyAvLyAwIC0gNTkKICAgICAgICAgICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThtaW51dGVzX2ZsYWcsIDEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpOG1pbnV0ZXNfZmxhZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG1pbnV0ZXNfdmFsdWUsIDYpOyAvLyAwIC0gNTkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThob3Vyc19mbGFnLCAxKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodWk4aG91cnNfZmxhZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThob3Vyc192YWx1ZSwgNSk7IC8vIDAgLSAyMwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aTh0aW1lX29mZnNldF9sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHdvJ3MgY29tcGxlbWVudCBzdG9yYWdlIDogSWYgdGltZV9vZmZzZXQ8MCA9ICgoMiBeIHYpICsgdGltZV9vZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpaTMydGltZV9vZmZzZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTUdfVUlOVDMyKSgoMiBeIHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCkgKyBpMzJ0aW1lX29mZnNldCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTh0aW1lX29mZnNldF9sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU1HX1VJTlQzMikgaTMydGltZV9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTh0aW1lX29mZnNldF9sZW5ndGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojZW5kaWYKCiNpZmRlZiBTRUlfTk9UX1VTRV9UT0tFTl9BTElHTgogICAgLy8gUGFkIHRvIGVuZCBvZiBieXRlCiAgICBpZiAoIXVpOHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKQogICAgICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgdWk4UGFkID0gKHVpOFBheWxvYWRTaXplQml0cyArIDcpIC8gODsKICAgIHVpOFBhZCA9ICh1aThQYWQgKiA4KSAtIHVpOFBheWxvYWRTaXplQml0czsKICAgIGlmICh1aThQYWQgPiAwKQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgKHVpOFBhZCAtIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOFBhZCk7IC8vIFNFSSBwYXlsb2FkIHR5cGUgKGJ1ZmZlcmluZyBwZXJpb2QpCiNlbHNlCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NCk7IC8vIFRlbGwgTVRYIHRvIGluc2VydCB0aGUgYnl0ZSBhbGlnbiBmaWVsZAogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwojZW5kaWYKCiAgICAvLyBXcml0ZSB0ZXJtaW5hdG9yCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCwgOCk7CiAgICByZXR1cm47Cn0KCnN0YXRpYyB2b2lkIHBud19fSDI2NF93cml0ZWJpdHNfU0VJX0ZQQV9oZWFkZXIoCiAgICAgICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLCBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICBjaGFyKiBzZWlfZGF0YV9idWYsIElNR19VSU5UMzIgZGF0YV9zaXplKQp7CiAgICBJTUdfVUlOVDggaTsKCiAgICAvLyBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudChwTVRYX0hlYWRlciwKICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgIDQpOyAvLyAwMCAwMCAwMSBzdGFydCBjb2RlIHByZWZpeAoKICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhX3NpemU7IGkrKykKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgc2VpX2RhdGFfYnVmW2ldLCA4KTsgLy9zZWlfZGF0YV9idWYgKFNFSSBNZXNzYWdlKQogICAgLy8gVGVsbCBNVFggdG8gaW5zZXJ0IHRoZSBieXRlIGFsaWduIGZpZWxkICh3ZSBkb24ndCBrbm93IGZpbmFsIHN0cmVhbSBzaXplIGZvciBhbGlnbm1lbnQgYXQgdGhpcyBwb2ludCkKICAgIC8vcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX0gyNjQpOwoKICAgIHJldHVybjsKfQoKCiNpZiBQU0JfTUZMRF9EVU1NWV9DT0RFCnZvaWQgcG53X19IMjY0X3ByZXBhcmVfQVVEX2hlYWRlcihNVFhfSEVBREVSX1BBUkFNUyAqIHBNVFhfSGVhZGVyKQp7CiAgICAvLyBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqYXVpMzJFbGVtZW50UG9pbnRlcnNbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgcE1UWF9IZWFkZXItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIHBNVFhfSGVhZGVyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX0FVRF9oZWFkZXIocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzKTsKCiAgICBwTVRYX0hlYWRlci0+RWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKfQojZW5kaWYKCnZvaWQgcG53X19IMjY0X3ByZXBhcmVfU0VJX2J1ZmZlcmluZ19wZXJpb2RfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKiBwTVRYX0hlYWRlciwKICAgIElNR19VSU5UOCB1aThOYWxIcmRCcFByZXNlbnRGbGFnLAogICAgSU1HX1VJTlQ4IHVpOG5hbF9jcGJfY250X21pbnVzMSwKICAgIElNR19VSU5UOCB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgsCiAgICBJTUdfVUlOVDMyIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgIElNR19VSU5UMzIgdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldCwKICAgIElNR19VSU5UOCB1aThWY2xIcmRCcFByZXNlbnRGbGFnLAogICAgSU1HX1VJTlQ4IHVpOHZjbF9jcGJfY250X21pbnVzMSwKICAgIElNR19VSU5UMzIgdWkzMnZjbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5LAogICAgSU1HX1VJTlQzMiB1aTMydmNsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0KQp7CiAgICAvLyBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqYXVpMzJFbGVtZW50UG9pbnRlcnNbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgcE1UWF9IZWFkZXItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIHBNVFhfSGVhZGVyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX1NFSV9idWZmZXJpbmdfcGVyaW9kX2hlYWRlcigKICAgICAgICBwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgdWk4TmFsSHJkQnBQcmVzZW50RmxhZywKICAgICAgICB1aThuYWxfY3BiX2NudF9taW51czEsCiAgICAgICAgdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoLAogICAgICAgIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgICAgICB1aTMybmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0LAogICAgICAgIHVpOFZjbEhyZEJwUHJlc2VudEZsYWcsCiAgICAgICAgdWk4dmNsX2NwYl9jbnRfbWludXMxLAogICAgICAgIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgICAgICB1aTMydmNsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0KTsKCiAgICBwTVRYX0hlYWRlci0+RWxlbWVudHMrKzsKICAgIC8vSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50CiAgICByZXR1cm47Cn0KCnZvaWQgcG53X19IMjY0X3ByZXBhcmVfU0VJX3BpY3R1cmVfdGltaW5nX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICogcE1UWF9IZWFkZXIsCiAgICBJTUdfVUlOVDggdWk4Q3BiRHBiRGVsYXlzUHJlc2VudEZsYWcsCiAgICBJTUdfVUlOVDMyIHVpMzJjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgSU1HX1VJTlQzMiB1aTMyZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgSU1HX1VJTlQzMiB1aTMyY3BiX3JlbW92YWxfZGVsYXksCiAgICBJTUdfVUlOVDMyIHVpMzJkcGJfb3V0cHV0X2RlbGF5LAogICAgSU1HX1VJTlQ4IHVpOHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOHBpY19zdHJ1Y3QsCiAgICBJTUdfVUlOVDggdWk4TnVtQ2xvY2tUUywKICAgIElNR19VSU5UOCAqYXVpOGNsb2NrX3RpbWVzdGFtcF9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOGZ1bGxfdGltZXN0YW1wX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4c2Vjb25kc19mbGFnLAogICAgSU1HX1VJTlQ4IHVpOG1pbnV0ZXNfZmxhZywKICAgIElNR19VSU5UOCB1aThob3Vyc19mbGFnLAogICAgSU1HX1VJTlQ4IHVpOHNlY29uZHNfdmFsdWUsCiAgICBJTUdfVUlOVDggdWk4bWludXRlc192YWx1ZSwKICAgIElNR19VSU5UOCB1aThob3Vyc192YWx1ZSwKICAgIElNR19VSU5UOCB1aThjdF90eXBlLAogICAgSU1HX1VJTlQ4IHVpOG51aXRfZmllbGRfYmFzZWRfZmxhZywKICAgIElNR19VSU5UOCB1aThjb3VudGluZ190eXBlLAogICAgSU1HX1VJTlQ4IHVpOGRpc2NvbnRpbnVpdHlfZmxhZywKICAgIElNR19VSU5UOCB1aThjbnRfZHJvcHBlZF9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOG5fZnJhbWVzLAogICAgSU1HX1VJTlQ4IHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCwKICAgIElNR19JTlQzMiBpMzJ0aW1lX29mZnNldCkKewogICAgLy8gRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIHBNVFhfSGVhZGVyLT5FbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBwTVRYX0hlYWRlci0+YXNFbGVtZW50U3RyZWFtOwogICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgcG53X19IMjY0X3dyaXRlYml0c19TRUlfcGljdHVyZV90aW1pbmdfaGVhZGVyKAogICAgICAgIHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICB1aThDcGJEcGJEZWxheXNQcmVzZW50RmxhZywKICAgICAgICB1aTMyY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSwKICAgICAgICB1aTMyZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgICAgIHVpMzJjcGJfcmVtb3ZhbF9kZWxheSwKICAgICAgICB1aTMyZHBiX291dHB1dF9kZWxheSwKICAgICAgICB1aThwaWNfc3RydWN0X3ByZXNlbnRfZmxhZywKICAgICAgICB1aThwaWNfc3RydWN0LAogICAgICAgIHVpOE51bUNsb2NrVFMsCiAgICAgICAgYXVpOGNsb2NrX3RpbWVzdGFtcF9mbGFnLAogICAgICAgIHVpOGZ1bGxfdGltZXN0YW1wX2ZsYWcsCiAgICAgICAgdWk4c2Vjb25kc19mbGFnLAogICAgICAgIHVpOG1pbnV0ZXNfZmxhZywKICAgICAgICB1aThob3Vyc19mbGFnLAogICAgICAgIHVpOHNlY29uZHNfdmFsdWUsCiAgICAgICAgdWk4bWludXRlc192YWx1ZSwKICAgICAgICB1aThob3Vyc192YWx1ZSwKICAgICAgICB1aThjdF90eXBlLAogICAgICAgIHVpOG51aXRfZmllbGRfYmFzZWRfZmxhZywKICAgICAgICB1aThjb3VudGluZ190eXBlLAogICAgICAgIHVpOGRpc2NvbnRpbnVpdHlfZmxhZywKICAgICAgICB1aThjbnRfZHJvcHBlZF9mbGFnLAogICAgICAgIHVpOG5fZnJhbWVzLAogICAgICAgIHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCwKICAgICAgICBpMzJ0aW1lX29mZnNldCk7CgogICAgcE1UWF9IZWFkZXItPkVsZW1lbnRzKys7CiAgICAvL0hhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudAogICAgcmV0dXJuOwp9CgojaWYgUFNCX01GTERfRFVNTVlfQ09ERQp2b2lkIHBud19fSDI2NF9wcmVwYXJlX1NFSV9GUEFfaGVhZGVyKAogICAgICAgIE1UWF9IRUFERVJfUEFSQU1TICogcE1UWF9IZWFkZXIsCiAgICAgICAgY2hhciogc2VpX2RhdGFfYnVmLAogICAgICAgIElNR19VSU5UMzIgZGF0YV9zaXplKQp7CiAgICAvLyBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqYXVpMzJFbGVtZW50UG9pbnRlcnNbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgcE1UWF9IZWFkZXItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIHBNVFhfSGVhZGVyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX1NFSV9GUEFfaGVhZGVyKAogICAgICAgICAgICBwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgIHNlaV9kYXRhX2J1ZiwgZGF0YV9zaXplKTsKCiAgICBwTVRYX0hlYWRlci0+RWxlbWVudHMrKzsKICAgIC8vSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50CiAgICByZXR1cm47Cn0KI2VuZGlmCgoKdm9pZCBwbndfX0gyNjRfcHJlcGFyZV9zZXF1ZW5jZV9oZWFkZXIoCiAgICAgICAgdW5zaWduZWQgY2hhciAqcEhlYWRlck1lbW9yeSwKICAgICAgICBJTUdfVUlOVDMyIHVpUGljV2lkdGhJbk1icywKICAgICAgICBJTUdfVUlOVDMyIHVpUGljSGVpZ2h0SW5NYnMsCiAgICAgICAgSU1HX0JPT0wgVlVJX3ByZXNlbnQsIEgyNjRfVlVJX1BBUkFNUyAqVlVJX3BhcmFtcywKICAgICAgICBIMjY0X0NST1BfUEFSQU1TICpwc0Nyb3BQYXJhbXMsCiAgICAgICAgSU1HX1VJTlQ4IHVpTGV2ZWwsCiAgICAgICAgSU1HX1VJTlQ4IHVpUHJvZmlsZSkKewogICAgSDI2NF9TRVFVRU5DRV9IRUFERVJfUEFSQU1TIFNIUGFyYW1zOwogICAgTVRYX0hFQURFUl9QQVJBTVMgICAqbXR4X2hkcjsKCiAgICAvKiBSb3V0ZSBvdXRwdXQgZWxlbWVudHMgdG8gbWVtb3J5IHByb3ZpZGVkICovCiAgICBtZW1zZXQoJlNIUGFyYW1zLCAwLCBzaXplb2YoU0hQYXJhbXMpKTsKICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbW9yeTsKCiAgICAvKiBTZXR1cCBTZXF1ZW5jZSBIZWFkZXIgaW5mb3JtYXRpb24gICovCgoKICAgIHN3aXRjaCAodWlQcm9maWxlKSB7CiAgICBjYXNlIDU6CiAgICAgICAgU0hQYXJhbXMudWNQcm9maWxlICA9IFNIX1BST0ZJTEVfQlA7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDY6CiAgICAgICAgU0hQYXJhbXMudWNQcm9maWxlICA9IFNIX1BST0ZJTEVfTVA7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNIUGFyYW1zLnVjUHJvZmlsZSAgPSBTSF9QUk9GSUxFX01QOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHN3aXRjaCAodWlMZXZlbCkgewogICAgY2FzZSAxMDoKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzE7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDExMToKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzFCOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxMToKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzExOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxMjoKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzEyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAyMDoKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDMwOgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfMzsKICAgICAgICBicmVhazsKICAgIGNhc2UgMzE6CiAgICAgICAgU0hQYXJhbXMudWNMZXZlbCA9ICBTSF9MRVZFTF8zMTsKICAgICAgICBicmVhazsKICAgIGNhc2UgMzI6CiAgICAgICAgU0hQYXJhbXMudWNMZXZlbCA9ICBTSF9MRVZFTF8zMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDA6CiAgICAgICAgU0hQYXJhbXMudWNMZXZlbCA9ICBTSF9MRVZFTF80OwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0MToKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzQxOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0MjoKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzQyOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzM7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgU0hQYXJhbXMudWNXaWR0aF9pbl9tYnNfbWludXMxID0gKElNR19VSU5UOCkodWlQaWNXaWR0aEluTWJzIC0gMSk7CiAgICBTSFBhcmFtcy51Y0hlaWdodF9pbl9tYXBzX3VuaXRzX21pbnVzMSA9IChJTUdfVUlOVDgpKHVpUGljSGVpZ2h0SW5NYnMgLSAxKTsKICAgIFNIUGFyYW1zLlZVSV9QYXJhbXNfUHJlc2VudCA9IFZVSV9wcmVzZW50OwogICAgaWYgKFZVSV9wcmVzZW50KQogICAgICAgIFNIUGFyYW1zLlZVSV9QYXJhbXMgPSAqVlVJX3BhcmFtczsKICAgIFNIUGFyYW1zLmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlID0gSU1HX0ZBTFNFOwogICAgU0hQYXJhbXMudWNGcmFtZV9tYnNfb25seV9mbGFnID0gSU1HX1RSVUU7CgogICAgLyogQWxsIHBpY3R1cmUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHN0YXRpYwogICAgICogKGFwYXJ0IGZyb20gJ3BpY19pbml0X3FwX21pbnVzMjYnIGFuZCAncnNicF9ieXRlX2FsaWduJyBmaWVsZHMsIHdoaWNoIGFyZSBzZXQgaW4gTVRYIGFueXdheSkKICAgICAqLwoKICAgIC8qIENsZWFycyBlbnN1cmVzIGVsZW1lbnRzdHJlYW0gbWVtb3J5IGlzIHplcm9lZC4uIG5vdCBuZWNlc3NhcnksIGJ1dCBtYWtlcyBpdCBlYXNpZXIgdG8gZGVidWcKICAgICAqIGZvciAoTHA9MDtMcDxNQVhfSEVBREVSU0laRVdPUkRTLTE7THArKykgTVRYX0hlYWRlci5hc0VsZW1lbnRTdHJlYW1bTHBdPTA7CiAgICAgKi8KCiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJcblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICIqKioqKioqKiBIT1NUIEZJUk1XQVJFIFJPVVRJTkVTIFRPIFBBU1MgSEVBREVSUyBBTkQgVE9LRU5TIFRPIE1UWCoqKioqKlxuIik7CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiIpOwojZW5kaWYKCiAgICAvKiBGdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBwYWNrIEVsZW1lbnRzIChNVFhfSEVBREVSX1BBUkFNUyBzdHJ1Y3R1cmUpIHdpdGggaGVhZGVyIGluZm9ybWF0aW9uICovCiAgICBwbndfX0gyNjRfZ2V0ZWxlbWVudHNfc2VxdWVuY2VfaGVhZGVyKG10eF9oZHIsICZTSFBhcmFtcywgcHNDcm9wUGFyYW1zKTsKfQoKdm9pZCBwbndfX0gyNjRfcHJlcGFyZV9waWN0dXJlX2hlYWRlcih1bnNpZ25lZCBjaGFyICpwSGVhZGVyTWVtb3J5LCBJTUdfQk9PTCBiQ2FiYWNFbmFibGVkLCBJTUdfSU5UOCBDUVBPZmZzZXQpCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIC8qIFJvdXRlIG91dHB1dCBlbGVtZW50cyB0byBtZW1vcnkgcHJvdmlkZWQgKi8KICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbW9yeTsKCgogICAgLyogQnVpbGRzIGEgc2VxdWVuY2UsIHBpY3R1cmUgYW5kIHNsaWNlIGhlYWRlciB3aXRoIGZyb20gdGhlIGdpdmVuIGlucHV0cyBwYXJhbWV0ZXJzIChzdGFydCBvZiBuZXcgZnJhbWUpCiAgICAgKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICAgKi8KICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICplbHRfcFtNQVhOVU1CRVJFTEVNRU5UU107CiAgICBtdHhfaGRyLT5FbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBlbHRfcFswXSA9IFRoaXNfRWxlbWVudDsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3BpY3R1cmVfaGVhZGVyKG10eF9oZHIsIGVsdF9wLCBiQ2FiYWNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUVBPZmZzZXQsIENRUE9mZnNldCk7CiAgICBtdHhfaGRyLT5FbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KfQoKdm9pZCBwbndfX0gyNjRfcHJlcGFyZV9zbGljZV9oZWFkZXIoCiAgICB1bnNpZ25lZCBjaGFyICpwSGVhZGVyTWVtb3J5LAogICAgSU1HX0JPT0wgICAgYkludHJhU2xpY2UsCiAgICBJTUdfVUlOVDMyIHVpRGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJREMsCiAgICBJTUdfVUlOVDMyIHVpRnJhbWVOdW1iZXIsCiAgICBJTUdfVUlOVDMyIHVpRmlyc3RfTUJfQWRkcmVzcywKICAgIElNR19VSU5UMzIgdWlNQlNraXBSdW4sCiAgICBJTUdfQk9PTCBiQ2FiYWNFbmFibGVkLAogICAgSU1HX0JPT0wgYkZvcmNlSURSLAogICAgSU1HX0JPT0wgYlVzZXNMb25nVGVybVJlZiwKICAgIElNR19CT09MIGJJc0xvbmdUZXJtUmVmLAogICAgSU1HX1VJTlQxNiB1aUlkclBpY0lkKQp7CiAgICBIMjY0X1NMSUNFX0hFQURFUl9QQVJBTVMgU2xIUGFyYW1zOwogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHI7CgogICAgbWVtc2V0KCZTbEhQYXJhbXMsIDAsIHNpemVvZihTbEhQYXJhbXMpKTsKCiAgICAvKiBSb3V0ZSBvdXRwdXQgZWxlbWVudHMgdG8gbWVtb3J5IHByb3ZpZGVkICovCiAgICBtdHhfaGRyID0gKE1UWF9IRUFERVJfUEFSQU1TICopIHBIZWFkZXJNZW1vcnk7CgogICAgU2xIUGFyYW1zLlN0YXJ0X0NvZGVfUHJlZml4X1NpemVfQnl0ZXMgPSA0OwogICAgU2xIUGFyYW1zLlVzZXNMb25nVGVybVJlZiA9IGJVc2VzTG9uZ1Rlcm1SZWY7CiAgICBTbEhQYXJhbXMuSXNMb25nVGVybVJlZiA9IGJJc0xvbmdUZXJtUmVmOwoKICAgIGlmIChiRm9yY2VJRFIgfHwgKHVpRnJhbWVOdW1iZXIgPT0gMCkpIHsKICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJUT1BBWjogR2VuZXJhdGUgYSBJRFIgc2xpY2VcbiIpOwogICAgICAgIFNsSFBhcmFtcy5TbGljZUZyYW1lX1R5cGUgPSBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEU7CiAgICB9IGVsc2UKICAgICAgICBTbEhQYXJhbXMuU2xpY2VGcmFtZV9UeXBlID0gYkludHJhU2xpY2UgPyBTTEhQX0lfU0xJQ0VGUkFNRV9UWVBFIDogU0xIUF9QX1NMSUNFRlJBTUVfVFlQRTsKCiAgICAvKlNsSFBhcmFtcy5TbGljZUZyYW1lX1R5cGUgPSAgICAgICBiSW50cmFTbGljZSA/ICgoKHVpRnJhbWVOdW1iZXIlKDE8PDUpKT09MCkgPyBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEUgOlNMSFBfSV9TTElDRUZSQU1FX1RZUEUgKSA6IFNMSFBfUF9TTElDRUZSQU1FX1RZUEU7Ki8KICAgIFNsSFBhcmFtcy5GcmFtZV9OdW1fRE8gPSAoSU1HX1VJTlQ4KSB1aUZyYW1lTnVtYmVyICUgKDEgPDwgNSk7CiAgICBTbEhQYXJhbXMuUGljdHVyZV9OdW1fRE8gPSAoSU1HX1VJTlQ4KShTbEhQYXJhbXMuRnJhbWVfTnVtX0RPICogMik7CgoKICAgIFNsSFBhcmFtcy5GaXJzdF9NQl9BZGRyZXNzICA9ICB1aUZpcnN0X01CX0FkZHJlc3M7CiAgICBTbEhQYXJhbXMuRGlzYWJsZV9EZWJsb2NraW5nX0ZpbHRlcl9JZGMgPSAoSU1HX1VJTlQ4KSB1aURpc2FibGVEZWJsb2NraW5nRmlsdGVySURDOwoKICAgIHsKICAgICAgICBJTUdfVUlOVDMyICAgICAgKnBNVFhfSGVhZGVyX01lbSA9IChJTUdfVUlOVDMyICopbXR4X2hkcjsKICAgICAgICAvLyByaGs6IGZpcnN0IGluc2VydCBub3JtYWwgaGVhZGVyLgogICAgICAgIHBud19fSDI2NF9nZXRlbGVtZW50c19zbGljZV9oZWFkZXIobXR4X2hkciwgJlNsSFBhcmFtcywgYkNhYmFjRW5hYmxlZCwgdWlJZHJQaWNJZCk7CgogICAgICAgIC8vIHB1dCBhIG1hcmtlciB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBjb21wbGV4IGhlYWRlcgogICAgICAgIC8vIG5vdGUgdGhhdCBmaXJzdCAiaW50IiBpbiB0aGUgYnVmZmVyIGlzIHVzZWQgZm9yIG51bWJlciBvZiBlbGVtZW50cwogICAgICAgIC8vIHdoaWNoIGlzIG5vdCBnb2luZyB0byBiZSBtb3JlIHRoYW4gMjU1CiAgICAgICAgKnBNVFhfSGVhZGVyX01lbSB8PSAweDEwMDsKCiAgICAgICAgLy8gcmhrOiBpbnNlcnQgc2tpcHBlZCBmcmFtZSBoZWFkZXIgYXQgYW4gb2Zmc2V0IG9mIDEyOCBieXRlcwogICAgICAgIHBNVFhfSGVhZGVyX01lbSArPSAoSEVBREVSX1NJWkUgPj4gMyk7ICAvLyBnZXQgYSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgaGFsZiBvZiBtZW1vcnkKICAgICAgICBtdHhfaGRyID0gKE1UWF9IRUFERVJfUEFSQU1TICopcE1UWF9IZWFkZXJfTWVtOwogICAgICAgIHBud19fSDI2NF9nZXRlbGVtZW50c19za2lwX1Bfc2xpY2UobXR4X2hkciwgJlNsSFBhcmFtcywgdWlNQlNraXBSdW4sIGJDYWJhY0VuYWJsZWQpOwogICAgfQoKfQoKCnZvaWQgcG53X19NUEVHNF9wcmVwYXJlX3NlcXVlbmNlX2hlYWRlcigKICAgIHVuc2lnbmVkIGNoYXIgKnBIZWFkZXJNZW1vcnksCiAgICBJTUdfQk9PTCBiQkZyYW1lLAogICAgTVBFRzRfUFJPRklMRV9UWVBFIHNQcm9maWxlLAogICAgSU1HX1VJTlQ4IFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24sCiAgICBGSVhFRF9WT1BfVElNRV9UWVBFIHNGaXhlZF92b3BfdGltZV9pbmNyZW1lbnQsCiAgICBJTUdfVUlOVDMyIFBpY3R1cmVfV2lkdGhfUGl4ZWxzLAogICAgSU1HX1VJTlQzMiBQaWN0dXJlX0hlaWdodF9QaXhlbHMsCiAgICBWQlZQQVJBTVMgKiBwc1ZCVlBhcmFtcywKICAgIElNR19VSU5UMzIgVm9wVGltZVJlc29sdXRpb24pCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIC8qIFJvdXRlIG91dHB1dCBlbGVtZW50cyB0byBtZW1vcnkgcHJvdmlkZWQgKi8KICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbW9yeTsKICAgIC8qIEJ1aWxkcyBhIHNpbmdsZSBNUEVHNCB2aWRlbyBzZXF1ZW5jZSBoZWFkZXIgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyAqLwoKICAgIC8qIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcgKi8KICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICplbHRfcFtNQVhOVU1CRVJFTEVNRU5UU107CiAgICBtdHhfaGRyLT5FbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBlbHRfcFswXSA9IFRoaXNfRWxlbWVudDsKCiAgICBwbndfX01QRUc0X3dyaXRlYml0c19zZXF1ZW5jZV9oZWFkZXIoCiAgICAgICAgbXR4X2hkciwKICAgICAgICBlbHRfcCwKICAgICAgICBiQkZyYW1lLCBzUHJvZmlsZSwKICAgICAgICBQcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uLAogICAgICAgIHNGaXhlZF92b3BfdGltZV9pbmNyZW1lbnQsCiAgICAgICAgUGljdHVyZV9XaWR0aF9QaXhlbHMsCiAgICAgICAgUGljdHVyZV9IZWlnaHRfUGl4ZWxzLAogICAgICAgIHBzVkJWUGFyYW1zLCBWb3BUaW1lUmVzb2x1dGlvbik7CgogICAgbXR4X2hkci0+RWxlbWVudHMrKzsgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCgp9Cgp2b2lkIHBud19fTVBFRzRfcHJlcGFyZV92b3BfaGVhZGVyKAogICAgdW5zaWduZWQgY2hhciAqcEhlYWRlck1lbSwKICAgIElNR19CT09MIGJJc1ZPUF9jb2RlZCwKICAgIElNR19VSU5UMzIgVk9QX3RpbWVfaW5jcmVtZW50LAogICAgSU1HX1VJTlQ4IHNTZWFyY2hfcmFuZ2UsCiAgICBJTUdfVUlOVDggZVZvcF9Db2RpbmdfVHlwZSwKICAgIElNR19VSU5UMzIgVm9wVGltZVJlc29sdXRpb24pCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbTsKCiAgICAvKiBCdWlsZHMgYSBzaW5nbGUgTVBFRzQgVk9QIChwaWN0dXJlKSBoZWFkZXIgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyAqLwogICAgLyogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZyAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmVsdF9wW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGVsdF9wWzBdID0gVGhpc19FbGVtZW50OwoKICAgIC8qIEZyYW1lIFFTY2FsZSBubyBsb25nZXIgd3JpdHRlbiBoZXJlIGFzIGl0IGlzIGluc2VydGVkIGJ5IE1UWCBsYXRlcgogICAgICogKGFkZCBhcyBwYXJhbWV0ZXIgdG8gTVRYX1NlbmRfRWxlbWVudHNfVG9fVkxDKQogICAgICovCiAgICBwbndfX01QRUc0X3dyaXRlYml0c19WT1BfaGVhZGVyKAogICAgICAgIG10eF9oZHIsIGVsdF9wLCBiSXNWT1BfY29kZWQsCiAgICAgICAgVk9QX3RpbWVfaW5jcmVtZW50LAogICAgICAgIHNTZWFyY2hfcmFuZ2UsCiAgICAgICAgZVZvcF9Db2RpbmdfVHlwZSwKICAgICAgICBWb3BUaW1lUmVzb2x1dGlvbik7CgogICAgbXR4X2hkci0+RWxlbWVudHMrKzsgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCgp9CgoKI2lmIFBTQl9NRkxEX0RVTU1ZX0NPREUKdm9pZCBwbndfX0gyNjNfcHJlcGFyZV9zZXF1ZW5jZV9oZWFkZXIoCiAgICB1bnNpZ25lZCBjaGFyICpwSGVhZGVyTWVtLAogICAgSU1HX1VJTlQ4IFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24pCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbTsKCiAgICAvKiBCdWlsZHMgYSBzaW5nbGUgSDI2MyB2aWRlbyBzZXF1ZW5jZSBoZWFkZXIgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyAqLwoKICAgIC8qIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcgKi8KICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICplbHRfcFtNQVhOVU1CRVJFTEVNRU5UU107CiAgICBtdHhfaGRyLT5FbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBlbHRfcFswXSA9IFRoaXNfRWxlbWVudDsKCiAgICBIMjYzX3dyaXRlYml0c19WaWRlb1NlcXVlbmNlSGVhZGVyKG10eF9oZHIsIGVsdF9wLCBQcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uKTsKCiAgICBtdHhfaGRyLT5FbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KCn0KI2VuZGlmCgp2b2lkIHBud19fSDI2M19wcmVwYXJlX3BpY3R1cmVfaGVhZGVyKAogICAgdW5zaWduZWQgY2hhciAqcEhlYWRlck1lbSwKICAgIElNR19VSU5UOCBUZW1wb3JhbF9SZWYsCiAgICBIMjYzX1BJQ1RVUkVfQ09ESU5HX1RZUEUgUGljdHVyZUNvZGluZ1R5cGUsCiAgICBIMjYzX1NPVVJDRV9GT1JNQVRfVFlQRSBTb3VyY2VGb3JtYXRUeXBlLAogICAgSU1HX1VJTlQ4IEZyYW1lUmF0ZSwKICAgIElNR19VSU5UMTYgUGljdHVyZVdpZHRoLAogICAgSU1HX1VJTlQxNiBQaWN0dXJlSGVpZ3RoKQp7CiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkcjsKCiAgICBtdHhfaGRyID0gKE1UWF9IRUFERVJfUEFSQU1TICopIHBIZWFkZXJNZW07CgogICAgLyogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZyAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmVsdF9wW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGVsdF9wWzBdID0gVGhpc19FbGVtZW50OwoKICAgIEgyNjNfd3JpdGViaXRzX1ZpZGVvUGljdHVyZUhlYWRlcigKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICBUZW1wb3JhbF9SZWYsCiAgICAgICAgUGljdHVyZUNvZGluZ1R5cGUsCiAgICAgICAgU291cmNlRm9ybWF0VHlwZSwKICAgICAgICBGcmFtZVJhdGUsCiAgICAgICAgUGljdHVyZVdpZHRoLAogICAgICAgIFBpY3R1cmVIZWlndGgpOwoKICAgIG10eF9oZHItPkVsZW1lbnRzKys7IC8qIEhhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudCAqLwp9Cgp2b2lkIHBud19fSDI2M19wcmVwYXJlX0dPQnNsaWNlX2hlYWRlcigKICAgIHVuc2lnbmVkIGNoYXIgKnBIZWFkZXJNZW0sCiAgICBJTUdfVUlOVDggR09CTnVtYmVyLAogICAgSU1HX1VJTlQ4IEdPQkZyYW1lSWQpCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbTsKCiAgICAvKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nICovCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqZWx0X3BbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgbXR4X2hkci0+RWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwogICAgZWx0X3BbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgSDI2M193cml0ZWJpdHNfR09CU2xpY2VIZWFkZXIobXR4X2hkciwgZWx0X3AsIEdPQk51bWJlciwgR09CRnJhbWVJZCk7CgogICAgbXR4X2hkci0+RWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKICAgIAogICAgLyoKICAgICh2b2lkKXBud19fSDI2NF93cml0ZWJpdHNfU0VJX3Jic3BoZWFkZXI7CiAgICAodm9pZClwbndfX0gyNjRfZ2V0ZWxlbWVudHNfc2tpcF9CX3NsaWNlOwogICAgKHZvaWQpcG53X19IMjY0X2dldGVsZW1lbnRzX2JhY2t3YXJkX3plcm9fQl9zbGljZTsKICAgICh2b2lkKXBud19fSDI2NF9nZXRlbGVtZW50c19yYnNwX0FURV9vbmx5OwogICAgKHZvaWQpcG53X01QRUc0X2dldGVsZW1lbnRzX3ZpZGVvX3BhY2tldF9oZWFkZXI7CiAgICAqLwp9Cgo=