ZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9zZWxlY3RfbW9kdWxlLmMgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfc2VsZWN0X21vZHVsZS5jCmluZGV4IDg4NGVlYTcuLjU0YTVmN2UgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9zZWxlY3RfbW9kdWxlLmMKKysrIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3NlbGVjdF9tb2R1bGUuYwpAQCAtMTI2LDYgKzEyNiw4IEBACiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAqYzsKICAgICBjID0gKG5neF9jb25uZWN0aW9uX3QgKikgZXYtPmRhdGE7CiAKKyAgICBuZ3hfbG9nX2RlYnVnKGMtPmxvZywgImRlbCBldmVudDogJWQiIF8gYy0+ZmQpOworCiAjaWYgKFdJTjMyKQogICAgIGlmIChldmVudCA9PSBOR1hfUkVBRF9FVkVOVCkgewogICAgICAgICBGRF9DTFIoYy0+ZmQsICZtYXN0ZXJfcmVhZF9mZF9zZXQpOwpAQCAtMTQ2LDEzICsxNDgsMTMgQEAKICAgICAgICAgbWF4X2ZkID0gLTE7CiAjZW5kaWYKIAorICAgIG5ldmVudHMtLTsKKwogICAgIGlmIChldi0+aW5kZXggPCBuZXZlbnRzKSB7CiAgICAgICAgIGV2ZW50X2luZGV4W2V2LT5pbmRleF0gPSBldmVudF9pbmRleFtuZXZlbnRzXTsKICAgICAgICAgZXZlbnRfaW5kZXhbZXYtPmluZGV4XS0+aW5kZXggPSBldi0+aW5kZXg7CiAgICAgfQogCi0gICAgbmV2ZW50cy0tOwotCiAgICAgcmV0dXJuIE5HWF9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudC5oIGIvc3JjL2V2ZW50L25neF9ldmVudC5oCmluZGV4IGE0ZThkZDUuLjg2NjkxMWMgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnQuaAorKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50LmgKQEAgLTIyLDggKzIyLDggQEAKIAogICAgIGludCAgICAgICAgICAgICAgaW5kZXg7CiAKLSAgICBuZ3hfZXZlbnRfdCAgICAgKnByZXY7ICAgICAvKiBxdWV1ZSBpbiBzZWxlY3QoKSwgcG9sbCgpLCBtdXRleCgpLCAgICAgICAgKi8KLSAgICBuZ3hfZXZlbnRfdCAgICAgKm5leHQ7ICAgICAvKiAgIGFpb19yZWFkKCksIGFpb193cml0ZSgpICAgICAgICAgICAgICAgICAgKi8KKyAgICBuZ3hfZXZlbnRfdCAgICAgKnByZXY7ICAgICAvKiBxdWV1ZSBpbiBtdXRleCgpLCBhaW9fcmVhZCgpLCBhaW9fd3JpdGUoKSAgKi8KKyAgICBuZ3hfZXZlbnRfdCAgICAgKm5leHQ7ICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAgIGludCAgICAgICAgICAgICgqdGltZXJfaGFuZGxlcikobmd4X2V2ZW50X3QgKmV2KTsKICAgICBuZ3hfZXZlbnRfdCAgICAgKnRpbWVyX3ByZXY7CkBAIC00Myw5ICs0Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgYWNjZXB0OiAxIGlmIGFjY2VwdCBtYW55LCAwIG90aGVyd2lzZSAgICovCiAKICAgICAvKiBmbGFncyAtIGludCBhcmUgcHJvYmFibHkgZmFzdGVyIG9uIHdyaXRlIHRoZW4gYml0cyA/Pz8gKi8KLSNpZiAhKFVTRV9LUVVFVUUpCisKICAgICB1bnNpZ25lZCAgICAgICAgIG9uZXNob3Q6MTsKLSNlbmRpZgorCiAgICAgdW5zaWduZWQgICAgICAgICBsaXN0ZW5pbmc6MTsKICAgICB1bnNpZ25lZCAgICAgICAgIHdyaXRlOjE7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZXZlbnRfcHJveHlfaGFuZGxlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ldmVudF9wcm94eV9oYW5kbGVyLmMKaW5kZXggODViYjhhZC4uYjY3YmIyNSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ldmVudF9wcm94eV9oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ldmVudF9wcm94eV9oYW5kbGVyLmMKQEAgLTE2LDggKzE2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICphZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmFkZHJfdGV4dCk7CiBzdGF0aWMgaW50IG5neF9odHRwX3Byb3h5X3NlbmRfcmVxdWVzdChuZ3hfZXZlbnRfdCAqZXYpOworCiBzdGF0aWMgaW50IG5neF9odHRwX3Byb3h5X3JlYWRfcmVzcG9uc2VfaGVhZGVyKG5neF9ldmVudF90ICpldik7CitzdGF0aWMgaW50IG5neF9odHRwX3Byb3h5X3Byb2Nlc3Nfc3RhdHVzX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7CisKIHN0YXRpYyBpbnQgbmd4X2h0dHBfcHJveHlfcmVhZF9yZXNwb25zZV9ib2R5KG5neF9ldmVudF90ICpldik7CitzdGF0aWMgaW50IG5neF9odHRwX3Byb3h5X3dyaXRlX3RvX2NsaWVudChuZ3hfZXZlbnRfdCAqZXYpOworCitzdGF0aWMgaW50IG5neF9yZWFkX2h0dHBfcHJveHlfc3RhdHVzX2xpbmUobmd4X2h0dHBfcHJveHlfY3R4X3QgKmN0eCk7CiAKIAogc3RhdGljIGNoYXIgY29ubl9jbG9zZVtdID0gIkNvbm5lY3Rpb246IGNsb3NlIiBDUkxGOwpAQCAtMjUwLDcgKzI1Nyw4IEBACiAKIHN0YXRpYyBpbnQgbmd4X2h0dHBfcHJveHlfcmVhZF9yZXNwb25zZV9oZWFkZXIobmd4X2V2ZW50X3QgKmV2KQogewotICAgIGludCAgbjsKKyAgICBpbnQgIG4sIHJjOworICAgIG5neF9odW5rX3QgICAgICAgICAgICoqcGg7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICpjOwogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAqcjsKICAgICBuZ3hfaHR0cF9wcm94eV9jdHhfdCAgKnA7CkBAIC0yNjQsNyArMjcyLDE0IEBACiAKICAgICBpZiAocC0+aGVhZGVyX2luID09IE5VTEwpIHsKICAgICAgICAgbmd4X3Rlc3RfbnVsbChwLT5oZWFkZXJfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyX2luX3QpKSwKKyAgICAgICAgICAgICAgICAgICAgICBuZ3hfY3JlYXRlX3RlbXBfaHVuayhyLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNUVUIgKi8gMTAyNCAvKiovLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBOR1hfRVJST1IpOworCisgICAgICAgIHAtPmhlYWRlcl9pbi0+dHlwZSA9IE5HWF9IVU5LX01FTU9SWTsKKworICAgICAgICBuZ3hfdGVzdF9udWxsKHAtPmhlYWRlcnNfaW4sCisgICAgICAgICAgICAgICAgICAgICAgbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90KSksCiAgICAgICAgICAgICAgICAgICAgICAgTkdYX0VSUk9SKTsKIAogICAgICAgICBuZ3hfdGVzdF9udWxsKHAtPmh1bmtzLApAQCAtMjczLDM2ICsyODgsODcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHVua190ICopKSwKICAgICAgICAgICAgICAgICAgICAgICBOR1hfRVJST1IpOwogCi0gICAgICAgIHAtPmxhc3RfaHVuayA9IDA7CisgICAgICAgIG5neF90ZXN0X251bGwocGgsIG5neF9wdXNoX2FycmF5KHAtPmh1bmtzKSwgTkdYX0VSUk9SKTsKKyAgICAgICAgKnBoID0gcC0+aGVhZGVyX2luOwogCi0gICAgICAgIG5neF90ZXN0X251bGwocC0+aHVuaywKLSAgICAgICAgICAgICAgICAgICAgICBuZ3hfY3JlYXRlX3RlbXBfaHVuayhyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNUVUIgKi8gMTAyNCAvKiovLCAwLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICBOR1hfRVJST1IpOwotCi0gICAgICAgIHAtPmh1bmstPnR5cGUgPSBOR1hfSFVOS19NRU1PUlk7CisgICAgICAgIHAtPnN0YXRlX2hhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX3N0YXR1c19saW5lOwogICAgIH0KIAotICAgIG4gPSBuZ3hfZXZlbnRfcmVjdihjLCBwLT5odW5rLT5sYXN0Lm1lbSwgcC0+aHVuay0+ZW5kIC0gcC0+aHVuay0+bGFzdC5tZW0pOworICAgIG4gPSBuZ3hfZXZlbnRfcmVjdihjLCBwLT5oZWFkZXJfaW4tPmxhc3QubWVtLAorICAgICAgICAgICAgICAgICAgICAgICBwLT5oZWFkZXJfaW4tPmVuZCAtIHAtPmhlYWRlcl9pbi0+bGFzdC5tZW0pOwogCiAgICAgbmd4X2xvZ19kZWJ1ZyhjLT5sb2csICJSRUFEOiVkIiBfIG4pOwogCi0gICAgcC0+aHVuay0+bGFzdC5tZW0gKz0gbjsKKyAgICBwLT5oZWFkZXJfaW4tPmxhc3QubWVtICs9IG47CiAKLSAgICAqcC0+aHVuay0+bGFzdC5tZW0gPSAnXDAnOwotICAgIG5neF9sb2dfZGVidWcoYy0+bG9nLCAiUFJPWFk6XG4nJXMnIiBfIHAtPmh1bmstPnBvcy5tZW0pOworICAgIC8qIFNUVUIgKi8KKyAgICAqcC0+aGVhZGVyX2luLT5sYXN0Lm1lbSA9ICdcMCc7CisgICAgbmd4X2xvZ19kZWJ1ZyhjLT5sb2csICJQUk9YWTpcbiclcyciIF8gcC0+aGVhZGVyX2luLT5wb3MubWVtKTsKKyAgICAvKiovCisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIG5neF9sb2dfZGVidWcoYy0+bG9nLCAiQ0xPU0UgcHJveHkiKTsKKyAgICAgICAgbmd4X2RlbF9ldmVudChldiwgTkdYX1JFQURfRVZFTlQpOworICAgICAgICBuZ3hfZXZlbnRfY2xvc2VfY29ubmVjdGlvbihldik7CisKKyAgICAgICAgcC0+aHVua19uID0gMDsKKyAgICAgICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV93cml0ZV90b19jbGllbnQ7CisgICAgICAgIHJldHVybiBuZ3hfaHR0cF9wcm94eV93cml0ZV90b19jbGllbnQoYy0+d3JpdGUpOworICAgIH0KKworICAgIC8qIHN0YXRlX2hhbmRsZXJzIGFyZSBjYWxsZWQgaW4gZm9sbG93aW5nIG9yZGVyOgorICAgICAgICBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX3N0YXR1c19saW5lKHIsIHApCisgICAgICAgIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfcmVwb25zZV9oZWFkZXIociwgcCkgKi8KKworICAgIGRvIHsKKyAgICAgICAgcmMgPSAocC0+c3RhdGVfaGFuZGxlcikociwgcCk7CisKKyAgICAgICAgaWYgKHJjID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiByYzsKKworICAgICAgICAvKiByYyA9PSBOR1hfT0sgfHwgcmMgPT0gTkdYX0FHQUlOICovCisKKyAgICB9IHdoaWxlIChwLT5oZWFkZXJfaW4tPnBvcy5tZW0gPCBwLT5oZWFkZXJfaW4tPmxhc3QubWVtKTsKIAogICAgIGV2LT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfcmVhZF9yZXNwb25zZV9ib2R5OwotICAgIGlmIChwLT5odW5rLT5lbmQgLSBwLT5odW5rLT5sYXN0Lm1lbSA9PSAwKQorICAgIGlmIChwLT5oZWFkZXJfaW4tPmVuZCAtIHAtPmhlYWRlcl9pbi0+bGFzdC5tZW0gPT0gMCkKICAgICAgICAgcmV0dXJuIG5neF9odHRwX3Byb3h5X3JlYWRfcmVzcG9uc2VfYm9keShldik7CiAKKyAgICByZXR1cm4gTkdYX1dBSVRJTkc7Cit9CisKK3N0YXRpYyBpbnQgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19zdGF0dXNfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCit7CisgICAgaW50ICByYzsKKworICAgIG5neF9sb2dfZGVidWcoci0+Y29ubmVjdGlvbi0+bG9nLCAiU1RBVFVTOiAlZCIgXyBwLT5zdGF0dXMpOworCisgICAgcmMgPSBuZ3hfcmVhZF9odHRwX3Byb3h5X3N0YXR1c19saW5lKHApOworCisgICAgbmd4X2xvZ19kZWJ1ZyhyLT5jb25uZWN0aW9uLT5sb2csICJTVEFUVVM6ICVkIiBfIHAtPnN0YXR1cyk7CisKKyAgICBpZiAocmMgPT0gTkdYX09LKSB7CisgICAgICAgIC8qIFNUVUIgKi8KKyAgICAgICAgbmd4X2xvZ19kZWJ1ZyhyLT5jb25uZWN0aW9uLT5sb2csICJTVEFUVVM6ICVkIiBfIHAtPnN0YXR1cyk7CisKKyAgICAgICAgcC0+c3RhdGVfaGFuZGxlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHAtPmhlYWRlcl9pbi0+bGFzdC5tZW0gPj0gcC0+aGVhZGVyX2luLT5lbmQpIHsKKyAgICAgICAgcmMgPSBOR1hfSFRUUF9QQVJTRV9UT09fTE9OR19TVEFUVVNfTElORTsKKworICAgIH0gZWxzZSBpZiAocmMgPT0gTkdYX0FHQUlOKSB7CisgICAgICAgIHJldHVybiBOR1hfQUdBSU47CisgICAgfQorCiAgICAgLyogU1RVQiAqLyByZXR1cm4gTkdYX0VSUk9SOwogfQogCiBzdGF0aWMgaW50IG5neF9odHRwX3Byb3h5X3JlYWRfcmVzcG9uc2VfYm9keShuZ3hfZXZlbnRfdCAqZXYpCiB7CiAgICAgaW50ICAgICBuOwotICAgIHNpemVfdCAgc2l6ZTsKKyAgICBzaXplX3QgIGxlZnQ7CiAgICAgbmd4X2h1bmtfdCAgICAgICAgICAgICpoLCAqKnBoOwogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAqYzsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgKnI7CkBAIC0zMTUsMTUgKzM4MSwyNCBAQAogICAgIHIgPSAobmd4X2h0dHBfcmVxdWVzdF90ICopIGMtPmRhdGE7CiAgICAgcCA9IChuZ3hfaHR0cF9wcm94eV9jdHhfdCAqKSBuZ3hfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKIAotICAgIHNpemUgPSAwOworICAgIGxlZnQgPSAwOwogCiAgICAgaWYgKHAtPmh1bmtzLT5uZWx0cyA+IDApIHsKICAgICAgICAgaCA9ICgobmd4X2h1bmtfdCAqKikgcC0+aHVua3MtPmVsdHMpW3AtPmh1bmtzLT5uZWx0cyAtIDFdOwotICAgICAgICBzaXplID0gaC0+ZW5kIC0gaC0+bGFzdC5tZW07CisgICAgICAgIGxlZnQgPSBoLT5lbmQgLSBoLT5sYXN0Lm1lbTsKICAgICB9CiAKICAgICBkbyB7Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKKworI2lmIChIQVZFX0tRVUVVRSkKKyNpZiAhKFVTRV9LUVVFVUUpCisgICAgICAgIGlmIChuZ3hfZXZlbnRfdHlwZSA9PSBOR1hfS1FVRVVFX0VWRU5UKQorI2VuZGlmCisgICAgICAgICAgICAvKiBkbyBub3QgYWxsb2NhdGUgbmV3IGJsb2NrIGlmIHRoZXJlIGlzIEVPRiAqLworICAgICAgICAgICAgaWYgKGV2LT5lb2YgJiYgZXYtPmF2YWlsYWJsZSA9PSAwKQorICAgICAgICAgICAgICAgIGxlZnQgPSAxOworI2VuZGlmCisgICAgICAgIGlmIChsZWZ0ID09IDApIHsKICAgICAgICAgICAgIG5neF90ZXN0X251bGwocGgsIG5neF9wdXNoX2FycmF5KHAtPmh1bmtzKSwgTkdYX0VSUk9SKTsKICAgICAgICAgICAgIG5neF90ZXN0X251bGwoaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2NyZWF0ZV90ZW1wX2h1bmsoci0+cG9vbCwKQEAgLTMzOCwyOSArNDEzLDIxMSBAQAogCiAgICAgICAgIG5neF9sb2dfZGVidWcoYy0+bG9nLCAiUkVBRDolZCIgXyBuKTsKIAotICAgICAgICBoLT5sYXN0Lm1lbSArPSBuOworICAgICAgICBpZiAobiA9PSBOR1hfQUdBSU4pCisgICAgICAgICAgICByZXR1cm4gTkdYX1dBSVRJTkc7CiAKKyAgICAgICAgaWYgKG4gPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKworICAgICAgICBoLT5sYXN0Lm1lbSArPSBuOworICAgICAgICBsZWZ0ID0gaC0+ZW5kIC0gaC0+bGFzdC5tZW07CisKKyAgICAgICAgLyogU1RVQiAqLwogICAgICAgICAqaC0+bGFzdC5tZW0gPSAnXDAnOwogICAgICAgICBuZ3hfbG9nX2RlYnVnKGMtPmxvZywgIlBST1hZOlxuJyVzJyIgXyBoLT5wb3MubWVtKTsKLSAgICAgICAgc2l6ZSA9IGgtPmVuZCAtIGgtPmxhc3QubWVtOworICAgICAgICAvKiovCiAKLSAgICAgICAgLyogVE9ETzogY2xvc2UgaWYgS0VWRU5UIGFuZCAoZXYtPmF2YWlsYWJsZSA9PSAwICYmIGV2LT5lb2YpICovCi0KLSAgICB9IHdoaWxlIChzaXplID09IDApOworICAgIH0gd2hpbGUgKG4gPiAwICYmIGxlZnQgPT0gMCk7CiAKICAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBuZ3hfZXZlbnRfY2xvc2VfY29ubmVjdGlvbihldik7CisgICAgICAgIG5neF9sb2dfZGVidWcoYy0+bG9nLCAiQ0xPU0UgcHJveHkiKTsKKyAgICAgICAgbmd4X2RlbF9ldmVudChldiwgTkdYX1JFQURfRVZFTlQpOworICAgICAgICBuZ3hfZXZlbnRfY2xvc2VfY29ubmVjdGlvbihldik7CisKKyAgICAgICAgcC0+aHVua19uID0gMDsKKyAgICAgICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV93cml0ZV90b19jbGllbnQ7CisgICAgICAgIHJldHVybiBuZ3hfaHR0cF9wcm94eV93cml0ZV90b19jbGllbnQoYy0+d3JpdGUpOwogICAgIH0KIAogICAgIC8qIFNUVUIgKi8gcmV0dXJuIE5HWF9XQUlUSU5HOwogfQogCi0jaWYgMAogc3RhdGljIGludCBuZ3hfaHR0cF9wcm94eV93cml0ZV90b19jbGllbnQobmd4X2V2ZW50X3QgKmV2KQogewotICAgIC8qIMXTzMkgwtzLxc7EIMLZ09TSxcUsINTPIENMRUFSLCDJzsHexSAtIE9ORVNIT1QgKi8KKyAgICBpbnQgIHJjOworICAgIG5neF9odW5rX3QgICAgICAgICAgICAqaDsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgKmM7CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICpyOworICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICAqcDsKIAotICAgIHJjID0gbmd4X2h0dHBfb3V0cHV0X2ZpbHRlcihyLCBoKTsKKyAgICBjID0gKG5neF9jb25uZWN0aW9uX3QgKikgZXYtPmRhdGE7CisgICAgciA9IChuZ3hfaHR0cF9yZXF1ZXN0X3QgKikgYy0+ZGF0YTsKKyAgICBwID0gKG5neF9odHRwX3Byb3h5X2N0eF90ICopIG5neF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOworCisgICAgZG8geworICAgICAgICBoID0gKChuZ3hfaHVua190ICoqKSBwLT5odW5rcy0+ZWx0cylbcC0+aHVua19uXTsKKworICAgICAgICByYyA9IG5neF9odHRwX291dHB1dF9maWx0ZXIociwgaCk7CisgICAgICAgIGlmIChyYyAhPSBOR1hfT0spCisgICAgICAgICAgICByZXR1cm4gcmM7CisKKyAgICAgICAgaWYgKHAtPmh1bmtfbiA+PSBwLT5odW5rcy0+bmVsdHMpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBwLT5odW5rX24rKzsKKworICAgIH0gd2hpbGUgKHJjID09IE5HWF9PSyk7CisKKyAgICByZXR1cm4gTkdYX09LOwogfQogCi0jZW5kaWYKKworc3RhdGljIGludCBuZ3hfcmVhZF9odHRwX3Byb3h5X3N0YXR1c19saW5lKG5neF9odHRwX3Byb3h5X2N0eF90ICpjdHgpCit7CisgICAgY2hhciAgIGNoOworICAgIGNoYXIgICpwOworICAgIGVudW0gIHsKKyAgICAgICAgc3dfc3RhcnQgPSAwLAorICAgICAgICBzd19maXJzdF9tYWpvcl9kaWdpdCwKKyAgICAgICAgc3dfbWFqb3JfZGlnaXQsCisgICAgICAgIHN3X2ZpcnN0X21pbm9yX2RpZ2l0LAorICAgICAgICBzd19taW5vcl9kaWdpdCwKKyAgICAgICAgc3dfc3RhdHVzLAorICAgICAgICBzd19zcGFjZV9hZnRlcl9zdGF0dXMsCisgICAgICAgIHN3X3N0YXR1c190ZXh0LAorICAgICAgICBzd19hbG1vc3RfZG9uZSwKKyAgICAgICAgc3dfZG9uZQorICAgIH0gc3RhdGU7CisKKyAgICBzdGF0ZSA9IGN0eC0+c3RhdGU7CisgICAgcCA9IGN0eC0+aGVhZGVyX2luLT5wb3MubWVtOworCisgICAgd2hpbGUgKHAgPCBjdHgtPmhlYWRlcl9pbi0+bGFzdC5tZW0gJiYgc3RhdGUgPCBzd19kb25lKSB7CisgICAgICAgIGNoID0gKnArKzsKKworZnByaW50ZihzdGRlcnIsICJzdGF0ZTogJWQsIHBvczogJXgsIGVuZDogJXgsIGNoYXI6ICclYycsIHN0YXR1czogJWRcbiIsCisgICAgICAgc3RhdGUsIHAsIGN0eC0+aGVhZGVyX2luLT5sYXN0Lm1lbSwgY2gsIGN0eC0+c3RhdHVzKTsKKworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisKKyAgICAgICAgLyogIkhUVFAvIiAqLworICAgICAgICBjYXNlIHN3X3N0YXJ0OgorICAgICAgICAgICAgaWYgKHAgKyAzID49IGN0eC0+aGVhZGVyX2luLT5sYXN0Lm1lbSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0FHQUlOOworCisgICAgICAgICAgICBpZiAoY2ggIT0gJ0gnIHx8ICpwICE9ICdUJyB8fCAqKHAgKyAxKSAhPSAnVCcgfHwgKihwICsgMikgIT0gJ1AnCisgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICoocCArIDMpICE9ICcvJykKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOworCisgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgICBzdGF0ZSA9IHN3X2ZpcnN0X21ham9yX2RpZ2l0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZmlyc3QgZGlnaXQgb2YgbWFqb3IgSFRUUCB2ZXJzaW9uICovCisgICAgICAgIGNhc2Ugc3dfZmlyc3RfbWFqb3JfZGlnaXQ6CisgICAgICAgICAgICBpZiAoY2ggPCAnMScgfHwgY2ggPiAnOScpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKKworICAgICAgICAgICAgc3RhdGUgPSBzd19tYWpvcl9kaWdpdDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIG1ham9yIEhUVFAgdmVyc2lvbiBvciBkb3QgKi8KKyAgICAgICAgY2FzZSBzd19tYWpvcl9kaWdpdDoKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2ZpcnN0X21pbm9yX2RpZ2l0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZmlyc3QgZGlnaXQgb2YgbWlub3IgSFRUUCB2ZXJzaW9uICovCisgICAgICAgIGNhc2Ugc3dfZmlyc3RfbWlub3JfZGlnaXQ6CisgICAgICAgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKKworICAgICAgICAgICAgc3RhdGUgPSBzd19taW5vcl9kaWdpdDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIG1pbm9yIEhUVFAgdmVyc2lvbiBvciBlbmQgb2YgcmVxdWVzdCBsaW5lICovCisgICAgICAgIGNhc2Ugc3dfbWlub3JfZGlnaXQ6CisgICAgICAgICAgICBpZiAoY2ggPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zdGF0dXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBIVFRQIHN0YXR1cyBjb2RlICovCisgICAgICAgIGNhc2Ugc3dfc3RhdHVzOgorICAgICAgICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQorICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7CisKKyAgICAgICAgICAgIGN0eC0+c3RhdHVzID0gY3R4LT5zdGF0dXMgKiAxMCArIGNoIC0gJzAnOworCisgICAgICAgICAgICBpZiAoKytjdHgtPnN0YXR1c19jb3VudCA9PSAzKQorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc3BhY2VfYWZ0ZXJfc3RhdHVzOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgLyogc3BhY2Ugb3IgZW5kIG9mIGxpbmUgKi8KKyAgICAgICAgIGNhc2Ugc3dfc3BhY2VfYWZ0ZXJfc3RhdHVzOgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgY3R4LT5zdGF0dXNfdGV4dCA9IHAgLSAxOworICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc3RhdHVzX3RleHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENSOgorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYWxtb3N0X2RvbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZG9uZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGFueSB0ZXh0IHVudGlsIGVuZCBvZiBsaW5lICovCisgICAgICAgIGNhc2Ugc3dfc3RhdHVzX3RleHQ6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlIENSOgorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYWxtb3N0X2RvbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZG9uZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGVuZCBvZiByZXF1ZXN0IGxpbmUgKi8KKyAgICAgICAgY2FzZSBzd19hbG1vc3RfZG9uZToKKyAgICAgICAgICAgIGN0eC0+cmVxdWVzdF9lbmQgPSBwIC0gMjsKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgTEY6CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdHgtPmhlYWRlcl9pbi0+cG9zLm1lbSA9IHA7CisKKyAgICBpZiAoc3RhdGUgPT0gc3dfZG9uZSkgeworICAgICAgICBpZiAoY3R4LT5yZXF1ZXN0X2VuZCA9PSBOVUxMKQorICAgICAgICAgICAgY3R4LT5yZXF1ZXN0X2VuZCA9IHAgLSAxOworICAgICAgICBjdHgtPnN0YXRlID0gc3dfc3RhcnQ7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5zdGF0ZSA9IHN0YXRlOworICAgICAgICByZXR1cm4gTkdYX0FHQUlOOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZXZlbnRfcHJveHlfaGFuZGxlci5oIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ldmVudF9wcm94eV9oYW5kbGVyLmgKaW5kZXggNWRmZDQ2Ny4uZmZjM2ExNSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ldmVudF9wcm94eV9oYW5kbGVyLmgKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ldmVudF9wcm94eV9oYW5kbGVyLmgKQEAgLTcsMTkgKzcsMzMgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKKyNkZWZpbmUgTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSICAgICAgICAgIDIwCisjZGVmaW5lIE5HWF9IVFRQX1BBUlNFX1RPT19MT05HX1NUQVRVU19MSU5FICAgICAyMQorCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgaW50IGR1bW15OwotfSBuZ3hfaHR0cF9wcm94eV9oZWFkZXJfaW5fdDsKK30gbmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90OwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9wcm94eV9jdHhfcyAgbmd4X2h0dHBfcHJveHlfY3R4X3Q7CisKK3N0cnVjdCBuZ3hfaHR0cF9wcm94eV9jdHhfcyB7CiAgICAgbmd4X2NoYWluX3QgICpvdXQ7CiAKLSAgICBuZ3hfaHVua190ICAgKmh1bms7CiAgICAgaW50ICAgICAgICAgICBsYXN0X2h1bms7CiAgICAgbmd4X2FycmF5X3QgICpodW5rczsKIAotICAgIG5neF9odHRwX3Byb3h5X2hlYWRlcl9pbl90ICAqaGVhZGVyX2luOwotfSBuZ3hfaHR0cF9wcm94eV9jdHhfdDsKKyAgICBpbnQgICAgICAgICAgIGh1bmtfbjsKKworICAgIG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCAgKmhlYWRlcnNfaW47CisKKyAgICBuZ3hfaHVua190ICAqaGVhZGVyX2luOworICAgIGludCAgICAgICAgICBzdGF0ZTsKKyAgICBpbnQgICAgICAgICAgc3RhdHVzOworICAgIGludCAgICAgICAgICBzdGF0dXNfY291bnQ7CisgICAgY2hhciAgICAgICAgKnN0YXR1c190ZXh0OworICAgIGNoYXIgICAgICAgICpyZXF1ZXN0X2VuZDsKKyAgICBpbnQgICAgICAgICgqc3RhdGVfaGFuZGxlcikobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7Cit9OwogCiAKIGV4dGVybiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfcHJveHlfbW9kdWxlOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfZXZlbnQuYyBiL3NyYy9odHRwL25neF9odHRwX2V2ZW50LmMKaW5kZXggOGE3Y2ZhNi4uMzBkMWFjNSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfZXZlbnQuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9ldmVudC5jCkBAIC0zMjMsNyArMzIzLDcgQEAKICAgICB9CiAKICAgICBpZiAoci0+aGVhZGVyX2luLT5sYXN0Lm1lbSA+PSByLT5oZWFkZXJfaW4tPmVuZCkgewotICAgICAgICByYyA9PSBOR1hfSFRUUF9QQVJTRV9UT09fTE9OR19VUkk7CisgICAgICAgIHJjID0gTkdYX0hUVFBfUEFSU0VfVE9PX0xPTkdfVVJJOwogCiAgICAgfSBlbHNlIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKQEAgLTQ5NSwxMCArNDk1LDExIEBACiAKICAgICByYyA9IG5neF9odHRwX2hhbmRsZXIocik7CiAKKyAgICAvKiBoYW5kbGVyIGlzIHN0aWxsIGJ1c3kgKi8KICAgICBpZiAocmMgPT0gTkdYX1dBSVRJTkcpCiAgICAgICAgIHJldHVybiByYzsKIAotICAgIC8qIHRyYW5zZmVyIG5vdCBjb21wbGV0ZWQgKi8KKyAgICAvKiBoYW5kbGVyIGhhcyBkb25lIGl0cyB3b3JrIGJ1dCB0cmFuc2ZlciBpcyBub3QgY29tcGxldGVkICovCiAgICAgaWYgKHJjID09IE5HWF9BR0FJTikgewogI2lmIChIQVZFX0NMRUFSX0VWRU5UKQogICAgICAgICBpZiAobmd4X2FkZF9ldmVudChyLT5jb25uZWN0aW9uLT53cml0ZSwgTkdYX1dSSVRFX0VWRU5ULApAQCAtNTY3LDcgKzU2OCw3IEBACiAgICAgci0+Y29ubmVjdGlvbi0+cmVhZC0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX2Jsb2NrX3JlYWQ7CiAKICAgICAvKiBTVFVCOiBzaG91bGQgZmluZCBoYW5kbGVyICovCi0jaWYgMQorI2lmIDAKICAgICByLT5maWx0ZXIgPSBOR1hfSFRUUF9GSUxURVJfTkVFRF9JTl9NRU1PUlk7CiAjZW5kaWYKICAgICByYyA9IG5neF9odHRwX3NldF9kZWZhdWx0X2hhbmRsZXIocik7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9vdXRwdXRfZmlsdGVyLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9vdXRwdXRfZmlsdGVyLmMKaW5kZXggZTg2YzZjMS4uYmU1YzZkOCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfb3V0cHV0X2ZpbHRlci5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX291dHB1dF9maWx0ZXIuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICBjdHgtPmluID0gY2UtPm5leHQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChyYyA9PSBOR1hfT0spCisgICAgICAgICAgICBpZiAocmMgPT0gTkdYX09LICYmIGN0eC0+aHVuaykKICAgICAgICAgICAgICAgICBjdHgtPmh1bmstPnBvcy5tZW0gPSBjdHgtPmh1bmstPmxhc3QubWVtID0gY3R4LT5odW5rLT5zdGFydDsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CkBAIC0yMTgsNyArMjE4LDggQEAKICAgICAgICAgcmV0dXJuIE5HWF9PSzsKIAogICAgIGlmIChyYyA9PSBOR1hfT0spIHsKLSAgICAgICAgY3R4LT5odW5rLT5wb3MubWVtID0gY3R4LT5odW5rLT5sYXN0Lm1lbSA9IGN0eC0+aHVuay0+c3RhcnQ7CisgICAgICAgIGlmIChjdHgtPmh1bmspCisgICAgICAgICAgICBjdHgtPmh1bmstPnBvcy5tZW0gPSBjdHgtPmh1bmstPmxhc3QubWVtID0gY3R4LT5odW5rLT5zdGFydDsKICNpZiBsZXZlbF9ldmVudAogICAgICAgICBuZ3hfZGVsX2V2ZW50KHItPmNvbm5lY3Rpb24tPndyaXRlLCBOR1hfV1JJVEVfRVZFTlQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYwppbmRleCA5Y2Y4Njc2Li44ZDUxNGRiIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMKQEAgLTMxMiw4NiArMzEyLDYgQEAKICAgICB9CiB9CiAKLSNpZiAwCi1pbnQgbmd4X3JlYWRfaHR0cF9yZXNwb25zZV9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqcikKLXsKLSAgICBjaGFyICAgYywgY2g7Ci0gICAgY2hhciAgKnA7Ci0gICAgZW51bSAgewotICAgICAgICBzd19zdGFydCA9IDAsCi0gICAgICAgIHN3X2RvbmUKLSAgICB9IHN0YXRlOwotCi0gICAgc3RhdGUgPSByLT5zdGF0ZTsKLSAgICBwID0gci0+aGVhZGVyX2luLT5wb3MubWVtOwotCi0gICAgd2hpbGUgKHAgPCByLT5oZWFkZXJfaW4tPmxhc3QubWVtICYmIHN0YXRlIDwgc3dfZG9uZSkgewotICAgICAgICBjaCA9ICpwKys7Ci0KLS8qCi1wcmludGYoIlxuc3RhdGU6ICVkLCBwb3M6ICV4LCBlbmQ6ICV4LCBjaGFyOiAnJWMnIGJ1ZjogJXMiLAotICAgICAgIHN0YXRlLCBwLCByLT5oZWFkZXJfaW4tPmxhc3QsIGNoLCBwKTsKLSovCi0KLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotCi0gICAgICAgIC8qICJIVFRQLyIgKi8KLSAgICAgICAgY2FzZSBzd19zdGFydDoKLSAgICAgICAgICAgIGlmIChwICsgMyA+PSByLT5oZWFkZXJfaW4tPmxhc3QubWVtKQotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQUdBSU47Ci0KLSAgICAgICAgICAgIGlmIChjaCAhPSAnSCcgfHwgKnAgIT0gJ1QnIHx8ICoocCArIDEpICE9ICdUJyB8fCAqKHAgKyAyKSAhPSAnUCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKihwICsgMykgIT0gJy8nKQotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QQVJTRV9OT19IRUFERVI7Ci0KLSAgICAgICAgICAgIHAgKz0gNDsKLSAgICAgICAgICAgIHN0YXRlID0gc3dfZmlyc3RfbWFqb3JfZGlnaXQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBmaXJzdCBkaWdpdCBvZiBtYWpvciBIVFRQIHZlcnNpb24gKi8KLSAgICAgICAgY2FzZSBzd19maXJzdF9tYWpvcl9kaWdpdDoKLSAgICAgICAgICAgIGlmIChjaCA8ICcxJyB8fCBjaCA+ICc5JykKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUEFSU0VfTk9fSEVBREVSOwotCi0gICAgICAgICAgICBzdGF0ZSA9IHN3X21ham9yX2RpZ2l0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogbWFqb3IgSFRUUCB2ZXJzaW9uIG9yIGRvdCAqLwotICAgICAgICBjYXNlIHN3X21ham9yX2RpZ2l0OgotICAgICAgICAgICAgaWYgKGNoID09ICcuJykgewotICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZmlyc3RfbWlub3JfZGlnaXQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUEFSU0VfTk9fSEVBREVSOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBmaXJzdCBkaWdpdCBvZiBtaW5vciBIVFRQIHZlcnNpb24gKi8KLSAgICAgICAgY2FzZSBzd19maXJzdF9taW5vcl9kaWdpdDoKLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUEFSU0VfTk9fSEVBREVSOwotCi0gICAgICAgICAgICBzdGF0ZSA9IHN3X21pbm9yX2RpZ2l0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogbWlub3IgSFRUUCB2ZXJzaW9uIG9yIGVuZCBvZiByZXF1ZXN0IGxpbmUgKi8KLSAgICAgICAgY2FzZSBzd19taW5vcl9kaWdpdDoKLSAgICAgICAgICAgIGlmIChjaCA9PSAnICcpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2NvZGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUEFSU0VfTk9fSEVBREVSOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCiBpbnQgbmd4X3JlYWRfaHR0cF9oZWFkZXJfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgY2hhciAgIGMsIGNoOwo=