ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IDU1Njc4NGYuLmFmNzdjZWYgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMzksNiArMzksNyBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmtleW1hc3RlckAzLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5rZXltYXN0ZXJANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYm9vdEAxLjAiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3J5cHRvIiwKQEAgLTk1LDYgKzk2LDcgQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJCZW5jaG1hcmsuY3BwIiwKICAgICAgICAgIkNoZWNrRW5jcnlwdGlvbi5jcHAiLAorICAgICAgICAiQ2hlY2twb2ludC5jcHAiLAogICAgICAgICAiRGV2bWFwcGVyLmNwcCIsCiAgICAgICAgICJFbmNyeXB0SW5wbGFjZS5jcHAiLAogICAgICAgICAiRXh0NENyeXB0LmNwcCIsCkBAIC0xMzgsNyArMTQwLDEzIEBACiAgICAgICAgICAgICAgICAgImxpYmFyY29iYnZvbHVtZSIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAorICAgICAgICBkZWJ1Z2dhYmxlOiB7CisgICAgICAgICAgICBjcHBmbGFnczogWyItRF9fQU5EUk9JRF9ERUJVR0dBQkxFX18iXSwKKyAgICAgICAgfSwKICAgICB9LAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC5zdG9yYWdlQDEuMCIsCisgICAgXSwKIH0KIAogY2NfYmluYXJ5IHsKQEAgLTE2OCw2ICsxNzYsMTEgQEAKICAgICAgICAgInZvbGRfcHJlcGFyZV9zdWJkaXJzIiwKICAgICAgICAgIndhaXRfZm9yX2tleW1hc3RlciIsCiAgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC5zdG9yYWdlQDEuMCIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICBdLAogfQogCiBjY19iaW5hcnkgewpkaWZmIC0tZ2l0IGEvQmVuY2htYXJrLmNwcCBiL0JlbmNobWFyay5jcHAKaW5kZXggZGZlMzM2Ni4uYjBhM2I4NSAxMDA2NDQKLS0tIGEvQmVuY2htYXJrLmNwcAorKysgYi9CZW5jaG1hcmsuY3BwCkBAIC0yOCw4ICsyOCw4IEBACiAKICNpbmNsdWRlIDx0aHJlYWQ+CiAKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmc7CkBAIC01MCwxMiArNTAsMTIgQEAKIAogLy8gUkFJSSBjbGFzcyBmb3IgYm9vc3RpbmcgZGV2aWNlIHBlcmZvcm1hbmNlIGR1cmluZyBiZW5jaG1hcmtzLgogY2xhc3MgUGVyZm9ybWFuY2VCb29zdCB7Ci1wcml2YXRlOgorICBwcml2YXRlOgogICAgIGludCBvcmlnX3ByaW87CiAgICAgaW50IG9yaWdfaW9wcmlvOwogICAgIElvU2NoZWRDbGFzcyBvcmlnX2NsYXp6OwogCi1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBQZXJmb3JtYW5jZUJvb3N0KCkgewogICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgIG9yaWdfcHJpbyA9IGdldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCk7CkBAIC04Nyw4ICs4Nyw4IEBACiB9OwogCiBzdGF0aWMgc3RhdHVzX3QgYmVuY2htYXJrSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3RQYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lciwKLSAgICAgICAgYW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlKiBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGUqIGV4dHJhcykgewogICAgIHN0YXR1c190IHJlcyA9IDA7CiAKICAgICBhdXRvIHBhdGggPSByb290UGF0aDsKQEAgLTEzNywxMiArMTM3LDEyIEBACiAgICAgLy8gT25seSBkcm9wIHdoZW4gd2UgaGF2ZW4ndCBhYm9ydGVkCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBhbmRyb2lkOjpiYXNlOjpUaW1lciB0aW1lcjsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJCZWZvcmUgZHJvcF9jYWNoZXMiOworICAgICAgICBMT0coREVCVUcpIDw8ICJCZWZvcmUgZHJvcF9jYWNoZXMiOwogICAgICAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKCIzIiwgIi9wcm9jL3N5cy92bS9kcm9wX2NhY2hlcyIpKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRyb3BfY2FjaGVzIjsKICAgICAgICAgICAgIHJlcyA9IC0xOwogICAgICAgICB9Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQWZ0ZXIgZHJvcF9jYWNoZXMiOworICAgICAgICBMT0coREVCVUcpIDw8ICJBZnRlciBkcm9wX2NhY2hlcyI7CiAgICAgICAgIHN5bmMoKTsKICAgICAgICAgaWYgKHJlcyA9PSBPSykgZXh0cmFzLT5wdXRMb25nKFN0cmluZzE2KCJkcm9wIiksIHRpbWVyLmR1cmF0aW9uKCkuY291bnQoKSk7CiAgICAgfQpAQCAtMTc5LDcgKzE3OSw3IEBACiB9CiAKIHZvaWQgQmVuY2htYXJrKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhrQmVuY2htYXJrTG9jayk7CiAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIGtXYWtlTG9jayk7CiAKZGlmZiAtLWdpdCBhL0JlbmNobWFyay5oIGIvQmVuY2htYXJrLmgKaW5kZXggNGYxOWIwMS4uZDU4ODJjZCAxMDA2NDQKLS0tIGEvQmVuY2htYXJrLmgKKysrIGIvQmVuY2htYXJrLmgKQEAgLTI0LDggKzI0LDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKKy8vIGNsYW5nLWZvcm1hdCBvZmYKIHZvaWQgQmVuY2htYXJrKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisvLyBjbGFuZy1mb3JtYXQgb24KIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9DaGVja3BvaW50LmNwcCBiL0NoZWNrcG9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTc4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9DaGVja3BvaW50LmNwcApAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2hlY2twb2ludCIKKyNpbmNsdWRlICJDaGVja3BvaW50LmgiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYm9vdC8xLjAvSUJvb3RDb250cm9sLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfcmVib290Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJvb3Q6OlYxXzA6OkJvb2xSZXN1bHQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Ym9vdDo6VjFfMDo6SUJvb3RDb250cm9sOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJvb3Q6OlYxXzA6OlNsb3Q7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB2b2xkIHsKKworbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtNZXRhZGF0YUNQRmlsZSA9ICIvbWV0YWRhdGEvdm9sZC9jaGVja3BvaW50IjsKKworYm9vbCBzZXRCb3dTdGF0ZShzdGQ6OnN0cmluZyBjb25zdCYgYmxvY2tfZGV2aWNlLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RhdGUpIHsKKyAgICBpZiAoYmxvY2tfZGV2aWNlLnN1YnN0cigwLCA1KSAhPSAiL2Rldi8iKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkV4cGVjdGVkIGJsb2NrIGRldmljZSwgZ290ICIgPDwgYmxvY2tfZGV2aWNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc3RhdGVfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZygiL3N5cy8iKSArIGJsb2NrX2RldmljZS5zdWJzdHIoNSkgKyAiL2Jvdy9zdGF0ZSI7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZShzdGF0ZSwgc3RhdGVfZmlsZW5hbWUpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd3JpdGUgdG8gZmlsZSAiIDw8IHN0YXRlX2ZpbGVuYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTdGF0dXMgY3Bfc3RhcnRDaGVja3BvaW50KGludCByZXRyeSkgeworICAgIGlmIChyZXRyeSA8IC0xKSByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJSZXRyeSBjb3VudCBtdXN0IGJlIG1vcmUgdGhhbiAtMSIpOworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQgPSBzdGQ6OnRvX3N0cmluZyhyZXRyeSArIDEpOworICAgIGlmIChyZXRyeSA9PSAtMSkgeworICAgICAgICBzcDxJQm9vdENvbnRyb2w+IG1vZHVsZSA9IElCb290Q29udHJvbDo6Z2V0U2VydmljZSgpOworICAgICAgICBpZiAobW9kdWxlKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICBhdXRvIGNiID0gWyZzdWZmaXhdKGhpZGxfc3RyaW5nIHMpIHsgc3VmZml4ID0gczsgfTsKKyAgICAgICAgICAgIGlmIChtb2R1bGUtPmdldFN1ZmZpeChtb2R1bGUtPmdldEN1cnJlbnRTbG90KCksIGNiKS5pc09rKCkpIGNvbnRlbnQgKz0gIiAiICsgc3VmZml4OworICAgICAgICB9CisgICAgfQorICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUoY29udGVudCwga01ldGFkYXRhQ1BGaWxlKSkKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoZXJybm8sICJGYWlsZWQgdG8gd3JpdGUgY2hlY2twb2ludCBmaWxlIik7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIGNwX2NvbW1pdENoYW5nZXMoKSB7CisgICAgLy8gTXVzdCB0YWtlIGFjdGlvbiBmb3IgbGlzdCBvZiBtb3VudGVkIGNoZWNrcG9pbnRlZCB0aGluZ3MgaGVyZQorICAgIC8vIFRvIGRvIHRoaXMsIHdlIHdhbGsgdGhlIGxpc3Qgb2YgbW91bnRlZCBmaWxlIHN5c3RlbXMuCisgICAgLy8gQnV0IHdlIGFsc28gbmVlZCB0byBnZXQgdGhlIG1hdGNoaW5nIGZzdGFiIGVudHJpZXMgdG8gc2VlCisgICAgLy8gdGhlIG9yaWdpbmFsIGZsYWdzCisgICAgc3RkOjpzdHJpbmcgZXJyX3N0cjsKKyAgICBhdXRvIGZzdGFiX2RlZmF1bHQgPSBzdGQ6OnVuaXF1ZV9wdHI8ZnN0YWIsIGRlY2x0eXBlKCZmc19tZ3JfZnJlZV9mc3RhYik+eworICAgICAgICBmc19tZ3JfcmVhZF9mc3RhYl9kZWZhdWx0KCksIGZzX21ncl9mcmVlX2ZzdGFifTsKKyAgICBpZiAoIWZzdGFiX2RlZmF1bHQpIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKEVJTlZBTCwgIkZhaWxlZCB0byBnZXQgZnN0YWIiKTsKKworICAgIGF1dG8gbW91bnRzID0gc3RkOjp1bmlxdWVfcHRyPGZzdGFiLCBkZWNsdHlwZSgmZnNfbWdyX2ZyZWVfZnN0YWIpPnsKKyAgICAgICAgZnNfbWdyX3JlYWRfZnN0YWIoIi9wcm9jL21vdW50cyIpLCBmc19tZ3JfZnJlZV9mc3RhYn07CisgICAgaWYgKCFtb3VudHMpIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKEVJTlZBTCwgIkZhaWxlZCB0byBnZXQgL3Byb2MvbW91bnRzIik7CisKKyAgICAvLyBXYWxrIG1vdW50ZWQgZmlsZSBzeXN0ZW1zCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb3VudHMtPm51bV9lbnRyaWVzOyArK2kpIHsKKyAgICAgICAgY29uc3QgZnN0YWJfcmVjKiBtb3VudF9yZWMgPSAmbW91bnRzLT5yZWNzW2ldOworICAgICAgICBjb25zdCBmc3RhYl9yZWMqIGZzdGFiX3JlYyA9CisgICAgICAgICAgICBmc19tZ3JfZ2V0X2VudHJ5X2Zvcl9tb3VudF9wb2ludChmc3RhYl9kZWZhdWx0LmdldCgpLCBtb3VudF9yZWMtPm1vdW50X3BvaW50KTsKKyAgICAgICAgaWYgKCFmc3RhYl9yZWMpIGNvbnRpbnVlOworCisgICAgICAgIGlmIChmc19tZ3JfaXNfY2hlY2twb2ludF9mcyhmc3RhYl9yZWMpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChmc3RhYl9yZWMtPmZzX3R5cGUsICJmMmZzIikpIHsKKyAgICAgICAgICAgICAgICBtb3VudChtb3VudF9yZWMtPmJsa19kZXZpY2UsIG1vdW50X3JlYy0+bW91bnRfcG9pbnQsICJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICBNU19SRU1PVU5UIHwgZnN0YWJfcmVjLT5mbGFncywgImNoZWNrcG9pbnQ9ZW5hYmxlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZnNfbWdyX2lzX2NoZWNrcG9pbnRfYmxrKGZzdGFiX3JlYykpIHsKKyAgICAgICAgICAgIHNldEJvd1N0YXRlKG1vdW50X3JlYy0+YmxrX2RldmljZSwgIjIiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYW5kcm9pZDo6YmFzZTo6UmVtb3ZlRmlsZUlmRXhpc3RzKGtNZXRhZGF0YUNQRmlsZSwgJmVycl9zdHIpKQorICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShlcnJubywgZXJyX3N0ci5jX3N0cigpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgY3BfYWJvcnRDaGFuZ2VzKCkgeworICAgIGFuZHJvaWRfcmVib290KEFORFJPSURfUkJfUkVTVEFSVDIsIDAsIG51bGxwdHIpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK2Jvb2wgY3BfbmVlZHNSb2xsYmFjaygpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIGJvb2wgcmV0OworCisgICAgcmV0ID0gYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrTWV0YWRhdGFDUEZpbGUsICZjb250ZW50KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGlmIChjb250ZW50ID09ICIwIikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChjb250ZW50LnN1YnN0cigwLCAzKSA9PSAiLTEgIikgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2xkU3VmZml4ID0gY29udGVudC5zdWJzdHIoMyk7CisgICAgICAgICAgICBzcDxJQm9vdENvbnRyb2w+IG1vZHVsZSA9IElCb290Q29udHJvbDo6Z2V0U2VydmljZSgpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3U3VmZml4OworCisgICAgICAgICAgICBpZiAobW9kdWxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBjYiA9IFsmbmV3U3VmZml4XShoaWRsX3N0cmluZyBzKSB7IG5ld1N1ZmZpeCA9IHM7IH07CisgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXRTdWZmaXgobW9kdWxlLT5nZXRDdXJyZW50U2xvdCgpLCBjYik7CisgICAgICAgICAgICAgICAgaWYgKG9sZFN1ZmZpeCA9PSBuZXdTdWZmaXgpIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBjcF9uZWVkc0NoZWNrcG9pbnQoKSB7CisgICAgYm9vbCByZXQ7CisgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICBzcDxJQm9vdENvbnRyb2w+IG1vZHVsZSA9IElCb290Q29udHJvbDo6Z2V0U2VydmljZSgpOworCisgICAgaWYgKG1vZHVsZSAmJiBtb2R1bGUtPmlzU2xvdE1hcmtlZFN1Y2Nlc3NmdWwobW9kdWxlLT5nZXRDdXJyZW50U2xvdCgpKSA9PSBCb29sUmVzdWx0OjpGQUxTRSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0ID0gYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrTWV0YWRhdGFDUEZpbGUsICZjb250ZW50KTsKKyAgICBpZiAocmV0KSByZXR1cm4gY29udGVudCAhPSAiMCI7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdGF0dXMgY3BfcHJlcGFyZUNoZWNrcG9pbnQoKSB7CisgICAgYXV0byBmc3RhYl9kZWZhdWx0ID0gc3RkOjp1bmlxdWVfcHRyPGZzdGFiLCBkZWNsdHlwZSgmZnNfbWdyX2ZyZWVfZnN0YWIpPnsKKyAgICAgICAgZnNfbWdyX3JlYWRfZnN0YWJfZGVmYXVsdCgpLCBmc19tZ3JfZnJlZV9mc3RhYn07CisgICAgaWYgKCFmc3RhYl9kZWZhdWx0KSByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJGYWlsZWQgdG8gZ2V0IGZzdGFiIik7CisKKyAgICBhdXRvIG1vdW50cyA9IHN0ZDo6dW5pcXVlX3B0cjxmc3RhYiwgZGVjbHR5cGUoJmZzX21ncl9mcmVlX2ZzdGFiKT57CisgICAgICAgIGZzX21ncl9yZWFkX2ZzdGFiKCIvcHJvYy9tb3VudHMiKSwgZnNfbWdyX2ZyZWVfZnN0YWJ9OworICAgIGlmICghbW91bnRzKSByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJGYWlsZWQgdG8gZ2V0IC9wcm9jL21vdW50cyIpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb3VudHMtPm51bV9lbnRyaWVzOyArK2kpIHsKKyAgICAgICAgY29uc3QgZnN0YWJfcmVjKiBtb3VudF9yZWMgPSAmbW91bnRzLT5yZWNzW2ldOworICAgICAgICBjb25zdCBmc3RhYl9yZWMqIGZzdGFiX3JlYyA9CisgICAgICAgICAgICBmc19tZ3JfZ2V0X2VudHJ5X2Zvcl9tb3VudF9wb2ludChmc3RhYl9kZWZhdWx0LmdldCgpLCBtb3VudF9yZWMtPm1vdW50X3BvaW50KTsKKyAgICAgICAgaWYgKCFmc3RhYl9yZWMpIGNvbnRpbnVlOworCisgICAgICAgIGlmIChmc19tZ3JfaXNfY2hlY2twb2ludF9ibGsoZnN0YWJfcmVjKSkgeworICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKAorICAgICAgICAgICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKG1vdW50X3JlYy0+bW91bnRfcG9pbnQsIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkpOworICAgICAgICAgICAgaWYgKCFmZCkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBtb3VudCBwb2ludCIgPDwgbW91bnRfcmVjLT5tb3VudF9wb2ludDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RydWN0IGZzdHJpbV9yYW5nZSByYW5nZSA9IHt9OworICAgICAgICAgICAgcmFuZ2UubGVuID0gVUxMT05HX01BWDsKKyAgICAgICAgICAgIGlmIChpb2N0bChmZCwgRklUUklNLCAmcmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB0cmltICIgPDwgbW91bnRfcmVjLT5tb3VudF9wb2ludDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0Qm93U3RhdGUobW91bnRfcmVjLT5ibGtfZGV2aWNlLCAiMSIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK25hbWVzcGFjZSB7Citjb25zdCBpbnQga0Jsb2NrU2l6ZSA9IDQwOTY7Citjb25zdCBpbnQga1NlY3RvclNpemUgPSA1MTI7CisKK3R5cGVkZWYgdWludDY0X3Qgc2VjdG9yX3Q7CisKK3N0cnVjdCBsb2dfZW50cnkgeworICAgIHNlY3Rvcl90IHNvdXJjZTsKKyAgICBzZWN0b3JfdCBkZXN0OworICAgIHVpbnQzMl90IHNpemU7CisgICAgdWludDMyX3QgY2hlY2tzdW07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbG9nX3NlY3RvciB7CisgICAgdWludDMyX3QgbWFnaWM7CisgICAgdWludDMyX3QgY291bnQ7CisgICAgdWludDMyX3Qgc2VxdWVuY2U7CisgICAgc3RydWN0IGxvZ19lbnRyeSBlbnRyaWVzW107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyBNQUdJQyBpcyBCT1cgaW4gYXNjaWkKK2NvbnN0IGludCBrTWFnaWMgPSAweDAwNTc0ZjQyOworCit2b2lkIGNyYzMyKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBuX2J5dGVzLCB1aW50MzJfdCogY3JjKSB7CisgICAgc3RhdGljIHVpbnQzMl90IHRhYmxlWzB4MTAwXSA9IHsKKyAgICAgICAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhFRTBFNjEyQywgMHg5OTA5NTFCQSwgMHgwNzZEQzQxOSwgMHg3MDZBRjQ4RiwgMHhFOTYzQTUzNSwKKyAgICAgICAgMHg5RTY0OTVBMywgMHgwRURCODgzMiwgMHg3OURDQjhBNCwgMHhFMEQ1RTkxRSwgMHg5N0QyRDk4OCwgMHgwOUI2NEMyQiwgMHg3RUIxN0NCRCwKKyAgICAgICAgMHhFN0I4MkQwNywgMHg5MEJGMUQ5MSwgMHgxREI3MTA2NCwgMHg2QUIwMjBGMiwgMHhGM0I5NzE0OCwgMHg4NEJFNDFERSwgMHgxQURBRDQ3RCwKKyAgICAgICAgMHg2RERERTRFQiwgMHhGNEQ0QjU1MSwgMHg4M0QzODVDNywgMHgxMzZDOTg1NiwgMHg2NDZCQThDMCwgMHhGRDYyRjk3QSwgMHg4QTY1QzlFQywKKyAgICAgICAgMHgxNDAxNUM0RiwgMHg2MzA2NkNEOSwgMHhGQTBGM0Q2MywgMHg4RDA4MERGNSwgMHgzQjZFMjBDOCwgMHg0QzY5MTA1RSwgMHhENTYwNDFFNCwKKyAgICAgICAgMHhBMjY3NzE3MiwgMHgzQzAzRTREMSwgMHg0QjA0RDQ0NywgMHhEMjBEODVGRCwgMHhBNTBBQjU2QiwgMHgzNUI1QThGQSwgMHg0MkIyOTg2QywKKyAgICAgICAgMHhEQkJCQzlENiwgMHhBQ0JDRjk0MCwgMHgzMkQ4NkNFMywgMHg0NURGNUM3NSwgMHhEQ0Q2MERDRiwgMHhBQkQxM0Q1OSwgMHgyNkQ5MzBBQywKKyAgICAgICAgMHg1MURFMDAzQSwgMHhDOEQ3NTE4MCwgMHhCRkQwNjExNiwgMHgyMUI0RjRCNSwgMHg1NkIzQzQyMywgMHhDRkJBOTU5OSwgMHhCOEJEQTUwRiwKKyAgICAgICAgMHgyODAyQjg5RSwgMHg1RjA1ODgwOCwgMHhDNjBDRDlCMiwgMHhCMTBCRTkyNCwgMHgyRjZGN0M4NywgMHg1ODY4NEMxMSwgMHhDMTYxMURBQiwKKyAgICAgICAgMHhCNjY2MkQzRCwKKworICAgICAgICAweDc2REM0MTkwLCAweDAxREI3MTA2LCAweDk4RDIyMEJDLCAweEVGRDUxMDJBLCAweDcxQjE4NTg5LCAweDA2QjZCNTFGLCAweDlGQkZFNEE1LAorICAgICAgICAweEU4QjhENDMzLCAweDc4MDdDOUEyLCAweDBGMDBGOTM0LCAweDk2MDlBODhFLCAweEUxMEU5ODE4LCAweDdGNkEwREJCLCAweDA4NkQzRDJELAorICAgICAgICAweDkxNjQ2Qzk3LCAweEU2NjM1QzAxLCAweDZCNkI1MUY0LCAweDFDNkM2MTYyLCAweDg1NjUzMEQ4LCAweEYyNjIwMDRFLCAweDZDMDY5NUVELAorICAgICAgICAweDFCMDFBNTdCLCAweDgyMDhGNEMxLCAweEY1MEZDNDU3LCAweDY1QjBEOUM2LCAweDEyQjdFOTUwLCAweDhCQkVCOEVBLCAweEZDQjk4ODdDLAorICAgICAgICAweDYyREQxRERGLCAweDE1REEyRDQ5LCAweDhDRDM3Q0YzLCAweEZCRDQ0QzY1LCAweDREQjI2MTU4LCAweDNBQjU1MUNFLCAweEEzQkMwMDc0LAorICAgICAgICAweEQ0QkIzMEUyLCAweDRBREZBNTQxLCAweDNERDg5NUQ3LCAweEE0RDFDNDZELCAweEQzRDZGNEZCLCAweDQzNjlFOTZBLCAweDM0NkVEOUZDLAorICAgICAgICAweEFENjc4ODQ2LCAweERBNjBCOEQwLCAweDQ0MDQyRDczLCAweDMzMDMxREU1LCAweEFBMEE0QzVGLCAweEREMEQ3Q0M5LCAweDUwMDU3MTNDLAorICAgICAgICAweDI3MDI0MUFBLCAweEJFMEIxMDEwLCAweEM5MEMyMDg2LCAweDU3NjhCNTI1LCAweDIwNkY4NUIzLCAweEI5NjZENDA5LCAweENFNjFFNDlGLAorICAgICAgICAweDVFREVGOTBFLCAweDI5RDlDOTk4LCAweEIwRDA5ODIyLCAweEM3RDdBOEI0LCAweDU5QjMzRDE3LCAweDJFQjQwRDgxLCAweEI3QkQ1QzNCLAorICAgICAgICAweEMwQkE2Q0FELAorCisgICAgICAgIDB4RURCODgzMjAsIDB4OUFCRkIzQjYsIDB4MDNCNkUyMEMsIDB4NzRCMUQyOUEsIDB4RUFENTQ3MzksIDB4OUREMjc3QUYsIDB4MDREQjI2MTUsCisgICAgICAgIDB4NzNEQzE2ODMsIDB4RTM2MzBCMTIsIDB4OTQ2NDNCODQsIDB4MEQ2RDZBM0UsIDB4N0E2QTVBQTgsIDB4RTQwRUNGMEIsIDB4OTMwOUZGOUQsCisgICAgICAgIDB4MEEwMEFFMjcsIDB4N0QwNzlFQjEsIDB4RjAwRjkzNDQsIDB4ODcwOEEzRDIsIDB4MUUwMUYyNjgsIDB4NjkwNkMyRkUsIDB4Rjc2MjU3NUQsCisgICAgICAgIDB4ODA2NTY3Q0IsIDB4MTk2QzM2NzEsIDB4NkU2QjA2RTcsIDB4RkVENDFCNzYsIDB4ODlEMzJCRTAsIDB4MTBEQTdBNUEsIDB4NjdERDRBQ0MsCisgICAgICAgIDB4RjlCOURGNkYsIDB4OEVCRUVGRjksIDB4MTdCN0JFNDMsIDB4NjBCMDhFRDUsIDB4RDZENkEzRTgsIDB4QTFEMTkzN0UsIDB4MzhEOEMyQzQsCisgICAgICAgIDB4NEZERkYyNTIsIDB4RDFCQjY3RjEsIDB4QTZCQzU3NjcsIDB4M0ZCNTA2REQsIDB4NDhCMjM2NEIsIDB4RDgwRDJCREEsIDB4QUYwQTFCNEMsCisgICAgICAgIDB4MzYwMzRBRjYsIDB4NDEwNDdBNjAsIDB4REY2MEVGQzMsIDB4QTg2N0RGNTUsIDB4MzE2RThFRUYsIDB4NDY2OUJFNzksIDB4Q0I2MUIzOEMsCisgICAgICAgIDB4QkM2NjgzMUEsIDB4MjU2RkQyQTAsIDB4NTI2OEUyMzYsIDB4Q0MwQzc3OTUsIDB4QkIwQjQ3MDMsIDB4MjIwMjE2QjksIDB4NTUwNTI2MkYsCisgICAgICAgIDB4QzVCQTNCQkUsIDB4QjJCRDBCMjgsIDB4MkJCNDVBOTIsIDB4NUNCMzZBMDQsIDB4QzJEN0ZGQTcsIDB4QjVEMENGMzEsIDB4MkNEOTlFOEIsCisgICAgICAgIDB4NUJERUFFMUQsCisKKyAgICAgICAgMHg5QjY0QzJCMCwgMHhFQzYzRjIyNiwgMHg3NTZBQTM5QywgMHgwMjZEOTMwQSwgMHg5QzA5MDZBOSwgMHhFQjBFMzYzRiwgMHg3MjA3Njc4NSwKKyAgICAgICAgMHgwNTAwNTcxMywgMHg5NUJGNEE4MiwgMHhFMkI4N0ExNCwgMHg3QkIxMkJBRSwgMHgwQ0I2MUIzOCwgMHg5MkQyOEU5QiwgMHhFNUQ1QkUwRCwKKyAgICAgICAgMHg3Q0RDRUZCNywgMHgwQkRCREYyMSwgMHg4NkQzRDJENCwgMHhGMUQ0RTI0MiwgMHg2OEREQjNGOCwgMHgxRkRBODM2RSwgMHg4MUJFMTZDRCwKKyAgICAgICAgMHhGNkI5MjY1QiwgMHg2RkIwNzdFMSwgMHgxOEI3NDc3NywgMHg4ODA4NUFFNiwgMHhGRjBGNkE3MCwgMHg2NjA2M0JDQSwgMHgxMTAxMEI1QywKKyAgICAgICAgMHg4RjY1OUVGRiwgMHhGODYyQUU2OSwgMHg2MTZCRkZEMywgMHgxNjZDQ0Y0NSwgMHhBMDBBRTI3OCwgMHhENzBERDJFRSwgMHg0RTA0ODM1NCwKKyAgICAgICAgMHgzOTAzQjNDMiwgMHhBNzY3MjY2MSwgMHhEMDYwMTZGNywgMHg0OTY5NDc0RCwgMHgzRTZFNzdEQiwgMHhBRUQxNkE0QSwgMHhEOUQ2NUFEQywKKyAgICAgICAgMHg0MERGMEI2NiwgMHgzN0Q4M0JGMCwgMHhBOUJDQUU1MywgMHhERUJCOUVDNSwgMHg0N0IyQ0Y3RiwgMHgzMEI1RkZFOSwgMHhCREJERjIxQywKKyAgICAgICAgMHhDQUJBQzI4QSwgMHg1M0IzOTMzMCwgMHgyNEI0QTNBNiwgMHhCQUQwMzYwNSwgMHhDREQ3MDY5MywgMHg1NERFNTcyOSwgMHgyM0Q5NjdCRiwKKyAgICAgICAgMHhCMzY2N0EyRSwgMHhDNDYxNEFCOCwgMHg1RDY4MUIwMiwgMHgyQTZGMkI5NCwgMHhCNDBCQkUzNywgMHhDMzBDOEVBMSwgMHg1QTA1REYxQiwKKyAgICAgICAgMHgyRDAyRUY4RH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5fYnl0ZXM7ICsraSkgeworICAgICAgICAqY3JjIF49ICgodWludDhfdCopZGF0YSlbaV07CisgICAgICAgICpjcmMgPSB0YWJsZVsodWludDhfdCkqY3JjXSBeICpjcmMgPj4gODsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTdGF0dXMgY3BfcmVzdG9yZUNoZWNrcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGJsb2NrRGV2aWNlKSB7CisgICAgTE9HKElORk8pIDw8ICJSZXN0b3JpbmcgY2hlY2twb2ludCBvbiAiIDw8IGJsb2NrRGV2aWNlOworICAgIHN0ZDo6ZnN0cmVhbSBkZXZpY2UoYmxvY2tEZXZpY2UsIHN0ZDo6aW9zOjpiaW5hcnkgfCBzdGQ6Omlvczo6aW4gfCBzdGQ6Omlvczo6b3V0KTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG9wZW4gIiA8PCBibG9ja0RldmljZTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoZXJybm8sICgiQ2Fubm90IG9wZW4gIiArIGJsb2NrRGV2aWNlKS5jX3N0cigpKTsKKyAgICB9CisgICAgY2hhciBidWZmZXJba0Jsb2NrU2l6ZV07CisgICAgZGV2aWNlLnJlYWQoYnVmZmVyLCBrQmxvY2tTaXplKTsKKyAgICBsb2dfc2VjdG9yJiBscyA9ICoobG9nX3NlY3RvciopYnVmZmVyOworICAgIGlmIChscy5tYWdpYyAhPSBrTWFnaWMpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gbWFnaWMiOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJObyBtYWdpYyIpOworICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAiUmVzdG9yaW5nICIgPDwgbHMuc2VxdWVuY2UgPDwgIiBsb2cgc2VjdG9ycyI7CisKKyAgICBmb3IgKGludCBzZXF1ZW5jZSA9IGxzLnNlcXVlbmNlOyBzZXF1ZW5jZSA+PSAwOyBzZXF1ZW5jZS0tKSB7CisgICAgICAgIGNoYXIgYnVmZmVyW2tCbG9ja1NpemVdOworICAgICAgICBkZXZpY2Uuc2Vla2coMCk7CisgICAgICAgIGRldmljZS5yZWFkKGJ1ZmZlciwga0Jsb2NrU2l6ZSk7CisgICAgICAgIGxvZ19zZWN0b3ImIGxzID0gKihsb2dfc2VjdG9yKilidWZmZXI7CisgICAgICAgIGlmIChscy5tYWdpYyAhPSBrTWFnaWMpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1hZ2ljISI7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJObyBtYWdpYyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChpbnQpbHMuc2VxdWVuY2UgIT0gc2VxdWVuY2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkV4cGVjdGluZyBsb2cgc2VjdG9yICIgPDwgc2VxdWVuY2UgPDwgIiBidXQgZ290ICIgPDwgbHMuc2VxdWVuY2U7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSgKKyAgICAgICAgICAgICAgICBFSU5WQUwsICgiRXhwZWN0aW5nIGxvZyBzZWN0b3IgIiArIHN0ZDo6dG9fc3RyaW5nKHNlcXVlbmNlKSArICIgYnV0IGdvdCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhscy5zZXF1ZW5jZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgTE9HKElORk8pIDw8ICJSZXN0b3JpbmcgZnJvbSBsb2cgc2VjdG9yICIgPDwgbHMuc2VxdWVuY2U7CisKKyAgICAgICAgZm9yIChsb2dfZW50cnkqIGxlID0gJmxzLmVudHJpZXNbbHMuY291bnQgLSAxXTsgbGUgPj0gbHMuZW50cmllczsgLS1sZSkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJSZXN0b3JpbmcgIiA8PCBsZS0+c2l6ZSA8PCAiIGJ5dGVzIGZyb20gc2VjdG9yICIgPDwgbGUtPmRlc3QgPDwgIiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgbGUtPnNvdXJjZSA8PCAiIHdpdGggY2hlY2tzdW0gIiA8PCBzdGQ6OmhleCA8PCBsZS0+Y2hlY2tzdW07CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWZmZXIobGUtPnNpemUpOworICAgICAgICAgICAgZGV2aWNlLnNlZWtnKGxlLT5kZXN0ICoga1NlY3RvclNpemUpOworICAgICAgICAgICAgZGV2aWNlLnJlYWQoJmJ1ZmZlclswXSwgbGUtPnNpemUpOworCisgICAgICAgICAgICB1aW50MzJfdCBjaGVja3N1bSA9IGxlLT5zb3VyY2UgLyAoa0Jsb2NrU2l6ZSAvIGtTZWN0b3JTaXplKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGUtPnNpemU7IGkgKz0ga0Jsb2NrU2l6ZSkgeworICAgICAgICAgICAgICAgIGNyYzMyKCZidWZmZXJbaV0sIGtCbG9ja1NpemUsICZjaGVja3N1bSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZS0+Y2hlY2tzdW0gJiYgY2hlY2tzdW0gIT0gbGUtPmNoZWNrc3VtKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2hlY2tzdW1zIGRvbid0IG1hdGNoICIgPDwgc3RkOjpoZXggPDwgY2hlY2tzdW07CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiQ2hlY2tzdW1zIGRvbid0IG1hdGNoIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRldmljZS5zZWVrZyhsZS0+c291cmNlICoga1NlY3RvclNpemUpOworICAgICAgICAgICAgZGV2aWNlLndyaXRlKCZidWZmZXJbMF0sIGxlLT5zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBjcF9tYXJrQm9vdEF0dGVtcHQoKSB7CisgICAgc3RkOjpzdHJpbmcgb2xkQ29udGVudCwgbmV3Q29udGVudDsKKyAgICBpbnQgcmV0cnkgPSAwOworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIGludCByZXN1bHQgPSBzdGF0KGtNZXRhZGF0YUNQRmlsZS5jX3N0cigpLCAmc3QpOworCisgICAgLy8gSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgd2UgYXJlbid0IG1hbmFnaW5nIGEgY2hlY2twb2ludCByZXRyeSBjb3VudGVyCisgICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrTWV0YWRhdGFDUEZpbGUsICZvbGRDb250ZW50KSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgY2hlY2twb2ludCBmaWxlIjsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoZXJybm8sICJGYWlsZWQgdG8gcmVhZCBjaGVja3BvaW50IGZpbGUiKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmV0cnlDb250ZW50ID0gb2xkQ29udGVudC5zdWJzdHIoMCwgb2xkQ29udGVudC5maW5kX2ZpcnN0X29mKCIgIikpOworCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludChyZXRyeUNvbnRlbnQsICZyZXRyeSkpCisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKEVJTlZBTCwgIkNvdWxkIG5vdCBwYXJzZSByZXRyeSBjb3VudCIpOworICAgIGlmIChyZXRyeSA+IDApIHsKKyAgICAgICAgcmV0cnktLTsKKworICAgICAgICBuZXdDb250ZW50ID0gc3RkOjp0b19zdHJpbmcocmV0cnkpOworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKG5ld0NvbnRlbnQsIGtNZXRhZGF0YUNQRmlsZSkpCisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShlcnJubywgIkNvdWxkIG5vdCB3cml0ZSBjaGVja3BvaW50IGZpbGUiKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHZvbGQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9DaGVja3BvaW50LmggYi9DaGVja3BvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjMmY5NAotLS0gL2Rldi9udWxsCisrKyBiL0NoZWNrcG9pbnQuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ0hFQ0tQT0lOVF9ICisjZGVmaW5lIF9DSEVDS1BPSU5UX0gKKworI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB2b2xkIHsKKworYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgY3Bfc3RhcnRDaGVja3BvaW50KGludCByZXRyeSk7CisKK2FuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGNwX2NvbW1pdENoYW5nZXMoKTsKKworYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgY3BfYWJvcnRDaGFuZ2VzKCk7CisKK2Jvb2wgY3BfbmVlZHNSb2xsYmFjaygpOworCitib29sIGNwX25lZWRzQ2hlY2twb2ludCgpOworCithbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBjcF9wcmVwYXJlQ2hlY2twb2ludCgpOworCithbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBjcF9yZXN0b3JlQ2hlY2twb2ludChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQb2ludCk7CisKK2FuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGNwX21hcmtCb290QXR0ZW1wdCgpOworCit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9EZXZtYXBwZXIuY3BwIGIvRGV2bWFwcGVyLmNwcAppbmRleCAyNTEwNzcxLi5iNDI0NjdjIDEwMDY0NAotLS0gYS9EZXZtYXBwZXIuY3BwCisrKyBiL0Rldm1hcHBlci5jcHAKQEAgLTE2LDIzICsxNiwyMiBAQAogCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19QQUNLQUdFX01BTkFHRVIKIAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiAjaW5jbHVkZSAiRGV2bWFwcGVyLmgiCkBAIC00Myw4ICs0Miw3IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrVm9sZFByZWZpeCA9ICJ2b2xkOiI7CiAKLXZvaWQgRGV2bWFwcGVyOjppb2N0bEluaXQoc3RydWN0IGRtX2lvY3RsICppbywgc2l6ZV90IGRhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBmbGFncykgewordm9pZCBEZXZtYXBwZXI6OmlvY3RsSW5pdChzdHJ1Y3QgZG1faW9jdGwqIGlvLCBzaXplX3QgZGF0YVNpemUsIGNvbnN0IGNoYXIqIG5hbWUsIHVuc2lnbmVkIGZsYWdzKSB7CiAgICAgbWVtc2V0KGlvLCAwLCBkYXRhU2l6ZSk7CiAgICAgaW8tPmRhdGFfc2l6ZSA9IGRhdGFTaXplOwogICAgIGlvLT5kYXRhX3N0YXJ0ID0gc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CkBAIC01NCwxNyArNTIsMTYgQEAKICAgICBpby0+ZmxhZ3MgPSBmbGFnczsKICAgICBpZiAobmFtZSkgewogICAgICAgICBzaXplX3QgcmV0ID0gc3RybGNweShpby0+bmFtZSwgbmFtZSwgc2l6ZW9mKGlvLT5uYW1lKSk7Ci0gICAgICAgIGlmIChyZXQgPj0gc2l6ZW9mKGlvLT5uYW1lKSkKLSAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIGlmIChyZXQgPj0gc2l6ZW9mKGlvLT5uYW1lKSkgYWJvcnQoKTsKICAgICB9CiB9CiAKLWludCBEZXZtYXBwZXI6OmNyZWF0ZShjb25zdCBjaGFyICpuYW1lX3JhdywgY29uc3QgY2hhciAqbG9vcEZpbGUsIGNvbnN0IGNoYXIgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNoYXIgKnVidWZmZXIsIHNpemVfdCBsZW4pIHsKK2ludCBEZXZtYXBwZXI6OmNyZWF0ZShjb25zdCBjaGFyKiBuYW1lX3JhdywgY29uc3QgY2hhciogbG9vcEZpbGUsIGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNoYXIqIHVidWZmZXIsIHNpemVfdCBsZW4pIHsKICAgICBhdXRvIG5hbWVfc3RyaW5nID0gU3RyaW5nUHJpbnRmKCIlcyVzIiwga1ZvbGRQcmVmaXgsIG5hbWVfcmF3KTsKICAgICBjb25zdCBjaGFyKiBuYW1lID0gbmFtZV9zdHJpbmcuY19zdHIoKTsKIAotICAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyICopIG1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOworICAgIGNoYXIqIGJ1ZmZlciA9IChjaGFyKiltYWxsb2MoREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKICAgICBpZiAoIWJ1ZmZlcikgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIG1hbGxvYyI7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTc3LDggKzc0LDggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHN0cnVjdCBkbV9pb2N0bCAqaW8gPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjsKLSAKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOworCiAgICAgLy8gQ3JlYXRlIHRoZSBETSBkZXZpY2UKICAgICBpb2N0bEluaXQoaW8sIERFVk1BUFBFUl9CVUZGRVJfU0laRSwgbmFtZSwgMCk7CiAKQEAgLTkyLDExICs4OSwxMSBAQAogICAgIC8vIFNldCB0aGUgbGVnYWN5IGdlb21ldHJ5CiAgICAgaW9jdGxJbml0KGlvLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUsIG5hbWUsIDApOwogCi0gICAgY2hhciAqZ2VvUGFyYW1zID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CisgICAgY2hhciogZ2VvUGFyYW1zID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CiAgICAgLy8gYnBzPTUxMiBzcGM9OCByZXM9MzIgbmZ0PTIgc2VjPTgxOTAgbWlkPTB4ZjAgc3B0PTYzIGhkcz02NCBoaWQ9MCBic3BmPTggcmRjbD0yIGluZnM9MSBia2JzPTIKICAgICBzdHJsY3B5KGdlb1BhcmFtcywgIjAgNjQgNjMgMCIsIERFVk1BUFBFUl9CVUZGRVJfU0laRSAtIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpKTsKICAgICBnZW9QYXJhbXMgKz0gc3RybGVuKGdlb1BhcmFtcykgKyAxOwotICAgIGdlb1BhcmFtcyA9IChjaGFyICopIF9hbGlnbihnZW9QYXJhbXMsIDgpOworICAgIGdlb1BhcmFtcyA9IChjaGFyKilfYWxpZ24oZ2VvUGFyYW1zLCA4KTsKICAgICBpZiAoaW9jdGwoZmQsIERNX0RFVl9TRVRfR0VPTUVUUlksIGlvKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIERNX0RFVl9TRVRfR0VPTUVUUlkiOwogICAgICAgICBmcmVlKGJ1ZmZlcik7CkBAIC0xMTcsOCArMTE0LDggQEAKICAgICBzbnByaW50Zih1YnVmZmVyLCBsZW4sICIvZGV2L2Jsb2NrL2RtLSV1IiwgbWlub3IpOwogCiAgICAgLy8gTG9hZCB0aGUgdGFibGUKLSAgICBzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKnRndDsKLSAgICB0Z3QgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjICopICZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOworICAgIHN0cnVjdCBkbV90YXJnZXRfc3BlYyogdGd0OworICAgIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMqKSZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOwogCiAgICAgaW9jdGxJbml0KGlvLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUsIG5hbWUsIERNX1NUQVRVU19UQUJMRV9GTEFHKTsKICAgICBpby0+dGFyZ2V0X2NvdW50ID0gMTsKQEAgLTEyOSwxMiArMTI2LDEyIEBACiAKICAgICBzdHJsY3B5KHRndC0+dGFyZ2V0X3R5cGUsICJjcnlwdCIsIHNpemVvZih0Z3QtPnRhcmdldF90eXBlKSk7CiAKLSAgICBjaGFyICpjcnlwdFBhcmFtcyA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7CisgICAgY2hhciogY3J5cHRQYXJhbXMgPSBidWZmZXIgKyBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKSArIHNpemVvZihzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMpOwogICAgIHNucHJpbnRmKGNyeXB0UGFyYW1zLAotICAgICAgICAgICAgREVWTUFQUEVSX0JVRkZFUl9TSVpFIC0gKHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYykpLAotICAgICAgICAgICAgInR3b2Zpc2ggJXMgMCAlcyAwIiwga2V5LCBsb29wRmlsZSk7CisgICAgICAgICAgICAgREVWTUFQUEVSX0JVRkZFUl9TSVpFIC0gKHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYykpLAorICAgICAgICAgICAgICJ0d29maXNoICVzIDAgJXMgMCIsIGtleSwgbG9vcEZpbGUpOwogICAgIGNyeXB0UGFyYW1zICs9IHN0cmxlbihjcnlwdFBhcmFtcykgKyAxOwotICAgIGNyeXB0UGFyYW1zID0gKGNoYXIgKikgX2FsaWduKGNyeXB0UGFyYW1zLCA4KTsKKyAgICBjcnlwdFBhcmFtcyA9IChjaGFyKilfYWxpZ24oY3J5cHRQYXJhbXMsIDgpOwogICAgIHRndC0+bmV4dCA9IGNyeXB0UGFyYW1zIC0gYnVmZmVyOwogCiAgICAgaWYgKGlvY3RsKGZkLCBETV9UQUJMRV9MT0FELCBpbykpIHsKQEAgLTE2MCwxMSArMTU3LDExIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBEZXZtYXBwZXI6OmRlc3Ryb3koY29uc3QgY2hhciAqbmFtZV9yYXcpIHsKK2ludCBEZXZtYXBwZXI6OmRlc3Ryb3koY29uc3QgY2hhciogbmFtZV9yYXcpIHsKICAgICBhdXRvIG5hbWVfc3RyaW5nID0gU3RyaW5nUHJpbnRmKCIlcyVzIiwga1ZvbGRQcmVmaXgsIG5hbWVfcmF3KTsKICAgICBjb25zdCBjaGFyKiBuYW1lID0gbmFtZV9zdHJpbmcuY19zdHIoKTsKIAotICAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyICopIG1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOworICAgIGNoYXIqIGJ1ZmZlciA9IChjaGFyKiltYWxsb2MoREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKICAgICBpZiAoIWJ1ZmZlcikgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIG1hbGxvYyI7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE3Nyw4ICsxNzQsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgc3RydWN0IGRtX2lvY3RsICppbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOwotIAorICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CisKICAgICAvLyBDcmVhdGUgdGhlIERNIGRldmljZQogICAgIGlvY3RsSW5pdChpbywgREVWTUFQUEVSX0JVRkZFUl9TSVpFLCBuYW1lLCAwKTsKIApAQCAtMTk4LDE0ICsxOTUsMTQgQEAKIAogaW50IERldm1hcHBlcjo6ZGVzdHJveUFsbCgpIHsKICAgICBBVFJBQ0VfTkFNRSgiRGV2bWFwcGVyOjpkZXN0cm95QWxsIik7Ci0gICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgbWFsbG9jKDEwMjQgKiA2NCk7CisgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKW1hbGxvYygxMDI0ICogNjQpOwogICAgIGlmICghYnVmZmVyKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgbWFsbG9jIjsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBtZW1zZXQoYnVmZmVyLCAwLCAoMTAyNCAqIDY0KSk7CiAKLSAgICBjaGFyICpidWZmZXIyID0gKGNoYXIgKikgbWFsbG9jKERFVk1BUFBFUl9CVUZGRVJfU0laRSk7CisgICAgY2hhciogYnVmZmVyMiA9IChjaGFyKiltYWxsb2MoREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKICAgICBpZiAoIWJ1ZmZlcjIpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCBtYWxsb2MiOwogICAgICAgICBmcmVlKGJ1ZmZlcik7CkBAIC0yMjAsNyArMjE3LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHN0cnVjdCBkbV9pb2N0bCAqaW8gPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjsKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOwogICAgIGlvY3RsSW5pdChpbywgKDEwMjQgKiA2NCksIE5VTEwsIDApOwogCiAgICAgaWYgKGlvY3RsKGZkLCBETV9MSVNUX0RFVklDRVMsIGlvKSkgewpAQCAtMjMxLDcgKzIyOCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBzdHJ1Y3QgZG1fbmFtZV9saXN0ICpuID0gKHN0cnVjdCBkbV9uYW1lX2xpc3QgKikgKCgoY2hhciAqKSBidWZmZXIpICsgaW8tPmRhdGFfc3RhcnQpOworICAgIHN0cnVjdCBkbV9uYW1lX2xpc3QqIG4gPSAoc3RydWN0IGRtX25hbWVfbGlzdCopKCgoY2hhciopYnVmZmVyKSArIGlvLT5kYXRhX3N0YXJ0KTsKICAgICBpZiAoIW4tPmRldikgewogICAgICAgICBmcmVlKGJ1ZmZlcik7CiAgICAgICAgIGZyZWUoYnVmZmVyMik7CkBAIC0yNDEsMTMgKzIzOCwxMyBAQAogCiAgICAgdW5zaWduZWQgbnh0ID0gMDsKICAgICBkbyB7Ci0gICAgICAgIG4gPSAoc3RydWN0IGRtX25hbWVfbGlzdCAqKSAoKChjaGFyICopIG4pICsgbnh0KTsKKyAgICAgICAgbiA9IChzdHJ1Y3QgZG1fbmFtZV9saXN0KikoKChjaGFyKiluKSArIG54dCk7CiAgICAgICAgIGF1dG8gbmFtZSA9IHN0ZDo6c3RyaW5nKG4tPm5hbWUpOwogICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChuYW1lLCBrVm9sZFByZWZpeCkpIHsKICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlRlYXJpbmcgZG93biBzdGFsZSBkbSBkZXZpY2UgbmFtZWQgIiA8PCBuYW1lOwogCiAgICAgICAgICAgICBtZW1zZXQoYnVmZmVyMiwgMCwgREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKLSAgICAgICAgICAgIHN0cnVjdCBkbV9pb2N0bCAqaW8yID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXIyOworICAgICAgICAgICAgc3RydWN0IGRtX2lvY3RsKiBpbzIgPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXIyOwogICAgICAgICAgICAgaW9jdGxJbml0KGlvMiwgREVWTUFQUEVSX0JVRkZFUl9TSVpFLCBuLT5uYW1lLCAwKTsKICAgICAgICAgICAgIGlmIChpb2N0bChmZCwgRE1fREVWX1JFTU9WRSwgaW8yKSkgewogICAgICAgICAgICAgICAgIGlmIChlcnJubyAhPSBFTlhJTykgewpAQCAtMjU1LDcgKzI1Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGb3VuZCB1bm1hbmFnZWQgZG0gZGV2aWNlIG5hbWVkICIgPDwgbmFtZTsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIkZvdW5kIHVubWFuYWdlZCBkbSBkZXZpY2UgbmFtZWQgIiA8PCBuYW1lOwogICAgICAgICB9CiAgICAgICAgIG54dCA9IG4tPm5leHQ7CiAgICAgfSB3aGlsZSAobnh0KTsKQEAgLTI2Niw5ICsyNjMsOCBAQAogICAgIHJldHVybiAwOwogfQogCi12b2lkICpEZXZtYXBwZXI6Ol9hbGlnbih2b2lkICpwdHIsIHVuc2lnbmVkIGludCBhKQotewotICAgICAgICB1bnNpZ25lZCBsb25nIGFnbiA9IC0tYTsKK3ZvaWQqIERldm1hcHBlcjo6X2FsaWduKHZvaWQqIHB0ciwgdW5zaWduZWQgaW50IGEpIHsKKyAgICB1bnNpZ25lZCBsb25nIGFnbiA9IC0tYTsKIAotICAgICAgICByZXR1cm4gKHZvaWQgKikgKCgodW5zaWduZWQgbG9uZykgcHRyICsgYWduKSAmIH5hZ24pOworICAgIHJldHVybiAodm9pZCopKCgodW5zaWduZWQgbG9uZylwdHIgKyBhZ24pICYgfmFnbik7CiB9CmRpZmYgLS1naXQgYS9EZXZtYXBwZXIuaCBiL0Rldm1hcHBlci5oCmluZGV4IDdiYjk3ODYuLmIxZjZkZmEgMTAwNjQ0Ci0tLSBhL0Rldm1hcHBlci5oCisrKyBiL0Rldm1hcHBlci5oCkBAIC0xNywyMCArMTcsMTkgQEAKICNpZm5kZWYgX0RFVk1BUFBFUl9ICiAjZGVmaW5lIF9ERVZNQVBQRVJfSAogCi0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogY2xhc3MgRGV2bWFwcGVyIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgaW50IGNyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpsb29wRmlsZSwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKTsKLSAgICBzdGF0aWMgaW50IGRlc3Ryb3koY29uc3QgY2hhciAqbmFtZSk7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgaW50IGNyZWF0ZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBsb29wRmlsZSwgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuKTsKKyAgICBzdGF0aWMgaW50IGRlc3Ryb3koY29uc3QgY2hhciogbmFtZSk7CiAgICAgc3RhdGljIGludCBkZXN0cm95QWxsKCk7CiAKLXByaXZhdGU6Ci0gICAgc3RhdGljIHZvaWQgKl9hbGlnbih2b2lkICpwdHIsIHVuc2lnbmVkIGludCBhKTsKLSAgICBzdGF0aWMgdm9pZCBpb2N0bEluaXQoc3RydWN0IGRtX2lvY3RsICppbywgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MpOworICBwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkKiBfYWxpZ24odm9pZCogcHRyLCB1bnNpZ25lZCBpbnQgYSk7CisgICAgc3RhdGljIHZvaWQgaW9jdGxJbml0KHN0cnVjdCBkbV9pb2N0bCogaW8sIHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IGNoYXIqIG5hbWUsIHVuc2lnbmVkIGZsYWdzKTsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvRW5jcnlwdElucGxhY2UuY3BwIGIvRW5jcnlwdElucGxhY2UuY3BwCmluZGV4IDY0NjJkYmYuLmQ1NTliZmYgMTAwNjQ0Ci0tLSBhL0VuY3J5cHRJbnBsYWNlLmNwcAorKysgYi9FbmNyeXB0SW5wbGFjZS5jcHAKQEAgLTE2LDE2ICsxNiwxNiBAQAogCiAjaW5jbHVkZSAiRW5jcnlwdElucGxhY2UuaCIKIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NC5oPgogI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgogI2luY2x1ZGUgPGYyZnNfc3BhcnNlYmxvY2suaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIApAQCAtMzYsMTMgKzM2LDExIEBACiAjaW5jbHVkZSAiY3J5cHRmcy5oIgogCiAvLyBGSVhNRSBob3JyaWJsZSBjdXQtYW5kLXBhc3RlIGNvZGUKLXN0YXRpYyBpbmxpbmUgaW50IHVuaXhfcmVhZChpbnQgIGZkLCB2b2lkKiAgYnVmZiwgaW50ICBsZW4pCi17CitzdGF0aWMgaW5saW5lIGludCB1bml4X3JlYWQoaW50IGZkLCB2b2lkKiBidWZmLCBpbnQgbGVuKSB7CiAgICAgcmV0dXJuIFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCBidWZmLCBsZW4pKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdW5peF93cml0ZShpbnQgIGZkLCBjb25zdCB2b2lkKiAgYnVmZiwgaW50ICBsZW4pCi17CitzdGF0aWMgaW5saW5lIGludCB1bml4X3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmZiwgaW50IGxlbikgewogICAgIHJldHVybiBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoZmQsIGJ1ZmYsIGxlbikpOwogfQogCkBAIC01NywxNSArNTUsMTQgQEAKICNkZWZpbmUgQkxPQ0tTX0FUX0FfVElNRSAxMDI0CiAjZW5kaWYKIAotc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhCi17CitzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgewogICAgIGludCByZWFsZmQ7CiAgICAgaW50IGNyeXB0b2ZkOwogICAgIG9mZjY0X3QgbnVtYmxvY2tzOwogICAgIG9mZjY0X3Qgb25lX3BjdCwgY3VyX3BjdCwgbmV3X3BjdDsKICAgICBvZmY2NF90IGJsb2Nrc19hbHJlYWR5X2RvbmUsIHRvdF9udW1ibG9ja3M7CiAgICAgb2ZmNjRfdCB1c2VkX2Jsb2Nrc19hbHJlYWR5X2RvbmUsIHRvdF91c2VkX2Jsb2NrczsKLSAgICBjaGFyKiByZWFsX2Jsa2RldiwgKiBjcnlwdG9fYmxrZGV2OworICAgIGNoYXIgKnJlYWxfYmxrZGV2LCAqY3J5cHRvX2Jsa2RldjsKICAgICBpbnQgY291bnQ7CiAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgY2hhciogYnVmZmVyOwpAQCAtNzYsOCArNzMsNyBAQAogICAgIGJvb2wgc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXM7CiB9OwogCi1zdGF0aWMgdm9pZCB1cGRhdGVfcHJvZ3Jlc3Moc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBkYXRhLCBpbnQgaXNfdXNlZCkKLXsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9wcm9ncmVzcyhzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIGRhdGEsIGludCBpc191c2VkKSB7CiAgICAgZGF0YS0+YmxvY2tzX2FscmVhZHlfZG9uZSsrOwogCiAgICAgaWYgKGlzX3VzZWQpIHsKQEAgLTEwNCwxNiArMTAwLDE0IEBACiAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkVycm9yIGdldHRpbmcgdGltZSI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkb3VibGUgZWxhcHNlZF90aW1lID0gZGlmZnRpbWUodGltZV9ub3cudHZfc2VjLCBkYXRhLT50aW1lX3N0YXJ0ZWQpOwotICAgICAgICAgICAgb2ZmNjRfdCByZW1haW5pbmdfYmxvY2tzID0gZGF0YS0+dG90X3VzZWRfYmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGRhdGEtPnVzZWRfYmxvY2tzX2FscmVhZHlfZG9uZTsKLSAgICAgICAgICAgIGludCByZW1haW5pbmdfdGltZSA9IChpbnQpKGVsYXBzZWRfdGltZSAqIHJlbWFpbmluZ19ibG9ja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gZGF0YS0+dXNlZF9ibG9ja3NfYWxyZWFkeV9kb25lKTsKKyAgICAgICAgICAgIG9mZjY0X3QgcmVtYWluaW5nX2Jsb2NrcyA9IGRhdGEtPnRvdF91c2VkX2Jsb2NrcyAtIGRhdGEtPnVzZWRfYmxvY2tzX2FscmVhZHlfZG9uZTsKKyAgICAgICAgICAgIGludCByZW1haW5pbmdfdGltZSA9CisgICAgICAgICAgICAgICAgKGludCkoZWxhcHNlZF90aW1lICogcmVtYWluaW5nX2Jsb2NrcyAvIGRhdGEtPnVzZWRfYmxvY2tzX2FscmVhZHlfZG9uZSk7CiAKICAgICAgICAgICAgIC8vIENoYW5nZSB0aW1lIG9ubHkgaWYgbm90IHlldCBzZXQsIGxvd2VyLCBvciBhIGxvdCBoaWdoZXIgZm9yCiAgICAgICAgICAgICAvLyBiZXN0IHVzZXIgZXhwZXJpZW5jZQotICAgICAgICAgICAgaWYgKGRhdGEtPnJlbWFpbmluZ190aW1lID09IC0xCi0gICAgICAgICAgICAgICAgfHwgcmVtYWluaW5nX3RpbWUgPCBkYXRhLT5yZW1haW5pbmdfdGltZQotICAgICAgICAgICAgICAgIHx8IHJlbWFpbmluZ190aW1lID4gZGF0YS0+cmVtYWluaW5nX3RpbWUgKyA2MCkgeworICAgICAgICAgICAgaWYgKGRhdGEtPnJlbWFpbmluZ190aW1lID09IC0xIHx8IHJlbWFpbmluZ190aW1lIDwgZGF0YS0+cmVtYWluaW5nX3RpbWUgfHwKKyAgICAgICAgICAgICAgICByZW1haW5pbmdfdGltZSA+IGRhdGEtPnJlbWFpbmluZ190aW1lICsgNjApIHsKICAgICAgICAgICAgICAgICBjaGFyIGJ1Zls4XTsKICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCByZW1haW5pbmdfdGltZSk7CiAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoInZvbGQuZW5jcnlwdF90aW1lX3JlbWFpbmluZyIsIGJ1Zik7CkBAIC0xMjMsOCArMTE3LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGxvZ19wcm9ncmVzcyhzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgY29uc3QqIGRhdGEsIGJvb2wgY29tcGxldGVkKQoteworc3RhdGljIHZvaWQgbG9nX3Byb2dyZXNzKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSBjb25zdCogZGF0YSwgYm9vbCBjb21wbGV0ZWQpIHsKICAgICAvLyBQcmVjb25kaXRpb24gLSBpZiBjb21wbGV0ZWQgZGF0YSA9IDAgZWxzZSBkYXRhICE9IDAKIAogICAgIC8vIFRyYWNrIHByb2dyZXNzIHNvIHdlIGNhbiBza2lwIGxvZ2dpbmcgYmxvY2tzCkBAIC0xNDcsMTMgKzE0MCwxMiBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBmbHVzaF9vdXRzdGFuZGluZ19kYXRhKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSkKLXsKK3N0YXRpYyBpbnQgZmx1c2hfb3V0c3RhbmRpbmdfZGF0YShzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIGRhdGEpIHsKICAgICBpZiAoZGF0YS0+Y291bnQgPT0gMCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBMT0coVkVSQk9TRSkgPDwgIkNvcHlpbmcgIiA8PCBkYXRhLT5jb3VudCA8PCAiIGJsb2NrcyBhdCBvZmZzZXQgIiA8PCBkYXRhLT5vZmZzZXQ7CisgICAgTE9HKERFQlVHKSA8PCAiQ29weWluZyAiIDw8IGRhdGEtPmNvdW50IDw8ICIgYmxvY2tzIGF0IG9mZnNldCAiIDw8IGRhdGEtPm9mZnNldDsKIAogICAgIGlmIChwcmVhZDY0KGRhdGEtPnJlYWxmZCwgZGF0YS0+YnVmZmVyLCBpbmZvLmJsb2NrX3NpemUgKiBkYXRhLT5jb3VudCwgZGF0YS0+b2Zmc2V0KSA8PSAwKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yIHJlYWRpbmcgcmVhbF9ibGtkZXYgIiA8PCBkYXRhLT5yZWFsX2Jsa2RldiA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwpAQCAtMTY1LDMwICsxNTcsMjkgQEAKICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIHsKLSAgICAgIGxvZ19wcm9ncmVzcyhkYXRhLCBmYWxzZSk7CisgICAgICAgIGxvZ19wcm9ncmVzcyhkYXRhLCBmYWxzZSk7CiAgICAgfQogCiAgICAgZGF0YS0+Y291bnQgPSAwOwotICAgIGRhdGEtPmxhc3Rfd3JpdHRlbl9zZWN0b3IgPSAoZGF0YS0+b2Zmc2V0ICsgZGF0YS0+Y291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gaW5mby5ibG9ja19zaXplICogQ1JZUFRfU0VDVE9SX1NJWkUgLSAxOworICAgIGRhdGEtPmxhc3Rfd3JpdHRlbl9zZWN0b3IgPQorICAgICAgICAoZGF0YS0+b2Zmc2V0ICsgZGF0YS0+Y291bnQpIC8gaW5mby5ibG9ja19zaXplICogQ1JZUFRfU0VDVE9SX1NJWkUgLSAxOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVuY3J5cHRfZ3JvdXBzKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSkKLXsKK3N0YXRpYyBpbnQgZW5jcnlwdF9ncm91cHMoc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBkYXRhKSB7CiAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgdTggKmJsb2NrX2JpdG1hcCA9IDA7CisgICAgdTgqIGJsb2NrX2JpdG1hcCA9IDA7CiAgICAgdW5zaWduZWQgaW50IGJsb2NrOwogICAgIG9mZjY0X3QgcmV0OwogICAgIGludCByYyA9IC0xOwogCi0gICAgZGF0YS0+YnVmZmVyID0gKGNoYXIqKSBtYWxsb2MoaW5mby5ibG9ja19zaXplICogQkxPQ0tTX0FUX0FfVElNRSk7CisgICAgZGF0YS0+YnVmZmVyID0gKGNoYXIqKW1hbGxvYyhpbmZvLmJsb2NrX3NpemUgKiBCTE9DS1NfQVRfQV9USU1FKTsKICAgICBpZiAoIWRhdGEtPmJ1ZmZlcikgewogICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgY3J5cHRvIGJ1ZmZlciI7CiAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgIH0KIAotICAgIGJsb2NrX2JpdG1hcCA9ICh1OCopIG1hbGxvYyhpbmZvLmJsb2NrX3NpemUpOworICAgIGJsb2NrX2JpdG1hcCA9ICh1OCopbWFsbG9jKGluZm8uYmxvY2tfc2l6ZSk7CiAgICAgaWYgKCFibG9ja19iaXRtYXApIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIGFsbG9jYXRlIGJsb2NrIGJpdG1hcCI7CiAgICAgICAgIGdvdG8gZXJyb3V0OwpAQCAtMTk4LDExICsxODksOSBAQAogICAgICAgICBMT0coSU5GTykgPDwgIkVuY3J5cHRpbmcgZ3JvdXAgIiA8PCBpOwogCiAgICAgICAgIHUzMiBmaXJzdF9ibG9jayA9IGF1eF9pbmZvLmZpcnN0X2RhdGFfYmxvY2sgKyBpICogaW5mby5ibG9ja3NfcGVyX2dyb3VwOwotICAgICAgICB1MzIgYmxvY2tfY291bnQgPSBzdGQ6Om1pbihpbmZvLmJsb2Nrc19wZXJfZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGF1eF9pbmZvLmxlbl9ibG9ja3MgLSBmaXJzdF9ibG9jaykpOworICAgICAgICB1MzIgYmxvY2tfY291bnQgPSBzdGQ6Om1pbihpbmZvLmJsb2Nrc19wZXJfZ3JvdXAsICh1MzIpKGF1eF9pbmZvLmxlbl9ibG9ja3MgLSBmaXJzdF9ibG9jaykpOwogCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKHU2NClpbmZvLmJsb2NrX3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwOworICAgICAgICBvZmY2NF90IG9mZnNldCA9ICh1NjQpaW5mby5ibG9ja19zaXplICogYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXA7CiAKICAgICAgICAgcmV0ID0gcHJlYWQ2NChkYXRhLT5yZWFsZmQsIGJsb2NrX2JpdG1hcCwgaW5mby5ibG9ja19zaXplLCBvZmZzZXQpOwogICAgICAgICBpZiAocmV0ICE9IChpbnQpaW5mby5ibG9ja19zaXplKSB7CkBAIC0yMTUsOCArMjA0LDkgQEAKICAgICAgICAgZGF0YS0+Y291bnQgPSAwOwogCiAgICAgICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IGJsb2NrX2NvdW50OyBibG9jaysrKSB7Ci0gICAgICAgICAgICBpbnQgdXNlZCA9IChhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZsYWdzICYgRVhUNF9CR19CTE9DS19VTklOSVQpID8KLSAgICAgICAgICAgICAgICAgICAgMCA6IGJpdG1hcF9nZXRfYml0KGJsb2NrX2JpdG1hcCwgYmxvY2spOworICAgICAgICAgICAgaW50IHVzZWQgPSAoYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19mbGFncyAmIEVYVDRfQkdfQkxPQ0tfVU5JTklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJpdG1hcF9nZXRfYml0KGJsb2NrX2JpdG1hcCwgYmxvY2spOwogICAgICAgICAgICAgdXBkYXRlX3Byb2dyZXNzKGRhdGEsIHVzZWQpOwogICAgICAgICAgICAgaWYgKHVzZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoZGF0YS0+Y291bnQgPT0gMCkgewpAQCAtMjMyLDggKzIyMiw4IEBACiAgICAgICAgICAgICBvZmZzZXQgKz0gaW5mby5ibG9ja19zaXplOwogCiAgICAgICAgICAgICAvKiBXcml0ZSBkYXRhIGlmIHdlIGFyZSBhbGlnbmVkIG9yIGJ1ZmZlciBzaXplIHJlYWNoZWQgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgJSAoaW5mby5ibG9ja19zaXplICogQkxPQ0tTX0FUX0FfVElNRSkgPT0gMAotICAgICAgICAgICAgICAgIHx8IGRhdGEtPmNvdW50ID09IEJMT0NLU19BVF9BX1RJTUUpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgJSAoaW5mby5ibG9ja19zaXplICogQkxPQ0tTX0FUX0FfVElNRSkgPT0gMCB8fAorICAgICAgICAgICAgICAgIGRhdGEtPmNvdW50ID09IEJMT0NLU19BVF9BX1RJTUUpIHsKICAgICAgICAgICAgICAgICBpZiAoZmx1c2hfb3V0c3RhbmRpbmdfZGF0YShkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm91dDsKICAgICAgICAgICAgICAgICB9CkBAIC0yNjAsNyArMjUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXMpIHsKICAgICB1MzIgaTsKICAgICBzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgZGF0YTsKLSAgICBpbnQgcmM7IC8vIENhbid0IGluaXRpYWxpemUgd2l0aG91dCBjYXVzaW5nIHdhcm5pbmcgLVdjbG9iYmVyZWQKKyAgICBpbnQgcmM7ICAvLyBDYW4ndCBpbml0aWFsaXplIHdpdGhvdXQgY2F1c2luZyB3YXJuaW5nIC1XY2xvYmJlcmVkCiAgICAgaW50IHJldHJpZXMgPSBSRVRSWV9NT1VOVF9BVFRFTVBUUzsKICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZV9zdGFydGVkID0gezB9OwogCkBAIC0yNzUsNyArMjY1LDcgQEAKICAgICBkYXRhLnNldF9wcm9ncmVzc19wcm9wZXJ0aWVzID0gc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXM7CiAKICAgICBMT0coREVCVUcpIDw8ICJPcGVuaW5nIiA8PCByZWFsX2Jsa2RldjsKLSAgICBpZiAoIChkYXRhLnJlYWxmZCA9IG9wZW4ocmVhbF9ibGtkZXYsIE9fUkRXUnxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICBpZiAoKGRhdGEucmVhbGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRFdSIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBvcGVuaW5nIHJlYWxfYmxrZGV2ICIgPDwgcmVhbF9ibGtkZXYgPDwgIiBmb3IgaW5wbGFjZSBlbmNyeXB0IjsKICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgZ290byBlcnJvdXQ7CkBAIC0yODMsNyArMjczLDcgQEAKIAogICAgIExPRyhERUJVRykgPDwgIk9wZW5pbmciIDw8IGNyeXB0b19ibGtkZXY7CiAgICAgLy8gV2FpdCB1bnRpbCB0aGUgYmxvY2sgZGV2aWNlIGFwcGVhcnMuICBSZS11c2UgdGhlIG1vdW50IHJldHJ5IHZhbHVlcyBzaW5jZSBpdCBpcyByZWFzb25hYmxlLgotICAgIHdoaWxlICgoZGF0YS5jcnlwdG9mZCA9IG9wZW4oY3J5cHRvX2Jsa2RldiwgT19XUk9OTFl8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgd2hpbGUgKChkYXRhLmNyeXB0b2ZkID0gb3BlbihjcnlwdG9fYmxrZGV2LCBPX1dST05MWSB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBpZiAoLS1yZXRyaWVzKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyBjcnlwdG9fYmxrZGV2ICIgPDwgY3J5cHRvX2Jsa2RldgogICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgZXh0NCBpbnBsYWNlIGVuY3J5cHQsIHJldHJ5aW5nIjsKQEAgLTI5Niw3ICsyODYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHNldGptcChzZXRqbXBfZW52KSkgeyAvLyBOT0xJTlQKKyAgICBpZiAoc2V0am1wKHNldGptcF9lbnYpKSB7ICAvLyBOT0xJTlQKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVhZGluZyBleHQ0IGV4dGVudCBjYXVzZWQgYW4gZXhjZXB0aW9uIjsKICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgZ290byBlcnJvdXQ7CkBAIC0zMTYsNyArMzA2LDcgQEAKIAogICAgIGRhdGEudG90X3VzZWRfYmxvY2tzID0gZGF0YS5udW1ibG9ja3M7CiAgICAgZm9yIChpID0gMDsgaSA8IGF1eF9pbmZvLmdyb3VwczsgKytpKSB7Ci0gICAgICBkYXRhLnRvdF91c2VkX2Jsb2NrcyAtPSBhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50OworICAgICAgICBkYXRhLnRvdF91c2VkX2Jsb2NrcyAtPSBhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50OwogICAgIH0KIAogICAgIGRhdGEub25lX3BjdCA9IGRhdGEudG90X3VzZWRfYmxvY2tzIC8gMTAwOwpAQCAtMzQ1LDggKzMzNSw3IEBACiAgICAgcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBsb2dfcHJvZ3Jlc3NfZjJmcyh1NjQgYmxvY2ssIGJvb2wgY29tcGxldGVkKQoteworc3RhdGljIHZvaWQgbG9nX3Byb2dyZXNzX2YyZnModTY0IGJsb2NrLCBib29sIGNvbXBsZXRlZCkgewogICAgIC8vIFByZWNvbmRpdGlvbiAtIGlmIGNvbXBsZXRlZCBkYXRhID0gMCBlbHNlIGRhdGEgIT0gMAogCiAgICAgLy8gVHJhY2sgcHJvZ3Jlc3Mgc28gd2UgY2FuIHNraXAgbG9nZ2luZyBibG9ja3MKQEAgLTM2OSw5ICszNTgsOCBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBlbmNyeXB0X29uZV9ibG9ja19mMmZzKHU2NCBwb3MsIHZvaWQgKmRhdGEpCi17Ci0gICAgc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhICpwcml2X2RhdCA9IChzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgKilkYXRhOworc3RhdGljIGludCBlbmNyeXB0X29uZV9ibG9ja19mMmZzKHU2NCBwb3MsIHZvaWQqIGRhdGEpIHsKKyAgICBzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIHByaXZfZGF0ID0gKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSopZGF0YTsKIAogICAgIHByaXZfZGF0LT5ibG9ja3NfYWxyZWFkeV9kb25lID0gcG9zIC0gMTsKICAgICB1cGRhdGVfcHJvZ3Jlc3MocHJpdl9kYXQsIDEpOwpAQCAtNDAwLDcgKzM4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IHByZXZpb3VzbHlfZW5jcnlwdGVkX3VwdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzKSB7CiAgICAgc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhIGRhdGE7Ci0gICAgc3RydWN0IGYyZnNfaW5mbyAqZjJmc19pbmZvID0gTlVMTDsKKyAgICBzdHJ1Y3QgZjJmc19pbmZvKiBmMmZzX2luZm8gPSBOVUxMOwogICAgIGludCByYyA9IEVOQUJMRV9JTlBMQUNFX0VSUl9PVEhFUjsKICAgICBpZiAocHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0byA+ICpzaXplX2FscmVhZHlfZG9uZSkgewogICAgICAgICBMT0coREVCVUcpIDw8ICJOb3QgZmFzdCBlbmNyeXB0aW5nIHNpbmNlIHJlc3VtaW5nIHBhcnQgd2F5IHRocm91Z2giOwpAQCAtNDEyLDExICs0MDAsMTEgQEAKICAgICBkYXRhLnNldF9wcm9ncmVzc19wcm9wZXJ0aWVzID0gc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXM7CiAgICAgZGF0YS5yZWFsZmQgPSAtMTsKICAgICBkYXRhLmNyeXB0b2ZkID0gLTE7Ci0gICAgaWYgKCAoZGF0YS5yZWFsZmQgPSBvcGVuNjQocmVhbF9ibGtkZXYsIE9fUkRXUnxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICBpZiAoKGRhdGEucmVhbGZkID0gb3BlbjY0KHJlYWxfYmxrZGV2LCBPX1JEV1IgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIG9wZW5pbmcgcmVhbF9ibGtkZXYgIiA8PCByZWFsX2Jsa2RldiA8PCAiIGZvciBmMmZzIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgIH0KLSAgICBpZiAoIChkYXRhLmNyeXB0b2ZkID0gb3BlbjY0KGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgoZGF0YS5jcnlwdG9mZCA9IG9wZW42NChjcnlwdG9fYmxrZGV2LCBPX1dST05MWSB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyBjcnlwdG9fYmxrZGV2ICIgPDwgY3J5cHRvX2Jsa2RldgogICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBmMmZzIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIHJjID0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVjsKQEAgLTQyNCw4ICs0MTIsNyBAQAogICAgIH0KIAogICAgIGYyZnNfaW5mbyA9IGdlbmVyYXRlX2YyZnNfaW5mbyhkYXRhLnJlYWxmZCk7Ci0gICAgaWYgKCFmMmZzX2luZm8pCi0gICAgICBnb3RvIGVycm91dDsKKyAgICBpZiAoIWYyZnNfaW5mbykgZ290byBlcnJvdXQ7CiAKICAgICBkYXRhLm51bWJsb2NrcyA9IHNpemUgLyBDUllQVF9TRUNUT1JTX1BFUl9CVUZTSVpFOwogICAgIGRhdGEudG90X251bWJsb2NrcyA9IHRvdF9zaXplIC8gQ1JZUFRfU0VDVE9SU19QRVJfQlVGU0laRTsKQEAgLTQzOCw3ICs0MjUsNyBAQAogICAgIGRhdGEudGltZV9zdGFydGVkID0gdGltZShOVUxMKTsKICAgICBkYXRhLnJlbWFpbmluZ190aW1lID0gLTE7CiAKLSAgICBkYXRhLmJ1ZmZlciA9IChjaGFyKikgbWFsbG9jKGYyZnNfaW5mby0+YmxvY2tfc2l6ZSk7CisgICAgZGF0YS5idWZmZXIgPSAoY2hhciopbWFsbG9jKGYyZnNfaW5mby0+YmxvY2tfc2l6ZSk7CiAgICAgaWYgKCFkYXRhLmJ1ZmZlcikgewogICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgY3J5cHRvIGJ1ZmZlciI7CiAgICAgICAgIGdvdG8gZXJyb3V0OwpAQCAtNDc1LDE4ICs0NjIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXMpIHsKICAgICBpbnQgcmVhbGZkLCBjcnlwdG9mZDsKLSAgICBjaGFyICpidWZbQ1JZUFRfSU5QTEFDRV9CVUZTSVpFXTsKKyAgICBjaGFyKiBidWZbQ1JZUFRfSU5QTEFDRV9CVUZTSVpFXTsKICAgICBpbnQgcmMgPSBFTkFCTEVfSU5QTEFDRV9FUlJfT1RIRVI7CiAgICAgb2ZmNjRfdCBudW1ibG9ja3MsIGksIHJlbWFpbmRlcjsKICAgICBvZmY2NF90IG9uZV9wY3QsIGN1cl9wY3QsIG5ld19wY3Q7CiAgICAgb2ZmNjRfdCBibG9ja3NfYWxyZWFkeV9kb25lLCB0b3RfbnVtYmxvY2tzOwogCi0gICAgaWYgKCAocmVhbGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRE9OTFl8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgaWYgKChyZWFsZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JET05MWSB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyByZWFsX2Jsa2RldiAiIDw8IHJlYWxfYmxrZGV2IDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIHJldHVybiBFTkFCTEVfSU5QTEFDRV9FUlJfT1RIRVI7CiAgICAgfQogCi0gICAgaWYgKCAoY3J5cHRvZmQgPSBvcGVuKGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgoY3J5cHRvZmQgPSBvcGVuKGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBvcGVuaW5nIGNyeXB0b19ibGtkZXYgIiA8PCBjcnlwdG9fYmxrZGV2IDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIGNsb3NlKHJlYWxmZCk7CiAgICAgICAgIHJldHVybiBFTkFCTEVfSU5QTEFDRV9FUlJfREVWOwpAQCAtNTE2LDcgKzUwMyw3IEBACiAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgIH0KIAotICAgIGZvciAoO2kgPCBzaXplICYmIGkgJSBDUllQVF9TRUNUT1JTX1BFUl9CVUZTSVpFICE9IDA7ICsraSkgeworICAgIGZvciAoOyBpIDwgc2l6ZSAmJiBpICUgQ1JZUFRfU0VDVE9SU19QRVJfQlVGU0laRSAhPSAwOyArK2kpIHsKICAgICAgICAgaWYgKHVuaXhfcmVhZChyZWFsZmQsIGJ1ZiwgQ1JZUFRfU0VDVE9SX1NJWkUpIDw9IDApIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIGluaXRpYWwgc2VjdG9ycyBmcm9tIHJlYWxfYmxrZGV2ICIgPDwgcmVhbF9ibGtkZXYKICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CkBAIC01MzQsNyArNTIxLDcgQEAKICAgICBvbmVfcGN0ID0gdG90X251bWJsb2NrcyAvIDEwMDsKICAgICBjdXJfcGN0ID0gMDsKICAgICAvKiBwcm9jZXNzIHRoZSBtYWpvcml0eSBvZiB0aGUgZmlsZXN5c3RlbSBpbiBibG9ja3MgKi8KLSAgICBmb3IgKGkvPUNSWVBUX1NFQ1RPUlNfUEVSX0JVRlNJWkU7IGk8bnVtYmxvY2tzOyBpKyspIHsKKyAgICBmb3IgKGkgLz0gQ1JZUFRfU0VDVE9SU19QRVJfQlVGU0laRTsgaSA8IG51bWJsb2NrczsgaSsrKSB7CiAgICAgICAgIG5ld19wY3QgPSAoaSArIGJsb2Nrc19hbHJlYWR5X2RvbmUpIC8gb25lX3BjdDsKICAgICAgICAgaWYgKHNldF9wcm9ncmVzc19wcm9wZXJ0aWVzICYmIG5ld19wY3QgPiBjdXJfcGN0KSB7CiAgICAgICAgICAgICBjaGFyIGJ1Zls4XTsKQEAgLTU1Nyw3ICs1NDQsNyBAQAogICAgIH0KIAogICAgIC8qIERvIGFueSByZW1haW5pbmcgc2VjdG9ycyAqLwotICAgIGZvciAoaT0wOyBpPHJlbWFpbmRlcjsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHJlbWFpbmRlcjsgaSsrKSB7CiAgICAgICAgIGlmICh1bml4X3JlYWQocmVhbGZkLCBidWYsIENSWVBUX1NFQ1RPUl9TSVpFKSA8PSAwKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIGZpbmFsIHNlY3RvcnMgZnJvbSByZWFsX2Jsa2RldiAiIDw8IHJlYWxfYmxrZGV2CiAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CkBAIC02MjYsOSArNjEzLDggQEAKICAgICBMT0coREVCVUcpIDw8ICJjcnlwdGZzX2VuYWJsZV9pbnBsYWNlX2Z1bGwoKT0iIDw8IHJjX2Z1bGw7CiAKICAgICAvKiBIYWNrIGZvciBiLzE3ODk4OTYyLCB0aGUgZm9sbG93aW5nIGlzIHRoZSBzeW1wdG9tLi4uICovCi0gICAgaWYgKHJjX2V4dDQgPT0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVgotICAgICAgICAmJiByY19mMmZzID09IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYKLSAgICAgICAgJiYgcmNfZnVsbCA9PSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWKSB7CisgICAgaWYgKHJjX2V4dDQgPT0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFViAmJiByY19mMmZzID09IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYgJiYKKyAgICAgICAgcmNfZnVsbCA9PSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWKSB7CiAgICAgICAgIExPRyhERUJVRykgPDwgIkVOQUJMRV9JTlBMQUNFX0VSUl9ERVYiOwogICAgICAgICByZXR1cm4gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVjsKICAgICB9CmRpZmYgLS1naXQgYS9FeHQ0Q3J5cHQuY3BwIGIvRXh0NENyeXB0LmNwcAppbmRleCA2N2I3ZTkwLi4yMTA3MWQ0IDEwMDY0NAotLS0gYS9FeHQ0Q3J5cHQuY3BwCisrKyBiL0V4dDRDcnlwdC5jcHAKQEAgLTMxLDEyICszMSwxMiBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzZWxpbnV4L2FuZHJvaWQuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKQEAgLTkzLDcgKzkzLDcgQEAKIC8vIFRPRE8gYWJvbGlzaCB0aGlzIG1hcCwgcGVyIGIvMjY5NDgwNTMKIHN0ZDo6bWFwPHVzZXJpZF90LCBLZXlCdWZmZXI+IHNfY2Vfa2V5czsKIAotfQorfSAgLy8gbmFtZXNwYWNlCiAKIHN0YXRpYyBib29sIGU0Y3J5cHRfaXNfZW11bGF0ZWQoKSB7CiAgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LnN5cy5lbXVsYXRlX2ZiZSIsIGZhbHNlKTsKQEAgLTE0NSw4ICsxNDUsNyBAQAogfQogCiBzdGF0aWMgYm9vbCBnZXRfY2Vfa2V5X25ld19wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJlY3RvcnlfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNlX2tleV9wYXRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGF0aHMsIHN0ZDo6c3RyaW5nKiBjZV9rZXlfcGF0aCkgewogICAgIGlmIChwYXRocy5lbXB0eSgpKSB7CiAgICAgICAgICpjZV9rZXlfcGF0aCA9IGdldF9jZV9rZXlfY3VycmVudF9wYXRoKGRpcmVjdG9yeV9wYXRoKTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNjMsOSArMTYyLDkgQEAKIAogLy8gRGlzY2FyZCBhbGwga2V5cyBidXQgdGhlIG5hbWVkIG9uZTsgcmVuYW1lIGl0IHRvIGNhbm9uaWNhbCBuYW1lLgogLy8gTm8gcG9pbnQgaW4gYWN0aW5nIG9uIGVycm9ycyBpbiB0aGlzOyBpZ25vcmUgdGhlbS4KLXN0YXRpYyB2b2lkIGZpeGF0ZV91c2VyX2NlX2tleShjb25zdCBzdGQ6OnN0cmluZyYgZGlyZWN0b3J5X3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nICZ0b19maXgsCitzdGF0aWMgdm9pZCBmaXhhdGVfdXNlcl9jZV9rZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcmVjdG9yeV9wYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9fZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGF0aHMpIHsKLSAgICBmb3IgKGF1dG8gY29uc3Qgb3RoZXJfcGF0aDogcGF0aHMpIHsKKyAgICBmb3IgKGF1dG8gY29uc3Qgb3RoZXJfcGF0aCA6IHBhdGhzKSB7CiAgICAgICAgIGlmIChvdGhlcl9wYXRoICE9IHRvX2ZpeCkgewogICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6ZGVzdHJveUtleShvdGhlcl9wYXRoKTsKICAgICAgICAgfQpAQCAtMTgxLDEwICsxODAsMTAgQEAKIAogc3RhdGljIGJvb2wgcmVhZF9hbmRfZml4YXRlX3VzZXJfY2Vfa2V5KHVzZXJpZF90IHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6dm9sZDo6S2V5QXV0aGVudGljYXRpb24mIGF1dGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5QnVmZmVyICpjZV9rZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlCdWZmZXIqIGNlX2tleSkgewogICAgIGF1dG8gY29uc3QgZGlyZWN0b3J5X3BhdGggPSBnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpOwogICAgIGF1dG8gY29uc3QgcGF0aHMgPSBnZXRfY2Vfa2V5X3BhdGhzKGRpcmVjdG9yeV9wYXRoKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgY2Vfa2V5X3BhdGg6IHBhdGhzKSB7CisgICAgZm9yIChhdXRvIGNvbnN0IGNlX2tleV9wYXRoIDogcGF0aHMpIHsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiVHJ5aW5nIHVzZXIgQ0Uga2V5ICIgPDwgY2Vfa2V5X3BhdGg7CiAgICAgICAgIGlmIChhbmRyb2lkOjp2b2xkOjpyZXRyaWV2ZUtleShjZV9rZXlfcGF0aCwgYXV0aCwgY2Vfa2V5KSkgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBrZXkiOwpAQCAtMjQyLDEyICsyNDEsMTQgQEAKICAgICAgICAgYXV0byBjb25zdCBwYXRocyA9IGdldF9jZV9rZXlfcGF0aHMoZGlyZWN0b3J5X3BhdGgpOwogICAgICAgICBzdGQ6OnN0cmluZyBjZV9rZXlfcGF0aDsKICAgICAgICAgaWYgKCFnZXRfY2Vfa2V5X25ld19wYXRoKGRpcmVjdG9yeV9wYXRoLCBwYXRocywgJmNlX2tleV9wYXRoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShjZV9rZXlfcGF0aCwgdXNlcl9rZXlfdGVtcCwKLSAgICAgICAgICAgICAgICBrRW1wdHlBdXRoZW50aWNhdGlvbiwgY2Vfa2V5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShjZV9rZXlfcGF0aCwgdXNlcl9rZXlfdGVtcCwga0VtcHR5QXV0aGVudGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlX2tleSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGZpeGF0ZV91c2VyX2NlX2tleShkaXJlY3RvcnlfcGF0aCwgY2Vfa2V5X3BhdGgsIHBhdGhzKTsKICAgICAgICAgLy8gV3JpdGUgREUga2V5IHNlY29uZDsgb25jZSB0aGlzIGlzIHdyaXR0ZW4sIGFsbCBpcyBnb29kLgogICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShnZXRfZGVfa2V5X3BhdGgodXNlcl9pZCksIHVzZXJfa2V5X3RlbXAsCi0gICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sIGRlX2tleSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sIGRlX2tleSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIGRlX3Jhd19yZWY7CiAgICAgaWYgKCFhbmRyb2lkOjp2b2xkOjppbnN0YWxsS2V5KGRlX2tleSwgJmRlX3Jhd19yZWYpKSByZXR1cm4gZmFsc2U7CkBAIC00NDAsMTQgKzQ0MSwxNCBAQAogICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAgICAgc3RkOjpzdHJpbmcgcmF3X3JlZjsKICAgICBzdWNjZXNzICY9IGV2aWN0X2NlX2tleSh1c2VyX2lkKTsKLSAgICBzdWNjZXNzICY9IGxvb2t1cF9rZXlfcmVmKHNfZGVfa2V5X3Jhd19yZWZzLCB1c2VyX2lkLCAmcmF3X3JlZikKLSAgICAgICAgJiYgYW5kcm9pZDo6dm9sZDo6ZXZpY3RLZXkocmF3X3JlZik7CisgICAgc3VjY2VzcyAmPQorICAgICAgICBsb29rdXBfa2V5X3JlZihzX2RlX2tleV9yYXdfcmVmcywgdXNlcl9pZCwgJnJhd19yZWYpICYmIGFuZHJvaWQ6OnZvbGQ6OmV2aWN0S2V5KHJhd19yZWYpOwogICAgIHNfZGVfa2V5X3Jhd19yZWZzLmVyYXNlKHVzZXJfaWQpOwogICAgIGF1dG8gaXQgPSBzX2VwaGVtZXJhbF91c2Vycy5maW5kKHVzZXJfaWQpOwogICAgIGlmIChpdCAhPSBzX2VwaGVtZXJhbF91c2Vycy5lbmQoKSkgewogICAgICAgICBzX2VwaGVtZXJhbF91c2Vycy5lcmFzZShpdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0IHBhdGg6IGdldF9jZV9rZXlfcGF0aHMoZ2V0X2NlX2tleV9kaXJlY3RvcnlfcGF0aCh1c2VyX2lkKSkpIHsKKyAgICAgICAgZm9yIChhdXRvIGNvbnN0IHBhdGggOiBnZXRfY2Vfa2V5X3BhdGhzKGdldF9jZV9rZXlfZGlyZWN0b3J5X3BhdGgodXNlcl9pZCkpKSB7CiAgICAgICAgICAgICBzdWNjZXNzICY9IGFuZHJvaWQ6OnZvbGQ6OmRlc3Ryb3lLZXkocGF0aCk7CiAgICAgICAgIH0KICAgICAgICAgYXV0byBkZV9rZXlfcGF0aCA9IGdldF9kZV9rZXlfcGF0aCh1c2VyX2lkKTsKQEAgLTU1NiwxNCArNTU3LDE0IEBACiAgICAgc3RkOjpzdHJpbmcgdG9rZW4sIHNlY3JldDsKICAgICBpZiAoIXBhcnNlX2hleCh0b2tlbl9oZXgsICZ0b2tlbikpIHJldHVybiBmYWxzZTsKICAgICBpZiAoIXBhcnNlX2hleChzZWNyZXRfaGV4LCAmc2VjcmV0KSkgcmV0dXJuIGZhbHNlOwotICAgIGF1dG8gYXV0aCA9IHNlY3JldC5lbXB0eSgpID8ga0VtcHR5QXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhbmRyb2lkOjp2b2xkOjpLZXlBdXRoZW50aWNhdGlvbih0b2tlbiwgc2VjcmV0KTsKKyAgICBhdXRvIGF1dGggPQorICAgICAgICBzZWNyZXQuZW1wdHkoKSA/IGtFbXB0eUF1dGhlbnRpY2F0aW9uIDogYW5kcm9pZDo6dm9sZDo6S2V5QXV0aGVudGljYXRpb24odG9rZW4sIHNlY3JldCk7CiAgICAgYXV0byBpdCA9IHNfY2Vfa2V5cy5maW5kKHVzZXJfaWQpOwogICAgIGlmIChpdCA9PSBzX2NlX2tleXMuZW5kKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiS2V5IG5vdCBsb2FkZWQgaW50byBtZW1vcnksIGNhbid0IGNoYW5nZSBmb3IgdXNlciAiIDw8IHVzZXJfaWQ7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgY29uc3QgYXV0byAmY2Vfa2V5ID0gaXQtPnNlY29uZDsKKyAgICBjb25zdCBhdXRvJiBjZV9rZXkgPSBpdC0+c2Vjb25kOwogICAgIGF1dG8gY29uc3QgZGlyZWN0b3J5X3BhdGggPSBnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpOwogICAgIGF1dG8gY29uc3QgcGF0aHMgPSBnZXRfY2Vfa2V5X3BhdGhzKGRpcmVjdG9yeV9wYXRoKTsKICAgICBzdGQ6OnN0cmluZyBjZV9rZXlfcGF0aDsKQEAgLTY3MCw3ICs2NzEsOCBAQAogICAgICAgICAgICAgaWYgKCFwcmVwYXJlX2RpcihzeXN0ZW1fbGVnYWN5X3BhdGgsIDA3MDAsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pKSByZXR1cm4gZmFsc2U7CiAjaWYgTUFOQUdFX01JU0NfRElSUwogICAgICAgICAgICAgaWYgKCFwcmVwYXJlX2RpcihtaXNjX2xlZ2FjeV9wYXRoLCAwNzUwLCBtdWx0aXVzZXJfZ2V0X3VpZCh1c2VyX2lkLCBBSURfU1lTVEVNKSwKLSAgICAgICAgICAgICAgICAgICAgbXVsdGl1c2VyX2dldF91aWQodXNlcl9pZCwgQUlEX0VWRVJZQk9EWSkpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpdXNlcl9nZXRfdWlkKHVzZXJfaWQsIEFJRF9FVkVSWUJPRFkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAjZW5kaWYKICAgICAgICAgICAgIGlmICghcHJlcGFyZV9kaXIocHJvZmlsZXNfZGVfcGF0aCwgMDc3MSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkpIHJldHVybiBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvRmlsZURldmljZVV0aWxzLmNwcCBiL0ZpbGVEZXZpY2VVdGlscy5jcHAKaW5kZXggYmM5ZjRiZC4uY2U5MzhhOSAxMDA2NDQKLS0tIGEvRmlsZURldmljZVV0aWxzLmNwcAorKysgYi9GaWxlRGV2aWNlVXRpbHMuY3BwCkBAIC0xNiwxNSArMTYsMTUgQEAKIAogI2luY2x1ZGUgIkZpbGVEZXZpY2VVdGlscy5oIgogCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgotI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgpAQCAtNDAsMzggKzQwLDMzIEBACiBuYW1lc3BhY2Ugdm9sZCB7CiAKIC8vIEdpdmVuIGEgZmlsZSBwYXRoLCBsb29rIGZvciB0aGUgY29ycmVzcG9uZGluZyBibG9jayBkZXZpY2UgaW4gL3Byb2MvbW91bnQKLXN0ZDo6c3RyaW5nIEJsb2NrRGV2aWNlRm9yUGF0aChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkKLXsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgaW50KCopKEZJTEUqKT4gbW50cyhzZXRtbnRlbnQoIi9wcm9jL21vdW50cyIsICJyZSIpLCBlbmRtbnRlbnQpOworc3RkOjpzdHJpbmcgQmxvY2tEZXZpY2VGb3JQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGludCAoKikoRklMRSopPiBtbnRzKHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInJlIiksIGVuZG1udGVudCk7CiAgICAgaWYgKCFtbnRzKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gb3BlbiAvcHJvYy9tb3VudHMiOwogICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKICAgICBzaXplX3QgYmVzdF9sZW5ndGggPSAwOwotICAgIHN0cnVjdCBtbnRlbnQgKm1udDsgLy8gZ2V0bW50ZW50IHJldHVybnMgYSB0aHJlYWQgbG9jYWwsIHNvIGl0J3Mgc2FmZS4KKyAgICBzdHJ1Y3QgbW50ZW50KiBtbnQ7ICAvLyBnZXRtbnRlbnQgcmV0dXJucyBhIHRocmVhZCBsb2NhbCwgc28gaXQncyBzYWZlLgogICAgIHdoaWxlICgobW50ID0gZ2V0bW50ZW50KG1udHMuZ2V0KCkpKSAhPSBudWxscHRyKSB7CiAgICAgICAgIGF1dG8gbCA9IHN0cmxlbihtbnQtPm1udF9kaXIpOwotICAgICAgICBpZiAobCA+IGJlc3RfbGVuZ3RoICYmCi0gICAgICAgICAgICBwYXRoLnNpemUoKSA+IGwgJiYKLSAgICAgICAgICAgIHBhdGhbbF0gPT0gJy8nICYmCisgICAgICAgIGlmIChsID4gYmVzdF9sZW5ndGggJiYgcGF0aC5zaXplKCkgPiBsICYmIHBhdGhbbF0gPT0gJy8nICYmCiAgICAgICAgICAgICBwYXRoLmNvbXBhcmUoMCwgbCwgbW50LT5tbnRfZGlyKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbW50LT5tbnRfZnNuYW1lOwotICAgICAgICAgICAgICAgIGJlc3RfbGVuZ3RoID0gbDsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1udC0+bW50X2ZzbmFtZTsKKyAgICAgICAgICAgIGJlc3RfbGVuZ3RoID0gbDsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocmVzdWx0LmVtcHR5KCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCJEaWRuJ3QgZmluZCBhIG1vdW50cG9pbnQgdG8gbWF0Y2ggcGF0aCAiIDw8IHBhdGg7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkRpZG4ndCBmaW5kIGEgbW91bnRwb2ludCB0byBtYXRjaCBwYXRoICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KICAgICBMT0coREVCVUcpIDw8ICJGb3IgcGF0aCAiIDw8IHBhdGggPDwgIiBibG9jayBkZXZpY2UgaXMgIiA8PCByZXN1bHQ7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IFBhdGhGaWVtYXAoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIHVpbnQzMl90IGV4dGVudF9jb3VudCkKLXsKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oCi0gICAgICAgIHBhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMsIDApKSk7CitzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gUGF0aEZpZW1hcChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgdWludDMyX3QgZXh0ZW50X2NvdW50KSB7CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHBhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMsIDApKSk7CiAgICAgaWYgKGZkID09IC0xKSB7CiAgICAgICAgIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKICAgICAgICAgICAgIFBMT0coREVCVUcpIDw8ICJVbmFibGUgdG8gb3BlbiAiIDw8IHBhdGg7CkBAIC04OCw3ICs4Myw3IEBACiAgICAgYXV0byBtYXBwZWQgPSBmaWVtYXAtPmZtX21hcHBlZF9leHRlbnRzOwogICAgIGlmIChtYXBwZWQgPCAxIHx8IG1hcHBlZCA+IGV4dGVudF9jb3VudCkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJFeHRlbnQgY291bnQgbm90IGluIGJvdW5kcyAxIDw9ICIgPDwgbWFwcGVkIDw8ICIgPD0gIiA8PCBleHRlbnRfY291bnQKLSAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwYXRoOworICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwYXRoOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAgICAgcmV0dXJuIGZpZW1hcDsKQEAgLTk5LDEwICs5NCw5IEBACiAKIG5hbWVzcGFjZSB7CiAKLXN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiBhbGxvY19maWVtYXAodWludDMyX3QgZXh0ZW50X2NvdW50KQoteworc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IGFsbG9jX2ZpZW1hcCh1aW50MzJfdCBleHRlbnRfY291bnQpIHsKICAgICBzaXplX3QgYWxsb2NzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGZpZW1hcCwgZm1fZXh0ZW50c1tleHRlbnRfY291bnRdKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gcmVzKG5ldyAoOjpvcGVyYXRvciBuZXcgKGFsbG9jc2l6ZSkpIHN0cnVjdCBmaWVtYXApOworICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiByZXMobmV3ICg6Om9wZXJhdG9yIG5ldyhhbGxvY3NpemUpKSBzdHJ1Y3QgZmllbWFwKTsKICAgICBtZW1zZXQocmVzLmdldCgpLCAwLCBhbGxvY3NpemUpOwogICAgIHJlcy0+Zm1fc3RhcnQgPSAwOwogICAgIHJlcy0+Zm1fbGVuZ3RoID0gVUlOVDY0X01BWDsKQEAgLTExMiw0ICsxMDYsNCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLX0KK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvRmlsZURldmljZVV0aWxzLmggYi9GaWxlRGV2aWNlVXRpbHMuaAppbmRleCA0YzFkNDlhLi40NDI4Y2VmIDEwMDY0NAotLS0gYS9GaWxlRGV2aWNlVXRpbHMuaAorKysgYi9GaWxlRGV2aWNlVXRpbHMuaApAQCAtMTcsMTcgKzE3LDE3IEBACiAjaWZuZGVmIEFORFJPSURfVk9MRF9GSUxFREVWSUNFVVRJTFNfSAogI2RlZmluZSBBTkRST0lEX1ZPTERfRklMRURFVklDRVVUSUxTX0gKIAotI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB2b2xkIHsKIAogLy8gR2l2ZW4gYSBmaWxlIHBhdGgsIGxvb2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGRldmljZSBpbiAvcHJvYy9tb3VudAotc3RkOjpzdHJpbmcgQmxvY2tEZXZpY2VGb3JQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKK3N0ZDo6c3RyaW5nIEJsb2NrRGV2aWNlRm9yUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAKIC8vIFJlYWQgdGhlIGZpbGUncyBGSUVNQVAKLXN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiBQYXRoRmllbWFwKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoLCB1aW50MzJfdCBleHRlbnRfY291bnQpOworc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IFBhdGhGaWVtYXAoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHVpbnQzMl90IGV4dGVudF9jb3VudCk7CiAKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvSWRsZU1haW50LmNwcCBiL0lkbGVNYWludC5jcHAKaW5kZXggNzc0NDAyNC4uNzk4OTRmYyAxMDA2NDQKLS0tIGEvSWRsZU1haW50LmNwcAorKysgYi9JZGxlTWFpbnQuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgIklkbGVNYWludC5oIgorI2luY2x1ZGUgIkZpbGVEZXZpY2VVdGlscy5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogI2luY2x1ZGUgIm1vZGVsL1ByaXZhdGVWb2x1bWUuaCIKQEAgLTIzLDE4ICsyNCwyMCBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2Nocm9ub191dGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9oZWFsdGgvc3RvcmFnZS8xLjAvSVN0b3JhZ2UuaD4KICNpbmNsdWRlIDxmc19tZ3IuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZzsKQEAgLTQyLDYgKzQ1LDExIEBACiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpUaW1lcjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6c3RvcmFnZTo6VjFfMDo6SUdhcmJhZ2VDb2xsZWN0Q2FsbGJhY2s7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGVhbHRoOjpzdG9yYWdlOjpWMV8wOjpJU3RvcmFnZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OnN0b3JhZ2U6OlYxXzA6OlJlc3VsdDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewpAQCAtNzIsOCArODAsNyBAQAogc3RhdGljIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGN2X2Fib3J0LCBjdl9zdG9wOwogc3RhdGljIHN0ZDo6bXV0ZXggY3ZfbTsKIAotc3RhdGljIHZvaWQgYWRkRnJvbVZvbHVtZU1hbmFnZXIoc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiogcGF0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoVHlwZXMgcGF0aF90eXBlKSB7CitzdGF0aWMgdm9pZCBhZGRGcm9tVm9sdW1lTWFuYWdlcihzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+KiBwYXRocywgUGF0aFR5cGVzIHBhdGhfdHlwZSkgewogICAgIFZvbHVtZU1hbmFnZXIqIHZtID0gVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKTsKICAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IHByaXZhdGVJZHM7CiAgICAgdm0tPmxpc3RWb2x1bWVzKFZvbHVtZUJhc2U6OlR5cGU6OmtQcml2YXRlLCBwcml2YXRlSWRzKTsKQEAgLTg1LDEzICs5MiwxMSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoX3R5cGUgPT0gUGF0aFR5cGVzOjprQmxrRGV2aWNlKSB7CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2NfcGF0aDsKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNfdHlwZSA9IHZvbC0+Z2V0RnNUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZzX3R5cGUgPT0gImYyZnMiICYmCi0gICAgICAgICAgICAgICAgICAgIFJlYWxwYXRoKHZvbC0+Z2V0UmF3RGV2UGF0aCgpLCAmZ2NfcGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aHMtPnB1c2hfYmFjayhzdGQ6OnN0cmluZygiL3N5cy9mcy8iKSArIGZzX3R5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiArIEJhc2VuYW1lKGdjX3BhdGgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZnNfdHlwZSA9PSAiZjJmcyIgJiYgKFJlYWxwYXRoKHZvbC0+Z2V0UmF3RG1EZXZQYXRoKCksICZnY19wYXRoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbHBhdGgodm9sLT5nZXRSYXdEZXZQYXRoKCksICZnY19wYXRoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aHMtPnB1c2hfYmFjayhzdGQ6OnN0cmluZygiL3N5cy9mcy8iKSArIGZzX3R5cGUgKyAiLyIgKyBCYXNlbmFtZShnY19wYXRoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCiAgICAgICAgIH0KICAgICB9CiB9CkBAIC05OSw3ICsxMDQsNyBAQAogc3RhdGljIHZvaWQgYWRkRnJvbUZzdGFiKHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4qIHBhdGhzLCBQYXRoVHlwZXMgcGF0aF90eXBlKSB7CiAgICAgc3RkOjp1bmlxdWVfcHRyPGZzdGFiLCBkZWNsdHlwZSgmZnNfbWdyX2ZyZWVfZnN0YWIpPiBmc3RhYihmc19tZ3JfcmVhZF9mc3RhYl9kZWZhdWx0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19tZ3JfZnJlZV9mc3RhYik7Ci0gICAgc3RydWN0IGZzdGFiX3JlYyAqcHJldl9yZWMgPSBOVUxMOworICAgIHN0cnVjdCBmc3RhYl9yZWMqIHByZXZfcmVjID0gTlVMTDsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnN0YWItPm51bV9lbnRyaWVzOyBpKyspIHsKICAgICAgICAgYXV0byBmc190eXBlID0gc3RkOjpzdHJpbmcoZnN0YWItPnJlY3NbaV0uZnNfdHlwZSk7CkBAIC0xMzAsOSArMTM1LDExIEBACiAgICAgICAgIH0gZWxzZSBpZiAocGF0aF90eXBlID09IFBhdGhUeXBlczo6a0Jsa0RldmljZSkgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2NfcGF0aDsKICAgICAgICAgICAgIGlmIChzdGQ6OnN0cmluZyhmc3RhYi0+cmVjc1tpXS5mc190eXBlKSA9PSAiZjJmcyIgJiYKLSAgICAgICAgICAgICAgICBSZWFscGF0aChmc3RhYi0+cmVjc1tpXS5ibGtfZGV2aWNlLCAmZ2NfcGF0aCkpIHsKLSAgICAgICAgICAgICAgICBwYXRocy0+cHVzaF9iYWNrKHN0ZDo6c3RyaW5nKCIvc3lzL2ZzLyIpICsgZnN0YWItPnJlY3NbaV0uZnNfdHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKyBCYXNlbmFtZShnY19wYXRoKSk7CisgICAgICAgICAgICAgICAgUmVhbHBhdGgoCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnZvbGQ6OkJsb2NrRGV2aWNlRm9yUGF0aChzdGQ6OnN0cmluZyhmc3RhYi0+cmVjc1tpXS5tb3VudF9wb2ludCkgKyAiLyIpLAorICAgICAgICAgICAgICAgICAgICAmZ2NfcGF0aCkpIHsKKyAgICAgICAgICAgICAgICBwYXRocy0+cHVzaF9iYWNrKHN0ZDo6c3RyaW5nKCIvc3lzL2ZzLyIpICsgZnN0YWItPnJlY3NbaV0uZnNfdHlwZSArICIvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlbmFtZShnY19wYXRoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTc1LDggKzE4Miw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuc2Vjc190IHRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKSAtIHN0YXJ0OwotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJUcmltbWVkICIgPDwgcmFuZ2UubGVuIDw8ICIgYnl0ZXMgb24gIiA8PCBwYXRoCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHModGltZSkgPDwgIm1zIjsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVHJpbW1lZCAiIDw8IHJhbmdlLmxlbiA8PCAiIGJ5dGVzIG9uICIgPDwgcGF0aCA8PCAiIGluICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHModGltZSkgPDwgIm1zIjsKICAgICAgICAgICAgIGV4dHJhcy5wdXRMb25nKFN0cmluZzE2KCJieXRlcyIpLCByYW5nZS5sZW4pOwogICAgICAgICAgICAgZXh0cmFzLnB1dExvbmcoU3RyaW5nMTYoInRpbWUiKSwgdGltZSk7CiAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKQEAgLTIyMSw4ICsyMjgsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgbGsubG9jaygpOwotICAgICAgICBhYm9ydGVkID0gY3ZfYWJvcnQud2FpdF9mb3IobGssIDEwcywgW117Ci0gICAgICAgICAgICByZXR1cm4gaWRsZV9tYWludF9zdGF0ID09IElkbGVNYWludFN0YXRzOjprQWJvcnQ7fSk7CisgICAgICAgIGFib3J0ZWQgPQorICAgICAgICAgICAgY3ZfYWJvcnQud2FpdF9mb3IobGssIDEwcywgW10geyByZXR1cm4gaWRsZV9tYWludF9zdGF0ID09IElkbGVNYWludFN0YXRzOjprQWJvcnQ7IH0pOwogICAgICAgICBsay51bmxvY2soKTsKICAgICB9CiAKQEAgLTI1NSwxMCArMjYyLDEwIEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwogfQogCi1zdGF0aWMgdm9pZCBydW5EZXZHYyh2b2lkKSB7CitzdGF0aWMgdm9pZCBydW5EZXZHY0ZzdGFiKHZvaWQpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZnN0YWIsIGRlY2x0eXBlKCZmc19tZ3JfZnJlZV9mc3RhYik+IGZzdGFiKGZzX21ncl9yZWFkX2ZzdGFiX2RlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX21ncl9mcmVlX2ZzdGFiKTsKLSAgICBzdHJ1Y3QgZnN0YWJfcmVjICpyZWMgPSBOVUxMOworICAgIHN0cnVjdCBmc3RhYl9yZWMqIHJlYyA9IE5VTEw7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZzdGFiLT5udW1fZW50cmllczsgaSsrKSB7CiAgICAgICAgIGlmIChmc19tZ3JfaGFzX3N5c2ZzX3BhdGgoJmZzdGFiLT5yZWNzW2ldKSkgewpAQCAtMjgyLDcgKzI4OSw3IEBACiAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJSZWFkaW5nIG1hbnVhbF9nYyBmYWlsZWQgaW4gIiA8PCBwYXRoOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQorICAgICAgICByZXF1aXJlID0gYW5kcm9pZDo6YmFzZTo6VHJpbShyZXF1aXJlKTsKICAgICAgICAgaWYgKHJlcXVpcmUgPT0gIiIgfHwgcmVxdWlyZSA9PSAib2ZmIiB8fCByZXF1aXJlID09ICJkaXNhYmxlZCIpIHsKICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIk5vIG1vcmUgdG8gZG8gRGV2IEdDIjsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzA3LDYgKzMxNCw1NyBAQAogICAgIHJldHVybjsKIH0KIAorY2xhc3MgR2NDYWxsYmFjayA6IHB1YmxpYyBJR2FyYmFnZUNvbGxlY3RDYWxsYmFjayB7CisgIHB1YmxpYzoKKyAgICBSZXR1cm48dm9pZD4gb25GaW5pc2goUmVzdWx0IHJlc3VsdCkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgbVJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgbUN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgdm9pZCB3YWl0KHVpbnQ2NF90IHNlY29uZHMpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1Ddi53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6c2Vjb25kcyhzZWNvbmRzKSwgW3RoaXNdIHsgcmV0dXJuIG1GaW5pc2hlZDsgfSk7CisKKyAgICAgICAgaWYgKCFtRmluaXNoZWQpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRGV2IEdDIG9uIEhBTCB0aW1lb3V0IjsKKyAgICAgICAgfSBlbHNlIGlmIChtUmVzdWx0ICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJEZXYgR0Mgb24gSEFMIGZhaWxlZCB3aXRoICIgPDwgdG9TdHJpbmcobVJlc3VsdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkRldiBHQyBvbiBIQUwgc3VjY2Vzc2Z1bCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3Y7CisgICAgYm9vbCBtRmluaXNoZWR7ZmFsc2V9OworICAgIFJlc3VsdCBtUmVzdWx0e1Jlc3VsdDo6VU5LTk9XTl9FUlJPUn07Cit9OworCitzdGF0aWMgdm9pZCBydW5EZXZHY09uSGFsKHNwPElTdG9yYWdlPiBzZXJ2aWNlKSB7CisgICAgTE9HKERFQlVHKSA8PCAiU3RhcnQgRGV2IEdDIG9uIEhBTCI7CisgICAgc3A8R2NDYWxsYmFjaz4gY2IgPSBuZXcgR2NDYWxsYmFjaygpOworICAgIGF1dG8gcmV0ID0gc2VydmljZS0+Z2FyYmFnZUNvbGxlY3QoREVWR0NfVElNRU9VVF9TRUMsIGNiKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJDYW5ub3Qgc3RhcnQgRGV2IEdDIG9uIEhBTDogIiA8PCByZXQuZGVzY3JpcHRpb24oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYi0+d2FpdChERVZHQ19USU1FT1VUX1NFQyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bkRldkdjKHZvaWQpIHsKKyAgICBhdXRvIHNlcnZpY2UgPSBJU3RvcmFnZTo6Z2V0U2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcnVuRGV2R2NPbkhhbChzZXJ2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBmYWxsYmFjayB0byBsZWdhY3kgY29kZSBwYXRoCisgICAgICAgIHJ1bkRldkdjRnN0YWIoKTsKKyAgICB9Cit9CisKIGludCBSdW5JZGxlTWFpbnQoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKGN2X20pOwogICAgIGlmIChpZGxlX21haW50X3N0YXQgIT0gSWRsZU1haW50U3RhdHM6OmtTdG9wcGVkKSB7CkBAIC0zNjcsOCArNDI1LDcgQEAKICAgICAgICAgY3ZfYWJvcnQubm90aWZ5X29uZSgpOwogICAgICAgICBsay5sb2NrKCk7CiAgICAgICAgIExPRyhERUJVRykgPDwgImFib3J0aW5nIGlkbGUgbWFpbnRlbmFuY2UiOwotICAgICAgICBjdl9zdG9wLndhaXQobGssIFtdewotICAgICAgICAgICAgcmV0dXJuIGlkbGVfbWFpbnRfc3RhdCA9PSBJZGxlTWFpbnRTdGF0czo6a1N0b3BwZWQ7fSk7CisgICAgICAgIGN2X3N0b3Aud2FpdChsaywgW10geyByZXR1cm4gaWRsZV9tYWludF9zdGF0ID09IElkbGVNYWludFN0YXRzOjprU3RvcHBlZDsgfSk7CiAgICAgfQogICAgIGxrLnVubG9jaygpOwogCmRpZmYgLS1naXQgYS9LZXlCdWZmZXIuY3BwIGIvS2V5QnVmZmVyLmNwcAppbmRleCBlN2FlZGU1Li41NjMzYmY4IDEwMDY0NAotLS0gYS9LZXlCdWZmZXIuY3BwCisrKyBiL0tleUJ1ZmZlci5jcHAKQEAgLTM0LDQgKzM0LDMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL0tleUJ1ZmZlci5oIGIvS2V5QnVmZmVyLmgKaW5kZXggMjA4NzE4Ny4uYTY4MzExZiAxMDA2NDQKLS0tIGEvS2V5QnVmZmVyLmgKKysrIGIvS2V5QnVmZmVyLmgKQEAgLTMzLDE3ICszMywxNSBAQAogI2RlZmluZSBPUFROT05FIF9fYXR0cmlidXRlX18oKG9wdGltaXplKCJPMCIpKSkKICNlbmRpZiAgLy8gbm90IF9fY2xhbmdfXwogaW5saW5lIE9QVE5PTkUgdm9pZCogbWVtc2V0X3Modm9pZCogcywgaW50IGMsIHNpemVfdCBuKSB7Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4gczsKKyAgICBpZiAoIXMpIHJldHVybiBzOwogICAgIHJldHVybiBtZW1zZXQocywgYywgbik7CiB9CiAjdW5kZWYgT1BUTk9ORQogCiAvLyBBbGxvY2F0b3IgdGhhdCBkZWxlZ2F0ZXMgdXNlZnVsIHdvcmsgdG8gc3RhbmRhcmQgb25lIGJ1dCB6ZXJvZXMgZGF0YSBiZWZvcmUgZGVhbGxvY2F0aW5nLgogY2xhc3MgWmVyb2luZ0FsbG9jYXRvciA6IHB1YmxpYyBzdGQ6OmFsbG9jYXRvcjxjaGFyPiB7Ci0gICAgcHVibGljOgotICAgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIHAsIHNpemVfdHlwZSBuKQotICAgIHsKKyAgcHVibGljOgorICAgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIHAsIHNpemVfdHlwZSBuKSB7CiAgICAgICAgIG1lbXNldF9zKHAsIDAsIG4pOwogICAgICAgICBzdGQ6OmFsbG9jYXRvcjxjaGFyPjo6ZGVhbGxvY2F0ZShwLCBuKTsKICAgICB9CkBAIC02MCw0ICs1OCwzIEBACiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvS2V5U3RvcmFnZS5jcHAgYi9LZXlTdG9yYWdlLmNwcAppbmRleCAwNTE4OTMwLi4wMzVjN2I3IDEwMDY0NAotLS0gYS9LZXlTdG9yYWdlLmNwcAorKysgYi9LZXlTdG9yYWdlLmNwcApAQCAtNTY4LDcgKzU2OCwxMCBAQAogICAgICAgICBzdWNjZXNzICY9IGRlbGV0ZUtleShkaXIpOwogICAgIH0KICAgICBhdXRvIHNlY2Rpc2NhcmRfY21kID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ewotICAgICAgICBrU2VjZGlzY2FyZFBhdGgsICItLSIsIGRpciArICIvIiArIGtGbl9lbmNyeXB0ZWRfa2V5LCBkaXIgKyAiLyIgKyBrRm5fc2VjZGlzY2FyZGFibGUsCisgICAgICAgIGtTZWNkaXNjYXJkUGF0aCwKKyAgICAgICAgIi0tIiwKKyAgICAgICAgZGlyICsgIi8iICsga0ZuX2VuY3J5cHRlZF9rZXksCisgICAgICAgIGRpciArICIvIiArIGtGbl9zZWNkaXNjYXJkYWJsZSwKICAgICB9OwogICAgIGlmICh1c2VzX2ttKSB7CiAgICAgICAgIHNlY2Rpc2NhcmRfY21kLmVtcGxhY2VfYmFjayhkaXIgKyAiLyIgKyBrRm5fa2V5bWFzdGVyX2tleV9ibG9iKTsKZGlmZiAtLWdpdCBhL0tleVV0aWwuY3BwIGIvS2V5VXRpbC5jcHAKaW5kZXggOTg4NTQ0MC4uMjliYTY5OSAxMDA2NDQKLS0tIGEvS2V5VXRpbC5jcHAKKysrIGIvS2V5VXRpbC5jcHAKQEAgLTg4LDEyICs4OCw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBjaGFyIGNvbnN0KiBjb25zdCBOQU1FX1BSRUZJWEVTW10gPSB7Ci0gICAgImV4dDQiLAotICAgICJmMmZzIiwKLSAgICAiZnNjcnlwdCIsCi0gICAgbnVsbHB0cgotfTsKK3N0YXRpYyBjaGFyIGNvbnN0KiBjb25zdCBOQU1FX1BSRUZJWEVTW10gPSB7ImV4dDQiLCAiZjJmcyIsICJmc2NyeXB0IiwgbnVsbHB0cn07CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBrZXluYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdfcmVmKSB7CiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CkBAIC0xMTksNyArMTE0LDcgQEAKIGJvb2wgaW5zdGFsbEtleShjb25zdCBLZXlCdWZmZXImIGtleSwgc3RkOjpzdHJpbmcqIHJhd19yZWYpIHsKICAgICAvLyBQbGFjZSBleHQ0X2VuY3J5cHRpb25fa2V5IGludG8gYXV0b21hdGljYWxseSB6ZXJvaW5nIGJ1ZmZlci4KICAgICBLZXlCdWZmZXIgZXh0NEtleUJ1ZmZlcihzaXplb2YoZXh0NF9lbmNyeXB0aW9uX2tleSkpOwotICAgIGV4dDRfZW5jcnlwdGlvbl9rZXkgJmV4dDRfa2V5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8ZXh0NF9lbmNyeXB0aW9uX2tleSo+KGV4dDRLZXlCdWZmZXIuZGF0YSgpKTsKKyAgICBleHQ0X2VuY3J5cHRpb25fa2V5JiBleHQ0X2tleSA9ICpyZWludGVycHJldF9jYXN0PGV4dDRfZW5jcnlwdGlvbl9rZXkqPihleHQ0S2V5QnVmZmVyLmRhdGEoKSk7CiAKICAgICBpZiAoIWZpbGxLZXkoa2V5LCAmZXh0NF9rZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgKnJhd19yZWYgPSBnZW5lcmF0ZUtleVJlZihleHQ0X2tleS5yYXcsIGV4dDRfa2V5LnNpemUpOwpAQCAtMTcwLDggKzE2NSw4IEBACiAgICAgICAgIGlmICghcmV0cmlldmVLZXkoa2V5X3BhdGgsIGtleV9hdXRoZW50aWNhdGlvbiwgJmtleSkpIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIWNyZWF0ZV9pZl9hYnNlbnQpIHsKLSAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8ga2V5IGZvdW5kIGluICIgPDwga2V5X3BhdGg7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGtleSBmb3VuZCBpbiAiIDw8IGtleV9wYXRoOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgbmV3IGtleSBpbiAiIDw8IGtleV9wYXRoOwogICAgICAgICBpZiAoIXJhbmRvbUtleSgma2V5KSkgcmV0dXJuIGZhbHNlOwpAQCAtMTg1LDIwICsxODAsMTkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCByZXRyaWV2ZUtleShib29sIGNyZWF0ZV9pZl9hYnNlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfcGF0aCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcF9wYXRoLCBLZXlCdWZmZXIqIGtleSkgeworYm9vbCByZXRyaWV2ZUtleShib29sIGNyZWF0ZV9pZl9hYnNlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcF9wYXRoLAorICAgICAgICAgICAgICAgICBLZXlCdWZmZXIqIGtleSkgewogICAgIGlmIChwYXRoRXhpc3RzKGtleV9wYXRoKSkgewogICAgICAgICBMT0coREVCVUcpIDw8ICJLZXkgZXhpc3RzLCB1c2luZzogIiA8PCBrZXlfcGF0aDsKICAgICAgICAgaWYgKCFyZXRyaWV2ZUtleShrZXlfcGF0aCwga0VtcHR5QXV0aGVudGljYXRpb24sIGtleSkpIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIWNyZWF0ZV9pZl9hYnNlbnQpIHsKLSAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8ga2V5IGZvdW5kIGluICIgPDwga2V5X3BhdGg7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGtleSBmb3VuZCBpbiAiIDw8IGtleV9wYXRoOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgbmV3IGtleSBpbiAiIDw8IGtleV9wYXRoOwogICAgICAgICBpZiAoIXJhbmRvbUtleShrZXkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghc3RvcmVLZXlBdG9taWNhbGx5KGtleV9wYXRoLCB0bXBfcGF0aCwKLSAgICAgICAgICAgICAgICBrRW1wdHlBdXRoZW50aWNhdGlvbiwgKmtleSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFzdG9yZUtleUF0b21pY2FsbHkoa2V5X3BhdGgsIHRtcF9wYXRoLCBrRW1wdHlBdXRoZW50aWNhdGlvbiwgKmtleSkpIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9LZXlVdGlsLmggYi9LZXlVdGlsLmgKaW5kZXggYTg1ZWNhMS4uYjQxMTVmNCAxMDA2NDQKLS0tIGEvS2V5VXRpbC5oCisrKyBiL0tleVV0aWwuaApAQCAtMjAsOCArMjAsOCBAQAogI2luY2x1ZGUgIktleUJ1ZmZlci5oIgogI2luY2x1ZGUgIktleVN0b3JhZ2UuaCIKIAotI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CkBAIC0zMiw4ICszMiw4IEBACiBib29sIHJldHJpZXZlQW5kSW5zdGFsbEtleShib29sIGNyZWF0ZV9pZl9hYnNlbnQsIGNvbnN0IEtleUF1dGhlbnRpY2F0aW9uJiBrZXlfYXV0aGVudGljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bXBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBrZXlfcmVmKTsKLWJvb2wgcmV0cmlldmVLZXkoYm9vbCBjcmVhdGVfaWZfYWJzZW50LCBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3BhdGgsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bXBfcGF0aCwgS2V5QnVmZmVyKiBrZXkpOworYm9vbCByZXRyaWV2ZUtleShib29sIGNyZWF0ZV9pZl9hYnNlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcF9wYXRoLAorICAgICAgICAgICAgICAgICBLZXlCdWZmZXIqIGtleSk7CiAKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvTG9vcC5jcHAgYi9Mb29wLmNwcAppbmRleCAzMzVjYTEzLi40OTI2ZWE4IDEwMDY0NAotLS0gYS9Mb29wLmNwcAorKysgYi9Mb29wLmNwcApAQCAtMTYsMjQgKzE2LDI0IEBACiAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1BBQ0tBR0VfTUFOQUdFUgogCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTc5LDcgKzc5LDcgQEAKIAogICAgIHN0cnVjdCBsb29wX2luZm82NCBsaTsKICAgICBtZW1zZXQoJmxpLCAwLCBzaXplb2YobGkpKTsKLSAgICBzdHJsY3B5KChjaGFyKikgbGkubG9fY3J5cHRfbmFtZSwga1ZvbGRQcmVmaXgsIExPX05BTUVfU0laRSk7CisgICAgc3RybGNweSgoY2hhciopbGkubG9fY3J5cHRfbmFtZSwga1ZvbGRQcmVmaXgsIExPX05BTUVfU0laRSk7CiAgICAgaWYgKGlvY3RsKGRldmljZV9mZC5nZXQoKSwgTE9PUF9TRVRfU1RBVFVTNjQsICZsaSkgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBMT09QX1NFVF9TVEFUVVM2NCI7CiAgICAgICAgIHJldHVybiAtZXJybm87CkBAIC04OCw3ICs4OCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBMb29wOjpkZXN0cm95QnlEZXZpY2UoY29uc3QgY2hhciAqbG9vcERldmljZSkgeworaW50IExvb3A6OmRlc3Ryb3lCeURldmljZShjb25zdCBjaGFyKiBsb29wRGV2aWNlKSB7CiAgICAgaW50IGRldmljZV9mZDsKIAogICAgIGRldmljZV9mZCA9IG9wZW4obG9vcERldmljZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGF1dG8gaWQgPSBzdGQ6OnN0cmluZygoY2hhciopIGxpLmxvX2NyeXB0X25hbWUpOworICAgICAgICBhdXRvIGlkID0gc3RkOjpzdHJpbmcoKGNoYXIqKWxpLmxvX2NyeXB0X25hbWUpOwogICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChpZCwga1ZvbGRQcmVmaXgpKSB7CiAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJUZWFyaW5nIGRvd24gc3RhbGUgbG9vcCBkZXZpY2UgYXQgIiA8PCBwYXRoIDw8ICIgbmFtZWQgIiA8PCBpZDsKIApAQCAtMTQ2LDE0ICsxNDYsMTQgQEAKICAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gTE9PUF9DTFJfRkQgIiA8PCBwYXRoOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGb3VuZCB1bm1hbmFnZWQgbG9vcCBkZXZpY2UgYXQgIiA8PCBwYXRoIDw8ICIgbmFtZWQgIiA8PCBpZDsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIkZvdW5kIHVubWFuYWdlZCBsb29wIGRldmljZSBhdCAiIDw8IHBhdGggPDwgIiBuYW1lZCAiIDw8IGlkOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBMb29wOjpjcmVhdGVJbWFnZUZpbGUoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKSB7CitpbnQgTG9vcDo6Y3JlYXRlSW1hZ2VGaWxlKGNvbnN0IGNoYXIqIGZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycykgewogICAgIHVuaXF1ZV9mZCBmZChvcGVuKGZpbGUsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2MDApKTsKICAgICBpZiAoZmQuZ2V0KCkgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgaW1hZ2UgIiA8PCBmaWxlOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBMb29wOjpyZXNpemVJbWFnZUZpbGUoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKSB7CitpbnQgTG9vcDo6cmVzaXplSW1hZ2VGaWxlKGNvbnN0IGNoYXIqIGZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycykgewogICAgIGludCBmZDsKIAogICAgIGlmICgoZmQgPSBvcGVuKGZpbGUsIE9fUkRXUiB8IE9fQ0xPRVhFQykpIDwgMCkgewpkaWZmIC0tZ2l0IGEvTG9vcC5oIGIvTG9vcC5oCmluZGV4IDEzMGM1YjYuLjRlNWY5YzEgMTAwNjQ0Ci0tLSBhL0xvb3AuaAorKysgYi9Mb29wLmgKQEAgLTE3LDE5ICsxNywyMCBAQAogI2lmbmRlZiBfTE9PUF9ICiAjZGVmaW5lIF9MT09QX0gKIAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9sb29wLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogCiBjbGFzcyBMb29wIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIHN0YXRpYyBjb25zdCBpbnQgTE9PUF9NQVggPSA0MDk2OwotcHVibGljOgorCisgIHB1YmxpYzoKICAgICBzdGF0aWMgaW50IGNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgc3RkOjpzdHJpbmcmIG91dF9kZXZpY2UpOwotICAgIHN0YXRpYyBpbnQgZGVzdHJveUJ5RGV2aWNlKGNvbnN0IGNoYXIgKmxvb3BEZXZpY2UpOworICAgIHN0YXRpYyBpbnQgZGVzdHJveUJ5RGV2aWNlKGNvbnN0IGNoYXIqIGxvb3BEZXZpY2UpOwogICAgIHN0YXRpYyBpbnQgZGVzdHJveUFsbCgpOwotICAgIHN0YXRpYyBpbnQgY3JlYXRlSW1hZ2VGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycyk7Ci0gICAgc3RhdGljIGludCByZXNpemVJbWFnZUZpbGUoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKTsKKyAgICBzdGF0aWMgaW50IGNyZWF0ZUltYWdlRmlsZShjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpOworICAgIHN0YXRpYyBpbnQgcmVzaXplSW1hZ2VGaWxlKGNvbnN0IGNoYXIqIGZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycyk7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01ldGFkYXRhQ3J5cHQuY3BwIGIvTWV0YWRhdGFDcnlwdC5jcHAKaW5kZXggYzE0YjlhMi4uMDkzNDU2MyAxMDA2NDQKLS0tIGEvTWV0YWRhdGFDcnlwdC5jcHAKKysrIGIvTWV0YWRhdGFDcnlwdC5jcHAKQEAgLTE0LDEzICsxNCwxMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIktleUJ1ZmZlci5oIgogI2luY2x1ZGUgIk1ldGFkYXRhQ3J5cHQuaCIKKyNpbmNsdWRlICJLZXlCdWZmZXIuaCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dGhyZWFkPgogI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgpAQCAtMzYsMTIgKzM2LDEzIEBACiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8ZnNfbWdyLmg+CiAKKyNpbmNsdWRlICJDaGVja3BvaW50LmgiCiAjaW5jbHVkZSAiRW5jcnlwdElucGxhY2UuaCIKICNpbmNsdWRlICJLZXlTdG9yYWdlLmgiCiAjaW5jbHVkZSAiS2V5VXRpbC5oIgotI2luY2x1ZGUgInNlY29udGV4dC5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sZFV0aWwuaCIKKyNpbmNsdWRlICJzZWNvbnRleHQuaCIKIAogI2RlZmluZSBETV9DUllQVF9CVUZfU0laRSA0MDk2CiAjZGVmaW5lIFRBQkxFX0xPQURfUkVUUklFUyAxMApAQCAtNTksNyArNjAsOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGF1dG8gbW91bnRfcmMgPSBmc19tZ3JfZG9fbW91bnQoZnN0YWJfZGVmYXVsdCwgY29uc3RfY2FzdDxjaGFyKj4obW91bnRfcG9pbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4oYmxrX2RldmljZSksIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4oYmxrX2RldmljZSksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjp2b2xkOjpjcF9uZWVkc0NoZWNrcG9pbnQoKSk7CiAgICAgaWYgKHNldGV4ZWNjb24obnVsbHB0cikpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjbGVhciBzZXRleGVjY29uIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTksMzMgKzEwMSwyMiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBib29sIGdldF9udW1iZXJfb2Zfc2VjdG9ycyhjb25zdCBzdGQ6OnN0cmluZyYgcmVhbF9ibGtkZXYsIHVpbnQ2NF90ICpucl9zZWMpIHsKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZGV2X2ZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKAotICAgICAgICByZWFsX2Jsa2Rldi5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQywgMCkpKTsKLSAgICBpZiAoZGV2X2ZkID09IC0xKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gb3BlbiAiIDw8IHJlYWxfYmxrZGV2IDw8ICIgdG8gbWVhc3VyZSBzaXplIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB1bnNpZ25lZCBsb25nIHJlczsKLSAgICAvLyBUT0RPOiBzaG91bGQgdXNlIEJMS0dFVFNJWkU2NAotICAgIGdldF9ibGtkZXZfc2l6ZShkZXZfZmQuZ2V0KCksICZyZXMpOwotICAgIGlmIChyZXMgPT0gMCkgeworc3RhdGljIGJvb2wgZ2V0X251bWJlcl9vZl9zZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFsX2Jsa2RldiwgdWludDY0X3QqIG5yX3NlYykgeworICAgIGlmIChhbmRyb2lkOjp2b2xkOjpHZXRCbG9ja0RldjUxMlNlY3RvcnMocmVhbF9ibGtkZXYsIG5yX3NlYykgIT0gYW5kcm9pZDo6T0spIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBtZWFzdXJlIHNpemUgb2YgIiA8PCByZWFsX2Jsa2RldjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAqbnJfc2VjID0gcmVzOwogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGRtX2lvY3RsKiBkbV9pb2N0bF9pbml0KGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG1fbmFtZSkgeworc3RhdGljIHN0cnVjdCBkbV9pb2N0bCogZG1faW9jdGxfaW5pdChjaGFyKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRtX25hbWUpIHsKICAgICBpZiAoYnVmZmVyX3NpemUgPCBzaXplb2YoZG1faW9jdGwpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgImRtX2lvY3RsIGJ1ZmZlciB0b28gc21hbGwiOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKICAgICBtZW1zZXQoYnVmZmVyLCAwLCBidWZmZXJfc2l6ZSk7Ci0gICAgc3RydWN0IGRtX2lvY3RsKiBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKSBidWZmZXI7CisgICAgc3RydWN0IGRtX2lvY3RsKiBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjsKICAgICBpby0+ZGF0YV9zaXplID0gYnVmZmVyX3NpemU7CiAgICAgaW8tPmRhdGFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKICAgICBpby0+dmVyc2lvblswXSA9IDQ7CkBAIC0xMzksOCArMTMwLDggQEAKIHN0YXRpYyBib29sIGNyZWF0ZV9jcnlwdG9fYmxrX2Rldihjb25zdCBzdGQ6OnN0cmluZyYgZG1fbmFtZSwgdWludDY0X3QgbnJfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXRfdHlwZSwgY29uc3QgS2V5QnVmZmVyJiBjcnlwdF9wYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGNyeXB0b19ibGtkZXYpIHsKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZG1fZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oCi0gICAgICAgICIvZGV2L2RldmljZS1tYXBwZXIiLCBPX1JEV1IgfCBPX0NMT0VYRUMsIDApKSk7CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGRtX2ZkKAorICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbigiL2Rldi9kZXZpY2UtbWFwcGVyIiwgT19SRFdSIHwgT19DTE9FWEVDLCAwKSkpOwogICAgIGlmIChkbV9mZCA9PSAtMSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG9wZW4gZGV2aWNlLW1hcHBlciI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE1OCwxMyArMTQ5LDEzIEBACiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmV0cmlldmUgZG0tY3J5cHQgZGV2aWNlIHN0YXR1cyAiIDw8IGRtX25hbWU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgKmNyeXB0b19ibGtkZXYgPSBzdGQ6OnN0cmluZygpICsgIi9kZXYvYmxvY2svZG0tIiArIHN0ZDo6dG9fc3RyaW5nKAotICAgICAgICAoaW8tPmRldiAmIDB4ZmYpIHwgKChpby0+ZGV2ID4+IDEyKSAmIDB4ZmZmMDApKTsKKyAgICAqY3J5cHRvX2Jsa2RldiA9IHN0ZDo6c3RyaW5nKCkgKyAiL2Rldi9ibG9jay9kbS0iICsKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKChpby0+ZGV2ICYgMHhmZikgfCAoKGlvLT5kZXYgPj4gMTIpICYgMHhmZmYwMCkpOwogCiAgICAgaW8gPSBkbV9pb2N0bF9pbml0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGRtX25hbWUpOwogICAgIHNpemVfdCBwYXJhbWl4ID0gaW8tPmRhdGFfc3RhcnQgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKTsKICAgICBzaXplX3QgbnVsbGl4ID0gcGFyYW1peCArIGNyeXB0X3BhcmFtcy5zaXplKCk7Ci0gICAgc2l6ZV90IGVuZGl4ID0gKG51bGxpeCArIDEgKyA3KSAmIDg7IC8vIEFkZCByb29tIGZvciBcMCBhbmQgYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5CisgICAgc2l6ZV90IGVuZGl4ID0gKG51bGxpeCArIDEgKyA3KSAmIDg7ICAvLyBBZGQgcm9vbSBmb3IgXDAgYW5kIGFsaWduIHRvIDggYnl0ZSBib3VuZGFyeQogCiAgICAgaWYgKGVuZGl4ID4gc2l6ZW9mKGJ1ZmZlcikpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3J5cHRfcGFyYW1zIHRvbyBiaWcgZm9yIERNX0NSWVBUX0JVRl9TSVpFIjsKQEAgLTE3MiwyMSArMTYzLDIxIEBACiAgICAgfQogCiAgICAgaW8tPnRhcmdldF9jb3VudCA9IDE7Ci0gICAgYXV0byB0Z3QgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjICopIChidWZmZXIgKyBpby0+ZGF0YV9zdGFydCk7CisgICAgYXV0byB0Z3QgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjKikoYnVmZmVyICsgaW8tPmRhdGFfc3RhcnQpOwogICAgIHRndC0+c3RhdHVzID0gMDsKICAgICB0Z3QtPnNlY3Rvcl9zdGFydCA9IDA7CiAgICAgdGd0LT5sZW5ndGggPSBucl9zZWM7CiAgICAgdGFyZ2V0X3R5cGUuY29weSh0Z3QtPnRhcmdldF90eXBlLCBzaXplb2YodGd0LT50YXJnZXRfdHlwZSkpOwogICAgIG1lbWNweShidWZmZXIgKyBwYXJhbWl4LCBjcnlwdF9wYXJhbXMuZGF0YSgpLAotICAgICAgICAgICAgc3RkOjptaW4oY3J5cHRfcGFyYW1zLnNpemUoKSwgc2l6ZW9mKGJ1ZmZlcikgLSBwYXJhbWl4KSk7CisgICAgICAgICAgIHN0ZDo6bWluKGNyeXB0X3BhcmFtcy5zaXplKCksIHNpemVvZihidWZmZXIpIC0gcGFyYW1peCkpOwogICAgIGJ1ZmZlcltudWxsaXhdID0gJ1wwJzsKICAgICB0Z3QtPm5leHQgPSBlbmRpeDsKIAotICAgIGZvciAoaW50IGkgPSAwOyA7IGkrKykgeworICAgIGZvciAoaW50IGkgPSAwOzsgaSsrKSB7CiAgICAgICAgIGlmIChpb2N0bChkbV9mZC5nZXQoKSwgRE1fVEFCTEVfTE9BRCwgaW8pID09IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpKzEgPj0gVEFCTEVfTE9BRF9SRVRSSUVTKSB7CisgICAgICAgIGlmIChpICsgMSA+PSBUQUJMRV9MT0FEX1JFVFJJRVMpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJETV9UQUJMRV9MT0FEIGlvY3RsIGZhaWxlZCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vdmVTdG9yYWdlLmNwcCBiL01vdmVTdG9yYWdlLmNwcAppbmRleCA0NjI0MDI2Li40NjUzZTAxIDEwMDY0NAotLS0gYS9Nb3ZlU3RvcmFnZS5jcHAKKysrIGIvTW92ZVN0b3JhZ2UuY3BwCkBAIC0yOSw3ICsyOSw4IEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAotI2RlZmluZSBDT05TVFJBSU4oYW1vdW50LCBsb3csIGhpZ2gpICgoYW1vdW50KSA8IChsb3cpID8gKGxvdykgOiAoKGFtb3VudCkgPiAoaGlnaCkgPyAoaGlnaCkgOiAoYW1vdW50KSkpCisjZGVmaW5lIENPTlNUUkFJTihhbW91bnQsIGxvdywgaGlnaCkgXAorICAgICgoYW1vdW50KSA8IChsb3cpID8gKGxvdykgOiAoKGFtb3VudCkgPiAoaGlnaCkgPyAoaGlnaCkgOiAoYW1vdW50KSkpCiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrUHJvcEJsb2NraW5nRXhlYyA9ICJwZXJzaXN0LnN5cy5ibG9ja2luZ19leGVjIjsKIApAQCAtNDgsNyArNDksNyBAQAogc3RhdGljIGNvbnN0IGNoYXIqIGtXYWtlTG9jayA9ICJNb3ZlVGFzayI7CiAKIHN0YXRpYyB2b2lkIG5vdGlmeVByb2dyZXNzKGludCBwcm9ncmVzcywKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIGFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZSBleHRyYXM7CiAgICAgICAgIGxpc3RlbmVyLT5vblN0YXR1cyhwcm9ncmVzcywgZXh0cmFzKTsKQEAgLTU2LDcgKzU3LDcgQEAKIH0KIAogc3RhdGljIHN0YXR1c190IHB1c2hCYWNrQ29udGVudHMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY21kLAotICAgICAgICBib29sIGFkZFdpbGRjYXJkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFdpbGRjYXJkKSB7CiAgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGguY19zdHIoKSk7CiAgICAgaWYgKGRpciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTc5LDcgKzgwLDcgQEAKIH0KIAogc3RhdGljIHN0YXR1c190IGV4ZWNSbShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgaW50IHN0YXJ0UHJvZ3Jlc3MsIGludCBzdGVwUHJvZ3Jlc3MsCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgbm90aWZ5UHJvZ3Jlc3Moc3RhcnRQcm9ncmVzcywgbGlzdGVuZXIpOwogCiAgICAgdWludDY0X3QgZXhwZWN0ZWRCeXRlcyA9IEdldFRyZWVCeXRlcyhwYXRoKTsKQEAgLTExNCwxNCArMTE1LDE3IEBACiAKICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgIHVpbnQ2NF90IGRlbHRhRnJlZUJ5dGVzID0gR2V0RnJlZUJ5dGVzKHBhdGgpIC0gc3RhcnRGcmVlQnl0ZXM7Ci0gICAgICAgIG5vdGlmeVByb2dyZXNzKHN0YXJ0UHJvZ3Jlc3MgKyBDT05TVFJBSU4oKGludCkKLSAgICAgICAgICAgICAgICAoKGRlbHRhRnJlZUJ5dGVzICogc3RlcFByb2dyZXNzKSAvIGV4cGVjdGVkQnl0ZXMpLCAwLCBzdGVwUHJvZ3Jlc3MpLCBsaXN0ZW5lcik7CisgICAgICAgIG5vdGlmeVByb2dyZXNzKAorICAgICAgICAgICAgc3RhcnRQcm9ncmVzcyArCisgICAgICAgICAgICAgICAgQ09OU1RSQUlOKChpbnQpKChkZWx0YUZyZWVCeXRlcyAqIHN0ZXBQcm9ncmVzcykgLyBleHBlY3RlZEJ5dGVzKSwgMCwgc3RlcFByb2dyZXNzKSwKKyAgICAgICAgICAgIGxpc3RlbmVyKTsKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgZXhlY0NwKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRvUGF0aCwgaW50IHN0YXJ0UHJvZ3Jlc3MsCi0gICAgICAgIGludCBzdGVwUHJvZ3Jlc3MsIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwUHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgbm90aWZ5UHJvZ3Jlc3Moc3RhcnRQcm9ncmVzcywgbGlzdGVuZXIpOwogCiAgICAgdWludDY0X3QgZXhwZWN0ZWRCeXRlcyA9IEdldFRyZWVCeXRlcyhmcm9tUGF0aCk7CkBAIC0xMjksNyArMTMzLDcgQEAKIAogICAgIGlmIChleHBlY3RlZEJ5dGVzID4gc3RhcnRGcmVlQnl0ZXMpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGF0YSBzaXplICIgPDwgZXhwZWN0ZWRCeXRlcyA8PCAiIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gZnJlZSBzcGFjZSAiCi0gICAgICAgICAgICAgICAgPDwgc3RhcnRGcmVlQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgPDwgc3RhcnRGcmVlQnl0ZXM7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKQEAgLTE2NSw4ICsxNjksMTAgQEAKIAogICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgdWludDY0X3QgZGVsdGFGcmVlQnl0ZXMgPSBzdGFydEZyZWVCeXRlcyAtIEdldEZyZWVCeXRlcyh0b1BhdGgpOwotICAgICAgICBub3RpZnlQcm9ncmVzcyhzdGFydFByb2dyZXNzICsgQ09OU1RSQUlOKChpbnQpCi0gICAgICAgICAgICAgICAgKChkZWx0YUZyZWVCeXRlcyAqIHN0ZXBQcm9ncmVzcykgLyBleHBlY3RlZEJ5dGVzKSwgMCwgc3RlcFByb2dyZXNzKSwgbGlzdGVuZXIpOworICAgICAgICBub3RpZnlQcm9ncmVzcygKKyAgICAgICAgICAgIHN0YXJ0UHJvZ3Jlc3MgKworICAgICAgICAgICAgICAgIENPTlNUUkFJTigoaW50KSgoZGVsdGFGcmVlQnl0ZXMgKiBzdGVwUHJvZ3Jlc3MpIC8gZXhwZWN0ZWRCeXRlcyksIDAsIHN0ZXBQcm9ncmVzcyksCisgICAgICAgICAgICBsaXN0ZW5lcik7CiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KQEAgLTE4Niw4ICsxOTIsOCBAQAogfQogCiBzdGF0aWMgc3RhdHVzX3QgbW92ZVN0b3JhZ2VJbnRlcm5hbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIGZyb20sCi0gICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgdG8sCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBzdGQ6OnN0cmluZyBmcm9tUGF0aDsKICAgICBzdGQ6OnN0cmluZyB0b1BhdGg7CiAKQEAgLTIzOSwxNyArMjQ1LDE5IEBACiAgICAgLy8gdXNlZnVsIGFueXdheS4KICAgICBleGVjUm0odG9QYXRoLCA4MCwgMSwgbGlzdGVuZXIpOwogZmFpbDoKKyAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5nZXRMb2NrKCkpOwogICAgICAgICBicmluZ09ubGluZShmcm9tKTsKICAgICAgICAgYnJpbmdPbmxpbmUodG8pOwogICAgIH0KKyAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICBub3RpZnlQcm9ncmVzcyhrTW92ZUZhaWxlZEludGVybmFsRXJyb3IsIGxpc3RlbmVyKTsKICAgICByZXR1cm4gLTE7CiB9CiAKIHZvaWQgTW92ZVN0b3JhZ2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiBmcm9tLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIHRvLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIGFjcXVpcmVfd2FrZV9sb2NrKFBBUlRJQUxfV0FLRV9MT0NLLCBrV2FrZUxvY2spOwogCiAgICAgYW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhczsKZGlmZiAtLWdpdCBhL01vdmVTdG9yYWdlLmggYi9Nb3ZlU3RvcmFnZS5oCmluZGV4IGQyNzE3MDQuLjQ2Zjc0NWYgMTAwNjQ0Ci0tLSBhL01vdmVTdG9yYWdlLmgKKysrIGIvTW92ZVN0b3JhZ2UuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIHZvbGQgewogCiB2b2lkIE1vdmVTdG9yYWdlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgZnJvbSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiB0bywKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvTmV0bGlua0hhbmRsZXIuY3BwIGIvTmV0bGlua0hhbmRsZXIuY3BwCmluZGV4IDkyMTMxZTkuLmQxODBhOTUgMTAwNjQ0Ci0tLSBhL05ldGxpbmtIYW5kbGVyLmNwcAorKysgYi9OZXRsaW5rSGFuZGxlci5jcHAKQEAgLTE0LDkgKzE0LDkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC0yNSwxMiArMjUsOSBAQAogI2luY2x1ZGUgIk5ldGxpbmtIYW5kbGVyLmgiCiAjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogCi1OZXRsaW5rSGFuZGxlcjo6TmV0bGlua0hhbmRsZXIoaW50IGxpc3RlbmVyU29ja2V0KSA6Ci0gICAgICAgICAgICAgICAgTmV0bGlua0xpc3RlbmVyKGxpc3RlbmVyU29ja2V0KSB7Ci19CitOZXRsaW5rSGFuZGxlcjo6TmV0bGlua0hhbmRsZXIoaW50IGxpc3RlbmVyU29ja2V0KSA6IE5ldGxpbmtMaXN0ZW5lcihsaXN0ZW5lclNvY2tldCkge30KIAotTmV0bGlua0hhbmRsZXI6On5OZXRsaW5rSGFuZGxlcigpIHsKLX0KK05ldGxpbmtIYW5kbGVyOjp+TmV0bGlua0hhbmRsZXIoKSB7fQogCiBpbnQgTmV0bGlua0hhbmRsZXI6OnN0YXJ0KCkgewogICAgIHJldHVybiB0aGlzLT5zdGFydExpc3RlbmVyKCk7CkBAIC00MCw5ICszNyw5IEBACiAgICAgcmV0dXJuIHRoaXMtPnN0b3BMaXN0ZW5lcigpOwogfQogCi12b2lkIE5ldGxpbmtIYW5kbGVyOjpvbkV2ZW50KE5ldGxpbmtFdmVudCAqZXZ0KSB7Ci0gICAgVm9sdW1lTWFuYWdlciAqdm0gPSBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpOwotICAgIGNvbnN0IGNoYXIgKnN1YnN5cyA9IGV2dC0+Z2V0U3Vic3lzdGVtKCk7Cit2b2lkIE5ldGxpbmtIYW5kbGVyOjpvbkV2ZW50KE5ldGxpbmtFdmVudCogZXZ0KSB7CisgICAgVm9sdW1lTWFuYWdlciogdm0gPSBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpOworICAgIGNvbnN0IGNoYXIqIHN1YnN5cyA9IGV2dC0+Z2V0U3Vic3lzdGVtKCk7CiAKICAgICBpZiAoIXN1YnN5cykgewogICAgICAgICBMT0coV0FSTklORykgPDwgIk5vIHN1YnN5c3RlbSBmb3VuZCBpbiBuZXRsaW5rIGV2ZW50IjsKZGlmZiAtLWdpdCBhL05ldGxpbmtIYW5kbGVyLmggYi9OZXRsaW5rSGFuZGxlci5oCmluZGV4IDU2ZWIyM2MuLjhhZjc1NzUgMTAwNjQ0Ci0tLSBhL05ldGxpbmtIYW5kbGVyLmgKKysrIGIvTmV0bGlua0hhbmRsZXIuaApAQCAtMTksMTYgKzE5LDE1IEBACiAKICNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rTGlzdGVuZXIuaD4KIAotY2xhc3MgTmV0bGlua0hhbmRsZXI6IHB1YmxpYyBOZXRsaW5rTGlzdGVuZXIgewotCi1wdWJsaWM6CitjbGFzcyBOZXRsaW5rSGFuZGxlciA6IHB1YmxpYyBOZXRsaW5rTGlzdGVuZXIgeworICBwdWJsaWM6CiAgICAgZXhwbGljaXQgTmV0bGlua0hhbmRsZXIoaW50IGxpc3RlbmVyU29ja2V0KTsKICAgICB2aXJ0dWFsIH5OZXRsaW5rSGFuZGxlcigpOwogCiAgICAgaW50IHN0YXJ0KHZvaWQpOwogICAgIGludCBzdG9wKHZvaWQpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoTmV0bGlua0V2ZW50ICpldnQpOworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoTmV0bGlua0V2ZW50KiBldnQpOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTmV0bGlua01hbmFnZXIuY3BwIGIvTmV0bGlua01hbmFnZXIuY3BwCmluZGV4IDQwOWNkYzguLmFhY2Y0YjkgMTAwNjQ0Ci0tLSBhL05ldGxpbmtNYW5hZ2VyLmNwcAorKysgYi9OZXRsaW5rTWFuYWdlci5jcHAKQEAgLTE0LDEyICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdW4uaD4KQEAgLTI4LDE0ICsyOCwxMyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KIAotI2luY2x1ZGUgIk5ldGxpbmtNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiTmV0bGlua0hhbmRsZXIuaCIKKyNpbmNsdWRlICJOZXRsaW5rTWFuYWdlci5oIgogCi1OZXRsaW5rTWFuYWdlciAqTmV0bGlua01hbmFnZXI6OnNJbnN0YW5jZSA9IE5VTEw7CitOZXRsaW5rTWFuYWdlciogTmV0bGlua01hbmFnZXI6OnNJbnN0YW5jZSA9IE5VTEw7CiAKLU5ldGxpbmtNYW5hZ2VyICpOZXRsaW5rTWFuYWdlcjo6SW5zdGFuY2UoKSB7Ci0gICAgaWYgKCFzSW5zdGFuY2UpCi0gICAgICAgIHNJbnN0YW5jZSA9IG5ldyBOZXRsaW5rTWFuYWdlcigpOworTmV0bGlua01hbmFnZXIqIE5ldGxpbmtNYW5hZ2VyOjpJbnN0YW5jZSgpIHsKKyAgICBpZiAoIXNJbnN0YW5jZSkgc0luc3RhbmNlID0gbmV3IE5ldGxpbmtNYW5hZ2VyKCk7CiAgICAgcmV0dXJuIHNJbnN0YW5jZTsKIH0KIApAQCAtNDMsOCArNDIsNyBAQAogICAgIG1Ccm9hZGNhc3RlciA9IE5VTEw7CiB9CiAKLU5ldGxpbmtNYW5hZ2VyOjp+TmV0bGlua01hbmFnZXIoKSB7Ci19CitOZXRsaW5rTWFuYWdlcjo6fk5ldGxpbmtNYW5hZ2VyKCkge30KIAogaW50IE5ldGxpbmtNYW5hZ2VyOjpzdGFydCgpIHsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOwpAQCAtNTYsOCArNTQsNyBAQAogICAgIG5sYWRkci5ubF9waWQgPSBnZXRwaWQoKTsKICAgICBubGFkZHIubmxfZ3JvdXBzID0gMHhmZmZmZmZmZjsKIAotICAgIGlmICgobVNvY2sgPSBzb2NrZXQoUEZfTkVUTElOSywgU09DS19ER1JBTSB8IFNPQ0tfQ0xPRVhFQywKLSAgICAgICAgICAgIE5FVExJTktfS09CSkVDVF9VRVZFTlQpKSA8IDApIHsKKyAgICBpZiAoKG1Tb2NrID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0gfCBTT0NLX0NMT0VYRUMsIE5FVExJTktfS09CSkVDVF9VRVZFTlQpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBjcmVhdGUgdWV2ZW50IHNvY2tldCI7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC03Niw3ICs3Myw3IEBACiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAgIGlmIChiaW5kKG1Tb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZubGFkZHIsIHNpemVvZihubGFkZHIpKSA8IDApIHsKKyAgICBpZiAoYmluZChtU29jaywgKHN0cnVjdCBzb2NrYWRkciopJm5sYWRkciwgc2l6ZW9mKG5sYWRkcikpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGJpbmQgdWV2ZW50IHNvY2tldCI7CiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KZGlmZiAtLWdpdCBhL05ldGxpbmtNYW5hZ2VyLmggYi9OZXRsaW5rTWFuYWdlci5oCmluZGV4IDljN2JhMTEuLmUzMWZjMmUgMTAwNjQ0Ci0tLSBhL05ldGxpbmtNYW5hZ2VyLmgKKysrIGIvTmV0bGlua01hbmFnZXIuaApAQCAtMTcsMzIgKzE3LDMyIEBACiAjaWZuZGVmIF9ORVRMSU5LTUFOQUdFUl9ICiAjZGVmaW5lIF9ORVRMSU5LTUFOQUdFUl9ICiAKLSNpbmNsdWRlIDxzeXN1dGlscy9Tb2NrZXRMaXN0ZW5lci5oPgogI2luY2x1ZGUgPHN5c3V0aWxzL05ldGxpbmtMaXN0ZW5lci5oPgorI2luY2x1ZGUgPHN5c3V0aWxzL1NvY2tldExpc3RlbmVyLmg+CiAKIGNsYXNzIE5ldGxpbmtIYW5kbGVyOwogCiBjbGFzcyBOZXRsaW5rTWFuYWdlciB7Ci1wcml2YXRlOgotICAgIHN0YXRpYyBOZXRsaW5rTWFuYWdlciAqc0luc3RhbmNlOworICBwcml2YXRlOgorICAgIHN0YXRpYyBOZXRsaW5rTWFuYWdlciogc0luc3RhbmNlOwogCi1wcml2YXRlOgotICAgIFNvY2tldExpc3RlbmVyICAgICAgICptQnJvYWRjYXN0ZXI7Ci0gICAgTmV0bGlua0hhbmRsZXIgICAgICAgKm1IYW5kbGVyOwotICAgIGludCAgICAgICAgICAgICAgICAgIG1Tb2NrOworICBwcml2YXRlOgorICAgIFNvY2tldExpc3RlbmVyKiBtQnJvYWRjYXN0ZXI7CisgICAgTmV0bGlua0hhbmRsZXIqIG1IYW5kbGVyOworICAgIGludCBtU29jazsKIAotcHVibGljOgorICBwdWJsaWM6CiAgICAgdmlydHVhbCB+TmV0bGlua01hbmFnZXIoKTsKIAogICAgIGludCBzdGFydCgpOwogICAgIGludCBzdG9wKCk7CiAKLSAgICB2b2lkIHNldEJyb2FkY2FzdGVyKFNvY2tldExpc3RlbmVyICpzbCkgeyBtQnJvYWRjYXN0ZXIgPSBzbDsgfQotICAgIFNvY2tldExpc3RlbmVyICpnZXRCcm9hZGNhc3RlcigpIHsgcmV0dXJuIG1Ccm9hZGNhc3RlcjsgfQorICAgIHZvaWQgc2V0QnJvYWRjYXN0ZXIoU29ja2V0TGlzdGVuZXIqIHNsKSB7IG1Ccm9hZGNhc3RlciA9IHNsOyB9CisgICAgU29ja2V0TGlzdGVuZXIqIGdldEJyb2FkY2FzdGVyKCkgeyByZXR1cm4gbUJyb2FkY2FzdGVyOyB9CiAKLSAgICBzdGF0aWMgTmV0bGlua01hbmFnZXIgKkluc3RhbmNlKCk7CisgICAgc3RhdGljIE5ldGxpbmtNYW5hZ2VyKiBJbnN0YW5jZSgpOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIE5ldGxpbmtNYW5hZ2VyKCk7CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9QUkVVUExPQUQuY2ZnIGIvUFJFVVBMT0FELmNmZwppbmRleCBjOGRiZjc3Li5kY2Y5MmJlIDEwMDY0NAotLS0gYS9QUkVVUExPQUQuY2ZnCisrKyBiL1BSRVVQTE9BRC5jZmcKQEAgLTMsMyArMyw2IEBACiAKIFtCdWlsdGluIEhvb2tzIE9wdGlvbnNdCiBjbGFuZ19mb3JtYXQgPSAtLWNvbW1pdCAke1BSRVVQTE9BRF9DT01NSVR9IC0tc3R5bGUgZmlsZSAtLWV4dGVuc2lvbnMgYyxoLGNjLGNwcAorCitbSG9vayBTY3JpcHRzXQorYW9zcF9ob29rID0gJHtSRVBPX1JPT1R9L2ZyYW1ld29ya3MvYmFzZS90b29scy9hb3NwL2Fvc3Bfc2hhLnNoICR7UFJFVVBMT0FEX0NPTU1JVH0gIi4iCmRpZmYgLS1naXQgYS9Qcm9jZXNzLmNwcCBiL1Byb2Nlc3MuY3BwCmluZGV4IDkwMzhhZjIuLmE1MDI4ZjIgMTAwNjQ0Ci0tLSBhL1Byb2Nlc3MuY3BwCisrKyBiL1Byb2Nlc3MuY3BwCkBAIC0xNCwyOCArMTQsMjggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGZ0cy5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8cHdkLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogCiAjaW5jbHVkZSAiUHJvY2Vzcy5oIgogCmRpZmYgLS1naXQgYS9TY3J5cHRQYXJhbWV0ZXJzLmNwcCBiL1NjcnlwdFBhcmFtZXRlcnMuY3BwCmluZGV4IGMwZTIwMzAuLmY1YTk2NGYgMTAwNjQ0Ci0tLSBhL1NjcnlwdFBhcmFtZXRlcnMuY3BwCisrKyBiL1NjcnlwdFBhcmFtZXRlcnMuY3BwCkBAIC0xOSwyMCArMTksMTkgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotYm9vbCBwYXJzZV9zY3J5cHRfcGFyYW1ldGVycyhjb25zdCBjaGFyKiBwYXJhbXN0ciwgaW50ICpOZiwgaW50ICpyZiwgaW50ICpwZikgeworYm9vbCBwYXJzZV9zY3J5cHRfcGFyYW1ldGVycyhjb25zdCBjaGFyKiBwYXJhbXN0ciwgaW50KiBOZiwgaW50KiByZiwgaW50KiBwZikgewogICAgIGludCBwYXJhbXNbM10gPSB7fTsKLSAgICBjaGFyICp0b2tlbjsKLSAgICBjaGFyICpzYXZlcHRyOworICAgIGNoYXIqIHRva2VuOworICAgIGNoYXIqIHNhdmVwdHI7CiAgICAgaW50IGk7CiAKICAgICAvKgogICAgICAqIFRoZSB0b2tlbiB3ZSdyZSBsb29raW5nIGZvciBzaG91bGQgYmUgdGhyZWUgaW50ZWdlcnMgc2VwYXJhdGVkIGJ5CiAgICAgICogY29sb25zIChlLmcuLCAiMTI6ODoxIikuIFNjYW4gdGhlIHByb3BlcnR5IHRvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzLgogICAgICAqLwotICAgIGZvciAoaSA9IDAsIHRva2VuID0gc3RydG9rX3IoY29uc3RfY2FzdDxjaGFyICo+KHBhcmFtc3RyKSwgIjoiLCAmc2F2ZXB0cik7Ci0gICAgICAgICAgICB0b2tlbiAhPSBudWxscHRyICYmIGkgPCAzOwotICAgICAgICAgICAgaSsrLCB0b2tlbiA9IHN0cnRva19yKG51bGxwdHIsICI6IiwgJnNhdmVwdHIpKSB7Ci0gICAgICAgIGNoYXIgKmVuZHB0cjsKKyAgICBmb3IgKGkgPSAwLCB0b2tlbiA9IHN0cnRva19yKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhcmFtc3RyKSwgIjoiLCAmc2F2ZXB0cik7CisgICAgICAgICB0b2tlbiAhPSBudWxscHRyICYmIGkgPCAzOyBpKyssIHRva2VuID0gc3RydG9rX3IobnVsbHB0ciwgIjoiLCAmc2F2ZXB0cikpIHsKKyAgICAgICAgY2hhciogZW5kcHRyOwogICAgICAgICBwYXJhbXNbaV0gPSBzdHJ0b2wodG9rZW4sICZlbmRwdHIsIDEwKTsKIAogICAgICAgICAvKgpAQCAtNDUsNiArNDQsOCBAQAogICAgIGlmICh0b2tlbiAhPSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgKk5mID0gcGFyYW1zWzBdOyAqcmYgPSBwYXJhbXNbMV07ICpwZiA9IHBhcmFtc1syXTsKKyAgICAqTmYgPSBwYXJhbXNbMF07CisgICAgKnJmID0gcGFyYW1zWzFdOworICAgICpwZiA9IHBhcmFtc1syXTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL1NjcnlwdFBhcmFtZXRlcnMuaCBiL1NjcnlwdFBhcmFtZXRlcnMuaAppbmRleCAxOTA4NDJiLi5lZGI4MGNjIDEwMDY0NAotLS0gYS9TY3J5cHRQYXJhbWV0ZXJzLmgKKysrIGIvU2NyeXB0UGFyYW1ldGVycy5oCkBAIC0yMyw2ICsyMyw2IEBACiAjZGVmaW5lIFNDUllQVF9QUk9QICJyby5jcnlwdG8uc2NyeXB0X3BhcmFtcyIKICNkZWZpbmUgU0NSWVBUX0RFRkFVTFRTICIxNTozOjEiCiAKLWJvb2wgcGFyc2Vfc2NyeXB0X3BhcmFtZXRlcnMoY29uc3QgY2hhciogcGFyYW1zdHIsIGludCAqTmYsIGludCAqcmYsIGludCAqcGYpOworYm9vbCBwYXJzZV9zY3J5cHRfcGFyYW1ldGVycyhjb25zdCBjaGFyKiBwYXJhbXN0ciwgaW50KiBOZiwgaW50KiByZiwgaW50KiBwZik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvVXRpbHMuY3BwIGIvVXRpbHMuY3BwCmluZGV4IDk4ZThhOWIuLmNkY2E4NWUgMTAwNjQ0Ci0tLSBhL1V0aWxzLmNwcAorKysgYi9VdGlscy5jcHAKQEAgLTIyLDI2ICsyMiwyOSBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKLSNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtdXRleD4KIAogI2lmbmRlZiBVTU9VTlRfTk9GT0xMT1cKLSNkZWZpbmUgVU1PVU5UX05PRk9MTE9XICAgIDB4MDAwMDAwMDggIC8qIERvbid0IGZvbGxvdyBzeW1saW5rIG9uIHVtb3VudCAqLworI2RlZmluZSBVTU9VTlRfTk9GT0xMT1cgMHgwMDAwMDAwOCAvKiBEb24ndCBmb2xsb3cgc3ltbGluayBvbiB1bW91bnQgKi8KICNlbmRpZgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nOwpAQCAtODEsOCArODQsOCBAQAogICAgIG1vZGVfdCBtb2RlID0gMDY2MCB8IFNfSUZCTEs7CiAgICAgaWYgKG1rbm9kKGNwYXRoLCBtb2RlLCBkZXYpIDwgMCkgewogICAgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugbm9kZSBmb3IgIiA8PCBtYWpvcihkZXYpCi0gICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCBtaW5vcihkZXYpIDw8ICIgYXQgIiA8PCBwYXRoOworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIG5vZGUgZm9yICIgPDwgbWFqb3IoZGV2KSA8PCAiOiIgPDwgbWlub3IoZGV2KQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhdCAiIDw8IHBhdGg7CiAgICAgICAgICAgICByZXMgPSAtZXJybm87CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDksOCArMjEyLDggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0YXR1c190IHJlYWRNZXRhZGF0YShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwKLSAgICAgICAgc3RkOjpzdHJpbmcqIGZzVXVpZCwgc3RkOjpzdHJpbmcqIGZzTGFiZWwsIGJvb2wgdW50cnVzdGVkKSB7CitzdGF0aWMgc3RhdHVzX3QgcmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLCBzdGQ6OnN0cmluZyogZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnNMYWJlbCwgYm9vbCB1bnRydXN0ZWQpIHsKICAgICBmc1R5cGUtPmNsZWFyKCk7CiAgICAgZnNVdWlkLT5jbGVhcigpOwogICAgIGZzTGFiZWwtPmNsZWFyKCk7CkBAIC0yNDQsMTMgKzI0NywxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgUmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLAotICAgICAgICBzdGQ6OnN0cmluZyogZnNVdWlkLCBzdGQ6OnN0cmluZyogZnNMYWJlbCkgeworc3RhdHVzX3QgUmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLCBzdGQ6OnN0cmluZyogZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKSB7CiAgICAgcmV0dXJuIHJlYWRNZXRhZGF0YShwYXRoLCBmc1R5cGUsIGZzVXVpZCwgZnNMYWJlbCwgZmFsc2UpOwogfQogCi1zdGF0dXNfdCBSZWFkTWV0YWRhdGFVbnRydXN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBmc1V1aWQsIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKSB7CitzdGF0dXNfdCBSZWFkTWV0YWRhdGFVbnRydXN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsIHN0ZDo6c3RyaW5nKiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZzTGFiZWwpIHsKICAgICByZXR1cm4gcmVhZE1ldGFkYXRhKHBhdGgsIGZzVHlwZSwgZnNVdWlkLCBmc0xhYmVsLCB0cnVlKTsKIH0KIApAQCAtMjYxLDEzICsyNjQsMTMgQEAKIHN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGtTZWN1cml0eUxvY2spOwogICAgIHNpemVfdCBhcmdjID0gYXJncy5zaXplKCk7Ci0gICAgY2hhcioqIGFyZ3YgPSAoY2hhcioqKSBjYWxsb2MoYXJnYywgc2l6ZW9mKGNoYXIqKSk7CisgICAgY2hhcioqIGFyZ3YgPSAoY2hhcioqKWNhbGxvYyhhcmdjLCBzaXplb2YoY2hhciopKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBhcmd2W2ldID0gKGNoYXIqKSBhcmdzW2ldLmNfc3RyKCk7CisgICAgICAgIGFyZ3ZbaV0gPSAoY2hhciopYXJnc1tpXS5jX3N0cigpOwogICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgYXJnc1tpXTsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgYXJnc1tpXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiICAgICIgPDwgYXJnc1tpXTsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIiAgICAiIDw8IGFyZ3NbaV07CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI4OSwyMSArMjkyLDIwIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0KSB7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQpIHsKICAgICByZXR1cm4gRm9ya0V4ZWN2cChhcmdzLCBvdXRwdXQsIG51bGxwdHIpOwogfQogCi1zdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KSB7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soa1NlY3VyaXR5TG9jayk7CiAgICAgc3RkOjpzdHJpbmcgY21kOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewogICAgICAgICBjbWQgKz0gYXJnc1tpXSArICIgIjsKICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8IGFyZ3NbaV07CisgICAgICAgICAgICBMT0coREVCVUcpIDw8IGFyZ3NbaV07CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIiAgICAiIDw8IGFyZ3NbaV07CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICIgICAgIiA8PCBhcmdzW2ldOwogICAgICAgICB9CiAgICAgfQogICAgIG91dHB1dC5jbGVhcigpOwpAQCAtMzE0LDcgKzMxNiw3IEBACiAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICB9CiAgICAgfQotICAgIEZJTEUqIGZwID0gcG9wZW4oY21kLmNfc3RyKCksICJyIik7IC8vIE5PTElOVAorICAgIEZJTEUqIGZwID0gcG9wZW4oY21kLmNfc3RyKCksICJyIik7ICAvLyBOT0xJTlQKICAgICBpZiAoY29udGV4dCkgewogICAgICAgICBpZiAoc2V0ZXhlY2NvbihudWxscHRyKSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldGV4ZWNjb24iOwpAQCAtMzI4LDcgKzMzMCw3IEBACiAgICAgfQogICAgIGNoYXIgbGluZVsxMDI0XTsKICAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgIT0gbnVsbHB0cikgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgbGluZTsKKyAgICAgICAgTE9HKERFQlVHKSA8PCBsaW5lOwogICAgICAgICBvdXRwdXQucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGxpbmUpKTsKICAgICB9CiAgICAgaWYgKHBjbG9zZShmcCkgIT0gMCkgewpAQCAtMzQxLDEzICszNDMsMTMgQEAKIAogcGlkX3QgRm9ya0V4ZWN2cEFzeW5jKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewogICAgIHNpemVfdCBhcmdjID0gYXJncy5zaXplKCk7Ci0gICAgY2hhcioqIGFyZ3YgPSAoY2hhcioqKSBjYWxsb2MoYXJnYyArIDEsIHNpemVvZihjaGFyKikpOworICAgIGNoYXIqKiBhcmd2ID0gKGNoYXIqKiljYWxsb2MoYXJnYyArIDEsIHNpemVvZihjaGFyKikpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgICAgIGFyZ3ZbaV0gPSAoY2hhciopIGFyZ3NbaV0uY19zdHIoKTsKKyAgICAgICAgYXJndltpXSA9IChjaGFyKilhcmdzW2ldLmNfc3RyKCk7CiAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCBhcmdzW2ldOworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCBhcmdzW2ldOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICIgICAgIiA8PCBhcmdzW2ldOworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiICAgICIgPDwgYXJnc1tpXTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDAwLDEwICs0MDIsMTAgQEAKIHN0YXR1c190IEdlbmVyYXRlUmFuZG9tVXVpZChzdGQ6OnN0cmluZyYgb3V0KSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZFJhbmRvbUJ5dGVzKDE2LCBvdXQpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgb3V0WzZdICY9IDB4MGY7ICAvKiBjbGVhciB2ZXJzaW9uICAgICAgICAqLwotICAgICAgICBvdXRbNl0gfD0gMHg0MDsgIC8qIHNldCB0byB2ZXJzaW9uIDQgICAgICovCi0gICAgICAgIG91dFs4XSAmPSAweDNmOyAgLyogY2xlYXIgdmFyaWFudCAgICAgICAgKi8KLSAgICAgICAgb3V0WzhdIHw9IDB4ODA7ICAvKiBzZXQgdG8gSUVURiB2YXJpYW50ICAqLworICAgICAgICBvdXRbNl0gJj0gMHgwZjsgLyogY2xlYXIgdmVyc2lvbiAgICAgICAgKi8KKyAgICAgICAgb3V0WzZdIHw9IDB4NDA7IC8qIHNldCB0byB2ZXJzaW9uIDQgICAgICovCisgICAgICAgIG91dFs4XSAmPSAweDNmOyAvKiBjbGVhciB2YXJpYW50ICAgICAgICAqLworICAgICAgICBvdXRbOF0gfD0gMHg4MDsgLyogc2V0IHRvIElFVEYgdmFyaWFudCAgKi8KICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTQxNSwyNCArNDE3LDI2IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZXguc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaW50IHZhbCA9IDA7CiAgICAgICAgIHN3aXRjaCAoaGV4W2ldKSB7Ci0gICAgICAgIGNhc2UgJyAnOiBjYXNlICctJzogY2FzZSAnOic6IGNvbnRpbnVlOwotICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6IHZhbCA9IDE1OyBicmVhazsKLSAgICAgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiB2YWwgPSAxNDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2QnOiBjYXNlICdEJzogdmFsID0gMTM7IGJyZWFrOwotICAgICAgICBjYXNlICdjJzogY2FzZSAnQyc6IHZhbCA9IDEyOyBicmVhazsKLSAgICAgICAgY2FzZSAnYic6IGNhc2UgJ0InOiB2YWwgPSAxMTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOiBjYXNlICdBJzogdmFsID0gMTA7IGJyZWFrOwotICAgICAgICBjYXNlICc5JzogdmFsID0gOTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzgnOiB2YWwgPSA4OyBicmVhazsKLSAgICAgICAgY2FzZSAnNyc6IHZhbCA9IDc7IGJyZWFrOwotICAgICAgICBjYXNlICc2JzogdmFsID0gNjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzUnOiB2YWwgPSA1OyBicmVhazsKLSAgICAgICAgY2FzZSAnNCc6IHZhbCA9IDQ7IGJyZWFrOwotICAgICAgICBjYXNlICczJzogdmFsID0gMzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzInOiB2YWwgPSAyOyBicmVhazsKLSAgICAgICAgY2FzZSAnMSc6IHZhbCA9IDE7IGJyZWFrOwotICAgICAgICBjYXNlICcwJzogdmFsID0gMDsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICAgICAgY2FzZSAnICc6IGNhc2UgJy0nOiBjYXNlICc6JzogY29udGludWU7CisgICAgICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6IHZhbCA9IDE1OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogdmFsID0gMTQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOiB2YWwgPSAxMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdjJzogY2FzZSAnQyc6IHZhbCA9IDEyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2InOiBjYXNlICdCJzogdmFsID0gMTE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnYSc6IGNhc2UgJ0EnOiB2YWwgPSAxMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc5JzogdmFsID0gOTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc4JzogdmFsID0gODsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc3JzogdmFsID0gNzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc2JzogdmFsID0gNjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc1JzogdmFsID0gNTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc0JzogdmFsID0gNDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICczJzogdmFsID0gMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcyJzogdmFsID0gMjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcxJzogdmFsID0gMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcwJzogdmFsID0gMDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgfQogCiAgICAgICAgIGlmIChldmVuKSB7CkBAIC00NzUsMTAgKzQ3OSw0NiBAQAogICAgIHJldHVybiBTdHJUb0hleCh0bXAsIG91dCk7CiB9CiAKK3N0YXR1c190IEdldEJsb2NrRGV2U2l6ZShpbnQgZmQsIHVpbnQ2NF90KiBzaXplKSB7CisgICAgaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsIHNpemUpKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHVpbnQ2NF90KiBzaXplKSB7CisgICAgaW50IGZkID0gb3BlbihwYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICByZXMgPSBHZXRCbG9ja0RldlNpemUoZmQsIHNpemUpOworCisgICAgY2xvc2UoZmQpOworCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgR2V0QmxvY2tEZXY1MTJTZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50NjRfdCogbnJfc2VjKSB7CisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICBzdGF0dXNfdCByZXMgPSBHZXRCbG9ja0RldlNpemUocGF0aCwgJnNpemUpOworCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgICpucl9zZWMgPSBzaXplIC8gNTEyOworCisgICAgcmV0dXJuIE9LOworfQorCiB1aW50NjRfdCBHZXRGcmVlQnl0ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICBzdHJ1Y3Qgc3RhdHZmcyBzYjsKICAgICBpZiAoc3RhdHZmcyhwYXRoLmNfc3RyKCksICZzYikgPT0gMCkgewotICAgICAgICByZXR1cm4gKHVpbnQ2NF90KSBzYi5mX2JhdmFpbCAqIHNiLmZfZnJzaXplOworICAgICAgICByZXR1cm4gKHVpbnQ2NF90KXNiLmZfYmF2YWlsICogc2IuZl9mcnNpemU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTQ4Niw3ICs1MjYsNyBAQAogCiAvLyBUT0RPOiBib3Jyb3dlZCBmcm9tIGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZGlza3VzYWdlLyB3aGljaCBzaG91bGQKIC8vIGV2ZW50dWFsbHkgYmUgbWlncmF0ZWQgaW50byBzeXN0ZW0vCi1zdGF0aWMgaW50NjRfdCBzdGF0X3NpemUoc3RydWN0IHN0YXQgKnMpIHsKK3N0YXRpYyBpbnQ2NF90IHN0YXRfc2l6ZShzdHJ1Y3Qgc3RhdCogcykgewogICAgIGludDY0X3QgYmxrc2l6ZSA9IHMtPnN0X2Jsa3NpemU7CiAgICAgLy8gY291bnQgYWN0dWFsIGJsb2NrcyB1c2VkIGluc3RlYWQgb2Ygbm9taW5hbCBmaWxlIHNpemUKICAgICBpbnQ2NF90IHNpemUgPSBzLT5zdF9ibG9ja3MgKiA1MTI7CkBAIC01MDQsOCArNTQ0LDggQEAKIGludDY0X3QgY2FsY3VsYXRlX2Rpcl9zaXplKGludCBkZmQpIHsKICAgICBpbnQ2NF90IHNpemUgPSAwOwogICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgRElSICpkOwotICAgIHN0cnVjdCBkaXJlbnQgKmRlOworICAgIERJUiogZDsKKyAgICBzdHJ1Y3QgZGlyZW50KiBkZTsKIAogICAgIGQgPSBmZG9wZW5kaXIoZGZkKTsKICAgICBpZiAoZCA9PSBOVUxMKSB7CkBAIC01MTQsNyArNTU0LDcgQEAKICAgICB9CiAKICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpIHsKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGRlLT5kX25hbWU7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZS0+ZF9uYW1lOwogICAgICAgICBpZiAoZnN0YXRhdChkZmQsIG5hbWUsICZzLCBBVF9TWU1MSU5LX05PRk9MTE9XKSA9PSAwKSB7CiAgICAgICAgICAgICBzaXplICs9IHN0YXRfc2l6ZSgmcyk7CiAgICAgICAgIH0KQEAgLTUyMywxMCArNTYzLDggQEAKIAogICAgICAgICAgICAgLyogYWx3YXlzIHNraXAgIi4iIGFuZCAiLi4iICovCiAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoKG5hbWVbMV0gPT0gJy4nKSAmJiAobmFtZVsyXSA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lWzFdID09ICcuJykgJiYgKG5hbWVbMl0gPT0gMCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdWJmZCA9IG9wZW5hdChkZmQsIG5hbWUsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkgfCBPX0NMT0VYRUMpOwpAQCAtNTQ1LDkgKzU4Myw3IEBACiAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ2NF90IHJlcyA9IGNhbGN1bGF0ZV9kaXJfc2l6ZShkaXJmZCk7Ci0gICAgICAgIGNsb3NlKGRpcmZkKTsKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZV9kaXJfc2l6ZShkaXJmZCk7CiAgICAgfQogfQogCkBAIC01NjMsOCArNTk5LDcgQEAKIHN0YXR1c190IFdpcGVCbG9ja0RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewogICAgIHN0YXR1c190IHJlcyA9IC0xOwogICAgIGNvbnN0IGNoYXIqIGNfcGF0aCA9IHBhdGguY19zdHIoKTsKLSAgICB1bnNpZ25lZCBsb25nIG5yX3NlYyA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHJhbmdlWzJdOworICAgIHVpbnQ2NF90IHJhbmdlWzJdID0gezAsIDB9OwogCiAgICAgaW50IGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oY19wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKICAgICBpZiAoZmQgPT0gLTEpIHsKQEAgLTU3MiwxNCArNjA3LDExIEBACiAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKLSAgICBpZiAoKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmbnJfc2VjKSkgPT0gLTEpIHsKKyAgICBpZiAoR2V0QmxvY2tEZXZTaXplKGZkLCAmcmFuZ2VbMV0pICE9IE9LKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHNpemUgb2YgIiA8PCBwYXRoOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCi0gICAgcmFuZ2VbMF0gPSAwOwotICAgIHJhbmdlWzFdID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgbnJfc2VjICogNTEyOwotCiAgICAgTE9HKElORk8pIDw8ICJBYm91dCB0byBkaXNjYXJkICIgPDwgcmFuZ2VbMV0gPDwgIiBvbiAiIDw8IHBhdGg7CiAgICAgaWYgKGlvY3RsKGZkLCBCTEtESVNDQVJELCAmcmFuZ2UpID09IDApIHsKICAgICAgICAgTE9HKElORk8pIDw8ICJEaXNjYXJkIHN1Y2Nlc3Mgb24gIiA8PCBwYXRoOwpAQCAtNTk0LDggKzYyNiw3IEBACiB9CiAKIHN0YXRpYyBib29sIGlzVmFsaWRGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIGlmIChuYW1lLmVtcHR5KCkgfHwgKG5hbWUgPT0gIi4iKSB8fCAobmFtZSA9PSAiLi4iKQotICAgICAgICAgICAgfHwgKG5hbWUuZmluZCgnLycpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgIGlmIChuYW1lLmVtcHR5KCkgfHwgKG5hbWUgPT0gIi4iKSB8fCAobmFtZSA9PSAiLi4iKSB8fCAobmFtZS5maW5kKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTY5MCw3ICs3MjEsNyBAQAogfQogCiBzdGF0dXNfdCBSZXN0b3JlY29uUmVjdXJzaXZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJTdGFydGluZyByZXN0b3JlY29uIG9mICIgPDwgcGF0aDsKKyAgICBMT0coREVCVUcpIDw8ICJTdGFydGluZyByZXN0b3JlY29uIG9mICIgPDwgcGF0aDsKIAogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga1Jlc3RvcmVjb25TdHJpbmcgPSAic2VsaW51eC5yZXN0b3JlY29uX3JlY3Vyc2l2ZSI7CiAKQEAgLTY5OSw3ICs3MzAsNyBAQAogCiAgICAgYW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5KGtSZXN0b3JlY29uU3RyaW5nLCBwYXRoKTsKIAotICAgIExPRyhWRVJCT1NFKSA8PCAiRmluaXNoZWQgcmVzdG9yZWNvbiBvZiAiIDw8IHBhdGg7CisgICAgTE9HKERFQlVHKSA8PCAiRmluaXNoZWQgcmVzdG9yZWNvbiBvZiAiIDw8IHBhdGg7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC03MTUsOCArNzQ2LDcgQEAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBzc2l6ZV90IHNpemUgPSByZWFkbGlua2F0KGRpcmZkLCBwYXRoLmNfc3RyKCksICZidWZbMF0sIGJ1Zi5zaXplKCkpOwogICAgICAgICAvLyBVbnJlY292ZXJhYmxlIGVycm9yPwotICAgICAgICBpZiAoc2l6ZSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHNpemUgPT0gLTEpIHJldHVybiBmYWxzZTsKICAgICAgICAgLy8gSXQgZml0ISAoSWYgc2l6ZSA9PSBidWYuc2l6ZSgpLCBpdCBtYXkgaGF2ZSBiZWVuIHRydW5jYXRlZC4pCiAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpIDwgYnVmLnNpemUoKSkgewogICAgICAgICAgICAgcmVzdWx0LT5hc3NpZ24oJmJ1ZlswXSwgc2l6ZSk7CkBAIC03MzEsNSArNzYxLDMyIEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8ua2VybmVsLnFlbXUiLCBmYWxzZSk7CiB9CiAKK3N0YXR1c190IFVubW91bnRUcmVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgpIHsKKyAgICBGSUxFKiBmcCA9IHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInIiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gL3Byb2MvbW91bnRzIjsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICAvLyBTb21lIHZvbHVtZXMgY2FuIGJlIHN0YWNrZWQgb24gZWFjaCBvdGhlciwgc28gZm9yY2UgdW5tb3VudCBpbgorICAgIC8vIHJldmVyc2Ugb3JkZXIgdG8gZ2l2ZSB1cyB0aGUgYmVzdCBjaGFuY2Ugb2Ygc3VjY2Vzcy4KKyAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IHRvVW5tb3VudDsKKyAgICBtbnRlbnQqIG1lbnRyeTsKKyAgICB3aGlsZSAoKG1lbnRyeSA9IGdldG1udGVudChmcCkpICE9IE5VTEwpIHsKKyAgICAgICAgYXV0byB0ZXN0ID0gc3RkOjpzdHJpbmcobWVudHJ5LT5tbnRfZGlyKSArICIvIjsKKyAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgodGVzdCwgcHJlZml4KSkgeworICAgICAgICAgICAgdG9Vbm1vdW50LnB1c2hfZnJvbnQodGVzdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZW5kbW50ZW50KGZwKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IHRvVW5tb3VudCkgeworICAgICAgICBpZiAodW1vdW50MihwYXRoLmNfc3RyKCksIE1OVF9ERVRBQ0gpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHVubW91bnQgIiA8PCBwYXRoOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9VdGlscy5oIGIvVXRpbHMuaAppbmRleCA1Y2FhNGU5Li40OGQ2MDVhIDEwMDY0NAotLS0gYS9VdGlscy5oCisrKyBiL1V0aWxzLmgKQEAgLTIwLDEyICsyMCwxMiBAQAogI2luY2x1ZGUgIktleUJ1ZmZlci5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAotI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBzdHJ1Y3QgRElSOwogCkBAIC01OSwyNCArNTksMjkgQEAKIGJvb2wgRmluZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CiAKIC8qIFJlYWRzIGZpbGVzeXN0ZW0gbWV0YWRhdGEgZnJvbSBkZXZpY2UgYXQgcGF0aCAqLwotc3RhdHVzX3QgUmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLAotICAgICAgICBzdGQ6OnN0cmluZyogZnNVdWlkLCBzdGQ6OnN0cmluZyogZnNMYWJlbCk7CitzdGF0dXNfdCBSZWFkTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsIHN0ZDo6c3RyaW5nKiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZzTGFiZWwpOwogCiAvKiBSZWFkcyBmaWxlc3lzdGVtIG1ldGFkYXRhIGZyb20gdW50cnVzdGVkIGRldmljZSBhdCBwYXRoICovCi1zdGF0dXNfdCBSZWFkTWV0YWRhdGFVbnRydXN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBmc1V1aWQsIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKTsKK3N0YXR1c190IFJlYWRNZXRhZGF0YVVudHJ1c3RlZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwgc3RkOjpzdHJpbmcqIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnNMYWJlbCk7CiAKIC8qIFJldHVybnMgZWl0aGVyIFdFWElUU1RBVFVTKCkgc3RhdHVzLCBvciBhIG5lZ2F0aXZlIGVycm5vICovCiBzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7CiBzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc2VjdXJpdHlfY29udGV4dF90IGNvbnRleHQpOwogCi1zdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQpOwotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0LCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCk7CitzdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQpOworc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCk7CiAKIHBpZF90IEZvcmtFeGVjdnBBc3luYyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwogCisvKiBHZXRzIGJsb2NrIGRldmljZSBzaXplIGluIGJ5dGVzICovCitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoaW50IGZkLCB1aW50NjRfdCogc2l6ZSk7CitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHVpbnQ2NF90KiBzaXplKTsKKy8qIEdldHMgYmxvY2sgZGV2aWNlIHNpemUgaW4gNTEyIGJ5dGUgc2VjdG9ycyAqLworc3RhdHVzX3QgR2V0QmxvY2tEZXY1MTJTZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50NjRfdCogbnJfc2VjKTsKKwogc3RhdHVzX3QgUmVhZFJhbmRvbUJ5dGVzKHNpemVfdCBieXRlcywgc3RkOjpzdHJpbmcmIG91dCk7CiBzdGF0dXNfdCBSZWFkUmFuZG9tQnl0ZXMoc2l6ZV90IGJ5dGVzLCBjaGFyKiBidWZmZXIpOwogc3RhdHVzX3QgR2VuZXJhdGVSYW5kb21VdWlkKHN0ZDo6c3RyaW5nJiBvdXQpOwpAQCAtMTI1LDYgKzEzMCw4IEBACiAvKiBDaGVja3MgaWYgQW5kcm9pZCBpcyBydW5uaW5nIGluIFFFTVUgKi8KIGJvb2wgSXNSdW5uaW5nSW5FbXVsYXRvcigpOwogCitzdGF0dXNfdCBVbm1vdW50VHJlZShjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4KTsKKwogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL1ZvbGROYXRpdmVTZXJ2aWNlLmNwcCBiL1ZvbGROYXRpdmVTZXJ2aWNlLmNwcAppbmRleCA4MTUyM2M2Li45Njg0ZTFhIDEwMDY0NAotLS0gYS9Wb2xkTmF0aXZlU2VydmljZS5jcHAKKysrIGIvVm9sZE5hdGl2ZVNlcnZpY2UuY3BwCkBAIC0yNCw5ICsyNCwxMCBAQAogI2luY2x1ZGUgIlByb2Nlc3MuaCIKICNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAKLSNpbmNsdWRlICJjcnlwdGZzLmgiCisjaW5jbHVkZSAiQ2hlY2twb2ludC5oIgogI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgogI2luY2x1ZGUgIk1ldGFkYXRhQ3J5cHQuaCIKKyNpbmNsdWRlICJjcnlwdGZzLmgiCiAKICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPHRocmVhZD4KQEAgLTgzLDExICs4NCwxMSBAQAogICAgIHVpZF90IHVpZDsKIAogICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KHBlcm1pc3Npb24pLCByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmcGlkKSwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZ1aWQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZ1aWQpKSkgewogICAgICAgICByZXR1cm4gb2soKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9TRUNVUklUWSwKLSAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlVJRCAlZCAvIFBJRCAlZCBsYWNrcyBwZXJtaXNzaW9uICVzIiwgdWlkLCBwaWQsIHBlcm1pc3Npb24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlVJRCAlZCAvIFBJRCAlZCBsYWNrcyBwZXJtaXNzaW9uICVzIiwgdWlkLCBwaWQsIHBlcm1pc3Npb24pKTsKICAgICB9CiB9CiAKQEAgLTk3LDcgKzk4LDcgQEAKICAgICAgICAgcmV0dXJuIG9rKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfU0VDVVJJVFksCi0gICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJVSUQgJWQgaXMgbm90IGV4cGVjdGVkIFVJRCAlZCIsIHVpZCwgZXhwZWN0ZWRVaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlVJRCAlZCBpcyBub3QgZXhwZWN0ZWQgVUlEICVkIiwgdWlkLCBleHBlY3RlZFVpZCkpOwogICAgIH0KIH0KIApAQCAtMTA4LDcgKzEwOSw3IEBACiAgICAgZm9yIChjb25zdCBjaGFyJiBjIDogaWQpIHsKICAgICAgICAgaWYgKCFzdGQ6OmlzYWxudW0oYykgJiYgYyAhPSAnOicgJiYgYyAhPSAnLCcpIHsKICAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24oYmluZGVyOjpTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiSUQgJXMgaXMgbWFsZm9ybWVkIiwgaWQuY19zdHIoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIklEICVzIGlzIG1hbGZvcm1lZCIsIGlkLmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2soKTsKQEAgLTEyMCwxNiArMTIxLDE2IEBACiAgICAgfQogICAgIGlmIChwYXRoWzBdICE9ICcvJykgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyByZWxhdGl2ZSIsIHBhdGguY19zdHIoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyByZWxhdGl2ZSIsIHBhdGguY19zdHIoKSkpOwogICAgIH0KICAgICBpZiAoKHBhdGggKyAnLycpLmZpbmQoIi8uLi8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyBzaGFkeSIsIHBhdGguY19zdHIoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyBzaGFkeSIsIHBhdGguY19zdHIoKSkpOwogICAgIH0KICAgICBmb3IgKGNvbnN0IGNoYXImIGMgOiBwYXRoKSB7CiAgICAgICAgIGlmIChjID09ICdcMCcgfHwgYyA9PSAnXG4nKSB7CiAgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlBhdGggJXMgaXMgbWFsZm9ybWVkIiwgcGF0aC5jX3N0cigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyBtYWxmb3JtZWQiLCBwYXRoLmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2soKTsKQEAgLTE0MCw0NSArMTQxLDQ5IEBACiAgICAgZm9yIChjb25zdCBjaGFyJiBjIDogaGV4KSB7CiAgICAgICAgIGlmICghc3RkOjppc3hkaWdpdChjKSAmJiBjICE9ICc6JyAmJiBjICE9ICctJykgewogICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJIZXggJXMgaXMgbWFsZm9ybWVkIiwgaGV4LmNfc3RyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJIZXggJXMgaXMgbWFsZm9ybWVkIiwgaGV4LmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2soKTsKIH0KIAotI2RlZmluZSBFTkZPUkNFX1VJRCh1aWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrVWlkKCh1aWQpKTsgICAgICAgICAgICAgICAgXAotICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBFTkZPUkNFX1VJRCh1aWQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrVWlkKCh1aWQpKTsgXAorICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBDSEVDS19BUkdVTUVOVF9JRChpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRJZCgoaWQpKTsgICAgICAgICAgXAotICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBDSEVDS19BUkdVTUVOVF9JRChpZCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRJZCgoaWQpKTsgXAorICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBDSEVDS19BUkdVTUVOVF9QQVRIKHBhdGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRQYXRoKChwYXRoKSk7ICAgICAgXAotICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBDSEVDS19BUkdVTUVOVF9QQVRIKHBhdGgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tBcmd1bWVudFBhdGgoKHBhdGgpKTsgXAorICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBDSEVDS19BUkdVTUVOVF9IRVgoaGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRIZXgoKGhleCkpOyAgICAgICAgXAotICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBDSEVDS19BUkdVTUVOVF9IRVgoaGV4KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja0FyZ3VtZW50SGV4KChoZXgpKTsgXAorICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBBQ1FVSVJFX0xPQ0sgXAorI2RlZmluZSBBQ1FVSVJFX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5nZXRMb2NrKCkpOyBcCiAgICAgQVRSQUNFX0NBTEwoKTsKIAotI2RlZmluZSBBQ1FVSVJFX0NSWVBUX0xPQ0sgXAorI2RlZmluZSBBQ1FVSVJFX0NSWVBUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmdldENyeXB0TG9jaygpKTsgXAogICAgIEFUUkFDRV9DQUxMKCk7CiAKQEAgLTE5Niw3ICsyMDEsNyBAQAogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAotc3RhdHVzX3QgVm9sZE5hdGl2ZVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICYgLyogYXJncyAqLykgeworc3RhdHVzX3QgVm9sZE5hdGl2ZVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKiBhcmdzICovKSB7CiAgICAgYXV0byBvdXQgPSBzdGQ6OmZzdHJlYW0oU3RyaW5nUHJpbnRmKCIvcHJvYy9zZWxmL2ZkLyVkIiwgZmQpKTsKICAgICBjb25zdCBiaW5kZXI6OlN0YXR1cyBkdW1wX3Blcm1pc3Npb24gPSBjaGVja1Blcm1pc3Npb24oa0R1bXApOwogICAgIGlmICghZHVtcF9wZXJtaXNzaW9uLmlzT2soKSkgewpAQCAtMjExLDcgKzIxNiw3IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpzZXRMaXN0ZW5lcigKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKQEAgLTIyMywxMiArMjI4LDggQEAKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKIAogICAgIC8vIFNpbXBseSBhY3F1aXJlL3JlbGVhc2UgZWFjaCBsb2NrIGZvciB3YXRjaGRvZwotICAgIHsKLSAgICAgICAgQUNRVUlSRV9MT0NLOwotICAgIH0KLSAgICB7Ci0gICAgICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKLSAgICB9CisgICAgeyBBQ1FVSVJFX0xPQ0s7IH0KKyAgICB7IEFDUVVJUkVfQ1JZUFRfTE9DSzsgfQogCiAgICAgcmV0dXJuIG9rKCk7CiB9CkBAIC0yODMsNyArMjg0LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnBhcnRpdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGlza0lkLCBpbnQzMl90IHBhcnRpdGlvblR5cGUsCi0gICAgICAgIGludDMyX3QgcmF0aW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYXRpbykgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIENIRUNLX0FSR1VNRU5UX0lEKGRpc2tJZCk7CiAgICAgQUNRVUlSRV9MT0NLOwpAQCAtMjkzLDE1ICsyOTQsMTkgQEAKICAgICAgICAgcmV0dXJuIGVycm9yKCJGYWlsZWQgdG8gZmluZCBkaXNrICIgKyBkaXNrSWQpOwogICAgIH0KICAgICBzd2l0Y2ggKHBhcnRpdGlvblR5cGUpIHsKLSAgICBjYXNlIFBBUlRJVElPTl9UWVBFX1BVQkxJQzogcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25QdWJsaWMoKSk7Ci0gICAgY2FzZSBQQVJUSVRJT05fVFlQRV9QUklWQVRFOiByZXR1cm4gdHJhbnNsYXRlKGRpc2stPnBhcnRpdGlvblByaXZhdGUoKSk7Ci0gICAgY2FzZSBQQVJUSVRJT05fVFlQRV9NSVhFRDogcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25NaXhlZChyYXRpbykpOwotICAgIGRlZmF1bHQ6IHJldHVybiBlcnJvcigiVW5rbm93biB0eXBlICIgKyBzdGQ6OnRvX3N0cmluZyhwYXJ0aXRpb25UeXBlKSk7CisgICAgICAgIGNhc2UgUEFSVElUSU9OX1RZUEVfUFVCTElDOgorICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25QdWJsaWMoKSk7CisgICAgICAgIGNhc2UgUEFSVElUSU9OX1RZUEVfUFJJVkFURToKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUoZGlzay0+cGFydGl0aW9uUHJpdmF0ZSgpKTsKKyAgICAgICAgY2FzZSBQQVJUSVRJT05fVFlQRV9NSVhFRDoKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUoZGlzay0+cGFydGl0aW9uTWl4ZWQocmF0aW8pKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigiVW5rbm93biB0eXBlICIgKyBzdGQ6OnRvX3N0cmluZyhwYXJ0aXRpb25UeXBlKSk7CiAgICAgfQogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Zm9yZ2V0UGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0R3VpZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSEVYKHBhcnRHdWlkKTsKICAgICBDSEVDS19BUkdVTUVOVF9IRVgoZnNVdWlkKTsKQEAgLTMxMSw3ICszMTYsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkLCBpbnQzMl90IG1vdW50RmxhZ3MsCi0gICAgICAgIGludDMyX3QgbW91bnRVc2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1vdW50VXNlcklkKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSUQodm9sSWQpOwogICAgIEFDUVVJUkVfTE9DSzsKQEAgLTM4Nyw5ICszOTIsNyBAQAogICAgIGF1dG8gc3RhdHVzID0gcGF0aEZvclZvbElkKHZvbElkLCAmcGF0aCk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSByZXR1cm4gc3RhdHVzOwogCi0gICAgc3RkOjp0aHJlYWQoWz1dKCkgewotICAgICAgICBhbmRyb2lkOjp2b2xkOjpCZW5jaG1hcmsocGF0aCwgbGlzdGVuZXIpOwotICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsgYW5kcm9pZDo6dm9sZDo6QmVuY2htYXJrKHBhdGgsIGxpc3RlbmVyKTsgfSkuZGV0YWNoKCk7CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKQEAgLTQwNCw4ICs0MDcsOSBAQAogICAgIHJldHVybiB0cmFuc2xhdGUoYW5kcm9pZDo6dm9sZDo6Q2hlY2tFbmNyeXB0aW9uKHBhdGgpKTsKIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1vdmVTdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tVm9sSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b1ZvbElkLCBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1vdmVTdG9yYWdlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tVm9sSWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b1ZvbElkLAorICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSUQoZnJvbVZvbElkKTsKICAgICBDSEVDS19BUkdVTUVOVF9JRCh0b1ZvbElkKTsKQEAgLTQxOSw5ICs0MjMsNyBAQAogICAgICAgICByZXR1cm4gZXJyb3IoIkZhaWxlZCB0byBmaW5kIHZvbHVtZSAiICsgdG9Wb2xJZCk7CiAgICAgfQogCi0gICAgc3RkOjp0aHJlYWQoWz1dKCkgewotICAgICAgICBhbmRyb2lkOjp2b2xkOjpNb3ZlU3RvcmFnZShmcm9tVm9sLCB0b1ZvbCwgbGlzdGVuZXIpOwotICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsgYW5kcm9pZDo6dm9sZDo6TW92ZVN0b3JhZ2UoZnJvbVZvbCwgdG9Wb2wsIGxpc3RlbmVyKTsgfSkuZGV0YWNoKCk7CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKQEAgLTQzMSwxMSArNDMzLDIwIEBACiAKICAgICBzdGQ6OnN0cmluZyB0bXA7CiAgICAgc3dpdGNoIChyZW1vdW50TW9kZSkgewotICAgIGNhc2UgUkVNT1VOVF9NT0RFX05PTkU6IHRtcCA9ICJub25lIjsgYnJlYWs7Ci0gICAgY2FzZSBSRU1PVU5UX01PREVfREVGQVVMVDogdG1wID0gImRlZmF1bHQiOyBicmVhazsKLSAgICBjYXNlIFJFTU9VTlRfTU9ERV9SRUFEOiB0bXAgPSAicmVhZCI7IGJyZWFrOwotICAgIGNhc2UgUkVNT1VOVF9NT0RFX1dSSVRFOiB0bXAgPSAid3JpdGUiOyBicmVhazsKLSAgICBkZWZhdWx0OiByZXR1cm4gZXJyb3IoIlVua25vd24gbW9kZSAiICsgc3RkOjp0b19zdHJpbmcocmVtb3VudE1vZGUpKTsKKyAgICAgICAgY2FzZSBSRU1PVU5UX01PREVfTk9ORToKKyAgICAgICAgICAgIHRtcCA9ICJub25lIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFTU9VTlRfTU9ERV9ERUZBVUxUOgorICAgICAgICAgICAgdG1wID0gImRlZmF1bHQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVNT1VOVF9NT0RFX1JFQUQ6CisgICAgICAgICAgICB0bXAgPSAicmVhZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRU1PVU5UX01PREVfV1JJVEU6CisgICAgICAgICAgICB0bXAgPSAid3JpdGUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIlVua25vd24gbW9kZSAiICsgc3RkOjp0b19zdHJpbmcocmVtb3VudE1vZGUpKTsKICAgICB9CiAgICAgcmV0dXJuIHRyYW5zbGF0ZShWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdW50VWlkKHVpZCwgdG1wKSk7CiB9CkBAIC00NDksMTQgKzQ2MCwxNSBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Y3JlYXRlT2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LCBpbnQzMl90IG93bmVyR2lkLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VLZXksIGludDMyX3Qgb3duZXJHaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBDSEVDS19BUkdVTUVOVF9QQVRIKHNvdXJjZVBhdGgpOwogICAgIENIRUNLX0FSR1VNRU5UX0hFWChzb3VyY2VLZXkpOwogICAgIEFDUVVJUkVfTE9DSzsKIAogICAgIHJldHVybiB0cmFuc2xhdGUoCi0gICAgICAgICAgICBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5jcmVhdGVPYmIoc291cmNlUGF0aCwgc291cmNlS2V5LCBvd25lckdpZCwgX2FpZGxfcmV0dXJuKSk7CisgICAgICAgIFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmNyZWF0ZU9iYihzb3VyY2VQYXRoLCBzb3VyY2VLZXksIG93bmVyR2lkLCBfYWlkbF9yZXR1cm4pKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmRlc3Ryb3lPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKSB7CkBAIC00NjcsNDEgKzQ3OSwzNSBAQAogICAgIHJldHVybiB0cmFuc2xhdGUoVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+ZGVzdHJveU9iYih2b2xJZCkpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZnN0cmltKGludDMyX3QgZnN0cmltRmxhZ3MsCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZnN0cmltKAorICAgIGludDMyX3QgZnN0cmltRmxhZ3MsIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9MT0NLOwogCi0gICAgc3RkOjp0aHJlYWQoWz1dKCkgewotICAgICAgICBhbmRyb2lkOjp2b2xkOjpUcmltKGxpc3RlbmVyKTsKLSAgICB9KS5kZXRhY2goKTsKKyAgICBzdGQ6OnRocmVhZChbPV0oKSB7IGFuZHJvaWQ6OnZvbGQ6OlRyaW0obGlzdGVuZXIpOyB9KS5kZXRhY2goKTsKICAgICByZXR1cm4gb2soKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnJ1bklkbGVNYWludCgKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIAotICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsKLSAgICAgICAgYW5kcm9pZDo6dm9sZDo6UnVuSWRsZU1haW50KGxpc3RlbmVyKTsKLSAgICB9KS5kZXRhY2goKTsKKyAgICBzdGQ6OnRocmVhZChbPV0oKSB7IGFuZHJvaWQ6OnZvbGQ6OlJ1bklkbGVNYWludChsaXN0ZW5lcik7IH0pLmRldGFjaCgpOwogICAgIHJldHVybiBvaygpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6YWJvcnRJZGxlTWFpbnQoCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKLSAgICBzdGQ6OnRocmVhZChbPV0oKSB7Ci0gICAgICAgIGFuZHJvaWQ6OnZvbGQ6OkFib3J0SWRsZU1haW50KGxpc3RlbmVyKTsKLSAgICB9KS5kZXRhY2goKTsKKyAgICBzdGQ6OnRocmVhZChbPV0oKSB7IGFuZHJvaWQ6OnZvbGQ6OkFib3J0SWRsZU1haW50KGxpc3RlbmVyKTsgfSkuZGV0YWNoKCk7CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjptb3VudEFwcEZ1c2UoaW50MzJfdCB1aWQsIGludDMyX3QgcGlkLCBpbnQzMl90IG1vdW50SWQsCi0gICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogX2FpZGxfcmV0dXJuKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9MT0NLOwogCkBAIC01NDEsNyArNTQ3LDcgQEAKIH0KIAogc3RhdGljIGludCBmZGVFbmFibGVJbnRlcm5hbChpbnQzMl90IHBhc3N3b3JkVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkLAotICAgICAgICBpbnQzMl90IGVuY3J5cHRpb25GbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVuY3J5cHRpb25GbGFncykgewogICAgIGJvb2wgbm9VaSA9IChlbmNyeXB0aW9uRmxhZ3MgJiBWb2xkTmF0aXZlU2VydmljZTo6RU5DUllQVElPTl9GTEFHX05PX1VJKSAhPSAwOwogCiAgICAgZm9yIChpbnQgdHJpZXMgPSAwOyB0cmllcyA8IDI7ICsrdHJpZXMpIHsKQEAgLTU2Miw4ICs1NjgsOCBAQAogICAgIHJldHVybiAtMTsKIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZUVuYWJsZShpbnQzMl90IHBhc3N3b3JkVHlwZSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkLCBpbnQzMl90IGVuY3J5cHRpb25GbGFncykgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZUVuYWJsZShpbnQzMl90IHBhc3N3b3JkVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVuY3J5cHRpb25GbGFncykgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNTgxLDcgKzU4Nyw3IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVDaGFuZ2VQYXNzd29yZChpbnQzMl90IHBhc3N3b3JkVHlwZSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCkBAIC01OTUsOCArNjAxLDcgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlKGNyeXB0ZnNfdmVyaWZ5X3Bhc3N3ZChwYXNzd29yZC5jX3N0cigpKSk7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVHZXRGaWVsZChjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlR2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNjA5LDggKzYxNCw3IEBACiAgICAgfQogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlU2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlU2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCkBAIC02OTIsOCArNjk2LDcgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X21vdW50X21ldGFkYXRhX2VuY3J5cHRlZChtb3VudFBvaW50LCB0cnVlKSk7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpjcmVhdGVVc2VyS2V5KGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsCi0gICAgICAgIGJvb2wgZXBoZW1lcmFsKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Y3JlYXRlVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBib29sIGVwaGVtZXJhbCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNzA4LDcgKzcxMSw4IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjphZGRVc2VyS2V5QXV0aChpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNzIzLDcgKzcyNyw4IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjp1bmxvY2tVc2VyS2V5KGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIApAQCAtNzM4LDcgKzc0Myw4IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpwcmVwYXJlVXNlclN0b3JhZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiYgdXVpZCwKLSAgICAgICAgaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwgaW50MzJfdCBmbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgc3RkOjpzdHJpbmcgZW1wdHlfc3RyaW5nID0gIiI7CiAgICAgYXV0byB1dWlkXyA9IHV1aWQgPyAqdXVpZCA6IGVtcHR5X3N0cmluZzsKQEAgLTc0OSw3ICs3NTUsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZGVzdHJveVVzZXJTdG9yYWdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4mIHV1aWQsCi0gICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IGZsYWdzKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgc3RkOjpzdHJpbmcgZW1wdHlfc3RyaW5nID0gIiI7CiAgICAgYXV0byB1dWlkXyA9IHV1aWQgPyAqdXVpZCA6IGVtcHR5X3N0cmluZzsKQEAgLTc1OSw1ICs3NjUsNjQgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X2Rlc3Ryb3lfdXNlcl9zdG9yYWdlKHV1aWRfLCB1c2VySWQsIGZsYWdzKSk7CiB9CiAKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpzdGFydENoZWNrcG9pbnQoaW50MzJfdCByZXRyeSkgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiBjcF9zdGFydENoZWNrcG9pbnQocmV0cnkpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bmVlZHNSb2xsYmFjayhib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gY3BfbmVlZHNSb2xsYmFjaygpOworICAgIHJldHVybiBvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bmVlZHNDaGVja3BvaW50KGJvb2wqIF9haWRsX3JldHVybikgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgICpfYWlkbF9yZXR1cm4gPSBjcF9uZWVkc0NoZWNrcG9pbnQoKTsKKyAgICByZXR1cm4gb2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmNvbW1pdENoYW5nZXMoKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQUNRVUlSRV9MT0NLOworCisgICAgcmV0dXJuIGNwX2NvbW1pdENoYW5nZXMoKTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnByZXBhcmVDaGVja3BvaW50KCkgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiBjcF9wcmVwYXJlQ2hlY2twb2ludCgpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6cmVzdG9yZUNoZWNrcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50UG9pbnQpIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBDSEVDS19BUkdVTUVOVF9QQVRIKG1vdW50UG9pbnQpOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiBjcF9yZXN0b3JlQ2hlY2twb2ludChtb3VudFBvaW50KTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1hcmtCb290QXR0ZW1wdCgpIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICByZXR1cm4gY3BfbWFya0Jvb3RBdHRlbXB0KCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjphYm9ydENoYW5nZXMoKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQUNRVUlSRV9MT0NLOworCisgICAgcmV0dXJuIGNwX2Fib3J0Q2hhbmdlcygpOworfQorCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL1ZvbGROYXRpdmVTZXJ2aWNlLmggYi9Wb2xkTmF0aXZlU2VydmljZS5oCmluZGV4IDJlOTAxMDEuLjQwY2UzYTQgMTAwNjQ0Ci0tLSBhL1ZvbGROYXRpdmVTZXJ2aWNlLmgKKysrIGIvVm9sZE5hdGl2ZVNlcnZpY2UuaApAQCAtMjYsMTAgKzI2LDEwIEBACiBuYW1lc3BhY2Ugdm9sZCB7CiAKIGNsYXNzIFZvbGROYXRpdmVTZXJ2aWNlIDogcHVibGljIEJpbmRlclNlcnZpY2U8Vm9sZE5hdGl2ZVNlcnZpY2U+LCBwdWJsaWMgb3M6OkJuVm9sZCB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICBzdGF0aWMgY2hhciBjb25zdCogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAidm9sZCI7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIHNldExpc3RlbmVyKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZExpc3RlbmVyPiYgbGlzdGVuZXIpOwogCkBAIC01MSwzOCArNTEsMzUgQEAKICAgICBiaW5kZXI6OlN0YXR1cyB1bm1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSk7CiAgICAgYmluZGVyOjpTdGF0dXMgYmVuY2htYXJrKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCwKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwogICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrRW5jcnlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgbW92ZVN0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb21Wb2xJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRvVm9sSWQsCi0gICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgcmVtb3VudFVpZChpbnQzMl90IHVpZCwgaW50MzJfdCByZW1vdW50TW9kZSk7CiAKICAgICBiaW5kZXI6OlN0YXR1cyBta2RpcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgY3JlYXRlT2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LAotICAgICAgICAgICAgaW50MzJfdCBvd25lckdpZCwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3duZXJHaWQsIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pOwogICAgIGJpbmRlcjo6U3RhdHVzIGRlc3Ryb3lPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIGZzdHJpbShpbnQzMl90IGZzdHJpbUZsYWdzLAotICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwotICAgIGJpbmRlcjo6U3RhdHVzIHJ1bklkbGVNYWludCgKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKLSAgICBiaW5kZXI6OlN0YXR1cyBhYm9ydElkbGVNYWludCgKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIGJpbmRlcjo6U3RhdHVzIHJ1bklkbGVNYWludChjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgYmluZGVyOjpTdGF0dXMgYWJvcnRJZGxlTWFpbnQoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgbW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwgaW50MzJfdCBtb3VudElkLAotICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBfYWlkbF9yZXR1cm4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIF9haWRsX3JldHVybik7CiAgICAgYmluZGVyOjpTdGF0dXMgdW5tb3VudEFwcEZ1c2UoaW50MzJfdCB1aWQsIGludDMyX3QgcGlkLCBpbnQzMl90IG1vdW50SWQpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgZmRlQ2hlY2tQYXNzd29yZChjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZkZVJlc3RhcnQoKTsKICAgICBiaW5kZXI6OlN0YXR1cyBmZGVDb21wbGV0ZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pOwotICAgIGJpbmRlcjo6U3RhdHVzIGZkZUVuYWJsZShpbnQzMl90IHBhc3N3b3JkVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpOwotICAgIGJpbmRlcjo6U3RhdHVzIGZkZUNoYW5nZVBhc3N3b3JkKGludDMyX3QgcGFzc3dvcmRUeXBlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBmZGVFbmFibGUoaW50MzJfdCBwYXNzd29yZFR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmNyeXB0aW9uRmxhZ3MpOworICAgIGJpbmRlcjo6U3RhdHVzIGZkZUNoYW5nZVBhc3N3b3JkKGludDMyX3QgcGFzc3dvcmRUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZkZVZlcmlmeVBhc3N3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZmRlR2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybik7CiAgICAgYmluZGVyOjpTdGF0dXMgZmRlU2V0RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKQEAgLTEwMSwxOCArOTgsMzAgQEAKICAgICBiaW5kZXI6OlN0YXR1cyBjcmVhdGVVc2VyS2V5KGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsIGJvb2wgZXBoZW1lcmFsKTsKICAgICBiaW5kZXI6OlN0YXR1cyBkZXN0cm95VXNlcktleShpbnQzMl90IHVzZXJJZCk7CiAKLSAgICBiaW5kZXI6OlN0YXR1cyBhZGRVc2VyS2V5QXV0aChpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0KTsKKyAgICBiaW5kZXI6OlN0YXR1cyBhZGRVc2VyS2V5QXV0aChpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZml4YXRlTmV3ZXN0VXNlcktleUF1dGgoaW50MzJfdCB1c2VySWQpOwogCi0gICAgYmluZGVyOjpTdGF0dXMgdW5sb2NrVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0KTsKKyAgICBiaW5kZXI6OlN0YXR1cyB1bmxvY2tVc2VyS2V5KGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGxvY2tVc2VyS2V5KGludDMyX3QgdXNlcklkKTsKIAotICAgIGJpbmRlcjo6U3RhdHVzIHByZXBhcmVVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLAotICAgICAgICAgICAgaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwgaW50MzJfdCBmbGFncyk7Ci0gICAgYmluZGVyOjpTdGF0dXMgZGVzdHJveVVzZXJTdG9yYWdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4mIHV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHVzZXJJZCwgaW50MzJfdCBmbGFncyk7CisgICAgYmluZGVyOjpTdGF0dXMgcHJlcGFyZVVzZXJTdG9yYWdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4mIHV1aWQsIGludDMyX3QgdXNlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVzZXJTZXJpYWwsIGludDMyX3QgZmxhZ3MpOworICAgIGJpbmRlcjo6U3RhdHVzIGRlc3Ryb3lVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLCBpbnQzMl90IHVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFncyk7CisKKyAgICBiaW5kZXI6OlN0YXR1cyBtb3VudEV4dGVybmFsU3RvcmFnZUZvckFwcChjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZU5hbWUsIGludDMyX3QgYXBwSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNhbmRib3hJZCwgaW50MzJfdCB1c2VySWQpOworCisgICAgYmluZGVyOjpTdGF0dXMgc3RhcnRDaGVja3BvaW50KGludDMyX3QgcmV0cnkpOworICAgIGJpbmRlcjo6U3RhdHVzIG5lZWRzQ2hlY2twb2ludChib29sKiBfYWlkbF9yZXR1cm4pOworICAgIGJpbmRlcjo6U3RhdHVzIG5lZWRzUm9sbGJhY2soYm9vbCogX2FpZGxfcmV0dXJuKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjb21taXRDaGFuZ2VzKCk7CisgICAgYmluZGVyOjpTdGF0dXMgcHJlcGFyZUNoZWNrcG9pbnQoKTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXN0b3JlQ2hlY2twb2ludChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQb2ludCk7CisgICAgYmluZGVyOjpTdGF0dXMgbWFya0Jvb3RBdHRlbXB0KCk7CisgICAgYmluZGVyOjpTdGF0dXMgYWJvcnRDaGFuZ2VzKCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZApkaWZmIC0tZ2l0IGEvVm9sZFV0aWwuY3BwIGIvVm9sZFV0aWwuY3BwCmluZGV4IGFmZThiNTMuLjRiOTgwYmUgMTAwNjQ0Ci0tLSBhL1ZvbGRVdGlsLmNwcAorKysgYi9Wb2xkVXRpbC5jcHAKQEAgLTE0LDEzICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KIAotc3RydWN0IGZzdGFiICpmc3RhYl9kZWZhdWx0OwotCi12b2lkIGdldF9ibGtkZXZfc2l6ZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcqIG5yX3NlYykgewotICBpZiAoKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCBucl9zZWMpKSA9PSAtMSkgewotICAgICpucl9zZWMgPSAwOwotICB9Ci19CitzdHJ1Y3QgZnN0YWIqIGZzdGFiX2RlZmF1bHQ7CmRpZmYgLS1naXQgYS9Wb2xkVXRpbC5oIGIvVm9sZFV0aWwuaAppbmRleCBmZDY2NjcyLi43ODJlMzZkIDEwMDY0NAotLS0gYS9Wb2xkVXRpbC5oCisrKyBiL1ZvbGRVdGlsLmgKQEAgLTIwLDEwICsyMCw4IEBACiAjaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotZXh0ZXJuIHN0cnVjdCBmc3RhYiAqZnN0YWJfZGVmYXVsdDsKK2V4dGVybiBzdHJ1Y3QgZnN0YWIqIGZzdGFiX2RlZmF1bHQ7CiAKICNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQogCi12b2lkIGdldF9ibGtkZXZfc2l6ZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcqIG5yX3NlYyk7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvVm9sdW1lTWFuYWdlci5jcHAgYi9Wb2x1bWVNYW5hZ2VyLmNwcAppbmRleCA4YzMyNTg3Li43NWUyOGQ0IDEwMDY0NAotLS0gYS9Wb2x1bWVNYW5hZ2VyLmNwcAorKysgYi9Wb2x1bWVNYW5hZ2VyLmNwcApAQCAtMjYsOCArMjYsOCBAQAogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKQEAgLTY0LDYgKzY0LDcgQEAKICNpbmNsdWRlICJtb2RlbC9FbXVsYXRlZFZvbHVtZS5oIgogI2luY2x1ZGUgIm1vZGVsL09iYlZvbHVtZS5oIgogCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogCkBAIC03OSwxMSArODAsMTAgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4gPSAyNDA7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4ID0gMjU0OwogCi1Wb2x1bWVNYW5hZ2VyICpWb2x1bWVNYW5hZ2VyOjpzSW5zdGFuY2UgPSBOVUxMOworVm9sdW1lTWFuYWdlciogVm9sdW1lTWFuYWdlcjo6c0luc3RhbmNlID0gTlVMTDsKIAotVm9sdW1lTWFuYWdlciAqVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKSB7Ci0gICAgaWYgKCFzSW5zdGFuY2UpCi0gICAgICAgIHNJbnN0YW5jZSA9IG5ldyBWb2x1bWVNYW5hZ2VyKCk7CitWb2x1bWVNYW5hZ2VyKiBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpIHsKKyAgICBpZiAoIXNJbnN0YW5jZSkgc0luc3RhbmNlID0gbmV3IFZvbHVtZU1hbmFnZXIoKTsKICAgICByZXR1cm4gc0luc3RhbmNlOwogfQogCkBAIC05NSw4ICs5NSw3IEBACiAgICAgbVNlY3VyZUtleWd1YXJkU2hvd2luZyA9IHRydWU7CiB9CiAKLVZvbHVtZU1hbmFnZXI6On5Wb2x1bWVNYW5hZ2VyKCkgewotfQorVm9sdW1lTWFuYWdlcjo6flZvbHVtZU1hbmFnZXIoKSB7fQogCiBpbnQgVm9sdW1lTWFuYWdlcjo6dXBkYXRlVmlydHVhbERpc2soKSB7CiAgICAgQVRSQUNFX05BTUUoIlZvbHVtZU1hbmFnZXI6OnVwZGF0ZVZpcnR1YWxEaXNrIik7CkBAIC0xMTcsOCArMTE2LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF1dG8gZGlzayA9IG5ldyBhbmRyb2lkOjp2b2xkOjpEaXNrKCJ2aXJ0dWFsIiwgYnVmLnN0X3JkZXYsICJ2aXJ0dWFsIiwKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtBZG9wdGFibGUgfCBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a1NkKTsKKyAgICAgICAgICAgIGF1dG8gZGlzayA9IG5ldyBhbmRyb2lkOjp2b2xkOjpEaXNrKAorICAgICAgICAgICAgICAgICJ2aXJ0dWFsIiwgYnVmLnN0X3JkZXYsICJ2aXJ0dWFsIiwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a0Fkb3B0YWJsZSB8IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprU2QpOwogICAgICAgICAgICAgbVZpcnR1YWxEaXNrID0gc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OkRpc2s+KGRpc2spOwogICAgICAgICAgICAgaGFuZGxlRGlza0FkZGVkKG1WaXJ0dWFsRGlzayk7CiAgICAgICAgIH0KQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgIC8vIHN0b3JhZ2U7IHRoZSBmcmFtZXdvcmsgd2lsbCBkZWNpZGUgaWYgaXQgc2hvdWxkIGJlIG1vdW50ZWQuCiAgICAgQ0hFQ0sobUludGVybmFsRW11bGF0ZWQgPT0gbnVsbHB0cik7CiAgICAgbUludGVybmFsRW11bGF0ZWQgPSBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZT4oCi0gICAgICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6RW11bGF0ZWRWb2x1bWUoIi9kYXRhL21lZGlhIikpOworICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6RW11bGF0ZWRWb2x1bWUoIi9kYXRhL21lZGlhIikpOwogICAgIG1JbnRlcm5hbEVtdWxhdGVkLT5jcmVhdGUoKTsKIAogICAgIC8vIENvbnNpZGVyIGNyZWF0aW5nIGEgdmlydHVhbCBkaXNrCkBAIC0xNzMsMTcgKzE3MywxNyBAQAogICAgIHJldHVybiAwOwogfQogCi12b2lkIFZvbHVtZU1hbmFnZXI6OmhhbmRsZUJsb2NrRXZlbnQoTmV0bGlua0V2ZW50ICpldnQpIHsKK3ZvaWQgVm9sdW1lTWFuYWdlcjo6aGFuZGxlQmxvY2tFdmVudChOZXRsaW5rRXZlbnQqIGV2dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtRGVidWcpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICItLS0tLS0tLS0tLS0tLS0tIjsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJoYW5kbGVCbG9ja0V2ZW50IHdpdGggYWN0aW9uICIgPDwgKGludCkgZXZ0LT5nZXRBY3Rpb24oKTsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiLS0tLS0tLS0tLS0tLS0tLSI7CisgICAgICAgIExPRyhERUJVRykgPDwgImhhbmRsZUJsb2NrRXZlbnQgd2l0aCBhY3Rpb24gIiA8PCAoaW50KWV2dC0+Z2V0QWN0aW9uKCk7CiAgICAgICAgIGV2dC0+ZHVtcCgpOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIGV2ZW50UGF0aChldnQtPmZpbmRQYXJhbSgiREVWUEFUSCIpP2V2dC0+ZmluZFBhcmFtKCJERVZQQVRIIik6IiIpOwotICAgIHN0ZDo6c3RyaW5nIGRldlR5cGUoZXZ0LT5maW5kUGFyYW0oIkRFVlRZUEUiKT9ldnQtPmZpbmRQYXJhbSgiREVWVFlQRSIpOiIiKTsKKyAgICBzdGQ6OnN0cmluZyBldmVudFBhdGgoZXZ0LT5maW5kUGFyYW0oIkRFVlBBVEgiKSA/IGV2dC0+ZmluZFBhcmFtKCJERVZQQVRIIikgOiAiIik7CisgICAgc3RkOjpzdHJpbmcgZGV2VHlwZShldnQtPmZpbmRQYXJhbSgiREVWVFlQRSIpID8gZXZ0LT5maW5kUGFyYW0oIkRFVlRZUEUiKSA6ICIiKTsKIAogICAgIGlmIChkZXZUeXBlICE9ICJkaXNrIikgcmV0dXJuOwogCkBAIC0xOTIsNDMgKzE5Miw0MiBAQAogICAgIGRldl90IGRldmljZSA9IG1ha2VkZXYobWFqb3IsIG1pbm9yKTsKIAogICAgIHN3aXRjaCAoZXZ0LT5nZXRBY3Rpb24oKSkgewotICAgIGNhc2UgTmV0bGlua0V2ZW50OjpBY3Rpb246OmtBZGQ6IHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzb3VyY2UgOiBtRGlza1NvdXJjZXMpIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UtPm1hdGNoZXMoZXZlbnRQYXRoKSkgewotICAgICAgICAgICAgICAgIC8vIEZvciBub3csIGFzc3VtZSB0aGF0IE1NQyBhbmQgdmlydGlvLWJsayAodGhlIGxhdHRlciBpcwotICAgICAgICAgICAgICAgIC8vIGVtdWxhdG9yLXNwZWNpZmljOyBzZWUgRGlzay5jcHAgZm9yIGRldGFpbHMpIGRldmljZXMgYXJlIFNELAotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGF0IGV2ZXJ5dGhpbmcgZWxzZSBpcyBVU0IKLSAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSBzb3VyY2UtPmdldEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ham9yID09IGtNYWpvckJsb2NrTW1jCi0gICAgICAgICAgICAgICAgICAgIHx8IChhbmRyb2lkOjp2b2xkOjpJc1J1bm5pbmdJbkVtdWxhdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbWFqb3IgPj0gKGludCkga01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4KLSAgICAgICAgICAgICAgICAgICAgJiYgbWFqb3IgPD0gKGludCkga01ham9yQmxvY2tFeHBlcmltZW50YWxNYXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprU2Q7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtVc2I7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBjYXNlIE5ldGxpbmtFdmVudDo6QWN0aW9uOjprQWRkOiB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNvdXJjZSA6IG1EaXNrU291cmNlcykgeworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UtPm1hdGNoZXMoZXZlbnRQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBhc3N1bWUgdGhhdCBNTUMgYW5kIHZpcnRpby1ibGsgKHRoZSBsYXR0ZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZW11bGF0b3Itc3BlY2lmaWM7IHNlZSBEaXNrLmNwcCBmb3IgZGV0YWlscykgZGV2aWNlcyBhcmUgU0QsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGF0IGV2ZXJ5dGhpbmcgZWxzZSBpcyBVU0IKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gc291cmNlLT5nZXRGbGFncygpOworICAgICAgICAgICAgICAgICAgICBpZiAobWFqb3IgPT0ga01ham9yQmxvY2tNbWMgfHwgKGFuZHJvaWQ6OnZvbGQ6OklzUnVubmluZ0luRW11bGF0b3IoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ham9yID49IChpbnQpa01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWpvciA8PSAoaW50KWtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtTZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprVXNiOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBhdXRvIGRpc2sgPSBuZXcgYW5kcm9pZDo6dm9sZDo6RGlzayhldmVudFBhdGgsIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+Z2V0Tmlja25hbWUoKSwgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGhhbmRsZURpc2tBZGRlZChzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6RGlzaz4oZGlzaykpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBhdXRvIGRpc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OnZvbGQ6OkRpc2soZXZlbnRQYXRoLCBkZXZpY2UsIHNvdXJjZS0+Z2V0Tmlja25hbWUoKSwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNrQWRkZWQoc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OkRpc2s+KGRpc2spKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTmV0bGlua0V2ZW50OjpBY3Rpb246OmtDaGFuZ2U6IHsKLSAgICAgICAgTE9HKERFQlVHKSA8PCAiRGlzayBhdCAiIDw8IG1ham9yIDw8ICI6IiA8PCBtaW5vciA8PCAiIGNoYW5nZWQiOwotICAgICAgICBoYW5kbGVEaXNrQ2hhbmdlZChkZXZpY2UpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBOZXRsaW5rRXZlbnQ6OkFjdGlvbjo6a1JlbW92ZTogewotICAgICAgICBoYW5kbGVEaXNrUmVtb3ZlZChkZXZpY2UpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgICBMT0coV0FSTklORykgPDwgIlVuZXhwZWN0ZWQgYmxvY2sgZXZlbnQgYWN0aW9uICIgPDwgKGludCkgZXZ0LT5nZXRBY3Rpb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgICBjYXNlIE5ldGxpbmtFdmVudDo6QWN0aW9uOjprQ2hhbmdlOiB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJEaXNrIGF0ICIgPDwgbWFqb3IgPDwgIjoiIDw8IG1pbm9yIDw8ICIgY2hhbmdlZCI7CisgICAgICAgICAgICBoYW5kbGVEaXNrQ2hhbmdlZChkZXZpY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBOZXRsaW5rRXZlbnQ6OkFjdGlvbjo6a1JlbW92ZTogeworICAgICAgICAgICAgaGFuZGxlRGlza1JlbW92ZWQoZGV2aWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5leHBlY3RlZCBibG9jayBldmVudCBhY3Rpb24gIiA8PCAoaW50KWV2dC0+Z2V0QWN0aW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMjM3LDcgKzIzNiw3IEBACiAgICAgLy8gdW50aWwgdGhlIHVzZXIgdW5sb2NrcyB0aGUgZGV2aWNlIHRvIGFjdHVhbGx5IHRvdWNoIGl0CiAgICAgaWYgKG1TZWN1cmVLZXlndWFyZFNob3dpbmcpIHsKICAgICAgICAgTE9HKElORk8pIDw8ICJGb3VuZCBkaXNrIGF0ICIgPDwgZGlzay0+Z2V0RXZlbnRQYXRoKCkKLSAgICAgICAgICAgICAgICA8PCAiIGJ1dCBkZWxheWluZyBzY2FuIGR1ZSB0byBzZWN1cmUga2V5Z3VhcmQiOworICAgICAgICAgICAgICAgICAgPDwgIiBidXQgZGVsYXlpbmcgc2NhbiBkdWUgdG8gc2VjdXJlIGtleWd1YXJkIjsKICAgICAgICAgbVBlbmRpbmdEaXNrcy5wdXNoX2JhY2soZGlzayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZGlzay0+Y3JlYXRlKCk7CkBAIC0zMTIsOCArMzExLDcgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotdm9pZCBWb2x1bWVNYW5hZ2VyOjpsaXN0Vm9sdW1lcyhhbmRyb2lkOjp2b2xkOjpWb2x1bWVCYXNlOjpUeXBlIHR5cGUsCi0gICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGxpc3QpIHsKK3ZvaWQgVm9sdW1lTWFuYWdlcjo6bGlzdFZvbHVtZXMoYW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZTo6VHlwZSB0eXBlLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBsaXN0KSB7CiAgICAgbGlzdC5jbGVhcigpOwogICAgIGZvciAoY29uc3QgYXV0byYgZGlzayA6IG1EaXNrcykgewogICAgICAgICBkaXNrLT5saXN0Vm9sdW1lcyh0eXBlLCBsaXN0KTsKQEAgLTQxMywzMyArNDExLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1bm1vdW50X3RyZWUoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCkgewotICAgIEZJTEUqIGZwID0gc2V0bW50ZW50KCIvcHJvYy9tb3VudHMiLCAiciIpOwotICAgIGlmIChmcCA9PSBOVUxMKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAvcHJvYy9tb3VudHMiOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIC8vIFNvbWUgdm9sdW1lcyBjYW4gYmUgc3RhY2tlZCBvbiBlYWNoIG90aGVyLCBzbyBmb3JjZSB1bm1vdW50IGluCi0gICAgLy8gcmV2ZXJzZSBvcmRlciB0byBnaXZlIHVzIHRoZSBiZXN0IGNoYW5jZSBvZiBzdWNjZXNzLgotICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gdG9Vbm1vdW50OwotICAgIG1udGVudCogbWVudHJ5OwotICAgIHdoaWxlICgobWVudHJ5ID0gZ2V0bW50ZW50KGZwKSkgIT0gTlVMTCkgewotICAgICAgICBhdXRvIHRlc3QgPSBzdGQ6OnN0cmluZyhtZW50cnktPm1udF9kaXIpICsgIi8iOwotICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aCh0ZXN0LCBwcmVmaXgpKSB7Ci0gICAgICAgICAgICB0b1VubW91bnQucHVzaF9mcm9udCh0ZXN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbmRtbnRlbnQoZnApOwotCi0gICAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogdG9Vbm1vdW50KSB7Ci0gICAgICAgIGlmICh1bW91bnQyKHBhdGguY19zdHIoKSwgTU5UX0RFVEFDSCkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdW5tb3VudCAiIDw8IHBhdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBWb2x1bWVNYW5hZ2VyOjpyZW1vdW50VWlkKHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGUpIHsKICAgICBMT0coREVCVUcpIDw8ICJSZW1vdW50aW5nICIgPDwgdWlkIDw8ICIgYXMgbW9kZSAiIDw8IG1vZGU7CiAKQEAgLTQ5Nyw3ICs0NjgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gV2UgcHVycG9zZWZ1bGx5IGxlYXZlIHRoZSBuYW1lc3BhY2Ugb3BlbiBhY3Jvc3MgdGhlIGZvcmsKLSAgICAgICAgbnNGZCA9IG9wZW5hdChwaWRGZCwgIm5zL21udCIsIE9fUkRPTkxZKTsgLy8gbm90IE9fQ0xPRVhFQworICAgICAgICBuc0ZkID0gb3BlbmF0KHBpZEZkLCAibnMvbW50IiwgT19SRE9OTFkpOyAgLy8gbm90IE9fQ0xPRVhFQwogICAgICAgICBpZiAobnNGZCA8IDApIHsKICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvcGVuIG5hbWVzcGFjZSBmb3IgIiA8PCBkZS0+ZF9uYW1lOwogICAgICAgICAgICAgZ290byBuZXh0OwpAQCAtNTA5LDcgKzQ4MCw3IEBACiAgICAgICAgICAgICAgICAgX2V4aXQoMSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVubW91bnRfdHJlZSgiL3N0b3JhZ2UvIik7CisgICAgICAgICAgICBhbmRyb2lkOjp2b2xkOjpVbm1vdW50VHJlZSgiL3N0b3JhZ2UvIik7CiAKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0b3JhZ2VTb3VyY2U7CiAgICAgICAgICAgICBpZiAobW9kZSA9PSAiZGVmYXVsdCIpIHsKQEAgLTUyMiwyNiArNDkzLDIyIEBACiAgICAgICAgICAgICAgICAgLy8gU2FuZSBkZWZhdWx0IG9mIG5vIHN0b3JhZ2UgdmlzaWJsZQogICAgICAgICAgICAgICAgIF9leGl0KDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudChzdG9yYWdlU291cmNlLmNfc3RyKCksICIvc3RvcmFnZSIsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsIE1TX0JJTkQgfCBNU19SRUMsIE5VTEwpKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW91bnQgIiA8PCBzdG9yYWdlU291cmNlIDw8ICIgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRlLT5kX25hbWU7CisgICAgICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKAorICAgICAgICAgICAgICAgICAgICBtb3VudChzdG9yYWdlU291cmNlLmNfc3RyKCksICIvc3RvcmFnZSIsIE5VTEwsIE1TX0JJTkQgfCBNU19SRUMsIE5VTEwpKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW91bnQgIiA8PCBzdG9yYWdlU291cmNlIDw8ICIgZm9yICIgPDwgZGUtPmRfbmFtZTsKICAgICAgICAgICAgICAgICBfZXhpdCgxKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkobW91bnQoTlVMTCwgIi9zdG9yYWdlIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTVNfUkVDIHwgTVNfU0xBVkUsIE5VTEwpKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IE1TX1NMQVZFIHRvIC9zdG9yYWdlIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBkZS0+ZF9uYW1lOworICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudChOVUxMLCAiL3N0b3JhZ2UiLCBOVUxMLCBNU19SRUMgfCBNU19TTEFWRSwgTlVMTCkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgTVNfU0xBVkUgdG8gL3N0b3JhZ2UgZm9yICIgPDwgZGUtPmRfbmFtZTsKICAgICAgICAgICAgICAgICBfZXhpdCgxKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTW91bnQgdXNlci1zcGVjaWZpYyBzeW1saW5rIGhlbHBlciBpbnRvIHBsYWNlCiAgICAgICAgICAgICB1c2VyaWRfdCB1c2VyX2lkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKHVpZCk7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyB1c2VyU291cmNlKFN0cmluZ1ByaW50ZigiL21udC91c2VyLyVkIiwgdXNlcl9pZCkpOwotICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudCh1c2VyU291cmNlLmNfc3RyKCksICIvc3RvcmFnZS9zZWxmIiwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTVNfQklORCwgTlVMTCkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtb3VudCAiIDw8IHVzZXJTb3VyY2UgPDwgIiBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGUtPmRfbmFtZTsKKyAgICAgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoCisgICAgICAgICAgICAgICAgICAgIG1vdW50KHVzZXJTb3VyY2UuY19zdHIoKSwgIi9zdG9yYWdlL3NlbGYiLCBOVUxMLCBNU19CSU5ELCBOVUxMKSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1vdW50ICIgPDwgdXNlclNvdXJjZSA8PCAiIGZvciAiIDw8IGRlLT5kX25hbWU7CiAgICAgICAgICAgICAgICAgX2V4aXQoMSk7CiAgICAgICAgICAgICB9CiAKQEAgLTU1NSw3ICs1MjIsNyBAQAogICAgICAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQoY2hpbGQsIG51bGxwdHIsIDApKTsKICAgICAgICAgfQogCi1uZXh0OgorICAgIG5leHQ6CiAgICAgICAgIGNsb3NlKG5zRmQpOwogICAgICAgICBjbG9zZShwaWRGZCk7CiAgICAgfQpAQCAtNTgzLDcgKzU1MCw3IEBACiAvLyBDYW4gYmUgY2FsbGVkIHR3aWNlIChzZXF1ZW50aWFsbHkpIGR1cmluZyBzaHV0ZG93bi4gc2hvdWxkIGJlIHNhZmUgZm9yIHRoYXQuCiBpbnQgVm9sdW1lTWFuYWdlcjo6c2h1dGRvd24oKSB7CiAgICAgaWYgKG1JbnRlcm5hbEVtdWxhdGVkID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIDA7IC8vIGFscmVhZHkgc2h1dGRvd24KKyAgICAgICAgcmV0dXJuIDA7ICAvLyBhbHJlYWR5IHNodXRkb3duCiAgICAgfQogICAgIGFuZHJvaWQ6OnZvbGQ6OnNTbGVlcE9uVW5tb3VudCA9IGZhbHNlOwogICAgIG1JbnRlcm5hbEVtdWxhdGVkLT5kZXN0cm95KCk7CkBAIC02MjMsOSArNTkwLDEyIEBACiAgICAgbW50ZW50KiBtZW50cnk7CiAgICAgd2hpbGUgKChtZW50cnkgPSBnZXRtbnRlbnQoZnApKSAhPSBOVUxMKSB7CiAgICAgICAgIGF1dG8gdGVzdCA9IHN0ZDo6c3RyaW5nKG1lbnRyeS0+bW50X2Rpcik7Ci0gICAgICAgIGlmICgoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aCh0ZXN0LCAiL21udC8iKSAmJgotICAgICAgICAgICAgICFhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHRlc3QsICIvbW50L3ZlbmRvciIpKSB8fAotICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aCh0ZXN0LCAiL3N0b3JhZ2UvIikpIHsKKyAgICAgICAgaWYgKChTdGFydHNXaXRoKHRlc3QsICIvbW50LyIpICYmCisjaWZkZWYgX19BTkRST0lEX0RFQlVHR0FCTEVfXworICAgICAgICAgICAgICFTdGFydHNXaXRoKHRlc3QsICIvbW50L3NjcmF0Y2giKSAmJgorI2VuZGlmCisgICAgICAgICAgICAgIVN0YXJ0c1dpdGgodGVzdCwgIi9tbnQvdmVuZG9yIikgJiYgIVN0YXJ0c1dpdGgodGVzdCwgIi9tbnQvcHJvZHVjdCIpKSB8fAorICAgICAgICAgICAgU3RhcnRzV2l0aCh0ZXN0LCAiL3N0b3JhZ2UvIikpIHsKICAgICAgICAgICAgIHRvVW5tb3VudC5wdXNoX2Zyb250KHRlc3QpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjQxLDcgKzYxMSw3IEBACiAKIGludCBWb2x1bWVNYW5hZ2VyOjpta2RpcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICAvLyBPbmx5IG9mZmVyIHRvIGNyZWF0ZSBkaXJlY3RvcmllcyBmb3IgcGF0aHMgbWFuYWdlZCBieSB2b2xkCi0gICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgocGF0aCwgIi9zdG9yYWdlLyIpKSB7CisgICAgaWYgKFN0YXJ0c1dpdGgocGF0aCwgIi9zdG9yYWdlLyIpKSB7CiAgICAgICAgIC8vIGZzX21rZGlycygpIGRvZXMgc3ltbGluayBjaGVja2luZyBhbmQgcmVsYXRpdmUgcGF0aCBlbmZvcmNlbWVudAogICAgICAgICByZXR1cm4gZnNfbWtkaXJzKHBhdGguY19zdHIoKSwgMDcwMCk7CiAgICAgfSBlbHNlIHsKQEAgLTY2Myw3ICs2MzMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgKnBhdGggPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIi9tbnQvYXBwZnVzZS8lZF8lcyIsIHVpZCwgbmFtZS5jX3N0cigpKTsKKyAgICAqcGF0aCA9IFN0cmluZ1ByaW50ZigiL21udC9hcHBmdXNlLyVkXyVzIiwgdWlkLCBuYW1lLmNfc3RyKCkpOwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIApAQCAtNjcxLDIxICs2NDEsMTkgQEAKICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgbW91bnQuCiAgICAgYW5kcm9pZDo6dm9sZDo6Rm9yY2VVbm1vdW50KHBhdGgpOwogCi0gICAgY29uc3QgYXV0byBvcHRzID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgImZkPSVpLCIKLSAgICAgICAgICAgICJyb290bW9kZT00MDAwMCwiCi0gICAgICAgICAgICAiZGVmYXVsdF9wZXJtaXNzaW9ucywiCi0gICAgICAgICAgICAiYWxsb3dfb3RoZXIsIgotICAgICAgICAgICAgInVzZXJfaWQ9JWQsZ3JvdXBfaWQ9JWQsIgotICAgICAgICAgICAgImNvbnRleHQ9XCJ1Om9iamVjdF9yOmFwcF9mdXNlX2ZpbGU6czBcIiwiCi0gICAgICAgICAgICAiZnNjb250ZXh0PXU6b2JqZWN0X3I6YXBwX2Z1c2VmczpzMCIsCi0gICAgICAgICAgICBkZXZpY2VfZmQsCi0gICAgICAgICAgICB1aWQsCi0gICAgICAgICAgICB1aWQpOworICAgIGNvbnN0IGF1dG8gb3B0cyA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgImZkPSVpLCIKKyAgICAgICAgInJvb3Rtb2RlPTQwMDAwLCIKKyAgICAgICAgImRlZmF1bHRfcGVybWlzc2lvbnMsIgorICAgICAgICAiYWxsb3dfb3RoZXIsIgorICAgICAgICAidXNlcl9pZD0lZCxncm91cF9pZD0lZCwiCisgICAgICAgICJjb250ZXh0PVwidTpvYmplY3RfcjphcHBfZnVzZV9maWxlOnMwXCIsIgorICAgICAgICAiZnNjb250ZXh0PXU6b2JqZWN0X3I6YXBwX2Z1c2VmczpzMCIsCisgICAgICAgIGRldmljZV9mZCwgdWlkLCB1aWQpOwogCi0gICAgY29uc3QgaW50IHJlc3VsdCA9IFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudCgKLSAgICAgICAgICAgICIvZGV2L2Z1c2UiLCBwYXRoLmNfc3RyKCksICJmdXNlIiwKLSAgICAgICAgICAgIE1TX05PU1VJRCB8IE1TX05PREVWIHwgTVNfTk9FWEVDIHwgTVNfTk9BVElNRSwgb3B0cy5jX3N0cigpKSk7CisgICAgY29uc3QgaW50IHJlc3VsdCA9CisgICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudCgiL2Rldi9mdXNlIiwgcGF0aC5jX3N0cigpLCAiZnVzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU19OT1NVSUQgfCBNU19OT0RFViB8IE1TX05PRVhFQyB8IE1TX05PQVRJTUUsIG9wdHMuY19zdHIoKSkpOwogICAgIGlmIChyZXN1bHQgIT0gMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1vdW50ICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuIC1lcnJubzsKQEAgLTY5NCwxMSArNjYyLDggQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLXN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBydW5Db21tYW5kSW5OYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV9mZCkgeworc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IHJ1bkNvbW1hbmRJbk5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCwgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBpbnQgZGV2aWNlX2ZkKSB7CiAgICAgaWYgKERFQlVHX0FQUEZVU0UpIHsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiUnVuIGFwcCBmdXNlIGNvbW1hbmQgIiA8PCBjb21tYW5kIDw8ICIgZm9yIHRoZSBwYXRoICIgPDwgcGF0aAogICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gbmFtZXNwYWNlICIgPDwgdWlkOwpAQCAtNzExLDkgKzY3Niw4IEBACiAgICAgfQogCiAgICAgLy8gT2J0YWlucyBwcm9jZXNzIGZpbGUgZGVzY3JpcHRvci4KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBwaWRfc3RyID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIlZCIsIHBpZCk7Ci0gICAgY29uc3QgdW5pcXVlX2ZkIHBpZF9mZCgKLSAgICAgICAgICAgIG9wZW5hdChkaXIuZ2V0KCksIHBpZF9zdHIuY19zdHIoKSwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSB8IE9fQ0xPRVhFQykpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBpZF9zdHIgPSBTdHJpbmdQcmludGYoIiVkIiwgcGlkKTsKKyAgICBjb25zdCB1bmlxdWVfZmQgcGlkX2ZkKG9wZW5hdChkaXIuZ2V0KCksIHBpZF9zdHIuY19zdHIoKSwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSB8IE9fQ0xPRVhFQykpOwogICAgIGlmIChwaWRfZmQuZ2V0KCkgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIC9wcm9jLyIgPDwgcGlkOwogICAgICAgICByZXR1cm4gLWVycm5vOwpAQCAtNzI5LDcgKzY5Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHNiLnN0X3VpZCAhPSBBSURfU1lTVEVNKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJPbmx5IHN5c3RlbSBjYW4gbW91bnQgYXBwZnVzZS4gVUlEIGV4cGVjdGVkPSIgPDwgQUlEX1NZU1RFTQotICAgICAgICAgICAgICAgICAgICA8PCAiLCBhY3R1YWw9IiA8PCBzYi5zdF91aWQ7CisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGFjdHVhbD0iIDw8IHNiLnN0X3VpZDsKICAgICAgICAgICAgIHJldHVybiAtRVBFUk07CiAgICAgICAgIH0KICAgICB9CkBAIC03MzgsOCArNzAyLDggQEAKICAgICB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHJvb3ROYW1lOwogICAgICAgICBzdGQ6OnN0cmluZyBwaWROYW1lOwotICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OlJlYWRsaW5rYXQoZGlyLmdldCgpLCAiMS9ucy9tbnQiLCAmcm9vdE5hbWUpCi0gICAgICAgICAgICAgICAgfHwgIWFuZHJvaWQ6OnZvbGQ6OlJlYWRsaW5rYXQocGlkX2ZkLmdldCgpLCAibnMvbW50IiwgJnBpZE5hbWUpKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6dm9sZDo6UmVhZGxpbmthdChkaXIuZ2V0KCksICIxL25zL21udCIsICZyb290TmFtZSkgfHwKKyAgICAgICAgICAgICFhbmRyb2lkOjp2b2xkOjpSZWFkbGlua2F0KHBpZF9mZC5nZXQoKSwgIm5zL21udCIsICZwaWROYW1lKSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIG5hbWVzcGFjZXMiOwogICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKICAgICAgICAgfQpAQCAtNzUwLDcgKzcxNCw3IEBACiAgICAgfQogCiAgICAgLy8gV2UgcHVycG9zZWZ1bGx5IGxlYXZlIHRoZSBuYW1lc3BhY2Ugb3BlbiBhY3Jvc3MgdGhlIGZvcmsKLSAgICB1bmlxdWVfZmQgbnNfZmQob3BlbmF0KHBpZF9mZC5nZXQoKSwgIm5zL21udCIsIE9fUkRPTkxZKSk7IC8vIG5vdCBPX0NMT0VYRUMKKyAgICB1bmlxdWVfZmQgbnNfZmQob3BlbmF0KHBpZF9mZC5nZXQoKSwgIm5zL21udCIsIE9fUkRPTkxZKSk7ICAvLyBub3QgT19DTE9FWEVDCiAgICAgaWYgKG5zX2ZkLmdldCgpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gbmFtZXNwYWNlIGZvciAvcHJvYy8iIDw8IHBpZCA8PCAiL25zL21udCI7CiAgICAgICAgIHJldHVybiAtZXJybm87CkBAIC03NjgsOCArNzMyLDggQEAKICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJ1bm1vdW50IikgewogICAgICAgICAgICAgLy8gSWYgaXQncyBqdXN0IGFmdGVyIGFsbCBGRCBvcGVuZWQgb24gbW91bnQgcG9pbnQgYXJlIGNsb3NlZCwgdW1vdW50MiBjYW4gZmFpbCB3aXRoCiAgICAgICAgICAgICAvLyBFQlVTWS4gVG8gYXZvaWQgdGhlIGNhc2UsIHNwZWNpZnkgTU5UX0RFVEFDSC4KLSAgICAgICAgICAgIGlmICh1bW91bnQyKHBhdGguY19zdHIoKSwgVU1PVU5UX05PRk9MTE9XIHwgTU5UX0RFVEFDSCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBlcnJubyAhPSBFSU5WQUwgJiYgZXJybm8gIT0gRU5PRU5UKSB7CisgICAgICAgICAgICBpZiAodW1vdW50MihwYXRoLmNfc3RyKCksIFVNT1VOVF9OT0ZPTExPVyB8IE1OVF9ERVRBQ0gpICE9IDAgJiYgZXJybm8gIT0gRUlOVkFMICYmCisgICAgICAgICAgICAgICAgZXJybm8gIT0gRU5PRU5UKSB7CiAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB1bm1vdW50IGRpcmVjdG9yeS4iOwogICAgICAgICAgICAgICAgIF9leGl0KC1lcnJubyk7CiAgICAgICAgICAgICB9CkBAIC03OTYsMTEgKzc2MCwxMSBAQAogfQogCiBpbnQgVm9sdW1lTWFuYWdlcjo6Y3JlYXRlT2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LAotICAgICAgICBpbnQzMl90IG93bmVyR2lkLCBzdGQ6OnN0cmluZyogb3V0Vm9sSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvd25lckdpZCwgc3RkOjpzdHJpbmcqIG91dFZvbElkKSB7CiAgICAgaW50IGlkID0gbU5leHRPYmJJZCsrOwogCiAgICAgYXV0byB2b2wgPSBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZT4oCi0gICAgICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6T2JiVm9sdW1lKGlkLCBzb3VyY2VQYXRoLCBzb3VyY2VLZXksIG93bmVyR2lkKSk7CisgICAgICAgIG5ldyBhbmRyb2lkOjp2b2xkOjpPYmJWb2x1bWUoaWQsIHNvdXJjZVBhdGgsIHNvdXJjZUtleSwgb3duZXJHaWQpKTsKICAgICB2b2wtPmNyZWF0ZSgpOwogCiAgICAgbU9iYlZvbHVtZXMucHVzaF9iYWNrKHZvbCk7CkBAIC04MjEsOCArNzg1LDcgQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLWludCBWb2x1bWVNYW5hZ2VyOjptb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBwaWRfdCBwaWQsIGludCBtb3VudElkLAotICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCkgeworaW50IFZvbHVtZU1hbmFnZXI6Om1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIHBpZF90IHBpZCwgaW50IG1vdW50SWQsIHVuaXF1ZV9mZCogZGV2aWNlX2ZkKSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6dG9fc3RyaW5nKG1vdW50SWQpOwogCiAgICAgLy8gQ2hlY2sgbW91bnQgcG9pbnQgbmFtZS4KQEAgLTg0MCw3ICs4MDMsNyBAQAogICAgIH0KIAogICAgIC8vIE9wZW4gZGV2aWNlIEZELgotICAgIGRldmljZV9mZC0+cmVzZXQob3BlbigiL2Rldi9mdXNlIiwgT19SRFdSKSk7IC8vIG5vdCBPX0NMT0VYRUMKKyAgICBkZXZpY2VfZmQtPnJlc2V0KG9wZW4oIi9kZXYvZnVzZSIsIE9fUkRXUikpOyAgLy8gbm90IE9fQ0xPRVhFQwogICAgIGlmIChkZXZpY2VfZmQtPmdldCgpID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAvZGV2L2Z1c2UiOwogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9Wb2x1bWVNYW5hZ2VyLmggYi9Wb2x1bWVNYW5hZ2VyLmgKaW5kZXggZmI0NTVkOC4uZWVkYjFjYiAxMDA2NDQKLS0tIGEvVm9sdW1lTWFuYWdlci5oCisrKyBiL1ZvbHVtZU1hbmFnZXIuaApAQCAtMTcsOCArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX1ZPTERfVk9MVU1FX01BTkFHRVJfSAogI2RlZmluZSBBTkRST0lEX1ZPTERfVk9MVU1FX01BTkFHRVJfSAogCi0jaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlIDxsaXN0PgpAQCAtMjksOSArMjksOSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KKyNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rRXZlbnQuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8c3lzdXRpbHMvTmV0bGlua0V2ZW50Lmg+CiAKICNpbmNsdWRlICJhbmRyb2lkL29zL0lWb2xkTGlzdGVuZXIuaCIKIApAQCAtNDEsMTIgKzQxLDEyIEBACiAjZGVmaW5lIERFQlVHX0FQUEZVU0UgMAogCiBjbGFzcyBWb2x1bWVNYW5hZ2VyIHsKLXByaXZhdGU6Ci0gICAgc3RhdGljIFZvbHVtZU1hbmFnZXIgKnNJbnN0YW5jZTsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgVm9sdW1lTWFuYWdlciogc0luc3RhbmNlOwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICBtRGVidWc7CisgICAgYm9vbCBtRGVidWc7CiAKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIHZpcnR1YWwgflZvbHVtZU1hbmFnZXIoKTsKIAogICAgIC8vIFRPRE86IHBpcGUgYWxsIHJlcXVlc3RzIHRocm91Z2ggVk0gdG8gYXZvaWQgZXhwb3NpbmcgdGhpcyBsb2NrCkBAIC01OSwxMyArNTksMTIgQEAKICAgICBpbnQgc3RhcnQoKTsKICAgICBpbnQgc3RvcCgpOwogCi0gICAgdm9pZCBoYW5kbGVCbG9ja0V2ZW50KE5ldGxpbmtFdmVudCAqZXZ0KTsKKyAgICB2b2lkIGhhbmRsZUJsb2NrRXZlbnQoTmV0bGlua0V2ZW50KiBldnQpOwogCiAgICAgY2xhc3MgRGlza1NvdXJjZSB7Ci0gICAgcHVibGljOgotICAgICAgICBEaXNrU291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzeXNQYXR0ZXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgbmlja25hbWUsIGludCBmbGFncykgOgotICAgICAgICAgICAgICAgIG1TeXNQYXR0ZXJuKHN5c1BhdHRlcm4pLCBtTmlja25hbWUobmlja25hbWUpLCBtRmxhZ3MoZmxhZ3MpIHsKLSAgICAgICAgfQorICAgICAgcHVibGljOgorICAgICAgICBEaXNrU291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzeXNQYXR0ZXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgbmlja25hbWUsIGludCBmbGFncykKKyAgICAgICAgICAgIDogbVN5c1BhdHRlcm4oc3lzUGF0dGVybiksIG1OaWNrbmFtZShuaWNrbmFtZSksIG1GbGFncyhmbGFncykge30KIAogICAgICAgICBib29sIG1hdGNoZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHN5c1BhdGgpIHsKICAgICAgICAgICAgIHJldHVybiAhZm5tYXRjaChtU3lzUGF0dGVybi5jX3N0cigpLCBzeXNQYXRoLmNfc3RyKCksIDApOwpAQCAtNzQsNyArNzMsNyBAQAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0Tmlja25hbWUoKSB7IHJldHVybiBtTmlja25hbWU7IH0KICAgICAgICAgaW50IGdldEZsYWdzKCkgeyByZXR1cm4gbUZsYWdzOyB9CiAKLSAgICBwcml2YXRlOgorICAgICAgcHJpdmF0ZToKICAgICAgICAgc3RkOjpzdHJpbmcgbVN5c1BhdHRlcm47CiAgICAgICAgIHN0ZDo6c3RyaW5nIG1OaWNrbmFtZTsKICAgICAgICAgaW50IG1GbGFnczsKQEAgLTExMCw3ICsxMDksNyBAQAogICAgIGludCB1cGRhdGVWaXJ0dWFsRGlzaygpOwogICAgIGludCBzZXREZWJ1Zyhib29sIGVuYWJsZSk7CiAKLSAgICBzdGF0aWMgVm9sdW1lTWFuYWdlciAqSW5zdGFuY2UoKTsKKyAgICBzdGF0aWMgVm9sdW1lTWFuYWdlciogSW5zdGFuY2UoKTsKIAogICAgIC8qCiAgICAgICogRW5zdXJlIHRoYXQgYWxsIGRpcmVjdG9yaWVzIGFsb25nIGdpdmVuIHBhdGggZXhpc3QsIGNyZWF0aW5nIHBhcmVudApAQCAtMTIyLDEzICsxMjEsMTMgQEAKICAgICBpbnQgbWtkaXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIAogICAgIGludCBjcmVhdGVPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludDMyX3Qgb3duZXJHaWQsCi0gICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0Vm9sSWQpOworICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dFZvbElkKTsKICAgICBpbnQgZGVzdHJveU9iYihjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQpOwogCiAgICAgaW50IG1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIHBpZF90IHBpZCwgaW50IG1vdW50SWQsIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogZGV2aWNlX2ZkKTsKICAgICBpbnQgdW5tb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBwaWRfdCBwaWQsIGludCBtb3VudElkKTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICBWb2x1bWVNYW5hZ2VyKCk7CiAgICAgdm9pZCByZWFkSW5pdGlhbFN0YXRlKCk7CiAKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL29zL0lWb2xkLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9vcy9JVm9sZC5haWRsCmluZGV4IDgzMDBhOGUuLjRlZDg2MWYgMTAwNjQ0Ci0tLSBhL2JpbmRlci9hbmRyb2lkL29zL0lWb2xkLmFpZGwKKysrIGIvYmluZGVyL2FuZHJvaWQvb3MvSVZvbGQuYWlkbApAQCAtNDQsMTQgKzQ0LDE0IEBACiAgICAgdm9pZCBjaGVja0VuY3J5cHRpb24oQHV0ZjhJbkNwcCBTdHJpbmcgdm9sSWQpOwogCiAgICAgdm9pZCBtb3ZlU3RvcmFnZShAdXRmOEluQ3BwIFN0cmluZyBmcm9tVm9sSWQsIEB1dGY4SW5DcHAgU3RyaW5nIHRvVm9sSWQsCi0gICAgICAgICAgICBJVm9sZFRhc2tMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICBJVm9sZFRhc2tMaXN0ZW5lciBsaXN0ZW5lcik7CiAKICAgICB2b2lkIHJlbW91bnRVaWQoaW50IHVpZCwgaW50IHJlbW91bnRNb2RlKTsKIAogICAgIHZvaWQgbWtkaXJzKEB1dGY4SW5DcHAgU3RyaW5nIHBhdGgpOwogCi0gICAgQHV0ZjhJbkNwcCBTdHJpbmcgY3JlYXRlT2JiKEB1dGY4SW5DcHAgU3RyaW5nIHNvdXJjZVBhdGgsCi0gICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VLZXksIGludCBvd25lckdpZCk7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgY3JlYXRlT2JiKEB1dGY4SW5DcHAgU3RyaW5nIHNvdXJjZVBhdGgsIEB1dGY4SW5DcHAgU3RyaW5nIHNvdXJjZUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG93bmVyR2lkKTsKICAgICB2b2lkIGRlc3Ryb3lPYmIoQHV0ZjhJbkNwcCBTdHJpbmcgdm9sSWQpOwogCiAgICAgdm9pZCBmc3RyaW0oaW50IGZzdHJpbUZsYWdzLCBJVm9sZFRhc2tMaXN0ZW5lciBsaXN0ZW5lcik7CkBAIC04NCwxNSArODQsMjcgQEAKICAgICB2b2lkIGNyZWF0ZVVzZXJLZXkoaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsIGJvb2xlYW4gZXBoZW1lcmFsKTsKICAgICB2b2lkIGRlc3Ryb3lVc2VyS2V5KGludCB1c2VySWQpOwogCi0gICAgdm9pZCBhZGRVc2VyS2V5QXV0aChpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4sIEB1dGY4SW5DcHAgU3RyaW5nIHNlY3JldCk7CisgICAgdm9pZCBhZGRVc2VyS2V5QXV0aChpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBzZWNyZXQpOwogICAgIHZvaWQgZml4YXRlTmV3ZXN0VXNlcktleUF1dGgoaW50IHVzZXJJZCk7CiAKLSAgICB2b2lkIHVubG9ja1VzZXJLZXkoaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsIEB1dGY4SW5DcHAgU3RyaW5nIHRva2VuLCBAdXRmOEluQ3BwIFN0cmluZyBzZWNyZXQpOworICAgIHZvaWQgdW5sb2NrVXNlcktleShpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIHNlY3JldCk7CiAgICAgdm9pZCBsb2NrVXNlcktleShpbnQgdXNlcklkKTsKIAotICAgIHZvaWQgcHJlcGFyZVVzZXJTdG9yYWdlKEBudWxsYWJsZSBAdXRmOEluQ3BwIFN0cmluZyB1dWlkLCBpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgaW50IHN0b3JhZ2VGbGFncyk7CisgICAgdm9pZCBwcmVwYXJlVXNlclN0b3JhZ2UoQG51bGxhYmxlIEB1dGY4SW5DcHAgU3RyaW5nIHV1aWQsIGludCB1c2VySWQsIGludCB1c2VyU2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9yYWdlRmxhZ3MpOwogICAgIHZvaWQgZGVzdHJveVVzZXJTdG9yYWdlKEBudWxsYWJsZSBAdXRmOEluQ3BwIFN0cmluZyB1dWlkLCBpbnQgdXNlcklkLCBpbnQgc3RvcmFnZUZsYWdzKTsKIAorICAgIHZvaWQgc3RhcnRDaGVja3BvaW50KGludCByZXRyeSk7CisgICAgYm9vbGVhbiBuZWVkc0NoZWNrcG9pbnQoKTsKKyAgICBib29sZWFuIG5lZWRzUm9sbGJhY2soKTsKKyAgICB2b2lkIGFib3J0Q2hhbmdlcygpOworICAgIHZvaWQgY29tbWl0Q2hhbmdlcygpOworICAgIHZvaWQgcHJlcGFyZUNoZWNrcG9pbnQoKTsKKyAgICB2b2lkIHJlc3RvcmVDaGVja3BvaW50KEB1dGY4SW5DcHAgU3RyaW5nIGRldmljZSk7CisgICAgdm9pZCBtYXJrQm9vdEF0dGVtcHQoKTsKKwogICAgIGNvbnN0IGludCBFTkNSWVBUSU9OX0ZMQUdfTk9fVUkgPSA0OwogCiAgICAgY29uc3QgaW50IEVOQ1JZUFRJT05fU1RBVEVfTk9ORSA9IDE7CkBAIC0xMTMsOCArMTI1LDggQEAKIAogICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BBU1NXT1JEID0gMDsKICAgICBjb25zdCBpbnQgUEFTU1dPUkRfVFlQRV9ERUZBVUxUID0gMTsKLSAgICBjb25zdCBpbnQgUEFTU1dPUkRfVFlQRV9QSU4gPSAyOwotICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BBVFRFUk4gPSAzOworICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BBVFRFUk4gPSAyOworICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BJTiA9IDM7CiAKICAgICBjb25zdCBpbnQgU1RPUkFHRV9GTEFHX0RFID0gMTsKICAgICBjb25zdCBpbnQgU1RPUkFHRV9GTEFHX0NFID0gMjsKZGlmZiAtLWdpdCBhL2NyeXB0ZnMuY3BwIGIvY3J5cHRmcy5jcHAKaW5kZXggYzUwMjRhZS4uNGE3NmZiNyAxMDA2NDQKLS0tIGEvY3J5cHRmcy5jcHAKKysrIGIvY3J5cHRmcy5jcHAKQEAgLTIwLDQ5ICsyMCw1NSBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KLSNpbmNsdWRlIDxsaWJnZW4uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvbW91bnQuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgTE9HX1RBRyAiQ3J5cHRmcyIKKworI2luY2x1ZGUgImNyeXB0ZnMuaCIKKworI2luY2x1ZGUgIkNoZWNrcG9pbnQuaCIKKyNpbmNsdWRlICJFbmNyeXB0SW5wbGFjZS5oIgorI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgorI2luY2x1ZGUgIktleW1hc3Rlci5oIgorI2luY2x1ZGUgIlByb2Nlc3MuaCIKKyNpbmNsdWRlICJTY3J5cHRQYXJhbWV0ZXJzLmgiCisjaW5jbHVkZSAiVm9sZFV0aWwuaCIKKyNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAic2Vjb250ZXh0LmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJvb3Rsb2FkZXJfbWVzc2FnZS9ib290bG9hZGVyX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYW5kcm9pZF9yZWJvb3QuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF9jcnlwdC5oPgogI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGYyZnNfc3BhcnNlYmxvY2suaD4KICNpbmNsdWRlIDxmc19tZ3IuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgotI2luY2x1ZGUgImNyeXB0ZnMuaCIKLSNpbmNsdWRlICJzZWNvbnRleHQuaCIKLSNkZWZpbmUgTE9HX1RBRyAiQ3J5cHRmcyIKLSNpbmNsdWRlICJjdXRpbHMvbG9nLmgiCi0jaW5jbHVkZSAiY3V0aWxzL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJjdXRpbHMvYW5kcm9pZF9yZWJvb3QuaCIKLSNpbmNsdWRlICJoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+Ci0jaW5jbHVkZSAiU2NyeXB0UGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKLSNpbmNsdWRlICJWb2xkVXRpbC5oIgotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgotI2luY2x1ZGUgImYyZnNfc3BhcnNlYmxvY2suaCIKLSNpbmNsdWRlICJFbmNyeXB0SW5wbGFjZS5oIgotI2luY2x1ZGUgIlByb2Nlc3MuaCIKLSNpbmNsdWRlICJLZXltYXN0ZXIuaCIKLSNpbmNsdWRlICJhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgPGJvb3Rsb2FkZXJfbWVzc2FnZS9ib290bG9hZGVyX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSA8Y3J5cHRvX3NjcnlwdC5oPgogfQpAQCAtNzUsMTQgKzgxLDEyIEBACiAKIGNvbnN0ZXhwciBzaXplX3QgSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMgPSAxNjsKIGNvbnN0ZXhwciBzaXplX3QgSU5URVJNRURJQVRFX0lWX0xFTl9CWVRFUyA9IDE2OwotY29uc3RleHByIHNpemVfdCBJTlRFUk1FRElBVEVfQlVGX1NJWkUgPQotICAgIChJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyArIElOVEVSTUVESUFURV9JVl9MRU5fQllURVMpOworY29uc3RleHByIHNpemVfdCBJTlRFUk1FRElBVEVfQlVGX1NJWkUgPSAoSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMgKyBJTlRFUk1FRElBVEVfSVZfTEVOX0JZVEVTKTsKIAogLy8gU0NSWVBUX0xFTiBpcyB1c2VkIGJ5IHN0cnVjdCBjcnlwdF9tbnRfZnRyIGZvciBpdHMgaW50ZXJtZWRpYXRlIGtleS4KLXN0YXRpY19hc3NlcnQoSU5URVJNRURJQVRFX0JVRl9TSVpFID09IFNDUllQVF9MRU4sCi0gICAgICAgICAgICAgICJNaXNtYXRjaCBvZiBpbnRlcm1lZGlhdGUga2V5IHNpemVzIik7CitzdGF0aWNfYXNzZXJ0KElOVEVSTUVESUFURV9CVUZfU0laRSA9PSBTQ1JZUFRfTEVOLCAiTWlzbWF0Y2ggb2YgaW50ZXJtZWRpYXRlIGtleSBzaXplcyIpOwogCi0jZGVmaW5lIEtFWV9JTl9GT09URVIgICJmb290ZXIiCisjZGVmaW5lIEtFWV9JTl9GT09URVIgImZvb3RlciIKIAogI2RlZmluZSBERUZBVUxUX1BBU1NXT1JEICJkZWZhdWx0X3Bhc3N3b3JkIgogCkBAIC0xMDgsMjcgKzExMiwyNSBAQAogc3RhdGljIGludCBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cik7CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNhdmVkX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwotc3RhdGljIGNoYXIgKnNhdmVkX21vdW50X3BvaW50Owotc3RhdGljIGludCAgbWFzdGVyX2tleV9zYXZlZCA9IDA7Ci1zdGF0aWMgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGVyc2lzdF9kYXRhID0gTlVMTDsKK3N0YXRpYyBjaGFyKiBzYXZlZF9tb3VudF9wb2ludDsKK3N0YXRpYyBpbnQgbWFzdGVyX2tleV9zYXZlZCA9IDA7CitzdGF0aWMgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSogcGVyc2lzdF9kYXRhID0gTlVMTDsKIAogLyogU2hvdWxkIHdlIHVzZSBrZXltYXN0ZXI/ICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5KCkKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHkoKSB7CiAgICAgcmV0dXJuIGtleW1hc3Rlcl9jb21wYXRpYmlsaXR5X2NyeXB0ZnNfc2NyeXB0KCk7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBrZXltYXN0ZXIga2V5IGFuZCBzdG9yZSBpdCBpbiB0aGlzIGZvb3RlciAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfY3JlYXRlX2tleShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfY3JlYXRlX2tleShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyKSB7CiAgICAgaWYgKGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSkgewogICAgICAgICBTTE9HSSgiQWxyZWFkeSBoYXZlIGtleSIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpbnQgcmMgPSBrZXltYXN0ZXJfY3JlYXRlX2tleV9mb3JfY3J5cHRmc19zY3J5cHQoUlNBX0tFWV9TSVpFLCBSU0FfRVhQT05FTlQsCi0gICAgICAgICAgICBLRVlNQVNURVJfQ1JZUFRGU19SQVRFX0xJTUlULCBmdHItPmtleW1hc3Rlcl9ibG9iLCBLRVlNQVNURVJfQkxPQl9TSVpFLAotICAgICAgICAgICAgJmZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSk7CisgICAgaW50IHJjID0ga2V5bWFzdGVyX2NyZWF0ZV9rZXlfZm9yX2NyeXB0ZnNfc2NyeXB0KAorICAgICAgICBSU0FfS0VZX1NJWkUsIFJTQV9FWFBPTkVOVCwgS0VZTUFTVEVSX0NSWVBURlNfUkFURV9MSU1JVCwgZnRyLT5rZXltYXN0ZXJfYmxvYiwKKyAgICAgICAgS0VZTUFTVEVSX0JMT0JfU0laRSwgJmZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSk7CiAgICAgaWYgKHJjKSB7CiAgICAgICAgIGlmIChmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUgPiBLRVlNQVNURVJfQkxPQl9TSVpFKSB7CiAgICAgICAgICAgICBTTE9HRSgiS2V5bWFzdGVyIGtleSBibG9iIHRvbyBsYXJnZSIpOwpAQCAtMTQxLDEyICsxNDMsOSBAQAogfQogCiAvKiBUaGlzIHNpZ25zIHRoZSBnaXZlbiBvYmplY3QgdXNpbmcgdGhlIGtleW1hc3RlciBrZXkuICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9zaWduX29iamVjdChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKnNpZ25hdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqc2lnbmF0dXJlX3NpemUpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9zaWduX29iamVjdChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgb2JqZWN0X3NpemUsIHVuc2lnbmVkIGNoYXIqKiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHNpZ25hdHVyZV9zaXplKSB7CiAgICAgdW5zaWduZWQgY2hhciB0b19zaWduW1JTQV9LRVlfU0laRV9CWVRFU107CiAgICAgc2l6ZV90IHRvX3NpZ25fc2l6ZSA9IHNpemVvZih0b19zaWduKTsKICAgICBtZW1zZXQodG9fc2lnbiwgMCwgUlNBX0tFWV9TSVpFX0JZVEVTKTsKQEAgLTIyNSwyMSArMjI0LDIwIEBACiBzdGF0aWMgaW50IHBhc3N3b3JkX2V4cGlyeV90aW1lID0gMDsKIHN0YXRpYyBjb25zdCBpbnQgcGFzc3dvcmRfbWF4X2FnZV9zZWNvbmRzID0gNjA7CiAKLWVudW0gY2xhc3MgUmVib290VHlwZSB7cmVib290LCByZWNvdmVyeSwgc2h1dGRvd259Owotc3RhdGljIHZvaWQgY3J5cHRmc19yZWJvb3QoUmVib290VHlwZSBydCkKLXsKLSAgc3dpdGNoIChydCkgewotICAgICAgY2FzZSBSZWJvb3RUeXBlOjpyZWJvb3Q6Ci0gICAgICAgICAgcHJvcGVydHlfc2V0KEFORFJPSURfUkJfUFJPUEVSVFksICJyZWJvb3QiKTsKLSAgICAgICAgICBicmVhazsKK2VudW0gY2xhc3MgUmVib290VHlwZSB7IHJlYm9vdCwgcmVjb3ZlcnksIHNodXRkb3duIH07CitzdGF0aWMgdm9pZCBjcnlwdGZzX3JlYm9vdChSZWJvb3RUeXBlIHJ0KSB7CisgICAgc3dpdGNoIChydCkgeworICAgICAgICBjYXNlIFJlYm9vdFR5cGU6OnJlYm9vdDoKKyAgICAgICAgICAgIHByb3BlcnR5X3NldChBTkRST0lEX1JCX1BST1BFUlRZLCAicmVib290Iik7CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBSZWJvb3RUeXBlOjpyZWNvdmVyeToKLSAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInJlYm9vdCxyZWNvdmVyeSIpOwotICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJlYm9vdFR5cGU6OnJlY292ZXJ5OgorICAgICAgICAgICAgcHJvcGVydHlfc2V0KEFORFJPSURfUkJfUFJPUEVSVFksICJyZWJvb3QscmVjb3ZlcnkiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIFJlYm9vdFR5cGU6OnNodXRkb3duOgotICAgICAgICAgIHByb3BlcnR5X3NldChBTkRST0lEX1JCX1BST1BFUlRZLCAic2h1dGRvd24iKTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSZWJvb3RUeXBlOjpzaHV0ZG93bjoKKyAgICAgICAgICAgIHByb3BlcnR5X3NldChBTkRST0lEX1JCX1BST1BFUlRZLCAic2h1dGRvd24iKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIHNsZWVwKDIwKTsKQEAgLTI0OCw4ICsyNDYsNyBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgaW9jdGxfaW5pdChzdHJ1Y3QgZG1faW9jdGwgKmlvLCBzaXplX3QgZGF0YVNpemUsIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGZsYWdzKQoteworc3RhdGljIHZvaWQgaW9jdGxfaW5pdChzdHJ1Y3QgZG1faW9jdGwqIGlvLCBzaXplX3QgZGF0YVNpemUsIGNvbnN0IGNoYXIqIG5hbWUsIHVuc2lnbmVkIGZsYWdzKSB7CiAgICAgbWVtc2V0KGlvLCAwLCBkYXRhU2l6ZSk7CiAgICAgaW8tPmRhdGFfc2l6ZSA9IGRhdGFTaXplOwogICAgIGlvLT5kYXRhX3N0YXJ0ID0gc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CkBAIC0yNjcsNyArMjY0LDcgQEAKIHN0cnVjdCBDcnlwdG9UeXBlOwogCiAvLyBVc2UgdG8gZ2V0IHRoZSBDcnlwdG9UeXBlIGluIHVzZSBvbiB0aGlzIGRldmljZS4KLWNvbnN0IENyeXB0b1R5cGUgJmdldF9jcnlwdG9fdHlwZSgpOworY29uc3QgQ3J5cHRvVHlwZSYgZ2V0X2NyeXB0b190eXBlKCk7CiAKIHN0cnVjdCBDcnlwdG9UeXBlIHsKICAgICAvLyBXZSBzaG91bGQgb25seSBiZSBjb25zdHJ1Y3RpbmcgQ3J5cHRvVHlwZXMgYXMgcGFydCBvZgpAQCAtMjc5LDYwICsyNzYsNjAgQEAKICAgICBjb25zdGV4cHIgQ3J5cHRvVHlwZSBzZXRfa2V5c2l6ZSh1aW50MzJfdCBzaXplKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBDcnlwdG9UeXBlKHRoaXMtPnByb3BlcnR5X25hbWUsIHRoaXMtPmNyeXB0b19uYW1lLCBzaXplKTsKICAgICB9Ci0gICAgY29uc3RleHByIENyeXB0b1R5cGUgc2V0X3Byb3BlcnR5X25hbWUoY29uc3QgY2hhciAqcHJvcGVydHkpIGNvbnN0IHsKKyAgICBjb25zdGV4cHIgQ3J5cHRvVHlwZSBzZXRfcHJvcGVydHlfbmFtZShjb25zdCBjaGFyKiBwcm9wZXJ0eSkgY29uc3QgewogICAgICAgICByZXR1cm4gQ3J5cHRvVHlwZShwcm9wZXJ0eSwgdGhpcy0+Y3J5cHRvX25hbWUsIHRoaXMtPmtleXNpemUpOwogICAgIH0KLSAgICBjb25zdGV4cHIgQ3J5cHRvVHlwZSBzZXRfY3J5cHRvX25hbWUoY29uc3QgY2hhciAqY3J5cHRvKSBjb25zdCB7CisgICAgY29uc3RleHByIENyeXB0b1R5cGUgc2V0X2NyeXB0b19uYW1lKGNvbnN0IGNoYXIqIGNyeXB0bykgY29uc3QgewogICAgICAgICByZXR1cm4gQ3J5cHRvVHlwZSh0aGlzLT5wcm9wZXJ0eV9uYW1lLCBjcnlwdG8sIHRoaXMtPmtleXNpemUpOwogICAgIH0KIAotICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyICpnZXRfcHJvcGVydHlfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHByb3BlcnR5X25hbWU7IH0KLSAgICBjb25zdGV4cHIgY29uc3QgY2hhciAqZ2V0X2NyeXB0b19uYW1lKCkgY29uc3QgeyByZXR1cm4gY3J5cHRvX25hbWU7IH0KKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciogZ2V0X3Byb3BlcnR5X25hbWUoKSBjb25zdCB7IHJldHVybiBwcm9wZXJ0eV9uYW1lOyB9CisgICAgY29uc3RleHByIGNvbnN0IGNoYXIqIGdldF9jcnlwdG9fbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGNyeXB0b19uYW1lOyB9CiAgICAgY29uc3RleHByIHVpbnQzMl90IGdldF9rZXlzaXplKCkgY29uc3QgeyByZXR1cm4ga2V5c2l6ZTsgfQogCi0gcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV9uYW1lOwotICAgIGNvbnN0IGNoYXIgKmNyeXB0b19uYW1lOworICBwcml2YXRlOgorICAgIGNvbnN0IGNoYXIqIHByb3BlcnR5X25hbWU7CisgICAgY29uc3QgY2hhciogY3J5cHRvX25hbWU7CiAgICAgdWludDMyX3Qga2V5c2l6ZTsKIAotICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlKGNvbnN0IGNoYXIgKnByb3BlcnR5LCBjb25zdCBjaGFyICpjcnlwdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga3NpemUpCisgICAgY29uc3RleHByIENyeXB0b1R5cGUoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIGNyeXB0bywgdWludDMyX3Qga3NpemUpCiAgICAgICAgIDogcHJvcGVydHlfbmFtZShwcm9wZXJ0eSksIGNyeXB0b19uYW1lKGNyeXB0byksIGtleXNpemUoa3NpemUpIHt9Ci0gICAgZnJpZW5kIGNvbnN0IENyeXB0b1R5cGUgJmdldF9jcnlwdG9fdHlwZSgpOwotICAgIHN0YXRpYyBjb25zdCBDcnlwdG9UeXBlICZnZXRfZGV2aWNlX2NyeXB0b19hbGdvcml0aG0oKTsKKyAgICBmcmllbmQgY29uc3QgQ3J5cHRvVHlwZSYgZ2V0X2NyeXB0b190eXBlKCk7CisgICAgc3RhdGljIGNvbnN0IENyeXB0b1R5cGUmIGdldF9kZXZpY2VfY3J5cHRvX2FsZ29yaXRobSgpOwogfTsKIAogLy8gV2Ugb25seSB3YW50IHRvIHBhcnNlIHRoaXMgcmVhZC1vbmx5IHByb3BlcnR5IG9uY2UuICBCdXQgd2UgbmVlZCB0byB3YWl0CiAvLyB1bnRpbCB0aGUgc3lzdGVtIGlzIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBjYW4gcmVhZCBpdC4gIFNvIHdlIHVzZSBhIHN0YXRpYwogLy8gc2NvcGVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHRvIGdldCBpdCBvbmx5IG9uY2UuCi1jb25zdCBDcnlwdG9UeXBlICZnZXRfY3J5cHRvX3R5cGUoKSB7Citjb25zdCBDcnlwdG9UeXBlJiBnZXRfY3J5cHRvX3R5cGUoKSB7CiAgICAgc3RhdGljIENyeXB0b1R5cGUgY3J5cHRvX3R5cGUgPSBDcnlwdG9UeXBlOjpnZXRfZGV2aWNlX2NyeXB0b19hbGdvcml0aG0oKTsKICAgICByZXR1cm4gY3J5cHRvX3R5cGU7CiB9CiAKIGNvbnN0ZXhwciBDcnlwdG9UeXBlIGRlZmF1bHRfY3J5cHRvX3R5cGUgPSBDcnlwdG9UeXBlKCkKLSAgICAuc2V0X3Byb3BlcnR5X25hbWUoIkFFUy0xMjgtQ0JDIikKLSAgICAuc2V0X2NyeXB0b19uYW1lKCJhZXMtY2JjLWVzc2l2OnNoYTI1NiIpCi0gICAgLnNldF9rZXlzaXplKDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldF9wcm9wZXJ0eV9uYW1lKCJBRVMtMTI4LUNCQyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRfY3J5cHRvX25hbWUoImFlcy1jYmMtZXNzaXY6c2hhMjU2IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldF9rZXlzaXplKDE2KTsKIAogY29uc3RleHByIENyeXB0b1R5cGUgc3VwcG9ydGVkX2NyeXB0b190eXBlc1tdID0gewogICAgIGRlZmF1bHRfY3J5cHRvX3R5cGUsCiAgICAgLy8gQWRkIG5ldyBDcnlwdG9UeXBlcyBoZXJlLiAgT3JkZXIgaXMgbm90IGltcG9ydGFudC4KIH07CiAKLQogLy8gLS0tLS0tLS0tLSBTVEFSVCBDT01QSUxFLVRJTUUgU0FOSVRZIENIRUNLIEJMT0NLIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFdlIGNvbmZpcm0gYWxsIHN1cHBvcnRlZF9jcnlwdG9fdHlwZXMgaGF2ZSBhIHNtYWxsIGVub3VnaCBrZXlzaXplIGFuZAogLy8gaGFkIGJvdGggc2V0X3Byb3BlcnR5X25hbWUoKSBhbmQgc2V0X2NyeXB0b19uYW1lKCkgY2FsbGVkLgogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1jb25zdGV4cHIgc2l6ZV90IGFycmF5X2xlbmd0aChUICgmKVtOXSkgeyByZXR1cm4gTjsgfQorY29uc3RleHByIHNpemVfdCBhcnJheV9sZW5ndGgoVCAoJilbTl0pIHsKKyAgICByZXR1cm4gTjsKK30KIAogY29uc3RleHByIGJvb2wgaW5kZXhPdXRPZkJvdW5kc0ZvckNyeXB0b1R5cGVzKHNpemVfdCBpbmRleCkgewogICAgIHJldHVybiAoaW5kZXggPj0gYXJyYXlfbGVuZ3RoKHN1cHBvcnRlZF9jcnlwdG9fdHlwZXMpKTsKIH0KIAotY29uc3RleHByIGJvb2wgaXNWYWxpZENyeXB0b1R5cGUoY29uc3QgQ3J5cHRvVHlwZSAmY3J5cHRvX3R5cGUpIHsKK2NvbnN0ZXhwciBib29sIGlzVmFsaWRDcnlwdG9UeXBlKGNvbnN0IENyeXB0b1R5cGUmIGNyeXB0b190eXBlKSB7CiAgICAgcmV0dXJuICgoY3J5cHRvX3R5cGUuZ2V0X3Byb3BlcnR5X25hbWUoKSAhPSBudWxscHRyKSAmJgogICAgICAgICAgICAgKGNyeXB0b190eXBlLmdldF9jcnlwdG9fbmFtZSgpICE9IG51bGxwdHIpICYmCiAgICAgICAgICAgICAoY3J5cHRvX3R5cGUuZ2V0X2tleXNpemUoKSA8PSBNQVhfS0VZX0xFTikpOwpAQCAtMzQzLDggKzM0MCw4IEBACiAvLyBidXQgaXQncyBhc3NlcnRpbmcgYXQgY29tcGlsZSB0aW1lIHRoYXQgYWxsIG9mIG91ciBrZXkgbGVuZ3RocyBhcmUgdmFsaWQuCiBjb25zdGV4cHIgYm9vbCB2YWxpZGF0ZVN1cHBvcnRlZENyeXB0b1R5cGVzKHNpemVfdCBpbmRleCkgewogICAgIHJldHVybiBpbmRleE91dE9mQm91bmRzRm9yQ3J5cHRvVHlwZXMoaW5kZXgpIHx8Ci0gICAgICAgIChpc1ZhbGlkQ3J5cHRvVHlwZShzdXBwb3J0ZWRfY3J5cHRvX3R5cGVzW2luZGV4XSkgJiYKLSAgICAgICAgIHZhbGlkYXRlU3VwcG9ydGVkQ3J5cHRvVHlwZXMoaW5kZXggKyAxKSk7CisgICAgICAgICAgIChpc1ZhbGlkQ3J5cHRvVHlwZShzdXBwb3J0ZWRfY3J5cHRvX3R5cGVzW2luZGV4XSkgJiYKKyAgICAgICAgICAgIHZhbGlkYXRlU3VwcG9ydGVkQ3J5cHRvVHlwZXMoaW5kZXggKyAxKSk7CiB9CiAKIHN0YXRpY19hc3NlcnQodmFsaWRhdGVTdXBwb3J0ZWRDcnlwdG9UeXBlcygwKSwKQEAgLTM1MiwzNCArMzQ5LDMwIEBACiAgICAgICAgICAgICAgICJpbmNvbXBsZXRlbHkgY29uc3RydWN0ZWQuIik7CiAvLyAgLS0tLS0tLS0tLSBFTkQgQ09NUElMRS1USU1FIFNBTklUWSBDSEVDSyBCTE9DSyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLQogLy8gRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LCB1c2UgZ2V0X2NyeXB0b190eXBlKCksIHdoaWNoIGNhY2hlcyB0aGlzIHJlc3VsdC4KLWNvbnN0IENyeXB0b1R5cGUgJkNyeXB0b1R5cGU6OmdldF9kZXZpY2VfY3J5cHRvX2FsZ29yaXRobSgpIHsKK2NvbnN0IENyeXB0b1R5cGUmIENyeXB0b1R5cGU6OmdldF9kZXZpY2VfY3J5cHRvX2FsZ29yaXRobSgpIHsKICAgICBjb25zdGV4cHIgY2hhciBDUllQVF9BTEdPX1BST1BbXSA9ICJyby5jcnlwdG8uZmRlX2FsZ29yaXRobSI7CiAgICAgY2hhciBwYXJhbXN0cltQUk9QRVJUWV9WQUxVRV9NQVhdOwogCi0gICAgcHJvcGVydHlfZ2V0KENSWVBUX0FMR09fUFJPUCwgcGFyYW1zdHIsCi0gICAgICAgICAgICAgICAgIGRlZmF1bHRfY3J5cHRvX3R5cGUuZ2V0X3Byb3BlcnR5X25hbWUoKSk7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZjdHlwZSA6IHN1cHBvcnRlZF9jcnlwdG9fdHlwZXMpIHsKKyAgICBwcm9wZXJ0eV9nZXQoQ1JZUFRfQUxHT19QUk9QLCBwYXJhbXN0ciwgZGVmYXVsdF9jcnlwdG9fdHlwZS5nZXRfcHJvcGVydHlfbmFtZSgpKTsKKyAgICBmb3IgKGF1dG8gY29uc3QmIGN0eXBlIDogc3VwcG9ydGVkX2NyeXB0b190eXBlcykgewogICAgICAgICBpZiAoc3RyY21wKHBhcmFtc3RyLCBjdHlwZS5nZXRfcHJvcGVydHlfbmFtZSgpKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gY3R5cGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR0UoIkludmFsaWQgbmFtZSAoJXMpIGZvciAlcy4gIERlZmF1bHRpbmcgdG8gJXNcbiIsIHBhcmFtc3RyLAotICAgICAgICAgIENSWVBUX0FMR09fUFJPUCwgZGVmYXVsdF9jcnlwdG9fdHlwZS5nZXRfcHJvcGVydHlfbmFtZSgpKTsKKyAgICBBTE9HRSgiSW52YWxpZCBuYW1lICglcykgZm9yICVzLiAgRGVmYXVsdGluZyB0byAlc1xuIiwgcGFyYW1zdHIsIENSWVBUX0FMR09fUFJPUCwKKyAgICAgICAgICBkZWZhdWx0X2NyeXB0b190eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkpOwogICAgIHJldHVybiBkZWZhdWx0X2NyeXB0b190eXBlOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAotCi0KIC8qKgogICogR2V0cyB0aGUgZGVmYXVsdCBkZXZpY2Ugc2NyeXB0IHBhcmFtZXRlcnMgZm9yIGtleSBkZXJpdmF0aW9uIHRpbWUgdHVuaW5nLgogICogVGhlIHBhcmFtZXRlcnMgc2hvdWxkIGxlYWQgdG8gYWJvdXQgb25lIHNlY29uZCBkZXJpdmF0aW9uIHRpbWUgZm9yIHRoZQogICogZ2l2ZW4gZGV2aWNlLgogICovCi1zdGF0aWMgdm9pZCBnZXRfZGV2aWNlX3NjcnlwdF9wYXJhbXMoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0cikgeworc3RhdGljIHZvaWQgZ2V0X2RldmljZV9zY3J5cHRfcGFyYW1zKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIpIHsKICAgICBjaGFyIHBhcmFtc3RyW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgaW50IE5mLCByZiwgcGY7CiAKQEAgLTM5NywxNyArMzkwLDE2IEBACiAgICAgcmV0dXJuIGdldF9jcnlwdG9fdHlwZSgpLmdldF9rZXlzaXplKCk7CiB9CiAKLWNvbnN0IGNoYXIgKmNyeXB0ZnNfZ2V0X2NyeXB0b19uYW1lKCkgeworY29uc3QgY2hhciogY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSB7CiAgICAgcmV0dXJuIGdldF9jcnlwdG9fdHlwZSgpLmdldF9jcnlwdG9fbmFtZSgpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGdldF9mc19zaXplKGNoYXIgKmRldikKLXsKK3N0YXRpYyB1aW50NjRfdCBnZXRfZnNfc2l6ZShjaGFyKiBkZXYpIHsKICAgICBpbnQgZmQsIGJsb2NrX3NpemU7CiAgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgc2I7Ci0gICAgb2ZmNjRfdCBsZW47CisgICAgdWludDY0X3QgbGVuOwogCi0gICAgaWYgKChmZCA9IG9wZW4oZGV2LCBPX1JET05MWXxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICBpZiAoKGZkID0gb3BlbihkZXYsIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBkZXZpY2UgdG8gZ2V0IGZpbGVzeXN0ZW0gc2l6ZSAiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNDMwLDY4ICs0MjIsNTcgQEAKICAgICB9CiAgICAgYmxvY2tfc2l6ZSA9IDEwMjQgPDwgc2Iuc19sb2dfYmxvY2tfc2l6ZTsKICAgICAvKiBjb21wdXRlIGxlbmd0aCBpbiBieXRlcyAqLwotICAgIGxlbiA9ICggKChvZmY2NF90KXNiLnNfYmxvY2tzX2NvdW50X2hpIDw8IDMyKSArIHNiLnNfYmxvY2tzX2NvdW50X2xvKSAqIGJsb2NrX3NpemU7CisgICAgbGVuID0gKCgodWludDY0X3Qpc2Iuc19ibG9ja3NfY291bnRfaGkgPDwgMzIpICsgc2Iuc19ibG9ja3NfY291bnRfbG8pICogYmxvY2tfc2l6ZTsKIAogICAgIC8qIHJldHVybiBsZW5ndGggaW4gc2VjdG9ycyAqLwotICAgIHJldHVybiAodW5zaWduZWQgaW50KSAobGVuIC8gNTEyKTsKKyAgICByZXR1cm4gbGVuIC8gNTEyOwogfQogCi1zdGF0aWMgaW50IGdldF9jcnlwdF9mdHJfaW5mbyhjaGFyICoqbWV0YWRhdGFfZm5hbWUsIG9mZjY0X3QgKm9mZikKLXsKLSAgc3RhdGljIGludCBjYWNoZWRfZGF0YSA9IDA7Ci0gIHN0YXRpYyBvZmY2NF90IGNhY2hlZF9vZmYgPSAwOwotICBzdGF0aWMgY2hhciBjYWNoZWRfbWV0YWRhdGFfZm5hbWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9ICIiOwotICBpbnQgZmQ7Ci0gIGNoYXIga2V5X2xvY1tQUk9QRVJUWV9WQUxVRV9NQVhdOwotICBjaGFyIHJlYWxfYmxrZGV2W1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gIGludCByYyA9IC0xOworc3RhdGljIGludCBnZXRfY3J5cHRfZnRyX2luZm8oY2hhcioqIG1ldGFkYXRhX2ZuYW1lLCBvZmY2NF90KiBvZmYpIHsKKyAgICBzdGF0aWMgaW50IGNhY2hlZF9kYXRhID0gMDsKKyAgICBzdGF0aWMgdWludDY0X3QgY2FjaGVkX29mZiA9IDA7CisgICAgc3RhdGljIGNoYXIgY2FjaGVkX21ldGFkYXRhX2ZuYW1lW1BST1BFUlRZX1ZBTFVFX01BWF0gPSAiIjsKKyAgICBjaGFyIGtleV9sb2NbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBjaGFyIHJlYWxfYmxrZGV2W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaW50IHJjID0gLTE7CiAKLSAgaWYgKCFjYWNoZWRfZGF0YSkgewotICAgIGZzX21ncl9nZXRfY3J5cHRfaW5mbyhmc3RhYl9kZWZhdWx0LCBrZXlfbG9jLCByZWFsX2Jsa2Rldiwgc2l6ZW9mKGtleV9sb2MpKTsKKyAgICBpZiAoIWNhY2hlZF9kYXRhKSB7CisgICAgICAgIGZzX21ncl9nZXRfY3J5cHRfaW5mbyhmc3RhYl9kZWZhdWx0LCBrZXlfbG9jLCByZWFsX2Jsa2Rldiwgc2l6ZW9mKGtleV9sb2MpKTsKIAotICAgIGlmICghc3RyY21wKGtleV9sb2MsIEtFWV9JTl9GT09URVIpKSB7Ci0gICAgICBpZiAoIChmZCA9IG9wZW4ocmVhbF9ibGtkZXYsIE9fUkRXUnxPX0NMT0VYRUMpKSA8IDApIHsKLSAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIHJlYWwgYmxvY2sgZGV2aWNlICVzXG4iLCByZWFsX2Jsa2Rldik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLQotICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWMgPSAwOwotICAgICAgZ2V0X2Jsa2Rldl9zaXplKGZkLCAmbnJfc2VjKTsKLSAgICAgIGlmIChucl9zZWMgIT0gMCkgewotICAgICAgICAvKiBJZiBpdCdzIGFuIGVuY3J5cHRlZCBBbmRyb2lkIHBhcnRpdGlvbiwgdGhlIGxhc3QgMTYgS2J5dGVzIGNvbnRhaW4gdGhlCi0gICAgICAgICAqIGVuY3J5cHRpb24gaW5mbyBmb290ZXIgYW5kIGtleSwgYW5kIHBsZW50eSBvZiBieXRlcyB0byBzcGFyZSBmb3IgZnV0dXJlCi0gICAgICAgICAqIGdyb3d0aC4KLSAgICAgICAgICovCi0gICAgICAgIHN0cmxjcHkoY2FjaGVkX21ldGFkYXRhX2ZuYW1lLCByZWFsX2Jsa2Rldiwgc2l6ZW9mKGNhY2hlZF9tZXRhZGF0YV9mbmFtZSkpOwotICAgICAgICBjYWNoZWRfb2ZmID0gKChvZmY2NF90KW5yX3NlYyAqIDUxMikgLSBDUllQVF9GT09URVJfT0ZGU0VUOwotICAgICAgICBjYWNoZWRfZGF0YSA9IDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTTE9HRSgiQ2Fubm90IGdldCBzaXplIG9mIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOwotICAgICAgfQotICAgICAgY2xvc2UoZmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJsY3B5KGNhY2hlZF9tZXRhZGF0YV9mbmFtZSwga2V5X2xvYywgc2l6ZW9mKGNhY2hlZF9tZXRhZGF0YV9mbmFtZSkpOwotICAgICAgY2FjaGVkX29mZiA9IDA7Ci0gICAgICBjYWNoZWRfZGF0YSA9IDE7CisgICAgICAgIGlmICghc3RyY21wKGtleV9sb2MsIEtFWV9JTl9GT09URVIpKSB7CisgICAgICAgICAgICBpZiAoYW5kcm9pZDo6dm9sZDo6R2V0QmxvY2tEZXZTaXplKHJlYWxfYmxrZGV2LCAmY2FjaGVkX29mZikgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBpdCdzIGFuIGVuY3J5cHRlZCBBbmRyb2lkIHBhcnRpdGlvbiwgdGhlIGxhc3QgMTYgS2J5dGVzIGNvbnRhaW4gdGhlCisgICAgICAgICAgICAgICAgICogZW5jcnlwdGlvbiBpbmZvIGZvb3RlciBhbmQga2V5LCBhbmQgcGxlbnR5IG9mIGJ5dGVzIHRvIHNwYXJlIGZvciBmdXR1cmUKKyAgICAgICAgICAgICAgICAgKiBncm93dGguCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc3RybGNweShjYWNoZWRfbWV0YWRhdGFfZm5hbWUsIHJlYWxfYmxrZGV2LCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7CisgICAgICAgICAgICAgICAgY2FjaGVkX29mZiAtPSBDUllQVF9GT09URVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIGNhY2hlZF9kYXRhID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCBnZXQgc2l6ZSBvZiBibG9jayBkZXZpY2UgJXNcbiIsIHJlYWxfYmxrZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmxjcHkoY2FjaGVkX21ldGFkYXRhX2ZuYW1lLCBrZXlfbG9jLCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7CisgICAgICAgICAgICBjYWNoZWRfb2ZmID0gMDsKKyAgICAgICAgICAgIGNhY2hlZF9kYXRhID0gMTsKKyAgICAgICAgfQogICAgIH0KLSAgfQogCi0gIGlmIChjYWNoZWRfZGF0YSkgewotICAgIGlmIChtZXRhZGF0YV9mbmFtZSkgewotICAgICAgICAqbWV0YWRhdGFfZm5hbWUgPSBjYWNoZWRfbWV0YWRhdGFfZm5hbWU7CisgICAgaWYgKGNhY2hlZF9kYXRhKSB7CisgICAgICAgIGlmIChtZXRhZGF0YV9mbmFtZSkgeworICAgICAgICAgICAgKm1ldGFkYXRhX2ZuYW1lID0gY2FjaGVkX21ldGFkYXRhX2ZuYW1lOworICAgICAgICB9CisgICAgICAgIGlmIChvZmYpIHsKKyAgICAgICAgICAgICpvZmYgPSBjYWNoZWRfb2ZmOworICAgICAgICB9CisgICAgICAgIHJjID0gMDsKICAgICB9Ci0gICAgaWYgKG9mZikgewotICAgICAgICAqb2ZmID0gY2FjaGVkX29mZjsKLSAgICB9Ci0gICAgcmMgPSAwOwotICB9CiAKLSAgcmV0dXJuIHJjOworICAgIHJldHVybiByYzsKIH0KIAogLyogU2V0IHNoYTI1NiBjaGVja3N1bSBpbiBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyB2b2lkIHNldF9mdHJfc2hhKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpCi17CitzdGF0aWMgdm9pZCBzZXRfZnRyX3NoYShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyKSB7CiAgICAgU0hBMjU2X0NUWCBjOwogICAgIFNIQTI1Nl9Jbml0KCZjKTsKICAgICBtZW1zZXQoY3J5cHRfZnRyLT5zaGEyNTYsIDAsIHNpemVvZihjcnlwdF9mdHItPnNoYTI1NikpOwpAQCAtNTAyLDgyICs0ODMsNzYgQEAKIC8qIGtleSBvciBzYWx0IGNhbiBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGp1c3Qgc2tpcCB3cml0aW5nIHRoYXQgdmFsdWUuICBVc2VmdWwgdG8KICAqIHVwZGF0ZSB0aGUgZmFpbGVkIG1vdW50IGNvdW50IGJ1dCBub3QgY2hhbmdlIHRoZSBrZXkuCiAgKi8KLXN0YXRpYyBpbnQgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpCi17Ci0gIGludCBmZDsKLSAgdW5zaWduZWQgaW50IGNudDsKLSAgLyogc3RhcnRpbmdfb2ZmIGlzIHNldCB0byB0aGUgU0VFS19TRVQgb2Zmc2V0Ci0gICAqIHdoZXJlIHRoZSBjcnlwdG8gc3RydWN0dXJlIHN0YXJ0cwotICAgKi8KLSAgb2ZmNjRfdCBzdGFydGluZ19vZmY7Ci0gIGludCByYyA9IC0xOwotICBjaGFyICpmbmFtZSA9IE5VTEw7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7CitzdGF0aWMgaW50IHB1dF9jcnlwdF9mdHJfYW5kX2tleShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyKSB7CisgICAgaW50IGZkOworICAgIHVuc2lnbmVkIGludCBjbnQ7CisgICAgLyogc3RhcnRpbmdfb2ZmIGlzIHNldCB0byB0aGUgU0VFS19TRVQgb2Zmc2V0CisgICAgICogd2hlcmUgdGhlIGNyeXB0byBzdHJ1Y3R1cmUgc3RhcnRzCisgICAgICovCisgICAgb2ZmNjRfdCBzdGFydGluZ19vZmY7CisgICAgaW50IHJjID0gLTE7CisgICAgY2hhciogZm5hbWUgPSBOVUxMOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CiAKLSAgc2V0X2Z0cl9zaGEoY3J5cHRfZnRyKTsKKyAgICBzZXRfZnRyX3NoYShjcnlwdF9mdHIpOwogCi0gIGlmIChnZXRfY3J5cHRfZnRyX2luZm8oJmZuYW1lLCAmc3RhcnRpbmdfb2ZmKSkgewotICAgIFNMT0dFKCJVbmFibGUgdG8gZ2V0IGNyeXB0X2Z0cl9pbmZvXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGZuYW1lWzBdICE9ICcvJykgewotICAgIFNMT0dFKCJVbmV4cGVjdGVkIHZhbHVlIGZvciBjcnlwdG8ga2V5IGxvY2F0aW9uXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKCAoZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1IgfCBPX0NSRUFUfE9fQ0xPRVhFQywgMDYwMCkpIDwgMCkgewotICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBmb290ZXIgZmlsZSAlcyBmb3IgcHV0XG4iLCBmbmFtZSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGNyeXB0IGZvb3RlciAqLwotICBpZiAobHNlZWs2NChmZCwgc3RhcnRpbmdfb2ZmLCBTRUVLX1NFVCkgPT0gLTEpIHsKLSAgICBTTE9HRSgiQ2Fubm90IHNlZWsgdG8gcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQotCi0gIGlmICgoY250ID0gd3JpdGUoZmQsIGNyeXB0X2Z0ciwgc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkpICE9IHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpIHsKLSAgICBTTE9HRSgiQ2Fubm90IHdyaXRlIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KLQotICBmc3RhdChmZCwgJnN0YXRidWYpOwotICAvKiBJZiB0aGUga2V5cyBhcmUga2VwdCBvbiBhIHJhdyBibG9jayBkZXZpY2UsIGRvIG5vdCB0cnkgdG8gdHJ1bmNhdGUgaXQuICovCi0gIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpIHsKLSAgICBpZiAoZnRydW5jYXRlKGZkLCAweDQwMDApKSB7Ci0gICAgICBTTE9HRSgiQ2Fubm90IHNldCBmb290ZXIgZmlsZSBzaXplXG4iKTsKLSAgICAgIGdvdG8gZXJyb3V0OworICAgIGlmIChnZXRfY3J5cHRfZnRyX2luZm8oJmZuYW1lLCAmc3RhcnRpbmdfb2ZmKSkgeworICAgICAgICBTTE9HRSgiVW5hYmxlIHRvIGdldCBjcnlwdF9mdHJfaW5mb1xuIik7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gIH0KKyAgICBpZiAoZm5hbWVbMF0gIT0gJy8nKSB7CisgICAgICAgIFNMT0dFKCJVbmV4cGVjdGVkIHZhbHVlIGZvciBjcnlwdG8ga2V5IGxvY2F0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGZkID0gb3BlbihmbmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fQ0xPRVhFQywgMDYwMCkpIDwgMCkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZm9vdGVyIGZpbGUgJXMgZm9yIHB1dFxuIiwgZm5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gIC8qIFN1Y2Nlc3MhICovCi0gIHJjID0gMDsKKyAgICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgY3J5cHQgZm9vdGVyICovCisgICAgaWYgKGxzZWVrNjQoZmQsIHN0YXJ0aW5nX29mZiwgU0VFS19TRVQpID09IC0xKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgc2VlayB0byByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CisKKyAgICBpZiAoKGNudCA9IHdyaXRlKGZkLCBjcnlwdF9mdHIsIHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpKSAhPSBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgd3JpdGUgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQorCisgICAgZnN0YXQoZmQsICZzdGF0YnVmKTsKKyAgICAvKiBJZiB0aGUga2V5cyBhcmUga2VwdCBvbiBhIHJhdyBibG9jayBkZXZpY2UsIGRvIG5vdCB0cnkgdG8gdHJ1bmNhdGUgaXQuICovCisgICAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgeworICAgICAgICBpZiAoZnRydW5jYXRlKGZkLCAweDQwMDApKSB7CisgICAgICAgICAgICBTTE9HRSgiQ2Fubm90IHNldCBmb290ZXIgZmlsZSBzaXplXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogU3VjY2VzcyEgKi8KKyAgICByYyA9IDA7CiAKIGVycm91dDoKLSAgY2xvc2UoZmQpOwotICByZXR1cm4gcmM7Ci0KKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgYm9vbCBjaGVja19mdHJfc2hhKGNvbnN0IHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpCi17CitzdGF0aWMgYm9vbCBjaGVja19mdHJfc2hhKGNvbnN0IHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjb3B5OwogICAgIG1lbWNweSgmY29weSwgY3J5cHRfZnRyLCBzaXplb2YoY29weSkpOwogICAgIHNldF9mdHJfc2hhKCZjb3B5KTsKICAgICByZXR1cm4gbWVtY21wKGNvcHkuc2hhMjU2LCBjcnlwdF9mdHItPnNoYTI1Niwgc2l6ZW9mKGNvcHkuc2hhMjU2KSkgPT0gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdW5peF9yZWFkKGludCAgZmQsIHZvaWQqICBidWZmLCBpbnQgIGxlbikKLXsKK3N0YXRpYyBpbmxpbmUgaW50IHVuaXhfcmVhZChpbnQgZmQsIHZvaWQqIGJ1ZmYsIGludCBsZW4pIHsKICAgICByZXR1cm4gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoZmQsIGJ1ZmYsIGxlbikpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB1bml4X3dyaXRlKGludCAgZmQsIGNvbnN0IHZvaWQqICBidWZmLCBpbnQgIGxlbikKLXsKK3N0YXRpYyBpbmxpbmUgaW50IHVuaXhfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkKiBidWZmLCBpbnQgbGVuKSB7CiAgICAgcmV0dXJuIFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShmZCwgYnVmZiwgbGVuKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfZW1wdHlfcGVyc2lzdF9kYXRhKHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEgKnBkYXRhLCBpbnQgbGVuKQoteworc3RhdGljIHZvaWQgaW5pdF9lbXB0eV9wZXJzaXN0X2RhdGEoc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSogcGRhdGEsIGludCBsZW4pIHsKICAgICBtZW1zZXQocGRhdGEsIDAsIGxlbik7CiAgICAgcGRhdGEtPnBlcnNpc3RfbWFnaWMgPSBQRVJTSVNUX0RBVEFfTUFHSUM7CiAgICAgcGRhdGEtPnBlcnNpc3RfdmFsaWRfZW50cmllcyA9IDA7CkBAIC01ODgsMTggKzU2MywxNyBAQAogICogZGF0YSwgY3J5cHRfZnRyIGlzIGEgcG9pbnRlciB0byB0aGUgc3RydWN0IHRvIGJlIHVwZGF0ZWQsIGFuZCBvZmZzZXQgaXMgdGhlCiAgKiBhYnNvbHV0ZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjcnlwdF9tbnRfZnRyIG9uIHRoZSBwYXNzZWQgaW4gZmQuCiAgKi8KLXN0YXRpYyB2b2lkIHVwZ3JhZGVfY3J5cHRfZnRyKGludCBmZCwgc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0ciwgb2ZmNjRfdCBvZmZzZXQpCi17CitzdGF0aWMgdm9pZCB1cGdyYWRlX2NyeXB0X2Z0cihpbnQgZmQsIHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgaW50IG9yaWdfbWFqb3IgPSBjcnlwdF9mdHItPm1ham9yX3ZlcnNpb247CiAgICAgaW50IG9yaWdfbWlub3IgPSBjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb247CiAKICAgICBpZiAoKGNyeXB0X2Z0ci0+bWFqb3JfdmVyc2lvbiA9PSAxKSAmJiAoY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uID09IDApKSB7Ci0gICAgICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEgKnBkYXRhOworICAgICAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKiBwZGF0YTsKICAgICAgICAgb2ZmNjRfdCBwZGF0YV9vZmZzZXQgPSBvZmZzZXQgKyBDUllQVF9GT09URVJfVE9fUEVSU0lTVF9PRkZTRVQ7CiAKICAgICAgICAgU0xPR1coInVwZ3JhZGluZyBjcnlwdG8gZm9vdGVyIHRvIDEuMSIpOwogCi0gICAgICAgIHBkYXRhID0gKGNyeXB0X3BlcnNpc3RfZGF0YSAqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7CisgICAgICAgIHBkYXRhID0gKGNyeXB0X3BlcnNpc3RfZGF0YSopbWFsbG9jKENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKICAgICAgICAgaWYgKHBkYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgIFNMT0dFKCJDYW5ub3QgYWxsb2NhdGUgcGVyc2lzZW50IGRhdGFcbiIpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNjUyLDkxICs2MjYsODkgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKKyAgICBpbnQgZmQ7CisgICAgdW5zaWduZWQgaW50IGNudDsKKyAgICBvZmY2NF90IHN0YXJ0aW5nX29mZjsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBjaGFyKiBmbmFtZSA9IE5VTEw7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKIAotc3RhdGljIGludCBnZXRfY3J5cHRfZnRyX2FuZF9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKLSAgaW50IGZkOwotICB1bnNpZ25lZCBpbnQgY250OwotICBvZmY2NF90IHN0YXJ0aW5nX29mZjsKLSAgaW50IHJjID0gLTE7Ci0gIGNoYXIgKmZuYW1lID0gTlVMTDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9pbmZvKCZmbmFtZSwgJnN0YXJ0aW5nX29mZikpIHsKKyAgICAgICAgU0xPR0UoIlVuYWJsZSB0byBnZXQgY3J5cHRfZnRyX2luZm9cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChmbmFtZVswXSAhPSAnLycpIHsKKyAgICAgICAgU0xPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIGNyeXB0byBrZXkgbG9jYXRpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1IgfCBPX0NMT0VYRUMpKSA8IDApIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIGZvb3RlciBmaWxlICVzIGZvciBnZXRcbiIsIGZuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotICBpZiAoZ2V0X2NyeXB0X2Z0cl9pbmZvKCZmbmFtZSwgJnN0YXJ0aW5nX29mZikpIHsKLSAgICBTTE9HRSgiVW5hYmxlIHRvIGdldCBjcnlwdF9mdHJfaW5mb1xuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChmbmFtZVswXSAhPSAnLycpIHsKLSAgICBTTE9HRSgiVW5leHBlY3RlZCB2YWx1ZSBmb3IgY3J5cHRvIGtleSBsb2NhdGlvblxuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICggKGZkID0gb3BlbihmbmFtZSwgT19SRFdSfE9fQ0xPRVhFQykpIDwgMCkgewotICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBmb290ZXIgZmlsZSAlcyBmb3IgZ2V0XG4iLCBmbmFtZSk7Ci0gICAgcmV0dXJuIC0xOwotICB9CisgICAgLyogTWFrZSBzdXJlIGl0J3MgMTYgS2J5dGVzIGluIGxlbmd0aCAqLworICAgIGZzdGF0KGZkLCAmc3RhdGJ1Zik7CisgICAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSAmJiAoc3RhdGJ1Zi5zdF9zaXplICE9IDB4NDAwMCkpIHsKKyAgICAgICAgU0xPR0UoImZvb3RlciBmaWxlICVzIGlzIG5vdCB0aGUgZXhwZWN0ZWQgc2l6ZSFcbiIsIGZuYW1lKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIC8qIE1ha2Ugc3VyZSBpdCdzIDE2IEtieXRlcyBpbiBsZW5ndGggKi8KLSAgZnN0YXQoZmQsICZzdGF0YnVmKTsKLSAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSAmJiAoc3RhdGJ1Zi5zdF9zaXplICE9IDB4NDAwMCkpIHsKLSAgICBTTE9HRSgiZm9vdGVyIGZpbGUgJXMgaXMgbm90IHRoZSBleHBlY3RlZCBzaXplIVxuIiwgZm5hbWUpOwotICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGNyeXB0IGZvb3RlciAqLworICAgIGlmIChsc2VlazY0KGZkLCBzdGFydGluZ19vZmYsIFNFRUtfU0VUKSA9PSAtMSkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IHNlZWsgdG8gcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjcnlwdCBmb290ZXIgKi8KLSAgaWYgKGxzZWVrNjQoZmQsIHN0YXJ0aW5nX29mZiwgU0VFS19TRVQpID09IC0xKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCBzZWVrIHRvIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpZiAoKGNudCA9IHJlYWQoZmQsIGNyeXB0X2Z0ciwgc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkpICE9IHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCByZWFkIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICBpZiAoIChjbnQgPSByZWFkKGZkLCBjcnlwdF9mdHIsIHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpKSAhPSBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCByZWFkIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpZiAoY3J5cHRfZnRyLT5tYWdpYyAhPSBDUllQVF9NTlRfTUFHSUMpIHsKKyAgICAgICAgU0xPR0UoIkJhZCBtYWdpYyBmb3IgcmVhbCBibG9jayBkZXZpY2UgJXNcbiIsIGZuYW1lKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIGlmIChjcnlwdF9mdHItPm1hZ2ljICE9IENSWVBUX01OVF9NQUdJQykgewotICAgIFNMT0dFKCJCYWQgbWFnaWMgZm9yIHJlYWwgYmxvY2sgZGV2aWNlICVzXG4iLCBmbmFtZSk7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpZiAoY3J5cHRfZnRyLT5tYWpvcl92ZXJzaW9uICE9IENVUlJFTlRfTUFKT1JfVkVSU0lPTikgeworICAgICAgICBTTE9HRSgiQ2Fubm90IHVuZGVyc3RhbmQgbWFqb3IgdmVyc2lvbiAlZCByZWFsIGJsb2NrIGRldmljZSBmb290ZXI7IGV4cGVjdGVkICVkXG4iLAorICAgICAgICAgICAgICBjcnlwdF9mdHItPm1ham9yX3ZlcnNpb24sIENVUlJFTlRfTUFKT1JfVkVSU0lPTik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICBpZiAoY3J5cHRfZnRyLT5tYWpvcl92ZXJzaW9uICE9IENVUlJFTlRfTUFKT1JfVkVSU0lPTikgewotICAgIFNMT0dFKCJDYW5ub3QgdW5kZXJzdGFuZCBtYWpvciB2ZXJzaW9uICVkIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlcjsgZXhwZWN0ZWQgJWRcbiIsCi0gICAgICAgICAgY3J5cHRfZnRyLT5tYWpvcl92ZXJzaW9uLCBDVVJSRU5UX01BSk9SX1ZFUlNJT04pOwotICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgLy8gV2UgcmlzayBidWZmZXIgb3ZlcmZsb3dzIHdpdGggb3ZlcnNpemVkIGtleXMsIHNvIHdlIGp1c3QgcmVqZWN0IHRoZW0uCisgICAgLy8gMC1zaXplZCBrZXlzIGFyZSBwcm9ibGVtYXRpYyAoZXNzZW50aWFsbHkgYnktcGFzc2luZyBlbmNyeXB0aW9uKSwgYW5kCisgICAgLy8gQUVTLUNCQyBrZXkgd3JhcHBpbmcgb25seSB3b3JrcyBmb3IgbXVsdGlwbGVzIG9mIDE2IGJ5dGVzLgorICAgIGlmICgoY3J5cHRfZnRyLT5rZXlzaXplID09IDApIHx8ICgoY3J5cHRfZnRyLT5rZXlzaXplICUgMTYpICE9IDApIHx8CisgICAgICAgIChjcnlwdF9mdHItPmtleXNpemUgPiBNQVhfS0VZX0xFTikpIHsKKyAgICAgICAgU0xPR0UoCisgICAgICAgICAgICAiSW52YWxpZCBrZXlzaXplICgldSkgZm9yIGJsb2NrIGRldmljZSAlczsgTXVzdCBiZSBub24temVybywgIgorICAgICAgICAgICAgImRpdmlzaWJsZSBieSAxNiwgYW5kIDw9ICVkXG4iLAorICAgICAgICAgICAgY3J5cHRfZnRyLT5rZXlzaXplLCBmbmFtZSwgTUFYX0tFWV9MRU4pOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgLy8gV2UgcmlzayBidWZmZXIgb3ZlcmZsb3dzIHdpdGggb3ZlcnNpemVkIGtleXMsIHNvIHdlIGp1c3QgcmVqZWN0IHRoZW0uCi0gIC8vIDAtc2l6ZWQga2V5cyBhcmUgcHJvYmxlbWF0aWMgKGVzc2VudGlhbGx5IGJ5LXBhc3NpbmcgZW5jcnlwdGlvbiksIGFuZAotICAvLyBBRVMtQ0JDIGtleSB3cmFwcGluZyBvbmx5IHdvcmtzIGZvciBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCi0gIGlmICgoY3J5cHRfZnRyLT5rZXlzaXplID09IDApIHx8ICgoY3J5cHRfZnRyLT5rZXlzaXplICUgMTYpICE9IDApIHx8Ci0gICAgICAoY3J5cHRfZnRyLT5rZXlzaXplID4gTUFYX0tFWV9MRU4pKSB7Ci0gICAgU0xPR0UoIkludmFsaWQga2V5c2l6ZSAoJXUpIGZvciBibG9jayBkZXZpY2UgJXM7IE11c3QgYmUgbm9uLXplcm8sICIKLSAgICAgICAgICAiZGl2aXNpYmxlIGJ5IDE2LCBhbmQgPD0gJWRcbiIsIGNyeXB0X2Z0ci0+a2V5c2l6ZSwgZm5hbWUsCi0gICAgICAgICAgTUFYX0tFWV9MRU4pOwotICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgaWYgKGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbiA+IENVUlJFTlRfTUlOT1JfVkVSU0lPTikgeworICAgICAgICBTTE9HVygiV2FybmluZzogY3J5cHRvIGZvb3RlciBtaW5vciB2ZXJzaW9uICVkLCBleHBlY3RlZCA8PSAlZCwgY29udGludWluZy4uLlxuIiwKKyAgICAgICAgICAgICAgY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uLCBDVVJSRU5UX01JTk9SX1ZFUlNJT04pOworICAgIH0KIAotICBpZiAoY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uID4gQ1VSUkVOVF9NSU5PUl9WRVJTSU9OKSB7Ci0gICAgU0xPR1coIldhcm5pbmc6IGNyeXB0byBmb290ZXIgbWlub3IgdmVyc2lvbiAlZCwgZXhwZWN0ZWQgPD0gJWQsIGNvbnRpbnVpbmcuLi5cbiIsCi0gICAgICAgICAgY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uLCBDVVJSRU5UX01JTk9SX1ZFUlNJT04pOwotICB9CisgICAgLyogSWYgdGhpcyBpcyBhIHZlcmlvbiAxLjAgY3J5cHRfZnRyLCBtYWtlIGl0IGEgMS4xIGNyeXB0IGZvb3RlciwgYW5kIHVwZGF0ZSB0aGUKKyAgICAgKiBjb3B5IG9uIGRpc2sgYmVmb3JlIHJldHVybmluZy4KKyAgICAgKi8KKyAgICBpZiAoY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uIDwgQ1VSUkVOVF9NSU5PUl9WRVJTSU9OKSB7CisgICAgICAgIHVwZ3JhZGVfY3J5cHRfZnRyKGZkLCBjcnlwdF9mdHIsIHN0YXJ0aW5nX29mZik7CisgICAgfQogCi0gIC8qIElmIHRoaXMgaXMgYSB2ZXJpb24gMS4wIGNyeXB0X2Z0ciwgbWFrZSBpdCBhIDEuMSBjcnlwdCBmb290ZXIsIGFuZCB1cGRhdGUgdGhlCi0gICAqIGNvcHkgb24gZGlzayBiZWZvcmUgcmV0dXJuaW5nLgotICAgKi8KLSAgaWYgKGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbiA8IENVUlJFTlRfTUlOT1JfVkVSU0lPTikgewotICAgIHVwZ3JhZGVfY3J5cHRfZnRyKGZkLCBjcnlwdF9mdHIsIHN0YXJ0aW5nX29mZik7Ci0gIH0KLQotICAvKiBTdWNjZXNzISAqLwotICByYyA9IDA7CisgICAgLyogU3VjY2VzcyEgKi8KKyAgICByYyA9IDA7CiAKIGVycm91dDoKLSAgY2xvc2UoZmQpOwotICByZXR1cm4gcmM7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiByYzsKIH0KIAotc3RhdGljIGludCB2YWxpZGF0ZV9wZXJzaXN0ZW50X2RhdGFfc3RvcmFnZShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyKQoteworc3RhdGljIGludCB2YWxpZGF0ZV9wZXJzaXN0ZW50X2RhdGFfc3RvcmFnZShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyKSB7CiAgICAgaWYgKGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX29mZnNldFswXSArIGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX3NpemUgPgogICAgICAgICBjcnlwdF9mdHItPnBlcnNpc3RfZGF0YV9vZmZzZXRbMV0pIHsKICAgICAgICAgU0xPR0UoIkNyeXB0X2Z0ciBwZXJzaXN0IGRhdGEgcmVnaW9ucyBvdmVybGFwIik7CkBAIC03NDksNyArNzIxLDcgQEAKICAgICB9CiAKICAgICBpZiAoKChjcnlwdF9mdHItPnBlcnNpc3RfZGF0YV9vZmZzZXRbMV0gKyBjcnlwdF9mdHItPnBlcnNpc3RfZGF0YV9zaXplKSAtCi0gICAgICAgIChjcnlwdF9mdHItPnBlcnNpc3RfZGF0YV9vZmZzZXRbMF0gLSBDUllQVF9GT09URVJfVE9fUEVSU0lTVF9PRkZTRVQpKSA+CisgICAgICAgICAoY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdIC0gQ1JZUFRfRk9PVEVSX1RPX1BFUlNJU1RfT0ZGU0VUKSkgPgogICAgICAgICBDUllQVF9GT09URVJfT0ZGU0VUKSB7CiAgICAgICAgIFNMT0dFKCJQZXJzaXN0ZW50IGRhdGEgZXh0ZW5kcyBwYXN0IGNyeXB0byBmb290ZXIiKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNzU4LDEyICs3MzAsMTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsb2FkX3BlcnNpc3RlbnRfZGF0YSh2b2lkKQoteworc3RhdGljIGludCBsb2FkX3BlcnNpc3RlbnRfZGF0YSh2b2lkKSB7CiAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgY3J5cHRfZnRyOwotICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEgKnBkYXRhID0gTlVMTDsKKyAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKiBwZGF0YSA9IE5VTEw7CiAgICAgY2hhciBlbmNyeXB0ZWRfc3RhdGVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBjaGFyICpmbmFtZTsKKyAgICBjaGFyKiBmbmFtZTsKICAgICBpbnQgZm91bmQgPSAwOwogICAgIGludCBmZDsKICAgICBpbnQgcmV0OwpAQCAtNzc0LDEwICs3NDUsOSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLQogICAgIC8qIElmIG5vdCBlbmNyeXB0ZWQsIGp1c3QgYWxsb2NhdGUgYW4gZW1wdHkgdGFibGUgYW5kIGluaXRpYWxpemUgaXQgKi8KICAgICBwcm9wZXJ0eV9nZXQoInJvLmNyeXB0by5zdGF0ZSIsIGVuY3J5cHRlZF9zdGF0ZSwgIiIpOwotICAgIGlmIChzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikgKSB7CisgICAgaWYgKHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSkgewogICAgICAgICBwZGF0YSA9IChjcnlwdF9wZXJzaXN0X2RhdGEqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7CiAgICAgICAgIGlmIChwZGF0YSkgewogICAgICAgICAgICAgaW5pdF9lbXB0eV9wZXJzaXN0X2RhdGEocGRhdGEsIENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKQEAgLTc4NywxMiArNzU3LDEyIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZihnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKKyAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uIDwgMSkKLSAgICAgICAgfHwgKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uID09IDEgJiYgY3J5cHRfZnRyLm1pbm9yX3ZlcnNpb24gPCAxKSkgeworICAgIGlmICgoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPCAxKSB8fAorICAgICAgICAoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPT0gMSAmJiBjcnlwdF9mdHIubWlub3JfdmVyc2lvbiA8IDEpKSB7CiAgICAgICAgIFNMT0dFKCJDcnlwdF9mdHIgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgcGVyc2lzdGVudCBkYXRhIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC04MDYsNyArNzc2LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGZkID0gb3BlbihmbmFtZSwgT19SRE9OTFl8T19DTE9FWEVDKTsKKyAgICBmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiAlcyBtZXRhZGF0YSBmaWxlIiwgZm5hbWUpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC04MjMsNyArNzkzLDcgQEAKICAgICAgICAgICAgIFNMT0dFKCJDYW5ub3Qgc2VlayB0byByZWFkIHBlcnNpc3RlbnQgZGF0YSBvbiAlcyIsIGZuYW1lKTsKICAgICAgICAgICAgIGdvdG8gZXJyMjsKICAgICAgICAgfQotICAgICAgICBpZiAodW5peF9yZWFkKGZkLCBwZGF0YSwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSA8IDApeworICAgICAgICBpZiAodW5peF9yZWFkKGZkLCBwZGF0YSwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSA8IDApIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciByZWFkaW5nIHBlcnNpc3RlbnQgZGF0YSBvbiBpdGVyYXRpb24gJWQiLCBpKTsKICAgICAgICAgICAgIGdvdG8gZXJyMjsKICAgICAgICAgfQpAQCAtODUxLDExICs4MjEsMTAgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgc2F2ZV9wZXJzaXN0ZW50X2RhdGEodm9pZCkKLXsKK3N0YXRpYyBpbnQgc2F2ZV9wZXJzaXN0ZW50X2RhdGEodm9pZCkgewogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKLSAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhICpwZGF0YTsKLSAgICBjaGFyICpmbmFtZTsKKyAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKiBwZGF0YTsKKyAgICBjaGFyKiBmbmFtZTsKICAgICBvZmY2NF90IHdyaXRlX29mZnNldDsKICAgICBvZmY2NF90IGVyYXNlX29mZnNldDsKICAgICBpbnQgZmQ7CkBAIC04NjYsMTIgKzgzNSwxMiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7CisgICAgaWYgKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA8IDEpCi0gICAgICAgIHx8IChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA9PSAxICYmIGNyeXB0X2Z0ci5taW5vcl92ZXJzaW9uIDwgMSkpIHsKKyAgICBpZiAoKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uIDwgMSkgfHwKKyAgICAgICAgKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uID09IDEgJiYgY3J5cHRfZnRyLm1pbm9yX3ZlcnNpb24gPCAxKSkgewogICAgICAgICBTTE9HRSgiQ3J5cHRfZnRyIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IHBlcnNpc3RlbnQgZGF0YSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtODg1LDcgKzg1NCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUnxPX0NMT0VYRUMpOworICAgIGZkID0gb3BlbihmbmFtZSwgT19SRFdSIHwgT19DTE9FWEVDKTsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiAlcyBtZXRhZGF0YSBmaWxlIiwgZm5hbWUpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC05MDMsMjAgKzg3MiwyMCBAQAogICAgIH0KIAogICAgIGlmICh1bml4X3JlYWQoZmQsIHBkYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIDwgMCkgewotICAgICAgICAgICAgU0xPR0UoIkVycm9yIHJlYWRpbmcgcGVyc2lzdGVudCBkYXRhIGJlZm9yZSBzYXZlIik7Ci0gICAgICAgICAgICBnb3RvIGVycjI7CisgICAgICAgIFNMT0dFKCJFcnJvciByZWFkaW5nIHBlcnNpc3RlbnQgZGF0YSBiZWZvcmUgc2F2ZSIpOworICAgICAgICBnb3RvIGVycjI7CiAgICAgfQogCiAgICAgaWYgKHBkYXRhLT5wZXJzaXN0X21hZ2ljID09IFBFUlNJU1RfREFUQV9NQUdJQykgewogICAgICAgICAvKiBUaGUgZmlyc3QgY29weSBpcyB0aGUgY3VyZW50IHZhbGlkIGNvcHksIHNvIHdyaXRlIHRvCiAgICAgICAgICAqIHRoZSBzZWNvbmQgY29weSBhbmQgZXJhc2UgdGhpcyBvbmUgKi8KLSAgICAgICB3cml0ZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFsxXTsKLSAgICAgICBlcmFzZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFswXTsKKyAgICAgICAgd3JpdGVfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMV07CisgICAgICAgIGVyYXNlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFRoZSBzZWNvbmQgY29weSBtdXN0IGJlIHRoZSB2YWxpZCBjb3B5LCBzbyB3cml0ZSB0bwogICAgICAgICAgKiB0aGUgZmlyc3QgY29weSwgYW5kIGVyYXNlIHRoZSBzZWNvbmQgKi8KLSAgICAgICB3cml0ZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFswXTsKLSAgICAgICBlcmFzZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFsxXTsKKyAgICAgICAgd3JpdGVfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMF07CisgICAgICAgIGVyYXNlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdOwogICAgIH0KIAogICAgIC8qIFdyaXRlIHRoZSBuZXcgY29weSBmaXJzdCwgaWYgc3VjY2Vzc2Z1bCwgdGhlbiBlcmFzZSB0aGUgb2xkIGNvcHkgKi8KQEAgLTkyNSwxNSArODk0LDE0IEBACiAgICAgICAgIGdvdG8gZXJyMjsKICAgICB9CiAgICAgaWYgKHVuaXhfd3JpdGUoZmQsIHBlcnNpc3RfZGF0YSwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSA9PQotICAgICAgICAoaW50KSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIHsKKyAgICAgICAgKGludCljcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIHsKICAgICAgICAgaWYgKGxzZWVrNjQoZmQsIGVyYXNlX29mZnNldCwgU0VFS19TRVQpIDwgMCkgewogICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCBzZWVrIHRvIGVyYXNlIHByZXZpb3VzIHBlcnNpc3RlbnQgZGF0YSIpOwogICAgICAgICAgICAgZ290byBlcnIyOwogICAgICAgICB9CiAgICAgICAgIGZzeW5jKGZkKTsKICAgICAgICAgbWVtc2V0KHBkYXRhLCAwLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpOwotICAgICAgICBpZiAodW5peF93cml0ZShmZCwgcGRhdGEsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgIT0KLSAgICAgICAgICAgIChpbnQpIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgeworICAgICAgICBpZiAodW5peF93cml0ZShmZCwgcGRhdGEsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgIT0gKGludCljcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIHsKICAgICAgICAgICAgIFNMT0dFKCJDYW5ub3Qgd3JpdGUgdG8gZXJhc2UgcHJldmlvdXMgcGVyc2lzdGVudCBkYXRhIik7CiAgICAgICAgICAgICBnb3RvIGVycjI7CiAgICAgICAgIH0KQEAgLTk1OCw4NSArOTI2LDgyIEBACiAvKiBDb252ZXJ0IGEgYmluYXJ5IGtleSBvZiBzcGVjaWZpZWQgbGVuZ3RoIGludG8gYW4gYXNjaWkgaGV4IHN0cmluZyBlcXVpdmFsZW50LAogICogd2l0aG91dCB0aGUgbGVhZGluZyAweCBhbmQgd2l0aCBudWxsIHRlcm1pbmF0aW9uCiAgKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnRfa2V5X3RvX2hleF9hc2NpaShjb25zdCB1bnNpZ25lZCBjaGFyICptYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlzaXplLCBjaGFyICptYXN0ZXJfa2V5X2FzY2lpKSB7CitzdGF0aWMgdm9pZCBjb252ZXJ0X2tleV90b19oZXhfYXNjaWkoY29uc3QgdW5zaWduZWQgY2hhciogbWFzdGVyX2tleSwgdW5zaWduZWQgaW50IGtleXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbWFzdGVyX2tleV9hc2NpaSkgewogICAgIHVuc2lnbmVkIGludCBpLCBhOwogICAgIHVuc2lnbmVkIGNoYXIgbmliYmxlOwogCi0gICAgZm9yIChpPTAsIGE9MDsgaTxrZXlzaXplOyBpKyssIGErPTIpIHsKKyAgICBmb3IgKGkgPSAwLCBhID0gMDsgaSA8IGtleXNpemU7IGkrKywgYSArPSAyKSB7CiAgICAgICAgIC8qIEZvciBlYWNoIGJ5dGUsIHdyaXRlIG91dCB0d28gYXNjaWkgaGV4IGRpZ2l0cyAqLwogICAgICAgICBuaWJibGUgPSAobWFzdGVyX2tleVtpXSA+PiA0KSAmIDB4ZjsKICAgICAgICAgbWFzdGVyX2tleV9hc2NpaVthXSA9IG5pYmJsZSArIChuaWJibGUgPiA5ID8gMHgzNyA6IDB4MzApOwogCiAgICAgICAgIG5pYmJsZSA9IG1hc3Rlcl9rZXlbaV0gJiAweGY7Ci0gICAgICAgIG1hc3Rlcl9rZXlfYXNjaWlbYSsxXSA9IG5pYmJsZSArIChuaWJibGUgPiA5ID8gMHgzNyA6IDB4MzApOworICAgICAgICBtYXN0ZXJfa2V5X2FzY2lpW2EgKyAxXSA9IG5pYmJsZSArIChuaWJibGUgPiA5ID8gMHgzNyA6IDB4MzApOwogICAgIH0KIAogICAgIC8qIEFkZCB0aGUgbnVsbCB0ZXJtaW5hdGlvbiAqLwogICAgIG1hc3Rlcl9rZXlfYXNjaWlbYV0gPSAnXDAnOwotCiB9CiAKLXN0YXRpYyBpbnQgbG9hZF9jcnlwdG9fbWFwcGluZ190YWJsZShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyLAotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICptYXN0ZXJfa2V5LCBjb25zdCBjaGFyICpyZWFsX2Jsa19uYW1lLAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmQsIGNvbnN0IGNoYXIgKmV4dHJhX3BhcmFtcykgewotICBhbGlnbmFzKHN0cnVjdCBkbV9pb2N0bCkgY2hhciBidWZmZXJbRE1fQ1JZUFRfQlVGX1NJWkVdOwotICBzdHJ1Y3QgZG1faW9jdGwgKmlvOwotICBzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKnRndDsKLSAgY2hhciAqY3J5cHRfcGFyYW1zOwotICAvLyBXZSBuZWVkIHR3byBBU0NJSSBjaGFyYWN0ZXJzIHRvIHJlcHJlc2VudCBlYWNoIGJ5dGUsIGFuZCBuZWVkIHNwYWNlIGZvcgotICAvLyB0aGUgJ1wwJyB0ZXJtaW5hdG9yLgotICBjaGFyIG1hc3Rlcl9rZXlfYXNjaWlbTUFYX0tFWV9MRU4gKiAyICsgMV07Ci0gIHNpemVfdCBidWZmX29mZnNldDsKLSAgaW50IGk7CitzdGF0aWMgaW50IGxvYWRfY3J5cHRvX21hcHBpbmdfdGFibGUoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBtYXN0ZXJfa2V5LCBjb25zdCBjaGFyKiByZWFsX2Jsa19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIGludCBmZCwgY29uc3QgY2hhciogZXh0cmFfcGFyYW1zKSB7CisgICAgYWxpZ25hcyhzdHJ1Y3QgZG1faW9jdGwpIGNoYXIgYnVmZmVyW0RNX0NSWVBUX0JVRl9TSVpFXTsKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvOworICAgIHN0cnVjdCBkbV90YXJnZXRfc3BlYyogdGd0OworICAgIGNoYXIqIGNyeXB0X3BhcmFtczsKKyAgICAvLyBXZSBuZWVkIHR3byBBU0NJSSBjaGFyYWN0ZXJzIHRvIHJlcHJlc2VudCBlYWNoIGJ5dGUsIGFuZCBuZWVkIHNwYWNlIGZvcgorICAgIC8vIHRoZSAnXDAnIHRlcm1pbmF0b3IuCisgICAgY2hhciBtYXN0ZXJfa2V5X2FzY2lpW01BWF9LRVlfTEVOICogMiArIDFdOworICAgIHNpemVfdCBidWZmX29mZnNldDsKKyAgICBpbnQgaTsKIAotICBpbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOworICAgIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOwogCi0gIC8qIExvYWQgdGhlIG1hcHBpbmcgdGFibGUgZm9yIHRoaXMgZGV2aWNlICovCi0gIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKikgJmJ1ZmZlcltzaXplb2Yoc3RydWN0IGRtX2lvY3RsKV07CisgICAgLyogTG9hZCB0aGUgbWFwcGluZyB0YWJsZSBmb3IgdGhpcyBkZXZpY2UgKi8KKyAgICB0Z3QgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjKikmYnVmZmVyW3NpemVvZihzdHJ1Y3QgZG1faW9jdGwpXTsKIAotICBpb2N0bF9pbml0KGlvLCBETV9DUllQVF9CVUZfU0laRSwgbmFtZSwgMCk7Ci0gIGlvLT50YXJnZXRfY291bnQgPSAxOwotICB0Z3QtPnN0YXR1cyA9IDA7Ci0gIHRndC0+c2VjdG9yX3N0YXJ0ID0gMDsKLSAgdGd0LT5sZW5ndGggPSBjcnlwdF9mdHItPmZzX3NpemU7Ci0gIHN0cmxjcHkodGd0LT50YXJnZXRfdHlwZSwgImNyeXB0IiwgRE1fTUFYX1RZUEVfTkFNRSk7CisgICAgaW9jdGxfaW5pdChpbywgRE1fQ1JZUFRfQlVGX1NJWkUsIG5hbWUsIDApOworICAgIGlvLT50YXJnZXRfY291bnQgPSAxOworICAgIHRndC0+c3RhdHVzID0gMDsKKyAgICB0Z3QtPnNlY3Rvcl9zdGFydCA9IDA7CisgICAgdGd0LT5sZW5ndGggPSBjcnlwdF9mdHItPmZzX3NpemU7CisgICAgc3RybGNweSh0Z3QtPnRhcmdldF90eXBlLCAiY3J5cHQiLCBETV9NQVhfVFlQRV9OQU1FKTsKIAotICBjcnlwdF9wYXJhbXMgPSBidWZmZXIgKyBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKSArIHNpemVvZihzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMpOwotICBjb252ZXJ0X2tleV90b19oZXhfYXNjaWkobWFzdGVyX2tleSwgY3J5cHRfZnRyLT5rZXlzaXplLCBtYXN0ZXJfa2V5X2FzY2lpKTsKKyAgICBjcnlwdF9wYXJhbXMgPSBidWZmZXIgKyBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKSArIHNpemVvZihzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMpOworICAgIGNvbnZlcnRfa2V5X3RvX2hleF9hc2NpaShtYXN0ZXJfa2V5LCBjcnlwdF9mdHItPmtleXNpemUsIG1hc3Rlcl9rZXlfYXNjaWkpOwogCi0gIGJ1ZmZfb2Zmc2V0ID0gY3J5cHRfcGFyYW1zIC0gYnVmZmVyOwotICBTTE9HSSgiRXh0cmEgcGFyYW1ldGVycyBmb3IgZG1fY3J5cHQ6ICVzXG4iLCBleHRyYV9wYXJhbXMpOwotICBzbnByaW50ZihjcnlwdF9wYXJhbXMsIHNpemVvZihidWZmZXIpIC0gYnVmZl9vZmZzZXQsICIlcyAlcyAwICVzIDAgJXMiLAotICAgICAgICAgICBjcnlwdF9mdHItPmNyeXB0b190eXBlX25hbWUsIG1hc3Rlcl9rZXlfYXNjaWksIHJlYWxfYmxrX25hbWUsCi0gICAgICAgICAgIGV4dHJhX3BhcmFtcyk7Ci0gIGNyeXB0X3BhcmFtcyArPSBzdHJsZW4oY3J5cHRfcGFyYW1zKSArIDE7Ci0gIGNyeXB0X3BhcmFtcyA9IChjaGFyICopICgoKHVuc2lnbmVkIGxvbmcpY3J5cHRfcGFyYW1zICsgNykgJiB+OCk7IC8qIEFsaWduIHRvIGFuIDggYnl0ZSBib3VuZGFyeSAqLwotICB0Z3QtPm5leHQgPSBjcnlwdF9wYXJhbXMgLSBidWZmZXI7CisgICAgYnVmZl9vZmZzZXQgPSBjcnlwdF9wYXJhbXMgLSBidWZmZXI7CisgICAgU0xPR0koIkV4dHJhIHBhcmFtZXRlcnMgZm9yIGRtX2NyeXB0OiAlc1xuIiwgZXh0cmFfcGFyYW1zKTsKKyAgICBzbnByaW50ZihjcnlwdF9wYXJhbXMsIHNpemVvZihidWZmZXIpIC0gYnVmZl9vZmZzZXQsICIlcyAlcyAwICVzIDAgJXMiLAorICAgICAgICAgICAgIGNyeXB0X2Z0ci0+Y3J5cHRvX3R5cGVfbmFtZSwgbWFzdGVyX2tleV9hc2NpaSwgcmVhbF9ibGtfbmFtZSwgZXh0cmFfcGFyYW1zKTsKKyAgICBjcnlwdF9wYXJhbXMgKz0gc3RybGVuKGNyeXB0X3BhcmFtcykgKyAxOworICAgIGNyeXB0X3BhcmFtcyA9CisgICAgICAgIChjaGFyKikoKCh1bnNpZ25lZCBsb25nKWNyeXB0X3BhcmFtcyArIDcpICYgfjgpOyAvKiBBbGlnbiB0byBhbiA4IGJ5dGUgYm91bmRhcnkgKi8KKyAgICB0Z3QtPm5leHQgPSBjcnlwdF9wYXJhbXMgLSBidWZmZXI7CiAKLSAgZm9yIChpID0gMDsgaSA8IFRBQkxFX0xPQURfUkVUUklFUzsgaSsrKSB7Ci0gICAgaWYgKCEgaW9jdGwoZmQsIERNX1RBQkxFX0xPQUQsIGlvKSkgewotICAgICAgYnJlYWs7CisgICAgZm9yIChpID0gMDsgaSA8IFRBQkxFX0xPQURfUkVUUklFUzsgaSsrKSB7CisgICAgICAgIGlmICghaW9jdGwoZmQsIERNX1RBQkxFX0xPQUQsIGlvKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgfQotICAgIHVzbGVlcCg1MDAwMDApOwotICB9CiAKLSAgaWYgKGkgPT0gVEFCTEVfTE9BRF9SRVRSSUVTKSB7Ci0gICAgLyogV2UgZmFpbGVkIHRvIGxvYWQgdGhlIHRhYmxlLCByZXR1cm4gYW4gZXJyb3IgKi8KLSAgICByZXR1cm4gLTE7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGkgKyAxOwotICB9CisgICAgaWYgKGkgPT0gVEFCTEVfTE9BRF9SRVRSSUVTKSB7CisgICAgICAgIC8qIFdlIGZhaWxlZCB0byBsb2FkIHRoZSB0YWJsZSwgcmV0dXJuIGFuIGVycm9yICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaSArIDE7CisgICAgfQogfQogCi0KLXN0YXRpYyBpbnQgZ2V0X2RtX2NyeXB0X3ZlcnNpb24oaW50IGZkLCBjb25zdCBjaGFyICpuYW1lLCAgaW50ICp2ZXJzaW9uKQoteworc3RhdGljIGludCBnZXRfZG1fY3J5cHRfdmVyc2lvbihpbnQgZmQsIGNvbnN0IGNoYXIqIG5hbWUsIGludCogdmVyc2lvbikgewogICAgIGNoYXIgYnVmZmVyW0RNX0NSWVBUX0JVRl9TSVpFXTsKLSAgICBzdHJ1Y3QgZG1faW9jdGwgKmlvOwotICAgIHN0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMgKnY7CisgICAgc3RydWN0IGRtX2lvY3RsKiBpbzsKKyAgICBzdHJ1Y3QgZG1fdGFyZ2V0X3ZlcnNpb25zKiB2OwogCi0gICAgaW8gPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjsKKyAgICBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjsKIAogICAgIGlvY3RsX2luaXQoaW8sIERNX0NSWVBUX0JVRl9TSVpFLCBuYW1lLCAwKTsKIApAQCAtMTA0NywxNiArMTAxMiwxNiBAQAogICAgIC8qIEl0ZXJhdGUgb3ZlciB0aGUgcmV0dXJuZWQgdmVyc2lvbnMsIGxvb2tpbmcgZm9yIG5hbWUgb2YgImNyeXB0Ii4KICAgICAgKiBXaGVuIGZvdW5kLCBnZXQgYW5kIHJldHVybiB0aGUgdmVyc2lvbi4KICAgICAgKi8KLSAgICB2ID0gKHN0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMgKikgJmJ1ZmZlcltzaXplb2Yoc3RydWN0IGRtX2lvY3RsKV07CisgICAgdiA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3ZlcnNpb25zKikmYnVmZmVyW3NpemVvZihzdHJ1Y3QgZG1faW9jdGwpXTsKICAgICB3aGlsZSAodi0+bmV4dCkgewotICAgICAgICBpZiAoISBzdHJjbXAodi0+bmFtZSwgImNyeXB0IikpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAodi0+bmFtZSwgImNyeXB0IikpIHsKICAgICAgICAgICAgIC8qIFdlIGZvdW5kIHRoZSBjcnlwdCBkcml2ZXIsIHJldHVybiB0aGUgdmVyc2lvbiwgYW5kIGdldCBvdXQgKi8KICAgICAgICAgICAgIHZlcnNpb25bMF0gPSB2LT52ZXJzaW9uWzBdOwogICAgICAgICAgICAgdmVyc2lvblsxXSA9IHYtPnZlcnNpb25bMV07CiAgICAgICAgICAgICB2ZXJzaW9uWzJdID0gdi0+dmVyc2lvblsyXTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIHYgPSAoc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyAqKSgoKGNoYXIgKil2KSArIHYtPm5leHQpOworICAgICAgICB2ID0gKHN0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMqKSgoKGNoYXIqKXYpICsgdi0+bmV4dCk7CiAgICAgfQogCiAgICAgcmV0dXJuIC0xOwpAQCAtMTEzOCw4NyArMTEwMyw3OCBAQAogICAgIHJldHZhbCA9IDA7CiAKIGVycm91dDoKLSAgY2xvc2UoZmQpOyAgIC8qIElmIGZkIGlzIDwwIGZyb20gYSBmYWlsZWQgb3BlbiBjYWxsLCBpdCdzIHNhZmUgdG8ganVzdCBpZ25vcmUgdGhlIGNsb3NlIGVycm9yICovCisgICAgY2xvc2UoZmQpOyAvKiBJZiBmZCBpcyA8MCBmcm9tIGEgZmFpbGVkIG9wZW4gY2FsbCwgaXQncyBzYWZlIHRvIGp1c3QgaWdub3JlIHRoZSBjbG9zZSBlcnJvciAqLwogCi0gIHJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBkZWxldGVfY3J5cHRvX2Jsa19kZXYoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgaW50IGZkOwotICBjaGFyIGJ1ZmZlcltETV9DUllQVF9CVUZfU0laRV07Ci0gIHN0cnVjdCBkbV9pb2N0bCAqaW87Ci0gIGludCByZXR2YWwgPSAtMTsKK3N0YXRpYyBpbnQgZGVsZXRlX2NyeXB0b19ibGtfZGV2KGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgZmQ7CisgICAgY2hhciBidWZmZXJbRE1fQ1JZUFRfQlVGX1NJWkVdOworICAgIHN0cnVjdCBkbV9pb2N0bCogaW87CisgICAgaW50IHJldHZhbCA9IC0xOwogCi0gIGlmICgoZmQgPSBvcGVuKCIvZGV2L2RldmljZS1tYXBwZXIiLCBPX1JEV1J8T19DTE9FWEVDKSkgPCAwICkgewotICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBkZXZpY2UtbWFwcGVyXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlmICgoZmQgPSBvcGVuKCIvZGV2L2RldmljZS1tYXBwZXIiLCBPX1JEV1IgfCBPX0NMT0VYRUMpKSA8IDApIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIGRldmljZS1tYXBwZXJcbiIpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgaW8gPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjsKKyAgICBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjsKIAotICBpb2N0bF9pbml0KGlvLCBETV9DUllQVF9CVUZfU0laRSwgbmFtZSwgMCk7Ci0gIGlmIChpb2N0bChmZCwgRE1fREVWX1JFTU9WRSwgaW8pKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCByZW1vdmUgZG0tY3J5cHQgZGV2aWNlXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlvY3RsX2luaXQoaW8sIERNX0NSWVBUX0JVRl9TSVpFLCBuYW1lLCAwKTsKKyAgICBpZiAoaW9jdGwoZmQsIERNX0RFVl9SRU1PVkUsIGlvKSkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IHJlbW92ZSBkbS1jcnlwdCBkZXZpY2VcbiIpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgLyogV2UgbWFkZSBpdCBoZXJlIHdpdGggbm8gZXJyb3JzLiAgV29vdCEgKi8KLSAgcmV0dmFsID0gMDsKKyAgICAvKiBXZSBtYWRlIGl0IGhlcmUgd2l0aCBubyBlcnJvcnMuICBXb290ISAqLworICAgIHJldHZhbCA9IDA7CiAKIGVycm91dDoKLSAgY2xvc2UoZmQpOyAgICAvKiBJZiBmZCBpcyA8MCBmcm9tIGEgZmFpbGVkIG9wZW4gY2FsbCwgaXQncyBzYWZlIHRvIGp1c3QgaWdub3JlIHRoZSBjbG9zZSBlcnJvciAqLworICAgIGNsb3NlKGZkKTsgLyogSWYgZmQgaXMgPDAgZnJvbSBhIGZhaWxlZCBvcGVuIGNhbGwsIGl0J3Mgc2FmZSB0byBqdXN0IGlnbm9yZSB0aGUgY2xvc2UgZXJyb3IgKi8KIAotICByZXR1cm4gcmV0dmFsOwotCisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBwYmtkZjIoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaWtleSwgdm9pZCAqcGFyYW1zIFVOVVNFRCkKLXsKK3N0YXRpYyBpbnQgcGJrZGYyKGNvbnN0IGNoYXIqIHBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciogc2FsdCwgdW5zaWduZWQgY2hhciogaWtleSwKKyAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtcyBVTlVTRUQpIHsKICAgICBTTE9HSSgiVXNpbmcgcGJrZGYyIGZvciBjcnlwdGZzIEtERiIpOwogCiAgICAgLyogVHVybiB0aGUgcGFzc3dvcmQgaW50byBhIGtleSBhbmQgSVYgdGhhdCBjYW4gZGVjcnlwdCB0aGUgbWFzdGVyIGtleSAqLwotICAgIHJldHVybiBQS0NTNV9QQktERjJfSE1BQ19TSEExKHBhc3N3ZCwgc3RybGVuKHBhc3N3ZCksIHNhbHQsIFNBTFRfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBU0hfQ09VTlQsIElOVEVSTUVESUFURV9CVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpa2V5KSAhPSAxOworICAgIHJldHVybiBQS0NTNV9QQktERjJfSE1BQ19TSEExKHBhc3N3ZCwgc3RybGVuKHBhc3N3ZCksIHNhbHQsIFNBTFRfTEVOLCBIQVNIX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSTUVESUFURV9CVUZfU0laRSwgaWtleSkgIT0gMTsKIH0KIAotc3RhdGljIGludCBzY3J5cHQoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaWtleSwgdm9pZCAqcGFyYW1zKQoteworc3RhdGljIGludCBzY3J5cHQoY29uc3QgY2hhciogcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzYWx0LCB1bnNpZ25lZCBjaGFyKiBpa2V5LCB2b2lkKiBwYXJhbXMpIHsKICAgICBTTE9HSSgiVXNpbmcgc2NyeXB0IGZvciBjcnlwdGZzIEtERiIpOwogCi0gICAgc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0ciA9IChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqKSBwYXJhbXM7CisgICAgc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0ciA9IChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciopcGFyYW1zOwogCiAgICAgaW50IE4gPSAxIDw8IGZ0ci0+Tl9mYWN0b3I7CiAgICAgaW50IHIgPSAxIDw8IGZ0ci0+cl9mYWN0b3I7CiAgICAgaW50IHAgPSAxIDw8IGZ0ci0+cF9mYWN0b3I7CiAKICAgICAvKiBUdXJuIHRoZSBwYXNzd29yZCBpbnRvIGEga2V5IGFuZCBJViB0aGF0IGNhbiBkZWNyeXB0IHRoZSBtYXN0ZXIga2V5ICovCi0gICAgY3J5cHRvX3NjcnlwdCgoY29uc3QgdWludDhfdCopcGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwKLSAgICAgICAgICAgICAgICAgIHNhbHQsIFNBTFRfTEVOLCBOLCByLCBwLCBpa2V5LAorICAgIGNyeXB0b19zY3J5cHQoKGNvbnN0IHVpbnQ4X3QqKXBhc3N3ZCwgc3RybGVuKHBhc3N3ZCksIHNhbHQsIFNBTFRfTEVOLCBOLCByLCBwLCBpa2V5LAogICAgICAgICAgICAgICAgICAgSU5URVJNRURJQVRFX0JVRl9TSVpFKTsKIAotICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2NyeXB0X2tleW1hc3Rlcihjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaWtleSwgdm9pZCAqcGFyYW1zKQoteworc3RhdGljIGludCBzY3J5cHRfa2V5bWFzdGVyKGNvbnN0IGNoYXIqIHBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciogc2FsdCwgdW5zaWduZWQgY2hhciogaWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbXMpIHsKICAgICBTTE9HSSgiVXNpbmcgc2NyeXB0IHdpdGgga2V5bWFzdGVyIGZvciBjcnlwdGZzIEtERiIpOwogCiAgICAgaW50IHJjOwogICAgIHNpemVfdCBzaWduYXR1cmVfc2l6ZTsKICAgICB1bnNpZ25lZCBjaGFyKiBzaWduYXR1cmU7Ci0gICAgc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0ciA9IChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqKSBwYXJhbXM7CisgICAgc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0ciA9IChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciopcGFyYW1zOwogCiAgICAgaW50IE4gPSAxIDw8IGZ0ci0+Tl9mYWN0b3I7CiAgICAgaW50IHIgPSAxIDw8IGZ0ci0+cl9mYWN0b3I7CiAgICAgaW50IHAgPSAxIDw8IGZ0ci0+cF9mYWN0b3I7CiAKLSAgICByYyA9IGNyeXB0b19zY3J5cHQoKGNvbnN0IHVpbnQ4X3QqKXBhc3N3ZCwgc3RybGVuKHBhc3N3ZCksCi0gICAgICAgICAgICAgICAgICAgICAgIHNhbHQsIFNBTFRfTEVOLCBOLCByLCBwLCBpa2V5LAorICAgIHJjID0gY3J5cHRvX3NjcnlwdCgoY29uc3QgdWludDhfdCopcGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwgc2FsdCwgU0FMVF9MRU4sIE4sIHIsIHAsIGlrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSTUVESUFURV9CVUZfU0laRSk7CiAKICAgICBpZiAocmMpIHsKQEAgLTEyMjYsMTQgKzExODIsMTMgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChrZXltYXN0ZXJfc2lnbl9vYmplY3QoZnRyLCBpa2V5LCBJTlRFUk1FRElBVEVfQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmF0dXJlLCAmc2lnbmF0dXJlX3NpemUpKSB7CisgICAgaWYgKGtleW1hc3Rlcl9zaWduX29iamVjdChmdHIsIGlrZXksIElOVEVSTUVESUFURV9CVUZfU0laRSwgJnNpZ25hdHVyZSwgJnNpZ25hdHVyZV9zaXplKSkgewogICAgICAgICBTTE9HRSgiU2lnbmluZyBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHJjID0gY3J5cHRvX3NjcnlwdChzaWduYXR1cmUsIHNpZ25hdHVyZV9zaXplLCBzYWx0LCBTQUxUX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgTiwgciwgcCwgaWtleSwgSU5URVJNRURJQVRFX0JVRl9TSVpFKTsKKyAgICByYyA9IGNyeXB0b19zY3J5cHQoc2lnbmF0dXJlLCBzaWduYXR1cmVfc2l6ZSwgc2FsdCwgU0FMVF9MRU4sIE4sIHIsIHAsIGlrZXksCisgICAgICAgICAgICAgICAgICAgICAgIElOVEVSTUVESUFURV9CVUZfU0laRSk7CiAgICAgZnJlZShzaWduYXR1cmUpOwogCiAgICAgaWYgKHJjKSB7CkBAIC0xMjQ0LDEyICsxMTk5LDEwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZW5jcnlwdF9tYXN0ZXJfa2V5KGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlY3J5cHRlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX21hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyKQotewotICAgIHVuc2lnbmVkIGNoYXIgaWtleVtJTlRFUk1FRElBVEVfQlVGX1NJWkVdID0geyAwIH07CitzdGF0aWMgaW50IGVuY3J5cHRfbWFzdGVyX2tleShjb25zdCBjaGFyKiBwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNhbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkZWNyeXB0ZWRfbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGVuY3J5cHRlZF9tYXN0ZXJfa2V5LCBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyKSB7CisgICAgdW5zaWduZWQgY2hhciBpa2V5W0lOVEVSTUVESUFURV9CVUZfU0laRV0gPSB7MH07CiAgICAgRVZQX0NJUEhFUl9DVFggZV9jdHg7CiAgICAgaW50IGVuY3J5cHRlZF9sZW4sIGZpbmFsX2xlbjsKICAgICBpbnQgcmMgPSAwOwpAQCAtMTI1OCw0NiArMTIxMSw0NiBAQAogICAgIGdldF9kZXZpY2Vfc2NyeXB0X3BhcmFtcyhjcnlwdF9mdHIpOwogCiAgICAgc3dpdGNoIChjcnlwdF9mdHItPmtkZl90eXBlKSB7Ci0gICAgY2FzZSBLREZfU0NSWVBUX0tFWU1BU1RFUjoKLSAgICAgICAgaWYgKGtleW1hc3Rlcl9jcmVhdGVfa2V5KGNyeXB0X2Z0cikpIHsKLSAgICAgICAgICAgIFNMT0dFKCJrZXltYXN0ZXJfY3JlYXRlX2tleSBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgICAgICBjYXNlIEtERl9TQ1JZUFRfS0VZTUFTVEVSOgorICAgICAgICAgICAgaWYgKGtleW1hc3Rlcl9jcmVhdGVfa2V5KGNyeXB0X2Z0cikpIHsKKyAgICAgICAgICAgICAgICBTTE9HRSgia2V5bWFzdGVyX2NyZWF0ZV9rZXkgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogCi0gICAgICAgIGlmIChzY3J5cHRfa2V5bWFzdGVyKHBhc3N3ZCwgc2FsdCwgaWtleSwgY3J5cHRfZnRyKSkgewotICAgICAgICAgICAgU0xPR0UoInNjcnlwdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChzY3J5cHRfa2V5bWFzdGVyKHBhc3N3ZCwgc2FsdCwgaWtleSwgY3J5cHRfZnRyKSkgeworICAgICAgICAgICAgICAgIFNMT0dFKCJzY3J5cHQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEtERl9TQ1JZUFQ6Ci0gICAgICAgIGlmIChzY3J5cHQocGFzc3dkLCBzYWx0LCBpa2V5LCBjcnlwdF9mdHIpKSB7Ci0gICAgICAgICAgICBTTE9HRSgic2NyeXB0IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtERl9TQ1JZUFQ6CisgICAgICAgICAgICBpZiAoc2NyeXB0KHBhc3N3ZCwgc2FsdCwgaWtleSwgY3J5cHRfZnRyKSkgeworICAgICAgICAgICAgICAgIFNMT0dFKCJzY3J5cHQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBkZWZhdWx0OgotICAgICAgICBTTE9HRSgiSW52YWxpZCBrZGZfdHlwZSIpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBTTE9HRSgiSW52YWxpZCBrZGZfdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY3J5cHRpb24gZW5naW5lICovCiAgICAgRVZQX0NJUEhFUl9DVFhfaW5pdCgmZV9jdHgpOwotICAgIGlmICghIEVWUF9FbmNyeXB0SW5pdF9leCgmZV9jdHgsIEVWUF9hZXNfMTI4X2NiYygpLCBOVUxMLCBpa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpa2V5K0lOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKSkgeworICAgIGlmICghRVZQX0VuY3J5cHRJbml0X2V4KCZlX2N0eCwgRVZQX2Flc18xMjhfY2JjKCksIE5VTEwsIGlrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWtleSArIElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKSkgewogICAgICAgICBTTE9HRSgiRVZQX0VuY3J5cHRJbml0IGZhaWxlZFxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoJmVfY3R4LCAwKTsgLyogVHVybiBvZmYgcGFkZGluZyBhcyBvdXIgZGF0YSBpcyBibG9jayBhbGlnbmVkICovCiAKICAgICAvKiBFbmNyeXB0IHRoZSBtYXN0ZXIga2V5ICovCi0gICAgaWYgKCEgRVZQX0VuY3J5cHRVcGRhdGUoJmVfY3R4LCBlbmNyeXB0ZWRfbWFzdGVyX2tleSwgJmVuY3J5cHRlZF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ci0+a2V5c2l6ZSkpIHsKKyAgICBpZiAoIUVWUF9FbmNyeXB0VXBkYXRlKCZlX2N0eCwgZW5jcnlwdGVkX21hc3Rlcl9rZXksICZlbmNyeXB0ZWRfbGVuLCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+a2V5c2l6ZSkpIHsKICAgICAgICAgU0xPR0UoIkVWUF9FbmNyeXB0VXBkYXRlIGZhaWxlZFxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKCEgRVZQX0VuY3J5cHRGaW5hbF9leCgmZV9jdHgsIGVuY3J5cHRlZF9tYXN0ZXJfa2V5ICsgZW5jcnlwdGVkX2xlbiwgJmZpbmFsX2xlbikpIHsKKyAgICBpZiAoIUVWUF9FbmNyeXB0RmluYWxfZXgoJmVfY3R4LCBlbmNyeXB0ZWRfbWFzdGVyX2tleSArIGVuY3J5cHRlZF9sZW4sICZmaW5hbF9sZW4pKSB7CiAgICAgICAgIFNMT0dFKCJFVlBfRW5jcnlwdEZpbmFsIGZhaWxlZFxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0xMzE2LDEzICsxMjY5LDEyIEBACiAgICAgaW50IHIgPSAxIDw8IGNyeXB0X2Z0ci0+cl9mYWN0b3I7CiAgICAgaW50IHAgPSAxIDw8IGNyeXB0X2Z0ci0+cF9mYWN0b3I7CiAKLSAgICByYyA9IGNyeXB0b19zY3J5cHQoaWtleSwgSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+c2FsdCwgc2l6ZW9mKGNyeXB0X2Z0ci0+c2FsdCksIE4sIHIsIHAsCi0gICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+c2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKKyAgICByYyA9IGNyeXB0b19zY3J5cHQoaWtleSwgSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMsIGNyeXB0X2Z0ci0+c2FsdCwgc2l6ZW9mKGNyeXB0X2Z0ci0+c2FsdCksCisgICAgICAgICAgICAgICAgICAgICAgIE4sIHIsIHAsIGNyeXB0X2Z0ci0+c2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNyeXB0X2Z0ci0+c2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSkpOwogCiAgICAgaWYgKHJjKSB7Ci0gICAgICBTTE9HRSgiZW5jcnlwdF9tYXN0ZXJfa2V5OiBjcnlwdG9fc2NyeXB0IGZhaWxlZCIpOworICAgICAgICBTTE9HRSgiZW5jcnlwdF9tYXN0ZXJfa2V5OiBjcnlwdG9fc2NyeXB0IGZhaWxlZCIpOwogICAgIH0KIAogICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmVfY3R4KTsKQEAgLTEzMzAsNjAgKzEyODIsNTcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNyeXB0X21hc3Rlcl9rZXlfYXV4KGNvbnN0IGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqc2FsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qga2V5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkZWNyeXB0ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZGZfZnVuYyBrZGYsIHZvaWQgKmtkZl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcioqIGludGVybWVkaWF0ZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBpbnRlcm1lZGlhdGVfa2V5X3NpemUpCi17Ci0gIHVuc2lnbmVkIGNoYXIgaWtleVtJTlRFUk1FRElBVEVfQlVGX1NJWkVdID0geyAwIH07Ci0gIEVWUF9DSVBIRVJfQ1RYIGRfY3R4OwotICBpbnQgZGVjcnlwdGVkX2xlbiwgZmluYWxfbGVuOworc3RhdGljIGludCBkZWNyeXB0X21hc3Rlcl9rZXlfYXV4KGNvbnN0IGNoYXIqIHBhc3N3ZCwgdW5zaWduZWQgY2hhciogc2FsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBlbmNyeXB0ZWRfbWFzdGVyX2tleSwgc2l6ZV90IGtleXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZGVjcnlwdGVkX21hc3Rlcl9rZXksIGtkZl9mdW5jIGtkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBrZGZfcGFyYW1zLCB1bnNpZ25lZCBjaGFyKiogaW50ZXJtZWRpYXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGludGVybWVkaWF0ZV9rZXlfc2l6ZSkgeworICAgIHVuc2lnbmVkIGNoYXIgaWtleVtJTlRFUk1FRElBVEVfQlVGX1NJWkVdID0gezB9OworICAgIEVWUF9DSVBIRVJfQ1RYIGRfY3R4OworICAgIGludCBkZWNyeXB0ZWRfbGVuLCBmaW5hbF9sZW47CiAKLSAgLyogVHVybiB0aGUgcGFzc3dvcmQgaW50byBhbiBpbnRlcm1lZGlhdGUga2V5IGFuZCBJViB0aGF0IGNhbiBkZWNyeXB0IHRoZQotICAgICBtYXN0ZXIga2V5ICovCi0gIGlmIChrZGYocGFzc3dkLCBzYWx0LCBpa2V5LCBrZGZfcGFyYW1zKSkgewotICAgIFNMT0dFKCJrZGYgZmFpbGVkIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgZGVjcnlwdGlvbiBlbmdpbmUgKi8KLSAgRVZQX0NJUEhFUl9DVFhfaW5pdCgmZF9jdHgpOwotICBpZiAoISBFVlBfRGVjcnlwdEluaXRfZXgoJmRfY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwgaWtleSwgaWtleStJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUykpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoJmRfY3R4LCAwKTsgLyogVHVybiBvZmYgcGFkZGluZyBhcyBvdXIgZGF0YSBpcyBibG9jayBhbGlnbmVkICovCi0gIC8qIERlY3J5cHQgdGhlIG1hc3RlciBrZXkgKi8KLSAgaWYgKCEgRVZQX0RlY3J5cHRVcGRhdGUoJmRfY3R4LCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgJmRlY3J5cHRlZF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkX21hc3Rlcl9rZXksIGtleXNpemUpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICghIEVWUF9EZWNyeXB0RmluYWxfZXgoJmRfY3R4LCBkZWNyeXB0ZWRfbWFzdGVyX2tleSArIGRlY3J5cHRlZF9sZW4sICZmaW5hbF9sZW4pKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKGRlY3J5cHRlZF9sZW4gKyBmaW5hbF9sZW4gIT0gc3RhdGljX2Nhc3Q8aW50PihrZXlzaXplKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qIENvcHkgaW50ZXJtZWRpYXRlIGtleSBpZiBuZWVkZWQgYnkgcGFyYW1zICovCi0gIGlmIChpbnRlcm1lZGlhdGVfa2V5ICYmIGludGVybWVkaWF0ZV9rZXlfc2l6ZSkgewotICAgICppbnRlcm1lZGlhdGVfa2V5ID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpOwotICAgIGlmICgqaW50ZXJtZWRpYXRlX2tleSkgewotICAgICAgbWVtY3B5KCppbnRlcm1lZGlhdGVfa2V5LCBpa2V5LCBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyk7Ci0gICAgICAqaW50ZXJtZWRpYXRlX2tleV9zaXplID0gSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVM7CisgICAgLyogVHVybiB0aGUgcGFzc3dvcmQgaW50byBhbiBpbnRlcm1lZGlhdGUga2V5IGFuZCBJViB0aGF0IGNhbiBkZWNyeXB0IHRoZQorICAgICAgIG1hc3RlciBrZXkgKi8KKyAgICBpZiAoa2RmKHBhc3N3ZCwgc2FsdCwgaWtleSwga2RmX3BhcmFtcykpIHsKKyAgICAgICAgU0xPR0UoImtkZiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgfQogCi0gIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmRfY3R4KTsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBkZWNyeXB0aW9uIGVuZ2luZSAqLworICAgIEVWUF9DSVBIRVJfQ1RYX2luaXQoJmRfY3R4KTsKKyAgICBpZiAoIUVWUF9EZWNyeXB0SW5pdF9leCgmZF9jdHgsIEVWUF9hZXNfMTI4X2NiYygpLCBOVUxMLCBpa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlrZXkgKyBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUykpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZygmZF9jdHgsIDApOyAvKiBUdXJuIG9mZiBwYWRkaW5nIGFzIG91ciBkYXRhIGlzIGJsb2NrIGFsaWduZWQgKi8KKyAgICAvKiBEZWNyeXB0IHRoZSBtYXN0ZXIga2V5ICovCisgICAgaWYgKCFFVlBfRGVjcnlwdFVwZGF0ZSgmZF9jdHgsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCAmZGVjcnlwdGVkX2xlbiwgZW5jcnlwdGVkX21hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzaXplKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghRVZQX0RlY3J5cHRGaW5hbF9leCgmZF9jdHgsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5ICsgZGVjcnlwdGVkX2xlbiwgJmZpbmFsX2xlbikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotICByZXR1cm4gMDsKKyAgICBpZiAoZGVjcnlwdGVkX2xlbiArIGZpbmFsX2xlbiAhPSBzdGF0aWNfY2FzdDxpbnQ+KGtleXNpemUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBDb3B5IGludGVybWVkaWF0ZSBrZXkgaWYgbmVlZGVkIGJ5IHBhcmFtcyAqLworICAgIGlmIChpbnRlcm1lZGlhdGVfa2V5ICYmIGludGVybWVkaWF0ZV9rZXlfc2l6ZSkgeworICAgICAgICAqaW50ZXJtZWRpYXRlX2tleSA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpOworICAgICAgICBpZiAoKmludGVybWVkaWF0ZV9rZXkpIHsKKyAgICAgICAgICAgIG1lbWNweSgqaW50ZXJtZWRpYXRlX2tleSwgaWtleSwgSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpOworICAgICAgICAgICAgKmludGVybWVkaWF0ZV9rZXlfc2l6ZSA9IElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTOworICAgICAgICB9CisgICAgfQorCisgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmZF9jdHgpOworCisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGdldF9rZGZfZnVuYyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyLCBrZGZfZnVuYyAqa2RmLCB2b2lkKioga2RmX3BhcmFtcykKLXsKK3N0YXRpYyB2b2lkIGdldF9rZGZfZnVuYyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyLCBrZGZfZnVuYyoga2RmLCB2b2lkKioga2RmX3BhcmFtcykgewogICAgIGlmIChmdHItPmtkZl90eXBlID09IEtERl9TQ1JZUFRfS0VZTUFTVEVSKSB7CiAgICAgICAgICprZGYgPSBzY3J5cHRfa2V5bWFzdGVyOwogICAgICAgICAqa2RmX3BhcmFtcyA9IGZ0cjsKQEAgLTEzOTYsMjAgKzEzNDUsMTcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgZGVjcnlwdF9tYXN0ZXJfa2V5KGNvbnN0IGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqZGVjcnlwdGVkX21hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcioqIGludGVybWVkaWF0ZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGludGVybWVkaWF0ZV9rZXlfc2l6ZSkKLXsKK3N0YXRpYyBpbnQgZGVjcnlwdF9tYXN0ZXJfa2V5KGNvbnN0IGNoYXIqIHBhc3N3ZCwgdW5zaWduZWQgY2hhciogZGVjcnlwdGVkX21hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyLCB1bnNpZ25lZCBjaGFyKiogaW50ZXJtZWRpYXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogaW50ZXJtZWRpYXRlX2tleV9zaXplKSB7CiAgICAga2RmX2Z1bmMga2RmOwotICAgIHZvaWQgKmtkZl9wYXJhbXM7CisgICAgdm9pZCoga2RmX3BhcmFtczsKICAgICBpbnQgcmV0OwogCiAgICAgZ2V0X2tkZl9mdW5jKGNyeXB0X2Z0ciwgJmtkZiwgJmtkZl9wYXJhbXMpOwotICAgIHJldCA9IGRlY3J5cHRfbWFzdGVyX2tleV9hdXgocGFzc3dkLCBjcnlwdF9mdHItPnNhbHQsIGNyeXB0X2Z0ci0+bWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+a2V5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCBrZGYsIGtkZl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfa2V5LCBpbnRlcm1lZGlhdGVfa2V5X3NpemUpOworICAgIHJldCA9IGRlY3J5cHRfbWFzdGVyX2tleV9hdXgocGFzc3dkLCBjcnlwdF9mdHItPnNhbHQsIGNyeXB0X2Z0ci0+bWFzdGVyX2tleSwgY3J5cHRfZnRyLT5rZXlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGtkZiwga2RmX3BhcmFtcywgaW50ZXJtZWRpYXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9rZXlfc2l6ZSk7CiAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgIFNMT0dXKCJmYWlsdXJlIGRlY3J5cHRpbmcgbWFzdGVyIGtleSIpOwogICAgIH0KQEAgLTE0MTcsMTMgKzEzNjMsMTMgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGNyZWF0ZV9lbmNyeXB0ZWRfcmFuZG9tX2tleShjb25zdCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKm1hc3Rlcl9rZXksIHVuc2lnbmVkIGNoYXIgKnNhbHQsCi0gICAgICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpIHsKK3N0YXRpYyBpbnQgY3JlYXRlX2VuY3J5cHRlZF9yYW5kb21fa2V5KGNvbnN0IGNoYXIqIHBhc3N3ZCwgdW5zaWduZWQgY2hhciogbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNhbHQsIHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBpbnQgZmQ7CiAgICAgdW5zaWduZWQgY2hhciBrZXlfYnVmW01BWF9LRVlfTEVOXTsKIAogICAgIC8qIEdldCBzb21lIHJhbmRvbSBiaXRzIGZvciBhIGtleSAqLwotICAgIGZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFl8T19DTE9FWEVDKTsKKyAgICBmZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKICAgICByZWFkKGZkLCBrZXlfYnVmLCBzaXplb2Yoa2V5X2J1ZikpOwogICAgIHJlYWQoZmQsIHNhbHQsIFNBTFRfTEVOKTsKICAgICBjbG9zZShmZCk7CkBAIC0xNDMyLDEzICsxMzc4LDEyIEBACiAgICAgcmV0dXJuIGVuY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIHNhbHQsIGtleV9idWYsIG1hc3Rlcl9rZXksIGNyeXB0X2Z0cik7CiB9CiAKLWludCB3YWl0X2FuZF91bm1vdW50KGNvbnN0IGNoYXIgKm1vdW50cG9pbnQsIGJvb2wga2lsbCkKLXsKK2ludCB3YWl0X2FuZF91bm1vdW50KGNvbnN0IGNoYXIqIG1vdW50cG9pbnQsIGJvb2wga2lsbCkgewogICAgIGludCBpLCBlcnIsIHJjOwogI2RlZmluZSBXQUlUX1VOTU9VTlRfQ09VTlQgMjAKIAogICAgIC8qICBOb3cgdW1vdW50IHRoZSB0bXBmcyBmaWxlc3lzdGVtICovCi0gICAgZm9yIChpPTA7IGk8V0FJVF9VTk1PVU5UX0NPVU5UOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgV0FJVF9VTk1PVU5UX0NPVU5UOyBpKyspIHsKICAgICAgICAgaWYgKHVtb3VudChtb3VudHBvaW50KSA9PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTQ2NywxOSArMTQxMiwxOCBAQAogICAgIH0KIAogICAgIGlmIChpIDwgV0FJVF9VTk1PVU5UX0NPVU5UKSB7Ci0gICAgICBTTE9HRCgidW5tb3VudGluZyAlcyBzdWNjZWVkZWRcbiIsIG1vdW50cG9pbnQpOwotICAgICAgcmMgPSAwOworICAgICAgICBTTE9HRCgidW5tb3VudGluZyAlcyBzdWNjZWVkZWRcbiIsIG1vdW50cG9pbnQpOworICAgICAgICByYyA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgIGFuZHJvaWQ6OnZvbGQ6OktpbGxQcm9jZXNzZXNXaXRoT3BlbkZpbGVzKG1vdW50cG9pbnQsIDApOwotICAgICAgU0xPR0UoInVubW91bnRpbmcgJXMgZmFpbGVkOiAlc1xuIiwgbW91bnRwb2ludCwgc3RyZXJyb3IoZXJyKSk7Ci0gICAgICByYyA9IC0xOworICAgICAgICBhbmRyb2lkOjp2b2xkOjpLaWxsUHJvY2Vzc2VzV2l0aE9wZW5GaWxlcyhtb3VudHBvaW50LCAwKTsKKyAgICAgICAgU0xPR0UoInVubW91bnRpbmcgJXMgZmFpbGVkOiAlc1xuIiwgbW91bnRwb2ludCwgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJjID0gLTE7CiAgICAgfQogCiAgICAgcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBwcmVwX2RhdGFfZnModm9pZCkKLXsKK3N0YXRpYyB2b2lkIHByZXBfZGF0YV9mcyh2b2lkKSB7CiAgICAgLy8gTk9URTogcG9zdF9mc19kYXRhIHJlc3VsdHMgaW4gaW5pdCBjYWxsaW5nIGJhY2sgYXJvdW5kIHRvIHZvbGQsIHNvIGFsbAogICAgIC8vIGNhbGxlcnMgdG8gdGhpcyBtZXRob2QgbXVzdCBiZSBhc3luYwogCkBAIC0xNDg5LDE3ICsxNDMzLDE0IEBACiAgICAgU0xPR0QoIkp1c3QgdHJpZ2dlcmVkIHBvc3RfZnNfZGF0YSIpOwogCiAgICAgLyogV2FpdCBhIG1heCBvZiA1MCBzZWNvbmRzLCBob3BlZnVsbHkgaXQgdGFrZXMgbXVjaCBsZXNzICovCi0gICAgd2hpbGUgKCFhbmRyb2lkOjpiYXNlOjpXYWl0Rm9yUHJvcGVydHkoInZvbGQucG9zdF9mc19kYXRhX2RvbmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcygxNSkpKSB7CisgICAgd2hpbGUgKCFhbmRyb2lkOjpiYXNlOjpXYWl0Rm9yUHJvcGVydHkoInZvbGQucG9zdF9mc19kYXRhX2RvbmUiLCAiMSIsIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDE1KSkpIHsKICAgICAgICAgLyogV2UgdGltZWQgb3V0IHRvIHByZXAgL2RhdGEgaW4gdGltZS4gIENvbnRpbnVlIHdhaXQuICovCiAgICAgICAgIFNMT0dFKCJ3YWl0ZWQgMTVzIGZvciB2b2xkLnBvc3RfZnNfZGF0YV9kb25lLCBzdGlsbCB3YWl0aW5nLi4uIik7CiAgICAgfQogICAgIFNMT0dEKCJwb3N0X2ZzX2RhdGEgZG9uZSIpOwogfQogCi1zdGF0aWMgdm9pZCBjcnlwdGZzX3NldF9jb3JydXB0KCkKLXsKK3N0YXRpYyB2b2lkIGNyeXB0ZnNfc2V0X2NvcnJ1cHQoKSB7CiAgICAgLy8gTWFyayB0aGUgZm9vdGVyIGFzIGJhZAogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKICAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7CkBAIC0xNTE0LDExICsxNDU1LDEwIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjcnlwdGZzX3RyaWdnZXJfcmVzdGFydF9taW5fZnJhbWV3b3JrKCkKLXsKK3N0YXRpYyB2b2lkIGNyeXB0ZnNfdHJpZ2dlcl9yZXN0YXJ0X21pbl9mcmFtZXdvcmsoKSB7CiAgICAgaWYgKGZzX21ncl9kb190bXBmc19tb3VudChEQVRBX01OVF9QT0lOVCkpIHsKLSAgICAgIFNMT0dFKCJGYWlsZWQgdG8gbW91bnQgdG1wZnMgb24gZGF0YSAtIHBhbmljIik7Ci0gICAgICByZXR1cm47CisgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gbW91bnQgdG1wZnMgb24gZGF0YSAtIHBhbmljIik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAocHJvcGVydHlfc2V0KCJ2b2xkLmRlY3J5cHQiLCAidHJpZ2dlcl9wb3N0X2ZzX2RhdGEiKSkgewpAQCAtMTUzMywxNCArMTQ3MywxMyBAQAogfQogCiAvKiByZXR1cm5zIDwgMCBvbiBmYWlsdXJlICovCi1zdGF0aWMgaW50IGNyeXB0ZnNfcmVzdGFydF9pbnRlcm5hbChpbnQgcmVzdGFydF9tYWluKQoteworc3RhdGljIGludCBjcnlwdGZzX3Jlc3RhcnRfaW50ZXJuYWwoaW50IHJlc3RhcnRfbWFpbikgewogICAgIGNoYXIgY3J5cHRvX2Jsa2RldltNQVhQQVRITEVOXTsKICAgICBpbnQgcmMgPSAtMTsKICAgICBzdGF0aWMgaW50IHJlc3RhcnRfc3VjY2Vzc2Z1bCA9IDA7CiAKICAgICAvKiBWYWxpZGF0ZSB0aGF0IGl0J3MgT0sgdG8gY2FsbCB0aGlzIHJvdXRpbmUgKi8KLSAgICBpZiAoISBtYXN0ZXJfa2V5X3NhdmVkKSB7CisgICAgaWYgKCFtYXN0ZXJfa2V5X3NhdmVkKSB7CiAgICAgICAgIFNMT0dFKCJFbmNyeXB0ZWQgZmlsZXN5c3RlbSBub3QgdmFsaWRhdGVkLCBhYm9ydGluZyIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTU4OSw3ICsxNTI4LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmICghIChyYyA9IHdhaXRfYW5kX3VubW91bnQoREFUQV9NTlRfUE9JTlQsIHRydWUpKSApIHsKKyAgICBpZiAoIShyYyA9IHdhaXRfYW5kX3VubW91bnQoREFUQV9NTlRfUE9JTlQsIHRydWUpKSkgewogICAgICAgICAvKiBJZiByby5jcnlwdG8ucmVhZG9ubHkgaXMgc2V0IHRvIDEsIG1vdW50IHRoZSBkZWNyeXB0ZWQKICAgICAgICAgICogZmlsZXN5c3RlbSByZWFkb25seS4gIFRoaXMgaXMgdXNlZCB3aGVuIC9kYXRhIGlzIG1vdW50ZWQgYnkKICAgICAgICAgICogcmVjb3ZlcnkgbW9kZS4KQEAgLTE1OTgsNyArMTUzNyw5IEBACiAgICAgICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnJlYWRvbmx5Iiwgcm9fcHJvcCwgIiIpOwogICAgICAgICBpZiAoc3RybGVuKHJvX3Byb3ApID4gMCAmJiBzdGQ6OnN0b2kocm9fcHJvcCkpIHsKICAgICAgICAgICAgIHN0cnVjdCBmc3RhYl9yZWMqIHJlYyA9IGZzX21ncl9nZXRfZW50cnlfZm9yX21vdW50X3BvaW50KGZzdGFiX2RlZmF1bHQsIERBVEFfTU5UX1BPSU5UKTsKLSAgICAgICAgICAgIHJlYy0+ZmxhZ3MgfD0gTVNfUkRPTkxZOworICAgICAgICAgICAgaWYgKHJlYykgeworICAgICAgICAgICAgICAgIHJlYy0+ZmxhZ3MgfD0gTVNfUkRPTkxZOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyogSWYgdGhhdCBzdWNjZWVkZWQsIHRoZW4gbW91bnQgdGhlIGRlY3J5cHRlZCBmaWxlc3lzdGVtICovCkBAIC0xNjA5LDE5ICsxNTUwLDE4IEBACiAgICAgICAgICAqIGZzX21ncl9kb19tb3VudCBydW5zIGZzY2suIFVzZSBzZXRleGVjY29uIHRvIHJ1biB0cnVzdGVkCiAgICAgICAgICAqIHBhcnRpdGlvbnMgaW4gdGhlIGZzY2sgZG9tYWluLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHNldGV4ZWNjb24oc2Vjb250ZXh0RnNjaygpKSl7CisgICAgICAgIGlmIChzZXRleGVjY29uKHNlY29udGV4dEZzY2soKSkpIHsKICAgICAgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gc2V0ZXhlY2NvbiIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgobW91bnRfcmMgPSBmc19tZ3JfZG9fbW91bnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvX2Jsa2RldiwgMCkpCi0gICAgICAgICAgICAgICAhPSAwKSB7CisgICAgICAgIGJvb2wgbmVlZHNfY3AgPSBhbmRyb2lkOjp2b2xkOjpjcF9uZWVkc0NoZWNrcG9pbnQoKTsKKyAgICAgICAgd2hpbGUgKChtb3VudF9yYyA9IGZzX21ncl9kb19tb3VudChmc3RhYl9kZWZhdWx0LCBEQVRBX01OVF9QT0lOVCwgY3J5cHRvX2Jsa2RldiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc19jcCkpICE9IDApIHsKICAgICAgICAgICAgIGlmIChtb3VudF9yYyA9PSBGU19NR1JfRE9NTlRfQlVTWSkgewogICAgICAgICAgICAgICAgIC8qIFRPRE86IGludm9rZSBzb21ldGhpbmcgc2ltaWxhciB0bwogICAgICAgICAgICAgICAgICAgIFByb2Nlc3M6OmtpbGxQcm9jZXNzV2l0aE9wZW5GaWxlcyhEQVRBX01OVF9QT0lOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcyA+IFJFVFJZX01PVU5UX0FUVEVNUFQvMiA/IDEgOiAyICkgKi8KLSAgICAgICAgICAgICAgICBTTE9HSSgiRmFpbGVkIHRvIG1vdW50ICVzIGJlY2F1c2UgaXQgaXMgYnVzeSAtIHdhaXRpbmciLAotICAgICAgICAgICAgICAgICAgICAgIGNyeXB0b19ibGtkZXYpOworICAgICAgICAgICAgICAgIFNMT0dJKCJGYWlsZWQgdG8gbW91bnQgJXMgYmVjYXVzZSBpdCBpcyBidXN5IC0gd2FpdGluZyIsIGNyeXB0b19ibGtkZXYpOwogICAgICAgICAgICAgICAgIGlmICgtLXJldHJpZXMpIHsKICAgICAgICAgICAgICAgICAgICAgc2xlZXAoUkVUUllfTU9VTlRfREVMQVlfU0VDT05EUyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE2NjQsOCArMTYwNCw3IEBACiAgICAgcmV0dXJuIHJjOwogfQogCi1pbnQgY3J5cHRmc19yZXN0YXJ0KHZvaWQpCi17CitpbnQgY3J5cHRmc19yZXN0YXJ0KHZvaWQpIHsKICAgICBTTE9HSSgiY3J5cHRmc19yZXN0YXJ0Iik7CiAgICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoImNyeXB0ZnNfcmVzdGFydCBub3QgdmFsaWQgZm9yIGZpbGUgZW5jcnlwdGlvbjoiKTsKQEAgLTE2NzYsMTkzICsxNjE1LDE4OSBAQAogICAgIHJldHVybiBjcnlwdGZzX3Jlc3RhcnRfaW50ZXJuYWwoMSk7CiB9CiAKLXN0YXRpYyBpbnQgZG9fY3J5cHRvX2NvbXBsZXRlKGNvbnN0IGNoYXIgKm1vdW50X3BvaW50KQotewotICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7Ci0gIGNoYXIgZW5jcnlwdGVkX3N0YXRlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gIGNoYXIga2V5X2xvY1tQUk9QRVJUWV9WQUxVRV9NQVhdOworc3RhdGljIGludCBkb19jcnlwdG9fY29tcGxldGUoY29uc3QgY2hhciogbW91bnRfcG9pbnQpIHsKKyAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7CisgICAgY2hhciBlbmNyeXB0ZWRfc3RhdGVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBjaGFyIGtleV9sb2NbUFJPUEVSVFlfVkFMVUVfTUFYXTsKIAotICBwcm9wZXJ0eV9nZXQoInJvLmNyeXB0by5zdGF0ZSIsIGVuY3J5cHRlZF9zdGF0ZSwgIiIpOwotICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpICkgewotICAgIFNMT0dFKCJub3QgcnVubmluZyB3aXRoIGVuY3J5cHRpb24sIGFib3J0aW5nIik7Ci0gICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEOwotICB9Ci0KLSAgLy8gY3J5cHRvX2NvbXBsZXRlIGlzIGZ1bGwgZGlzayBlbmNyeXB0ZWQgc3RhdHVzCi0gIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7Ci0gICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEOwotICB9Ci0KLSAgaWYgKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgewotICAgIGZzX21ncl9nZXRfY3J5cHRfaW5mbyhmc3RhYl9kZWZhdWx0LCBrZXlfbG9jLCAwLCBzaXplb2Yoa2V5X2xvYykpOwotCi0gICAgLyoKLSAgICAgKiBPbmx5IHJlcG9ydCB0aGlzIGVycm9yIGlmIGtleV9sb2MgaXMgYSBmaWxlIGFuZCBpdCBleGlzdHMuCi0gICAgICogSWYgdGhlIGRldmljZSB3YXMgbmV2ZXIgZW5jcnlwdGVkLCBhbmQgL2RhdGEgaXMgbm90IG1vdW50YWJsZSBmb3IKLSAgICAgKiBzb21lIHJlYXNvbiwgcmV0dXJuaW5nIDEgc2hvdWxkIHByZXZlbnQgdGhlIFVJIGZyb20gcHJlc2VudGluZyB0aGUKLSAgICAgKiBhICJlbnRlciBwYXNzd29yZCIgc2NyZWVuLCBvciB3b3JzZSwgYSAicHJlc3MgYnV0dG9uIHRvIHdpcGUgdGhlCi0gICAgICogZGV2aWNlIiBzY3JlZW4uCi0gICAgICovCi0gICAgaWYgKChrZXlfbG9jWzBdID09ICcvJykgJiYgKGFjY2Vzcygia2V5X2xvYyIsIEZfT0spID09IC0xKSkgewotICAgICAgU0xPR0UoIm1hc3RlciBrZXkgZmlsZSBkb2VzIG5vdCBleGlzdCwgYWJvcnRpbmciKTsKLSAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRDsKLSAgICB9IGVsc2UgewotICAgICAgU0xPR0UoIkVycm9yIGdldHRpbmcgY3J5cHQgZm9vdGVyIGFuZCBrZXlcbiIpOwotICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9CQURfTUVUQURBVEE7CisgICAgcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8uc3RhdGUiLCBlbmNyeXB0ZWRfc3RhdGUsICIiKTsKKyAgICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CisgICAgICAgIFNMT0dFKCJub3QgcnVubmluZyB3aXRoIGVuY3J5cHRpb24sIGFib3J0aW5nIik7CisgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRDsKICAgICB9Ci0gIH0KIAotICAvLyBUZXN0IGZvciBwb3NzaWJsZSBlcnJvciBmbGFncwotICBpZiAoY3J5cHRfZnRyLmZsYWdzICYgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUyl7Ci0gICAgU0xPR0UoIkVuY3J5cHRpb24gcHJvY2VzcyBpcyBwYXJ0d2F5IGNvbXBsZXRlZFxuIik7Ci0gICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9QQVJUSUFMOwotICB9CisgICAgLy8gY3J5cHRvX2NvbXBsZXRlIGlzIGZ1bGwgZGlzayBlbmNyeXB0ZWQgc3RhdHVzCisgICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKKyAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEOworICAgIH0KIAotICBpZiAoY3J5cHRfZnRyLmZsYWdzICYgQ1JZUFRfSU5DT05TSVNURU5UX1NUQVRFKXsKLSAgICBTTE9HRSgiRW5jcnlwdGlvbiBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBidXQgY2Fubm90IGNvbnRpbnVlXG4iKTsKLSAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0lOQ09OU0lTVEVOVDsKLSAgfQorICAgIGlmIChnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKKyAgICAgICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIGtleV9sb2MsIDAsIHNpemVvZihrZXlfbG9jKSk7CiAKLSAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0RBVEFfQ09SUlVQVCl7Ci0gICAgU0xPR0UoIkVuY3J5cHRpb24gaXMgc3VjY2Vzc2Z1bCBidXQgZGF0YSBpcyBjb3JydXB0XG4iKTsKLSAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0NPUlJVUFQ7Ci0gIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogT25seSByZXBvcnQgdGhpcyBlcnJvciBpZiBrZXlfbG9jIGlzIGEgZmlsZSBhbmQgaXQgZXhpc3RzLgorICAgICAgICAgKiBJZiB0aGUgZGV2aWNlIHdhcyBuZXZlciBlbmNyeXB0ZWQsIGFuZCAvZGF0YSBpcyBub3QgbW91bnRhYmxlIGZvcgorICAgICAgICAgKiBzb21lIHJlYXNvbiwgcmV0dXJuaW5nIDEgc2hvdWxkIHByZXZlbnQgdGhlIFVJIGZyb20gcHJlc2VudGluZyB0aGUKKyAgICAgICAgICogYSAiZW50ZXIgcGFzc3dvcmQiIHNjcmVlbiwgb3Igd29yc2UsIGEgInByZXNzIGJ1dHRvbiB0byB3aXBlIHRoZQorICAgICAgICAgKiBkZXZpY2UiIHNjcmVlbi4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoa2V5X2xvY1swXSA9PSAnLycpICYmIChhY2Nlc3MoImtleV9sb2MiLCBGX09LKSA9PSAtMSkpIHsKKyAgICAgICAgICAgIFNMT0dFKCJtYXN0ZXIga2V5IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFib3J0aW5nIik7CisgICAgICAgICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTTE9HRSgiRXJyb3IgZ2V0dGluZyBjcnlwdCBmb290ZXIgYW5kIGtleVxuIik7CisgICAgICAgICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0JBRF9NRVRBREFUQTsKKyAgICAgICAgfQorICAgIH0KIAotICAvKiBXZSBwYXNzZWQgdGhlIHRlc3QhIFdlIHNoYWxsIGRpbWluaXNoLCBhbmQgcmV0dXJuIHRvIHRoZSB3ZXN0ICovCi0gIHJldHVybiBDUllQVE9fQ09NUExFVEVfRU5DUllQVEVEOworICAgIC8vIFRlc3QgZm9yIHBvc3NpYmxlIGVycm9yIGZsYWdzCisgICAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MpIHsKKyAgICAgICAgU0xPR0UoIkVuY3J5cHRpb24gcHJvY2VzcyBpcyBwYXJ0d2F5IGNvbXBsZXRlZFxuIik7CisgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfUEFSVElBTDsKKyAgICB9CisKKyAgICBpZiAoY3J5cHRfZnRyLmZsYWdzICYgQ1JZUFRfSU5DT05TSVNURU5UX1NUQVRFKSB7CisgICAgICAgIFNMT0dFKCJFbmNyeXB0aW9uIHByb2Nlc3Mgd2FzIGludGVycnVwdGVkIGJ1dCBjYW5ub3QgY29udGludWVcbiIpOworICAgICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0lOQ09OU0lTVEVOVDsKKyAgICB9CisKKyAgICBpZiAoY3J5cHRfZnRyLmZsYWdzICYgQ1JZUFRfREFUQV9DT1JSVVBUKSB7CisgICAgICAgIFNMT0dFKCJFbmNyeXB0aW9uIGlzIHN1Y2Nlc3NmdWwgYnV0IGRhdGEgaXMgY29ycnVwdFxuIik7CisgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfQ09SUlVQVDsKKyAgICB9CisKKyAgICAvKiBXZSBwYXNzZWQgdGhlIHRlc3QhIFdlIHNoYWxsIGRpbWluaXNoLCBhbmQgcmV0dXJuIHRvIHRoZSB3ZXN0ICovCisgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9FTkNSWVBURUQ7CiB9CiAKLXN0YXRpYyBpbnQgdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCBjaGFyICptb3VudF9wb2ludCwgY29uc3QgY2hhciAqbGFiZWwpCi17Ci0gIHVuc2lnbmVkIGNoYXIgZGVjcnlwdGVkX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwotICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl07Ci0gIGNoYXIgcmVhbF9ibGtkZXZbTUFYUEFUSExFTl07Ci0gIGNoYXIgdG1wX21vdW50X3BvaW50WzY0XTsKLSAgdW5zaWduZWQgaW50IG9yaWdfZmFpbGVkX2RlY3J5cHRfY291bnQ7Ci0gIGludCByYzsKLSAgaW50IHVzZV9rZXltYXN0ZXIgPSAwOwotICBpbnQgdXBncmFkZSA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIqIGludGVybWVkaWF0ZV9rZXkgPSAwOwotICBzaXplX3QgaW50ZXJtZWRpYXRlX2tleV9zaXplID0gMDsKLSAgaW50IE4gPSAxIDw8IGNyeXB0X2Z0ci0+Tl9mYWN0b3I7Ci0gIGludCByID0gMSA8PCBjcnlwdF9mdHItPnJfZmFjdG9yOwotICBpbnQgcCA9IDEgPDwgY3J5cHRfZnRyLT5wX2ZhY3RvcjsKK3N0YXRpYyBpbnQgdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0ciwgY29uc3QgY2hhciogcGFzc3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtb3VudF9wb2ludCwgY29uc3QgY2hhciogbGFiZWwpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGRlY3J5cHRlZF9tYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsKKyAgICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl07CisgICAgY2hhciByZWFsX2Jsa2RldltNQVhQQVRITEVOXTsKKyAgICBjaGFyIHRtcF9tb3VudF9wb2ludFs2NF07CisgICAgdW5zaWduZWQgaW50IG9yaWdfZmFpbGVkX2RlY3J5cHRfY291bnQ7CisgICAgaW50IHJjOworICAgIGludCB1c2Vfa2V5bWFzdGVyID0gMDsKKyAgICBpbnQgdXBncmFkZSA9IDA7CisgICAgdW5zaWduZWQgY2hhciogaW50ZXJtZWRpYXRlX2tleSA9IDA7CisgICAgc2l6ZV90IGludGVybWVkaWF0ZV9rZXlfc2l6ZSA9IDA7CisgICAgaW50IE4gPSAxIDw8IGNyeXB0X2Z0ci0+Tl9mYWN0b3I7CisgICAgaW50IHIgPSAxIDw8IGNyeXB0X2Z0ci0+cl9mYWN0b3I7CisgICAgaW50IHAgPSAxIDw8IGNyeXB0X2Z0ci0+cF9mYWN0b3I7CiAKLSAgU0xPR0QoImNyeXB0X2Z0ci0+ZnNfc2l6ZSA9ICVsbGRcbiIsIGNyeXB0X2Z0ci0+ZnNfc2l6ZSk7Ci0gIG9yaWdfZmFpbGVkX2RlY3J5cHRfY291bnQgPSBjcnlwdF9mdHItPmZhaWxlZF9kZWNyeXB0X2NvdW50OworICAgIFNMT0dEKCJjcnlwdF9mdHItPmZzX3NpemUgPSAlbGxkXG4iLCBjcnlwdF9mdHItPmZzX3NpemUpOworICAgIG9yaWdfZmFpbGVkX2RlY3J5cHRfY291bnQgPSBjcnlwdF9mdHItPmZhaWxlZF9kZWNyeXB0X2NvdW50OwogCi0gIGlmICghIChjcnlwdF9mdHItPmZsYWdzICYgQ1JZUFRfTU5UX0tFWV9VTkVOQ1JZUFRFRCkgKSB7Ci0gICAgaWYgKGRlY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCBjcnlwdF9mdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJtZWRpYXRlX2tleSwgJmludGVybWVkaWF0ZV9rZXlfc2l6ZSkpIHsKLSAgICAgIFNMT0dFKCJGYWlsZWQgdG8gZGVjcnlwdCBtYXN0ZXIga2V5XG4iKTsKLSAgICAgIHJjID0gLTE7Ci0gICAgICBnb3RvIGVycm91dDsKKyAgICBpZiAoIShjcnlwdF9mdHItPmZsYWdzICYgQ1JZUFRfTU5UX0tFWV9VTkVOQ1JZUFRFRCkpIHsKKyAgICAgICAgaWYgKGRlY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCBjcnlwdF9mdHIsICZpbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm1lZGlhdGVfa2V5X3NpemUpKSB7CisgICAgICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIGRlY3J5cHQgbWFzdGVyIGtleVxuIik7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgIH0KICAgICB9Ci0gIH0KIAotICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwgMCwgcmVhbF9ibGtkZXYsIHNpemVvZihyZWFsX2Jsa2RldikpOworICAgIGZzX21ncl9nZXRfY3J5cHRfaW5mbyhmc3RhYl9kZWZhdWx0LCAwLCByZWFsX2Jsa2Rldiwgc2l6ZW9mKHJlYWxfYmxrZGV2KSk7CiAKLSAgLy8gQ3JlYXRlIGNyeXB0byBibG9jayBkZXZpY2UgLSBhbGwgKG5vbiBmYXRhbCkgY29kZSBwYXRocwotICAvLyBuZWVkIGl0Ci0gIGlmIChjcmVhdGVfY3J5cHRvX2Jsa19kZXYoY3J5cHRfZnRyLCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgcmVhbF9ibGtkZXYsIGNyeXB0b19ibGtkZXYsIGxhYmVsLCAwKSkgewotICAgICAgU0xPR0UoIkVycm9yIGNyZWF0aW5nIGRlY3J5cHRlZCBibG9jayBkZXZpY2VcbiIpOwotICAgICAgcmMgPSAtMTsKLSAgICAgIGdvdG8gZXJyb3V0OwotICB9CisgICAgLy8gQ3JlYXRlIGNyeXB0byBibG9jayBkZXZpY2UgLSBhbGwgKG5vbiBmYXRhbCkgY29kZSBwYXRocworICAgIC8vIG5lZWQgaXQKKyAgICBpZiAoY3JlYXRlX2NyeXB0b19ibGtfZGV2KGNyeXB0X2Z0ciwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIHJlYWxfYmxrZGV2LCBjcnlwdG9fYmxrZGV2LCBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKSB7CisgICAgICAgIFNMT0dFKCJFcnJvciBjcmVhdGluZyBkZWNyeXB0ZWQgYmxvY2sgZGV2aWNlXG4iKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIC8qIFdvcmsgb3V0IGlmIHRoZSBwcm9ibGVtIGlzIHRoZSBwYXNzd29yZCBvciB0aGUgZGF0YSAqLwotICB1bnNpZ25lZCBjaGFyIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXlbc2l6ZW9mKGNyeXB0X2Z0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSldOworICAgIC8qIFdvcmsgb3V0IGlmIHRoZSBwcm9ibGVtIGlzIHRoZSBwYXNzd29yZCBvciB0aGUgZGF0YSAqLworICAgIHVuc2lnbmVkIGNoYXIgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleVtzaXplb2YoY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KV07CiAKLSAgcmMgPSBjcnlwdG9fc2NyeXB0KGludGVybWVkaWF0ZV9rZXksIGludGVybWVkaWF0ZV9rZXlfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+c2FsdCwgc2l6ZW9mKGNyeXB0X2Z0ci0+c2FsdCksCi0gICAgICAgICAgICAgICAgICAgICBOLCByLCBwLCBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAotICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpKTsKKyAgICByYyA9IGNyeXB0b19zY3J5cHQoaW50ZXJtZWRpYXRlX2tleSwgaW50ZXJtZWRpYXRlX2tleV9zaXplLCBjcnlwdF9mdHItPnNhbHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjcnlwdF9mdHItPnNhbHQpLCBOLCByLCBwLCBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSkpOwogCi0gIC8vIERvZXMgdGhlIGtleSBtYXRjaCB0aGUgY3J5cHRvIGZvb3Rlcj8KLSAgaWYgKHJjID09IDAgJiYgbWVtY21wKHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPnNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSkpID09IDApIHsKLSAgICBTTE9HSSgiUGFzc3dvcmQgbWF0Y2hlcyIpOwotICAgIHJjID0gMDsKLSAgfSBlbHNlIHsKLSAgICAvKiBUcnkgbW91bnRpbmcgdGhlIGZpbGUgc3lzdGVtIGFueXdheSwganVzdCBpbiBjYXNlIHRoZSBwcm9ibGVtJ3Mgd2l0aAotICAgICAqIHRoZSBmb290ZXIsIG5vdCB0aGUga2V5LiAqLwotICAgIHNucHJpbnRmKHRtcF9tb3VudF9wb2ludCwgc2l6ZW9mKHRtcF9tb3VudF9wb2ludCksICIlcy90bXBfbW50IiwKLSAgICAgICAgICAgICBtb3VudF9wb2ludCk7Ci0gICAgbWtkaXIodG1wX21vdW50X3BvaW50LCAwNzU1KTsKLSAgICBpZiAoZnNfbWdyX2RvX21vdW50KGZzdGFiX2RlZmF1bHQsIERBVEFfTU5UX1BPSU5ULCBjcnlwdG9fYmxrZGV2LCB0bXBfbW91bnRfcG9pbnQpKSB7Ci0gICAgICBTTE9HRSgiRXJyb3IgdGVtcCBtb3VudGluZyBkZWNyeXB0ZWQgYmxvY2sgZGV2aWNlXG4iKTsKLSAgICAgIGRlbGV0ZV9jcnlwdG9fYmxrX2RldihsYWJlbCk7Ci0KLSAgICAgIHJjID0gKytjcnlwdF9mdHItPmZhaWxlZF9kZWNyeXB0X2NvdW50OwotICAgICAgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KGNyeXB0X2Z0cik7CisgICAgLy8gRG9lcyB0aGUga2V5IG1hdGNoIHRoZSBjcnlwdG8gZm9vdGVyPworICAgIGlmIChyYyA9PSAwICYmIG1lbWNtcChzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LCBjcnlwdF9mdHItPnNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KSkgPT0gMCkgeworICAgICAgICBTTE9HSSgiUGFzc3dvcmQgbWF0Y2hlcyIpOworICAgICAgICByYyA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgIC8qIFN1Y2Nlc3MhICovCi0gICAgICBTTE9HSSgiUGFzc3dvcmQgZGlkIG5vdCBtYXRjaCBidXQgZGVjcnlwdGVkIGRyaXZlIG1vdW50ZWQgLSBjb250aW51ZSIpOwotICAgICAgdW1vdW50KHRtcF9tb3VudF9wb2ludCk7Ci0gICAgICByYyA9IDA7Ci0gICAgfQotICB9CisgICAgICAgIC8qIFRyeSBtb3VudGluZyB0aGUgZmlsZSBzeXN0ZW0gYW55d2F5LCBqdXN0IGluIGNhc2UgdGhlIHByb2JsZW0ncyB3aXRoCisgICAgICAgICAqIHRoZSBmb290ZXIsIG5vdCB0aGUga2V5LiAqLworICAgICAgICBzbnByaW50Zih0bXBfbW91bnRfcG9pbnQsIHNpemVvZih0bXBfbW91bnRfcG9pbnQpLCAiJXMvdG1wX21udCIsIG1vdW50X3BvaW50KTsKKyAgICAgICAgbWtkaXIodG1wX21vdW50X3BvaW50LCAwNzU1KTsKKyAgICAgICAgaWYgKGZzX21ncl9kb19tb3VudChmc3RhYl9kZWZhdWx0LCBEQVRBX01OVF9QT0lOVCwgY3J5cHRvX2Jsa2RldiwgdG1wX21vdW50X3BvaW50KSkgeworICAgICAgICAgICAgU0xPR0UoIkVycm9yIHRlbXAgbW91bnRpbmcgZGVjcnlwdGVkIGJsb2NrIGRldmljZVxuIik7CisgICAgICAgICAgICBkZWxldGVfY3J5cHRvX2Jsa19kZXYobGFiZWwpOwogCi0gIGlmIChyYyA9PSAwKSB7Ci0gICAgY3J5cHRfZnRyLT5mYWlsZWRfZGVjcnlwdF9jb3VudCA9IDA7Ci0gICAgaWYgKG9yaWdfZmFpbGVkX2RlY3J5cHRfY291bnQgIT0gMCkgewotICAgICAgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KGNyeXB0X2Z0cik7Ci0gICAgfQotCi0gICAgLyogU2F2ZSB0aGUgbmFtZSBvZiB0aGUgY3J5cHRvIGJsb2NrIGRldmljZQotICAgICAqIHNvIHdlIGNhbiBtb3VudCBpdCB3aGVuIHJlc3RhcnRpbmcgdGhlIGZyYW1ld29yay4gKi8KLSAgICBwcm9wZXJ0eV9zZXQoInJvLmNyeXB0by5mc19jcnlwdG9fYmxrZGV2IiwgY3J5cHRvX2Jsa2Rldik7Ci0KLSAgICAvKiBBbHNvIHNhdmUgYSB0aGUgbWFzdGVyIGtleSBzbyB3ZSBjYW4gcmVlbmNyeXB0ZWQgdGhlIGtleQotICAgICAqIHRoZSBrZXkgd2hlbiB3ZSB3YW50IHRvIGNoYW5nZSB0aGUgcGFzc3dvcmQgb24gaXQuICovCi0gICAgbWVtY3B5KHNhdmVkX21hc3Rlcl9rZXksIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCBjcnlwdF9mdHItPmtleXNpemUpOwotICAgIHNhdmVkX21vdW50X3BvaW50ID0gc3RyZHVwKG1vdW50X3BvaW50KTsKLSAgICBtYXN0ZXJfa2V5X3NhdmVkID0gMTsKLSAgICBTTE9HRCgiJXMoKTogTWFzdGVyIGtleSBzYXZlZFxuIiwgX19GVU5DVElPTl9fKTsKLSAgICByYyA9IDA7Ci0KLSAgICAvLyBVcGdyYWRlIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgbGF0ZXN0IEtERi4KLSAgICB1c2Vfa2V5bWFzdGVyID0ga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHkoKTsKLSAgICBpZiAoY3J5cHRfZnRyLT5rZGZfdHlwZSA9PSBLREZfU0NSWVBUX0tFWU1BU1RFUikgewotICAgICAgICAvLyBEb24ndCBhbGxvdyBkb3duZ3JhZGUKLSAgICB9IGVsc2UgaWYgKHVzZV9rZXltYXN0ZXIgPT0gMSAmJiBjcnlwdF9mdHItPmtkZl90eXBlICE9IEtERl9TQ1JZUFRfS0VZTUFTVEVSKSB7Ci0gICAgICAgIGNyeXB0X2Z0ci0+a2RmX3R5cGUgPSBLREZfU0NSWVBUX0tFWU1BU1RFUjsKLSAgICAgICAgdXBncmFkZSA9IDE7Ci0gICAgfSBlbHNlIGlmICh1c2Vfa2V5bWFzdGVyID09IDAgJiYgY3J5cHRfZnRyLT5rZGZfdHlwZSAhPSBLREZfU0NSWVBUKSB7Ci0gICAgICAgIGNyeXB0X2Z0ci0+a2RmX3R5cGUgPSBLREZfU0NSWVBUOwotICAgICAgICB1cGdyYWRlID0gMTsKLSAgICB9Ci0KLSAgICBpZiAodXBncmFkZSkgewotICAgICAgICByYyA9IGVuY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGNyeXB0X2Z0ci0+c2FsdCwgc2F2ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5tYXN0ZXJfa2V5LCBjcnlwdF9mdHIpOwotICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICByYyA9IHB1dF9jcnlwdF9mdHJfYW5kX2tleShjcnlwdF9mdHIpOwotICAgICAgICB9Ci0gICAgICAgIFNMT0dEKCJLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiB1cGdyYWRlOiByYz0lZFxuIiwgcmMpOwotCi0gICAgICAgIC8vIERvIG5vdCBmYWlsIGV2ZW4gaWYgdXBncmFkZSBmYWlsZWQgLSBtYWNoaW5lIGlzIGJvb3RhYmxlCi0gICAgICAgIC8vIE5vdGUgdGhhdCBpZiB0aGlzIGNvZGUgaXMgZXZlciBoaXQsIHRoZXJlIGlzIGEgKnNlcmlvdXMqIHByb2JsZW0KLSAgICAgICAgLy8gc2luY2UgS0RGcyBzaG91bGQgbmV2ZXIgZmFpbC4gWW91ICptdXN0KiBmaXggdGhlIGtkZiBiZWZvcmUKLSAgICAgICAgLy8gcHJvY2VlZGluZyEKLSAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgU0xPR1coIlVwZ3JhZGUgZmFpbGVkIHdpdGggZXJyb3IgJWQsIgotICAgICAgICAgICAgICAgICIgYnV0IGNvbnRpbnVpbmcgd2l0aCBwcmV2aW91cyBzdGF0ZSIsCi0gICAgICAgICAgICAgICAgcmMpOwotICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgIHJjID0gKytjcnlwdF9mdHItPmZhaWxlZF9kZWNyeXB0X2NvdW50OworICAgICAgICAgICAgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KGNyeXB0X2Z0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBTdWNjZXNzISAqLworICAgICAgICAgICAgU0xPR0koIlBhc3N3b3JkIGRpZCBub3QgbWF0Y2ggYnV0IGRlY3J5cHRlZCBkcml2ZSBtb3VudGVkIC0gY29udGludWUiKTsKKyAgICAgICAgICAgIHVtb3VudCh0bXBfbW91bnRfcG9pbnQpOworICAgICAgICAgICAgcmMgPSAwOwogICAgICAgICB9CiAgICAgfQotICB9CiAKLSBlcnJvdXQ6Ci0gIGlmIChpbnRlcm1lZGlhdGVfa2V5KSB7Ci0gICAgbWVtc2V0KGludGVybWVkaWF0ZV9rZXksIDAsIGludGVybWVkaWF0ZV9rZXlfc2l6ZSk7Ci0gICAgZnJlZShpbnRlcm1lZGlhdGVfa2V5KTsKLSAgfQotICByZXR1cm4gcmM7CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgY3J5cHRfZnRyLT5mYWlsZWRfZGVjcnlwdF9jb3VudCA9IDA7CisgICAgICAgIGlmIChvcmlnX2ZhaWxlZF9kZWNyeXB0X2NvdW50ICE9IDApIHsKKyAgICAgICAgICAgIHB1dF9jcnlwdF9mdHJfYW5kX2tleShjcnlwdF9mdHIpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2F2ZSB0aGUgbmFtZSBvZiB0aGUgY3J5cHRvIGJsb2NrIGRldmljZQorICAgICAgICAgKiBzbyB3ZSBjYW4gbW91bnQgaXQgd2hlbiByZXN0YXJ0aW5nIHRoZSBmcmFtZXdvcmsuICovCisgICAgICAgIHByb3BlcnR5X3NldCgicm8uY3J5cHRvLmZzX2NyeXB0b19ibGtkZXYiLCBjcnlwdG9fYmxrZGV2KTsKKworICAgICAgICAvKiBBbHNvIHNhdmUgYSB0aGUgbWFzdGVyIGtleSBzbyB3ZSBjYW4gcmVlbmNyeXB0ZWQgdGhlIGtleQorICAgICAgICAgKiB0aGUga2V5IHdoZW4gd2Ugd2FudCB0byBjaGFuZ2UgdGhlIHBhc3N3b3JkIG9uIGl0LiAqLworICAgICAgICBtZW1jcHkoc2F2ZWRfbWFzdGVyX2tleSwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ci0+a2V5c2l6ZSk7CisgICAgICAgIHNhdmVkX21vdW50X3BvaW50ID0gc3RyZHVwKG1vdW50X3BvaW50KTsKKyAgICAgICAgbWFzdGVyX2tleV9zYXZlZCA9IDE7CisgICAgICAgIFNMT0dEKCIlcygpOiBNYXN0ZXIga2V5IHNhdmVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByYyA9IDA7CisKKyAgICAgICAgLy8gVXBncmFkZSBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIGxhdGVzdCBLREYuCisgICAgICAgIHVzZV9rZXltYXN0ZXIgPSBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSgpOworICAgICAgICBpZiAoY3J5cHRfZnRyLT5rZGZfdHlwZSA9PSBLREZfU0NSWVBUX0tFWU1BU1RFUikgeworICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgZG93bmdyYWRlCisgICAgICAgIH0gZWxzZSBpZiAodXNlX2tleW1hc3RlciA9PSAxICYmIGNyeXB0X2Z0ci0+a2RmX3R5cGUgIT0gS0RGX1NDUllQVF9LRVlNQVNURVIpIHsKKyAgICAgICAgICAgIGNyeXB0X2Z0ci0+a2RmX3R5cGUgPSBLREZfU0NSWVBUX0tFWU1BU1RFUjsKKyAgICAgICAgICAgIHVwZ3JhZGUgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHVzZV9rZXltYXN0ZXIgPT0gMCAmJiBjcnlwdF9mdHItPmtkZl90eXBlICE9IEtERl9TQ1JZUFQpIHsKKyAgICAgICAgICAgIGNyeXB0X2Z0ci0+a2RmX3R5cGUgPSBLREZfU0NSWVBUOworICAgICAgICAgICAgdXBncmFkZSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXBncmFkZSkgeworICAgICAgICAgICAgcmMgPSBlbmNyeXB0X21hc3Rlcl9rZXkocGFzc3dkLCBjcnlwdF9mdHItPnNhbHQsIHNhdmVkX21hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPm1hc3Rlcl9rZXksIGNyeXB0X2Z0cik7CisgICAgICAgICAgICBpZiAoIXJjKSB7CisgICAgICAgICAgICAgICAgcmMgPSBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNMT0dEKCJLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiB1cGdyYWRlOiByYz0lZFxuIiwgcmMpOworCisgICAgICAgICAgICAvLyBEbyBub3QgZmFpbCBldmVuIGlmIHVwZ3JhZGUgZmFpbGVkIC0gbWFjaGluZSBpcyBib290YWJsZQorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHRoaXMgY29kZSBpcyBldmVyIGhpdCwgdGhlcmUgaXMgYSAqc2VyaW91cyogcHJvYmxlbQorICAgICAgICAgICAgLy8gc2luY2UgS0RGcyBzaG91bGQgbmV2ZXIgZmFpbC4gWW91ICptdXN0KiBmaXggdGhlIGtkZiBiZWZvcmUKKyAgICAgICAgICAgIC8vIHByb2NlZWRpbmchCisgICAgICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgICAgICBTTE9HVygKKyAgICAgICAgICAgICAgICAgICAgIlVwZ3JhZGUgZmFpbGVkIHdpdGggZXJyb3IgJWQsIgorICAgICAgICAgICAgICAgICAgICAiIGJ1dCBjb250aW51aW5nIHdpdGggcHJldmlvdXMgc3RhdGUiLAorICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitlcnJvdXQ6CisgICAgaWYgKGludGVybWVkaWF0ZV9rZXkpIHsKKyAgICAgICAgbWVtc2V0KGludGVybWVkaWF0ZV9rZXksIDAsIGludGVybWVkaWF0ZV9rZXlfc2l6ZSk7CisgICAgICAgIGZyZWUoaW50ZXJtZWRpYXRlX2tleSk7CisgICAgfQorICAgIHJldHVybiByYzsKIH0KIAogLyoKQEAgLTE4NzMsMTkgKzE4MDgsMTAgQEAKICAqCiAgKiBvdXRfY3J5cHRvX2Jsa2RldiBtdXN0IGJlIE1BWFBBVEhMRU4uCiAgKi8KLWludCBjcnlwdGZzX3NldHVwX2V4dF92b2x1bWUoY29uc3QgY2hhciogbGFiZWwsIGNvbnN0IGNoYXIqIHJlYWxfYmxrZGV2LAotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksIGNoYXIqIG91dF9jcnlwdG9fYmxrZGV2KSB7Ci0gICAgaW50IGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRE9OTFl8T19DTE9FWEVDKTsKLSAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBvcGVuICVzOiAlcyIsIHJlYWxfYmxrZGV2LCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgbG9uZyBucl9zZWMgPSAwOwotICAgIGdldF9ibGtkZXZfc2l6ZShmZCwgJm5yX3NlYyk7Ci0gICAgY2xvc2UoZmQpOwotCi0gICAgaWYgKG5yX3NlYyA9PSAwKSB7CitpbnQgY3J5cHRmc19zZXR1cF9leHRfdm9sdW1lKGNvbnN0IGNoYXIqIGxhYmVsLCBjb25zdCBjaGFyKiByZWFsX2Jsa2RldiwgY29uc3QgdW5zaWduZWQgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBvdXRfY3J5cHRvX2Jsa2RldikgeworICAgIHVpbnQ2NF90IG5yX3NlYyA9IDA7CisgICAgaWYgKGFuZHJvaWQ6OnZvbGQ6OkdldEJsb2NrRGV2NTEyU2VjdG9ycyhyZWFsX2Jsa2RldiwgJm5yX3NlYykgIT0gYW5kcm9pZDo6T0spIHsKICAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBnZXQgc2l6ZSBvZiAlczogJXMiLCByZWFsX2Jsa2Rldiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTE4OTQsNyArMTgyMCw3IEBACiAgICAgbWVtc2V0KCZleHRfY3J5cHRfZnRyLCAwLCBzaXplb2YoZXh0X2NyeXB0X2Z0cikpOwogICAgIGV4dF9jcnlwdF9mdHIuZnNfc2l6ZSA9IG5yX3NlYzsKICAgICBleHRfY3J5cHRfZnRyLmtleXNpemUgPSBjcnlwdGZzX2dldF9rZXlzaXplKCk7Ci0gICAgc3RybGNweSgoY2hhciopIGV4dF9jcnlwdF9mdHIuY3J5cHRvX3R5cGVfbmFtZSwgY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSwKKyAgICBzdHJsY3B5KChjaGFyKilleHRfY3J5cHRfZnRyLmNyeXB0b190eXBlX25hbWUsIGNyeXB0ZnNfZ2V0X2NyeXB0b19uYW1lKCksCiAgICAgICAgICAgICBNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU4pOwogICAgIHVpbnQzMl90IGZsYWdzID0gMDsKICAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSAmJgpAQCAtMTkwOSwyMSArMTgzNSwyMCBAQAogICogc3RvcmFnZSB2b2x1bWUuCiAgKi8KIGludCBjcnlwdGZzX3JldmVydF9leHRfdm9sdW1lKGNvbnN0IGNoYXIqIGxhYmVsKSB7Ci0gICAgcmV0dXJuIGRlbGV0ZV9jcnlwdG9fYmxrX2RldigoY2hhciopIGxhYmVsKTsKKyAgICByZXR1cm4gZGVsZXRlX2NyeXB0b19ibGtfZGV2KChjaGFyKilsYWJlbCk7CiB9CiAKLWludCBjcnlwdGZzX2NyeXB0b19jb21wbGV0ZSh2b2lkKQotewotICByZXR1cm4gZG9fY3J5cHRvX2NvbXBsZXRlKCIvZGF0YSIpOworaW50IGNyeXB0ZnNfY3J5cHRvX2NvbXBsZXRlKHZvaWQpIHsKKyAgICByZXR1cm4gZG9fY3J5cHRvX2NvbXBsZXRlKCIvZGF0YSIpOwogfQogCi1pbnQgY2hlY2tfdW5tb3VudGVkX2FuZF9nZXRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpCi17CitpbnQgY2hlY2tfdW5tb3VudGVkX2FuZF9nZXRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKCBtYXN0ZXJfa2V5X3NhdmVkIHx8IHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKLSAgICAgICAgU0xPR0UoImVuY3J5cHRlZCBmcyBhbHJlYWR5IHZhbGlkYXRlZCBvciBub3QgcnVubmluZyB3aXRoIGVuY3J5cHRpb24sIgotICAgICAgICAgICAgICAiIGFib3J0aW5nIik7CisgICAgaWYgKG1hc3Rlcl9rZXlfc2F2ZWQgfHwgc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CisgICAgICAgIFNMT0dFKAorICAgICAgICAgICAgImVuY3J5cHRlZCBmcyBhbHJlYWR5IHZhbGlkYXRlZCBvciBub3QgcnVubmluZyB3aXRoIGVuY3J5cHRpb24sIgorICAgICAgICAgICAgIiBhYm9ydGluZyIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0xOTM1LDggKzE4NjAsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgY3J5cHRmc19jaGVja19wYXNzd2QoY29uc3QgY2hhciAqcGFzc3dkKQoteworaW50IGNyeXB0ZnNfY2hlY2tfcGFzc3dkKGNvbnN0IGNoYXIqIHBhc3N3ZCkgewogICAgIFNMT0dJKCJjcnlwdGZzX2NoZWNrX3Bhc3N3ZCIpOwogICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJjcnlwdGZzX2NoZWNrX3Bhc3N3ZCBub3QgdmFsaWQgZm9yIGZpbGUgZW5jcnlwdGlvbiIpOwpAQCAtMTk1Miw4ICsxODc2LDcgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAotICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgcGFzc3dkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9NTlRfUE9JTlQsIENSWVBUT19CTE9DS19ERVZJQ0UpOworICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgcGFzc3dkLCBEQVRBX01OVF9QT0lOVCwgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAgICAgaWYgKHJjKSB7CiAgICAgICAgIFNMT0dFKCJQYXNzd29yZCBkaWQgbm90IG1hdGNoIik7CiAgICAgICAgIHJldHVybiByYzsKQEAgLTE5NjUsOCArMTg4OCw4IEBACiAgICAgICAgIC8vIEZpcnN0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgY3J5cHRvIGJsb2NrIGRldmljZSB0aGF0CiAgICAgICAgIC8vIHRlc3RfbW91bnRfZW5jcnlwdGVkX2ZzIGxlYXZlcyBiZWhpbmQgYXMgYSBzaWRlIGVmZmVjdAogICAgICAgICBkZWxldGVfY3J5cHRvX2Jsa19kZXYoQ1JZUFRPX0JMT0NLX0RFVklDRSk7Ci0gICAgICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgREVGQVVMVF9QQVNTV09SRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX01OVF9QT0lOVCwgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CisgICAgICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgREVGQVVMVF9QQVNTV09SRCwgREFUQV9NTlRfUE9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAgICAgICAgIGlmIChyYykgewogICAgICAgICAgICAgU0xPR0UoIkRlZmF1bHQgcGFzc3dvcmQgZGlkIG5vdCBtYXRjaCBvbiByZWJvb3QgZW5jcnlwdGlvbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJjOwpAQCAtMTk5MiwxNSArMTkxNSwxNCBAQAogICAgIHJldHVybiByYzsKIH0KIAotaW50IGNyeXB0ZnNfdmVyaWZ5X3Bhc3N3ZChjb25zdCBjaGFyICpwYXNzd2QpCi17CitpbnQgY3J5cHRmc192ZXJpZnlfcGFzc3dkKGNvbnN0IGNoYXIqIHBhc3N3ZCkgewogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKICAgICB1bnNpZ25lZCBjaGFyIGRlY3J5cHRlZF9tYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGludCByYzsKIAogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKKyAgICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CiAgICAgICAgIFNMT0dFKCJkZXZpY2Ugbm90IGVuY3J5cHRlZCwgYWJvcnRpbmciKTsKICAgICAgICAgcmV0dXJuIC0yOwogICAgIH0KQEAgLTIwNDMsOCArMTk2NSw3IEBACiAgKiBQcmVzdW1hYmx5LCBhdCBhIG1pbmltdW0sIHRoZSBjYWxsZXIgd2lsbCB1cGRhdGUgdGhlCiAgKiBmaWxlc3lzdGVtIHNpemUgYW5kIGNyeXB0b190eXBlX25hbWUgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IGNyeXB0ZnNfaW5pdF9jcnlwdF9tbnRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIpCi17CitzdGF0aWMgaW50IGNyeXB0ZnNfaW5pdF9jcnlwdF9tbnRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIpIHsKICAgICBvZmY2NF90IG9mZjsKIAogICAgIG1lbXNldChmdHIsIDAsIHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpOwpAQCAtMjA1NSwxNyArMTk3NiwxNyBAQAogICAgIGZ0ci0+a2V5c2l6ZSA9IGNyeXB0ZnNfZ2V0X2tleXNpemUoKTsKIAogICAgIHN3aXRjaCAoa2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHkoKSkgewotICAgIGNhc2UgMToKLSAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIDA6Ci0gICAgICAgIGZ0ci0+a2RmX3R5cGUgPSBLREZfU0NSWVBUOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFQ7CisgICAgICAgICAgICBicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFNMT0dFKCJrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU0xPR0UoImtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5IGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIGdldF9kZXZpY2Vfc2NyeXB0X3BhcmFtcyhmdHIpOwpAQCAtMjA3Myw4ICsxOTk0LDcgQEAKICAgICBmdHItPnBlcnNpc3RfZGF0YV9zaXplID0gQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkU7CiAgICAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbyhOVUxMLCAmb2ZmKSA9PSAwKSB7CiAgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX29mZnNldFswXSA9IG9mZiArIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVDsKLSAgICAgICAgZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdID0gb2ZmICsgQ1JZUFRfRk9PVEVSX1RPX1BFUlNJU1RfT0ZGU0VUICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX3NpemU7CisgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX29mZnNldFsxXSA9IG9mZiArIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVCArIGZ0ci0+cGVyc2lzdF9kYXRhX3NpemU7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0yMDgyLDkgKzIwMDIsOCBAQAogCiAjZGVmaW5lIEZSQU1FV09SS19CT09UX1dBSVQgNjAKIAotc3RhdGljIGludCBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY29uc3QgY2hhciogZmlsZW5hbWUsIF9fbGU4KiBidWYpCi17Ci0gICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFl8T19DTE9FWEVDKTsKK3N0YXRpYyBpbnQgY3J5cHRmc19TSEEyNTZfZmlsZWJsb2NrKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBfX2xlOCogYnVmKSB7CisgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogICAgIGlmIChmZCA9PSAtMSkgewogICAgICAgICBTTE9HRSgiRXJyb3Igb3BlbmluZyBmaWxlICVzIiwgZmlsZW5hbWUpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yMTEwLDcgKzIwMjksNyBAQAogCiBzdGF0aWMgaW50IGNyeXB0ZnNfZW5hYmxlX2FsbF92b2x1bWVzKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsIGNoYXIqIGNyeXB0b19ibGtkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHJlYWxfYmxrZGV2LCBpbnQgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0bykgewotICAgIG9mZjY0X3QgY3VyX2VuY3J5cHRpb25fZG9uZT0wLCB0b3RfZW5jcnlwdGlvbl9zaXplPTA7CisgICAgb2ZmNjRfdCBjdXJfZW5jcnlwdGlvbl9kb25lID0gMCwgdG90X2VuY3J5cHRpb25fc2l6ZSA9IDA7CiAgICAgaW50IHJjID0gLTE7CiAKICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgdXNlcmRhdGEgcGFydGl0aW9uLCBhbmQgYWRkIGluIHRoZSB2b2xkIHZvbHVtZXMgYmVsb3cgKi8KQEAgLTIxNDYsMTcgKzIwNjUsMTYgQEAKIGludCBjcnlwdGZzX2VuYWJsZV9pbnRlcm5hbChpbnQgY3J5cHRfdHlwZSwgY29uc3QgY2hhciogcGFzc3dkLCBpbnQgbm9fdWkpIHsKICAgICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl0sIHJlYWxfYmxrZGV2W01BWFBBVEhMRU5dOwogICAgIHVuc2lnbmVkIGNoYXIgZGVjcnlwdGVkX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwotICAgIGludCByYz0tMSwgaTsKKyAgICBpbnQgcmMgPSAtMSwgaTsKICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7Ci0gICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGE7CisgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSogcGRhdGE7CiAgICAgY2hhciBlbmNyeXB0ZWRfc3RhdGVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBjaGFyIGxvY2tpZFszMl0gPSB7IDAgfTsKKyAgICBjaGFyIGxvY2tpZFszMl0gPSB7MH07CiAgICAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgaW50IG51bV92b2xzOwogICAgIG9mZjY0X3QgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0byA9IDA7CiAgICAgYm9vbCByZWJvb3RFbmNyeXB0aW9uID0gZmFsc2U7CiAgICAgYm9vbCBvbmx5Q3JlYXRlSGVhZGVyID0gZmFsc2U7Ci0gICAgaW50IGZkID0gLTE7CiAKICAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpID09IDApIHsKICAgICAgICAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MpIHsKQEAgLTIyMDAsMjUgKzIxMTgsMTcgQEAKICAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwgMCwgcmVhbF9ibGtkZXYsIHNpemVvZihyZWFsX2Jsa2RldikpOwogCiAgICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSByZWFsIGJsb2NrIGRldmljZSAqLwotICAgIGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRE9OTFl8T19DTE9FWEVDKTsKLSAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOwotICAgICAgICBnb3RvIGVycm9yX3VuZW5jcnlwdGVkOwotICAgIH0KLSAgICB1bnNpZ25lZCBsb25nIG5yX3NlYzsKLSAgICBnZXRfYmxrZGV2X3NpemUoZmQsICZucl9zZWMpOwotICAgIGlmIChucl9zZWMgPT0gMCkgeworICAgIHVpbnQ2NF90IG5yX3NlYzsKKyAgICBpZiAoYW5kcm9pZDo6dm9sZDo6R2V0QmxvY2tEZXY1MTJTZWN0b3JzKHJlYWxfYmxrZGV2LCAmbnJfc2VjKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICBTTE9HRSgiQ2Fubm90IGdldCBzaXplIG9mIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOwogICAgICAgICBnb3RvIGVycm9yX3VuZW5jcnlwdGVkOwogICAgIH0KLSAgICBjbG9zZShmZCk7CiAKICAgICAvKiBJZiBkb2luZyBpbnBsYWNlIGVuY3J5cHRpb24sIG1ha2Ugc3VyZSB0aGUgb3JpZyBmcyBkb2Vzbid0IGluY2x1ZGUgdGhlIGNyeXB0byBmb290ZXIgKi8KICAgICBpZiAoIXN0cmNtcChrZXlfbG9jLCBLRVlfSU5fRk9PVEVSKSkgewotICAgICAgICB1bnNpZ25lZCBpbnQgZnNfc2l6ZV9zZWMsIG1heF9mc19zaXplX3NlYzsKKyAgICAgICAgdWludDY0X3QgZnNfc2l6ZV9zZWMsIG1heF9mc19zaXplX3NlYzsKICAgICAgICAgZnNfc2l6ZV9zZWMgPSBnZXRfZnNfc2l6ZShyZWFsX2Jsa2Rldik7Ci0gICAgICAgIGlmIChmc19zaXplX3NlYyA9PSAwKQotICAgICAgICAgICAgZnNfc2l6ZV9zZWMgPSBnZXRfZjJmc19maWxlc3lzdGVtX3NpemVfc2VjKHJlYWxfYmxrZGV2KTsKKyAgICAgICAgaWYgKGZzX3NpemVfc2VjID09IDApIGZzX3NpemVfc2VjID0gZ2V0X2YyZnNfZmlsZXN5c3RlbV9zaXplX3NlYyhyZWFsX2Jsa2Rldik7CiAKICAgICAgICAgbWF4X2ZzX3NpemVfc2VjID0gbnJfc2VjIC0gKENSWVBUX0ZPT1RFUl9PRkZTRVQgLyBDUllQVF9TRUNUT1JfU0laRSk7CiAKQEAgLTIyMzIsNyArMjE0Miw3IEBACiAgICAgICogZGV2aWNlIHRvIHNsZWVwIG9uIHVzLiAgV2UnbGwgZ3JhYiBhIHBhcnRpYWwgd2FrZWxvY2ssIGFuZCBpZiB0aGUgVUkKICAgICAgKiB3YW50cyB0byBrZWVwIHRoZSBzY3JlZW4gb24sIGl0IGNhbiBncmFiIGEgZnVsbCB3YWtlbG9jay4KICAgICAgKi8KLSAgICBzbnByaW50Zihsb2NraWQsIHNpemVvZihsb2NraWQpLCAiZW5hYmxlY3J5cHRvJWQiLCAoaW50KSBnZXRwaWQoKSk7CisgICAgc25wcmludGYobG9ja2lkLCBzaXplb2YobG9ja2lkKSwgImVuYWJsZWNyeXB0byVkIiwgKGludClnZXRwaWQoKSk7CiAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIGxvY2tpZCk7CiAKICAgICAvKiBUaGUgaW5pdCBmaWxlcyBhcmUgc2V0dXAgdG8gc3RvcCB0aGUgY2xhc3MgbWFpbiBhbmQgbGF0ZSBzdGFydCB3aGVuCkBAIC0yMjkyLDggKzIyMDIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFzdHJjbXAoa2V5X2xvYywgS0VZX0lOX0ZPT1RFUikpIHsKLSAgICAgICAgICAgIGNyeXB0X2Z0ci5mc19zaXplID0gbnJfc2VjCi0gICAgICAgICAgICAgIC0gKENSWVBUX0ZPT1RFUl9PRkZTRVQgLyBDUllQVF9TRUNUT1JfU0laRSk7CisgICAgICAgICAgICBjcnlwdF9mdHIuZnNfc2l6ZSA9IG5yX3NlYyAtIChDUllQVF9GT09URVJfT0ZGU0VUIC8gQ1JZUFRfU0VDVE9SX1NJWkUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY3J5cHRfZnRyLmZzX3NpemUgPSBucl9zZWM7CiAgICAgICAgIH0KQEAgLTIzMDcsNyArMjIxNiw4IEBACiAgICAgICAgICAgICBjcnlwdF9mdHIuZmxhZ3MgfD0gQ1JZUFRfSU5DT05TSVNURU5UX1NUQVRFOwogICAgICAgICB9CiAgICAgICAgIGNyeXB0X2Z0ci5jcnlwdF90eXBlID0gY3J5cHRfdHlwZTsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKWNyeXB0X2Z0ci5jcnlwdG9fdHlwZV9uYW1lLCBjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpLCBNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU4pOworICAgICAgICBzdHJsY3B5KChjaGFyKiljcnlwdF9mdHIuY3J5cHRvX3R5cGVfbmFtZSwgY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSwKKyAgICAgICAgICAgICAgICBNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU4pOwogCiAgICAgICAgIC8qIE1ha2UgYW4gZW5jcnlwdGVkIG1hc3RlciBrZXkgKi8KICAgICAgICAgaWYgKGNyZWF0ZV9lbmNyeXB0ZWRfcmFuZG9tX2tleShvbmx5Q3JlYXRlSGVhZGVyID8gREVGQVVMVF9QQVNTV09SRCA6IHBhc3N3ZCwKQEAgLTIzMjEsOCArMjIzMSw4IEBACiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGZha2VfbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07CiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGVuY3J5cHRlZF9mYWtlX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwogICAgICAgICAgICAgbWVtc2V0KGZha2VfbWFzdGVyX2tleSwgMCwgc2l6ZW9mKGZha2VfbWFzdGVyX2tleSkpOwotICAgICAgICAgICAgZW5jcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgY3J5cHRfZnRyLnNhbHQsIGZha2VfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfZmFrZV9tYXN0ZXJfa2V5LCAmY3J5cHRfZnRyKTsKKyAgICAgICAgICAgIGVuY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGNyeXB0X2Z0ci5zYWx0LCBmYWtlX21hc3Rlcl9rZXksIGVuY3J5cHRlZF9mYWtlX21hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyeXB0X2Z0cik7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBXcml0ZSB0aGUga2V5IHRvIHRoZSBlbmQgb2YgdGhlIHBhcnRpdGlvbiAqLwpAQCAtMjMzMiwxMSArMjI0MiwxMSBAQAogICAgICAgICAgKiBJZiBub25lLCBjcmVhdGUgYSB2YWxpZCBlbXB0eSB0YWJsZSBhbmQgc2F2ZSB0aGF0LgogICAgICAgICAgKi8KICAgICAgICAgaWYgKCFwZXJzaXN0X2RhdGEpIHsKLSAgICAgICAgICAgIHBkYXRhID0gKGNyeXB0X3BlcnNpc3RfZGF0YSAqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7Ci0gICAgICAgICAgIGlmIChwZGF0YSkgewotICAgICAgICAgICAgICAgaW5pdF9lbXB0eV9wZXJzaXN0X2RhdGEocGRhdGEsIENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKLSAgICAgICAgICAgICAgIHBlcnNpc3RfZGF0YSA9IHBkYXRhOwotICAgICAgICAgICB9CisgICAgICAgICAgICBwZGF0YSA9IChjcnlwdF9wZXJzaXN0X2RhdGEqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7CisgICAgICAgICAgICBpZiAocGRhdGEpIHsKKyAgICAgICAgICAgICAgICBpbml0X2VtcHR5X3BlcnNpc3RfZGF0YShwZGF0YSwgQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOworICAgICAgICAgICAgICAgIHBlcnNpc3RfZGF0YSA9IHBkYXRhOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChwZXJzaXN0X2RhdGEpIHsKICAgICAgICAgICAgIHNhdmVfcGVyc2lzdGVudF9kYXRhKCk7CkBAIC0yMzcwLDggKzIyODAsOCBAQAogICAgICAgICBfX2xlOCBoYXNoX2ZpcnN0X2Jsb2NrW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKICAgICAgICAgcmMgPSBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY3J5cHRvX2Jsa2RldiwgaGFzaF9maXJzdF9ibG9jayk7CiAKLSAgICAgICAgaWYgKCFyYyAmJiBtZW1jbXAoaGFzaF9maXJzdF9ibG9jaywgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYXNoX2ZpcnN0X2Jsb2NrKSkgIT0gMCkgeworICAgICAgICBpZiAoIXJjICYmCisgICAgICAgICAgICBtZW1jbXAoaGFzaF9maXJzdF9ibG9jaywgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2ssIHNpemVvZihoYXNoX2ZpcnN0X2Jsb2NrKSkgIT0gMCkgewogICAgICAgICAgICAgU0xPR0UoIkNoZWNrc3VtcyBkbyBub3QgbWF0Y2ggLSB0cmlnZ2VyIHdpcGUiKTsKICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgIH0KQEAgLTIzODQsOCArMjI5NCw3IEBACiAKICAgICAvKiBDYWxjdWxhdGUgY2hlY2tzdW0gaWYgd2UgYXJlIG5vdCBmaW5pc2hlZCAqLwogICAgIGlmICghcmMgJiYgY3J5cHRfZnRyLmVuY3J5cHRlZF91cHRvICE9IGNyeXB0X2Z0ci5mc19zaXplKSB7Ci0gICAgICAgIHJjID0gY3J5cHRmc19TSEEyNTZfZmlsZWJsb2NrKGNyeXB0b19ibGtkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci5oYXNoX2ZpcnN0X2Jsb2NrKTsKKyAgICAgICAgcmMgPSBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY3J5cHRvX2Jsa2RldiwgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2spOwogICAgICAgICBpZiAocmMpIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciBjYWxjdWxhdGluZyBjaGVja3N1bSBmb3IgY29udGludWluZyBlbmNyeXB0aW9uIik7CiAgICAgICAgICAgICByYyA9IC0xOwpAQCAtMjM5NSw3ICsyMzA0LDcgQEAKICAgICAvKiBVbmRvIHRoZSBkbS1jcnlwdCBtYXBwaW5nIHdoZXRoZXIgd2Ugc3VjY2VlZCBvciBub3QgKi8KICAgICBkZWxldGVfY3J5cHRvX2Jsa19kZXYoQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAKLSAgICBpZiAoISByYykgeworICAgIGlmICghcmMpIHsKICAgICAgICAgLyogU3VjY2VzcyAqLwogICAgICAgICBjcnlwdF9mdHIuZmxhZ3MgJj0gfkNSWVBUX0lOQ09OU0lTVEVOVF9TVEFURTsKIApAQCAtMjQ0Myw4ICsyMzUyLDcgQEAKICAgICAgICAgICAgIFNMT0dFKCJlbmNyeXB0aW9uIGZhaWxlZCAtIHJlYm9vdGluZyBpbnRvIHJlY292ZXJ5IHRvIHdpcGUgZGF0YVxuIik7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI7CiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3B0aW9ucyA9IHsKLSAgICAgICAgICAgICAgICAiLS13aXBlX2RhdGFcbi0tcmVhc29uPWNyeXB0ZnNfZW5hYmxlX2ludGVybmFsXG4iCi0gICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICItLXdpcGVfZGF0YVxuLS1yZWFzb249Y3J5cHRmc19lbmFibGVfaW50ZXJuYWxcbiJ9OwogICAgICAgICAgICAgaWYgKCF3cml0ZV9ib290bG9hZGVyX21lc3NhZ2Uob3B0aW9ucywgJmVycikpIHsKICAgICAgICAgICAgICAgICBTTE9HRSgiY291bGQgbm90IHdyaXRlIGJvb3Rsb2FkZXIgbWVzc2FnZTogJXMiLCBlcnIuY19zdHIoKSk7CiAgICAgICAgICAgICB9CkBAIC0yNDc3LDcgKzIzODUsOSBAQAogICAgICAqIGJ1dCB0aGUgZnJhbWV3b3JrIGlzIHN0b3BwZWQgYW5kIG5vdCByZXN0YXJ0ZWQgdG8gc2hvdyB0aGUgZXJyb3IsIHNvIGl0J3MgdXAgdG8KICAgICAgKiB2b2xkIHRvIHJlc3RhcnQgdGhlIHN5c3RlbS4KICAgICAgKi8KLSAgICBTTE9HRSgiRXJyb3IgZW5hYmxpbmcgZW5jcnlwdGlvbiBhZnRlciBmcmFtZXdvcmsgaXMgc2h1dGRvd24sIG5vIGRhdGEgY2hhbmdlZCwgcmVzdGFydGluZyBzeXN0ZW0iKTsKKyAgICBTTE9HRSgKKyAgICAgICAgIkVycm9yIGVuYWJsaW5nIGVuY3J5cHRpb24gYWZ0ZXIgZnJhbWV3b3JrIGlzIHNodXRkb3duLCBubyBkYXRhIGNoYW5nZWQsIHJlc3RhcnRpbmcgIgorICAgICAgICAic3lzdGVtIik7CiAgICAgY3J5cHRmc19yZWJvb3QoUmVib290VHlwZTo6cmVib290KTsKIAogICAgIC8qIHNob3VsZG4ndCBnZXQgaGVyZSAqLwpAQCAtMjQ5Niw4ICsyNDA2LDcgQEAKICAgICByZXR1cm4gY3J5cHRmc19lbmFibGVfaW50ZXJuYWwoQ1JZUFRfVFlQRV9ERUZBVUxULCBERUZBVUxUX1BBU1NXT1JELCBub191aSk7CiB9CiAKLWludCBjcnlwdGZzX2NoYW5nZXB3KGludCBjcnlwdF90eXBlLCBjb25zdCBjaGFyICpuZXdwdykKLXsKK2ludCBjcnlwdGZzX2NoYW5nZXB3KGludCBjcnlwdF90eXBlLCBjb25zdCBjaGFyKiBuZXdwdykgewogICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJjcnlwdGZzX2NoYW5nZXB3IG5vdCB2YWxpZCBmb3IgZmlsZSBlbmNyeXB0aW9uIik7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTI1MjUsMTIgKzI0MzQsOCBAQAogCiAgICAgY3J5cHRfZnRyLmNyeXB0X3R5cGUgPSBjcnlwdF90eXBlOwogCi0gICAgcmMgPSBlbmNyeXB0X21hc3Rlcl9rZXkoY3J5cHRfdHlwZSA9PSBDUllQVF9UWVBFX0RFRkFVTFQgPyBERUZBVUxUX1BBU1NXT1JECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3cHcsCi0gICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci5zYWx0LAotICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHIubWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmNyeXB0X2Z0cik7CisgICAgcmMgPSBlbmNyeXB0X21hc3Rlcl9rZXkoY3J5cHRfdHlwZSA9PSBDUllQVF9UWVBFX0RFRkFVTFQgPyBERUZBVUxUX1BBU1NXT1JEIDogbmV3cHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLnNhbHQsIHNhdmVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ci5tYXN0ZXJfa2V5LCAmY3J5cHRfZnRyKTsKICAgICBpZiAocmMpIHsKICAgICAgICAgU0xPR0UoIkVuY3J5cHQgbWFzdGVyIGtleSBmYWlsZWQ6ICVkIiwgcmMpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yNTU4LDE0ICsyNDYzLDEzIEBACiAgICAgICAgIGRzaXplID0gQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkU7CiAgICAgfQogCi0gICAgbWF4X3BlcnNpc3RlbnRfZW50cmllcyA9IChkc2l6ZSAtIHNpemVvZihzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKSkgLwotICAgICAgICBzaXplb2Yoc3RydWN0IGNyeXB0X3BlcnNpc3RfZW50cnkpOworICAgIG1heF9wZXJzaXN0ZW50X2VudHJpZXMgPQorICAgICAgICAoZHNpemUgLSBzaXplb2Yoc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSkpIC8gc2l6ZW9mKHN0cnVjdCBjcnlwdF9wZXJzaXN0X2VudHJ5KTsKIAogICAgIHJldHVybiBtYXhfcGVyc2lzdGVudF9lbnRyaWVzOwogfQogCi1zdGF0aWMgaW50IHBlcnNpc3RfZ2V0X2tleShjb25zdCBjaGFyICpmaWVsZG5hbWUsIGNoYXIgKnZhbHVlKQoteworc3RhdGljIGludCBwZXJzaXN0X2dldF9rZXkoY29uc3QgY2hhciogZmllbGRuYW1lLCBjaGFyKiB2YWx1ZSkgewogICAgIHVuc2lnbmVkIGludCBpOwogCiAgICAgaWYgKHBlcnNpc3RfZGF0YSA9PSBOVUxMKSB7CkBAIC0yNTgyLDggKzI0ODYsNyBAQAogICAgIHJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBwZXJzaXN0X3NldF9rZXkoY29uc3QgY2hhciAqZmllbGRuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IGVuY3J5cHRlZCkKLXsKK3N0YXRpYyBpbnQgcGVyc2lzdF9zZXRfa2V5KGNvbnN0IGNoYXIqIGZpZWxkbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIGludCBlbmNyeXB0ZWQpIHsKICAgICB1bnNpZ25lZCBpbnQgaTsKICAgICB1bnNpZ25lZCBpbnQgbnVtOwogICAgIHVuc2lnbmVkIGludCBtYXhfcGVyc2lzdGVudF9lbnRyaWVzOwpAQCAtMjYyMSw3ICsyNTI0LDcgQEAKICAqIFRlc3QgaWYga2V5IGlzIHBhcnQgb2YgdGhlIG11bHRpLWVudHJ5IChmaWVsZCwgaW5kZXgpIHNlcXVlbmNlLiBSZXR1cm4gbm9uLXplcm8gaWYga2V5IGlzIGluIHRoZQogICogc2VxdWVuY2UgYW5kIGl0cyBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gaW5kZXguIFJldHVybiAwIG90aGVyd2lzZS4KICAqLwotaW50IG1hdGNoX211bHRpX2VudHJ5KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqZmllbGQsIHVuc2lnbmVkIGluZGV4KSB7CitpbnQgbWF0Y2hfbXVsdGlfZW50cnkoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiBmaWVsZCwgdW5zaWduZWQgaW5kZXgpIHsKICAgICBzdGQ6OnN0cmluZyBrZXlfID0ga2V5OwogICAgIHN0ZDo6c3RyaW5nIGZpZWxkXyA9IGZpZWxkOwogCkBAIC0yNjQ4LDggKzI1NTEsNyBAQAogICogYW5kIFBFUlNJU1RfREVMX0tFWV9FUlJPUl9PVEhFUiBpZiBlcnJvciBvY2N1cnMuCiAgKgogICovCi1zdGF0aWMgaW50IHBlcnNpc3RfZGVsX2tleXMoY29uc3QgY2hhciAqZmllbGRuYW1lLCB1bnNpZ25lZCBpbmRleCkKLXsKK3N0YXRpYyBpbnQgcGVyc2lzdF9kZWxfa2V5cyhjb25zdCBjaGFyKiBmaWVsZG5hbWUsIHVuc2lnbmVkIGluZGV4KSB7CiAgICAgdW5zaWduZWQgaW50IGk7CiAgICAgdW5zaWduZWQgaW50IGo7CiAgICAgdW5zaWduZWQgaW50IG51bTsKQEAgLTI2NjAsNyArMjU2Miw3IEBACiAKICAgICBudW0gPSBwZXJzaXN0X2RhdGEtPnBlcnNpc3RfdmFsaWRfZW50cmllczsKIAotICAgIGogPSAwOyAvLyBwb2ludHMgdG8gdGhlIGVuZCBvZiBub24tZGVsZXRlZCBlbnRyaWVzLgorICAgIGogPSAwOyAgLy8gcG9pbnRzIHRvIHRoZSBlbmQgb2Ygbm9uLWRlbGV0ZWQgZW50cmllcy4KICAgICAvLyBGaWx0ZXIgb3V0IHRvLWJlLWRlbGV0ZWQgZW50cmllcyBpbiBwbGFjZS4KICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKICAgICAgICAgaWYgKCFtYXRjaF9tdWx0aV9lbnRyeShwZXJzaXN0X2RhdGEtPnBlcnNpc3RfZW50cnlbaV0ua2V5LCBmaWVsZG5hbWUsIGluZGV4KSkgewpAQCAtMjY4MCw4ICsyNTgyLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgcGVyc2lzdF9jb3VudF9rZXlzKGNvbnN0IGNoYXIgKmZpZWxkbmFtZSkKLXsKK3N0YXRpYyBpbnQgcGVyc2lzdF9jb3VudF9rZXlzKGNvbnN0IGNoYXIqIGZpZWxkbmFtZSkgewogICAgIHVuc2lnbmVkIGludCBpOwogICAgIHVuc2lnbmVkIGludCBjb3VudDsKIApAQCAtMjcwMCw4ICsyNjAxLDcgQEAKIH0KIAogLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLiAqLwotaW50IGNyeXB0ZnNfZ2V0ZmllbGQoY29uc3QgY2hhciAqZmllbGRuYW1lLCBjaGFyICp2YWx1ZSwgaW50IGxlbikKLXsKK2ludCBjcnlwdGZzX2dldGZpZWxkKGNvbnN0IGNoYXIqIGZpZWxkbmFtZSwgY2hhciogdmFsdWUsIGludCBsZW4pIHsKICAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBTTE9HRSgiQ2Fubm90IGdldCBmaWVsZCB3aGVuIGZpbGUgZW5jcnlwdGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTI3MjksNyArMjYyOSw3IEBACiAgICAgLy8gc3RpdGNoIHRoZW0gYmFjayB0b2dldGhlci4KICAgICBpZiAoIXBlcnNpc3RfZ2V0X2tleShmaWVsZG5hbWUsIHRlbXBfdmFsdWUpKSB7CiAgICAgICAgIC8vIFdlIGZvdW5kIGl0LCBjb3B5IGl0IHRvIHRoZSBjYWxsZXIncyBidWZmZXIgYW5kIGtlZXAgZ29pbmcgdW50aWwgYWxsIGVudHJpZXMgYXJlIHJlYWQuCi0gICAgICAgIGlmIChzdHJsY3B5KHZhbHVlLCB0ZW1wX3ZhbHVlLCBsZW4pID49ICh1bnNpZ25lZCkgbGVuKSB7CisgICAgICAgIGlmIChzdHJsY3B5KHZhbHVlLCB0ZW1wX3ZhbHVlLCBsZW4pID49ICh1bnNpZ25lZClsZW4pIHsKICAgICAgICAgICAgIC8vIHZhbHVlIHRvbyBzbWFsbAogICAgICAgICAgICAgcmMgPSBDUllQVE9fR0VURklFTERfRVJST1JfQlVGX1RPT19TTUFMTDsKICAgICAgICAgICAgIGdvdG8gb3V0OwpAQCAtMjczOCw3ICsyNjM4LDcgQEAKIAogICAgICAgICBmb3IgKGkgPSAxOyAvKiBicmVhayBleHBsaWNpdGx5ICovOyBpKyspIHsKICAgICAgICAgICAgIGlmIChzbnByaW50Zih0ZW1wX2ZpZWxkLCBzaXplb2YodGVtcF9maWVsZCksICIlc18lZCIsIGZpZWxkbmFtZSwgaSkgPj0KLSAgICAgICAgICAgICAgICAgICAgKGludCkgc2l6ZW9mKHRlbXBfZmllbGQpKSB7CisgICAgICAgICAgICAgICAgKGludClzaXplb2YodGVtcF9maWVsZCkpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmllbGRuYW1lIGlzIHZlcnkgbG9uZywgd2Ugc3RvcCBhcyBzb29uIGFzIGl0IGJlZ2lucyB0byBvdmVyZmxvdyB0aGUKICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIGZpZWxkIGxlbmd0aC4gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGluIGZhY3QgZnVsbHkgcmVhZCBvdXQgdGhlIG9yaWdpbmFsCiAgICAgICAgICAgICAgICAgLy8gdmFsdWUgYmVjYXVzZSBjcnlwdGZzX3NldGZpZWxkIHdvdWxkIG5vdCBhbGxvdyBmaWVsZHMgd2l0aCBsb25nZXIgbmFtZXMgdG8gYmUKQEAgLTI3NDYsMTEgKzI2NDYsMTEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghcGVyc2lzdF9nZXRfa2V5KHRlbXBfZmllbGQsIHRlbXBfdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoc3RybGNhdCh2YWx1ZSwgdGVtcF92YWx1ZSwgbGVuKSA+PSAodW5zaWduZWQpbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG9vIHNtYWxsLgotICAgICAgICAgICAgICAgICAgICAgIHJjID0gQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX0JVRl9UT09fU01BTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0cmxjYXQodmFsdWUsIHRlbXBfdmFsdWUsIGxlbikgPj0gKHVuc2lnbmVkKWxlbikgeworICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSB0b28gc21hbGwuCisgICAgICAgICAgICAgICAgICAgIHJjID0gQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX0JVRl9UT09fU01BTEw7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gRXhoYXVzdCBhbGwgZW50cmllcy4KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI3NjYsOCArMjY2Niw3IEBACiB9CiAKIC8qIFNldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4gKi8KLWludCBjcnlwdGZzX3NldGZpZWxkKGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCi17CitpbnQgY3J5cHRmc19zZXRmaWVsZChjb25zdCBjaGFyKiBmaWVsZG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBzZXQgZmllbGQgd2hlbiBmaWxlIGVuY3J5cHRlZCIpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yNzkxLDcgKzI2OTAsNyBAQAogICAgIH0KIAogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKCFzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikgKSB7CisgICAgaWYgKCFzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikpIHsKICAgICAgICAgZW5jcnlwdGVkID0gMTsKICAgICB9CiAKQEAgLTI4NjAsMTQgKzI3NTksMTQgQEAKICAqIE9uIHN1Y2Nlc3MgdHJpZ2dlciBuZXh0IGluaXQgcGhhc2UgYW5kIHJldHVybiAwLgogICogQ3VycmVudGx5IGRvIG5vdCBoYW5kbGUgZmFpbHVyZSAtIHNlZSBUT0RPIGJlbG93LgogICovCi1pbnQgY3J5cHRmc19tb3VudF9kZWZhdWx0X2VuY3J5cHRlZCh2b2lkKQoteworaW50IGNyeXB0ZnNfbW91bnRfZGVmYXVsdF9lbmNyeXB0ZWQodm9pZCkgewogICAgIGludCBjcnlwdF90eXBlID0gY3J5cHRmc19nZXRfcGFzc3dvcmRfdHlwZSgpOwogICAgIGlmIChjcnlwdF90eXBlIDwgMCB8fCBjcnlwdF90eXBlID4gQ1JZUFRfVFlQRV9NQVhfVFlQRSkgewogICAgICAgICBTTE9HRSgiQmFkIGNyeXB0IHR5cGUgLSBlcnJvciIpOwogICAgIH0gZWxzZSBpZiAoY3J5cHRfdHlwZSAhPSBDUllQVF9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgU0xPR0QoIlBhc3N3b3JkIGlzIG5vdCBkZWZhdWx0IC0gIgotICAgICAgICAgICAgICAic3RhcnRpbmcgbWluIGZyYW1ld29yayB0byBwcm9tcHQiKTsKKyAgICAgICAgU0xPR0QoCisgICAgICAgICAgICAiUGFzc3dvcmQgaXMgbm90IGRlZmF1bHQgLSAiCisgICAgICAgICAgICAic3RhcnRpbmcgbWluIGZyYW1ld29yayB0byBwcm9tcHQiKTsKICAgICAgICAgcHJvcGVydHlfc2V0KCJ2b2xkLmRlY3J5cHQiLCAidHJpZ2dlcl9yZXN0YXJ0X21pbl9mcmFtZXdvcmsiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIGlmIChjcnlwdGZzX2NoZWNrX3Bhc3N3ZChERUZBVUxUX1BBU1NXT1JEKSA9PSAwKSB7CkBAIC0yODg3LDggKzI3ODYsNyBAQAogCiAvKiBSZXR1cm5zIHR5cGUgb2YgdGhlIHBhc3N3b3JkLCBkZWZhdWx0LCBwYXR0ZXJuLCBwaW4gb3IgcGFzc3dvcmQuCiAgKi8KLWludCBjcnlwdGZzX2dldF9wYXNzd29yZF90eXBlKHZvaWQpCi17CitpbnQgY3J5cHRmc19nZXRfcGFzc3dvcmRfdHlwZSh2b2lkKSB7CiAgICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoImNyeXB0ZnNfZ2V0X3Bhc3N3b3JkX3R5cGUgbm90IHZhbGlkIGZvciBmaWxlIGVuY3J5cHRpb24iKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjkwOCw4ICsyODA2LDcgQEAKICAgICByZXR1cm4gY3J5cHRfZnRyLmNyeXB0X3R5cGU7CiB9CiAKLWNvbnN0IGNoYXIqIGNyeXB0ZnNfZ2V0X3Bhc3N3b3JkKCkKLXsKK2NvbnN0IGNoYXIqIGNyeXB0ZnNfZ2V0X3Bhc3N3b3JkKCkgewogICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJjcnlwdGZzX2dldF9wYXNzd29yZCBub3QgdmFsaWQgZm9yIGZpbGUgZW5jcnlwdGlvbiIpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTI5MjUsOCArMjgyMiw3IEBACiAgICAgfQogfQogCi12b2lkIGNyeXB0ZnNfY2xlYXJfcGFzc3dvcmQoKQotewordm9pZCBjcnlwdGZzX2NsZWFyX3Bhc3N3b3JkKCkgewogICAgIGlmIChwYXNzd29yZCkgewogICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKHBhc3N3b3JkKTsKICAgICAgICAgbWVtc2V0KHBhc3N3b3JkLCAwLCBsZW4pOwpAQCAtMjkzNiw4ICsyODMyLDcgQEAKICAgICB9CiB9CiAKLWludCBjcnlwdGZzX2lzQ29udmVydGlibGVUb0ZCRSgpCi17CitpbnQgY3J5cHRmc19pc0NvbnZlcnRpYmxlVG9GQkUoKSB7CiAgICAgc3RydWN0IGZzdGFiX3JlYyogcmVjID0gZnNfbWdyX2dldF9lbnRyeV9mb3JfbW91bnRfcG9pbnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQpOwotICAgIHJldHVybiBmc19tZ3JfaXNfY29udmVydGlibGVfdG9fZmJlKHJlYykgPyAxIDogMDsKKyAgICByZXR1cm4gKHJlYyAmJiBmc19tZ3JfaXNfY29udmVydGlibGVfdG9fZmJlKHJlYykpID8gMSA6IDA7CiB9CmRpZmYgLS1naXQgYS9jcnlwdGZzLmggYi9jcnlwdGZzLmgKaW5kZXggZDZjN2RjNS4uNjkyZDdlZSAxMDA2NDQKLS0tIGEvY3J5cHRmcy5oCisrKyBiL2NyeXB0ZnMuaApAQCAtMjksOCArMjksMTAgQEAKICAqIHBhcnRpdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAvKiBUaGUgY3VycmVudCBjcnlwdGZzIHZlcnNpb24gKi8KQEAgLTQ5LDMyICs1MSwzOSBAQAogCiAvKiBkZWZpbml0aW9ucyBvZiBmbGFncyBpbiB0aGUgc3RydWN0dXJlIGJlbG93ICovCiAjZGVmaW5lIENSWVBUX01OVF9LRVlfVU5FTkNSWVBURUQgMHgxIC8qIFRoZSBrZXkgZm9yIHRoZSBwYXJ0aXRpb24gaXMgbm90IGVuY3J5cHRlZC4gKi8KLSNkZWZpbmUgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUyAweDIgLyogRW5jcnlwdGlvbiBwYXJ0aWFsbHkgY29tcGxldGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfdXB0byB2YWxpZCovCi0jZGVmaW5lIENSWVBUX0lOQ09OU0lTVEVOVF9TVEFURSAweDQgLyogU2V0IHdoZW4gc3RhcnRpbmcgZW5jcnlwdGlvbiwgY2xlYXIgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgY2xlYW5seSwgZWl0aGVyIHRocm91Z2ggc3VjY2VzcyBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RseSBtYXJrZWQgcGFydGlhbCBlbmNyeXB0aW9uICovCi0jZGVmaW5lIENSWVBUX0RBVEFfQ09SUlVQVCAweDggLyogU2V0IHdoZW4gZW5jcnlwdGlvbiBpcyBmaW5lLCBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJseWluZyB2b2x1bWUgaXMgY29ycnVwdCAqLwotI2RlZmluZSBDUllQVF9GT1JDRV9FTkNSWVBUSU9OIDB4MTAgLyogU2V0IHdoZW4gaXQgaXMgdGltZSB0byBlbmNyeXB0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSBvbiBib290LiBFdmVyeXRoaW5nIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBpcyBzZXQgdXAgY29ycmVjdGx5IGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aG91Z2ggZGV2aWNlIGlzIGVuY3J5cHRlZCBleGNlcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIG1hc3RlciBrZXkgaXMgZW5jcnlwdGVkIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHBhc3N3b3JkLiAqLwotI2RlZmluZSBDUllQVF9GT1JDRV9DT01QTEVURSAweDIwIC8qIFNldCB3aGVuIHRoZSBhYm92ZSBlbmNyeXB0aW9uIGN5Y2xlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUuIE9uIG5leHQgY3J5cHRrZWVwZXIgZW50cnksIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhc3N3b3JkLiBJZiBpdCBtYXRjaGVzIGZpeCB0aGUgbWFzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5IGFuZCByZW1vdmUgdGhpcyBmbGFnLiAqLworI2RlZmluZSBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTICAgICAgIFwKKyAgICAweDIgLyogRW5jcnlwdGlvbiBwYXJ0aWFsbHkgY29tcGxldGVkLCBcCisgICAgICAgICAgIGVuY3J5cHRlZF91cHRvIHZhbGlkKi8KKyNkZWZpbmUgQ1JZUFRfSU5DT05TSVNURU5UX1NUQVRFICAgICAgICAgICAgICAgICAgICBcCisgICAgMHg0IC8qIFNldCB3aGVuIHN0YXJ0aW5nIGVuY3J5cHRpb24sIGNsZWFyIHdoZW4gXAorICAgICAgICAgICBleGl0IGNsZWFubHksIGVpdGhlciB0aHJvdWdoIHN1Y2Nlc3Mgb3IgIFwKKyAgICAgICAgICAgY29ycmVjdGx5IG1hcmtlZCBwYXJ0aWFsIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUgQ1JZUFRfREFUQV9DT1JSVVBUICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAweDggLyogU2V0IHdoZW4gZW5jcnlwdGlvbiBpcyBmaW5lLCBidXQgdGhlIFwKKyAgICAgICAgICAgdW5kZXJseWluZyB2b2x1bWUgaXMgY29ycnVwdCAqLworI2RlZmluZSBDUllQVF9GT1JDRV9FTkNSWVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDB4MTAgLyogU2V0IHdoZW4gaXQgaXMgdGltZSB0byBlbmNyeXB0IHRoaXMgICAgICAgXAorICAgICAgICAgICAgdm9sdW1lIG9uIGJvb3QuIEV2ZXJ5dGhpbmcgaW4gdGhpcyAgICAgICAgXAorICAgICAgICAgICAgc3RydWN0dXJlIGlzIHNldCB1cCBjb3JyZWN0bHkgYXMgICAgICAgICAgXAorICAgICAgICAgICAgdGhvdWdoIGRldmljZSBpcyBlbmNyeXB0ZWQgZXhjZXB0ICAgICAgICAgXAorICAgICAgICAgICAgdGhhdCB0aGUgbWFzdGVyIGtleSBpcyBlbmNyeXB0ZWQgd2l0aCB0aGUgXAorICAgICAgICAgICAgZGVmYXVsdCBwYXNzd29yZC4gKi8KKyNkZWZpbmUgQ1JZUFRfRk9SQ0VfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgMHgyMCAvKiBTZXQgd2hlbiB0aGUgYWJvdmUgZW5jcnlwdGlvbiBjeWNsZSBpcyAgICAgXAorICAgICAgICAgICAgY29tcGxldGUuIE9uIG5leHQgY3J5cHRrZWVwZXIgZW50cnksIG1hdGNoIFwKKyAgICAgICAgICAgIHRoZSBwYXNzd29yZC4gSWYgaXQgbWF0Y2hlcyBmaXggdGhlIG1hc3RlciBcCisgICAgICAgICAgICBrZXkgYW5kIHJlbW92ZSB0aGlzIGZsYWcuICovCiAKIC8qIEFsbG93ZWQgdmFsdWVzIGZvciB0eXBlIGluIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgKi8KLSNkZWZpbmUgQ1JZUFRfVFlQRV9QQVNTV09SRCAwIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggYSBwYXNzd29yZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTXVzdCBiZSB6ZXJvIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBwcmUtTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGV2aWNlcyB3aGVyZSB0eXBlIGlzIGFsd2F5cyBwYXNzd29yZC4qLwotI2RlZmluZSBDUllQVF9UWVBFX0RFRkFVTFQgIDEgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXNzd29yZCAqLwotI2RlZmluZSBDUllQVF9UWVBFX1BBVFRFUk4gIDIgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBhdHRlcm4gKi8KLSNkZWZpbmUgQ1JZUFRfVFlQRV9QSU4gICAgICAzIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggYSBwaW4gKi8KKyNkZWZpbmUgQ1JZUFRfVFlQRV9QQVNTV09SRCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDAgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBhc3N3b3JkICBcCisgICAgICAgKiBNdXN0IGJlIHplcm8gdG8gYmUgY29tcGF0aWJsZSB3aXRoIHByZS1MIFwKKyAgICAgICAqIGRldmljZXMgd2hlcmUgdHlwZSBpcyBhbHdheXMgcGFzc3dvcmQuKi8KKyNkZWZpbmUgQ1JZUFRfVFlQRV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAxICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBkZWZhdWx0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc3dvcmQgKi8KKyNkZWZpbmUgQ1JZUFRfVFlQRV9QQVRURVJOIDIgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBhdHRlcm4gKi8KKyNkZWZpbmUgQ1JZUFRfVFlQRV9QSU4gMyAgICAgLyogbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQgd2l0aCBhIHBpbiAqLwogI2RlZmluZSBDUllQVF9UWVBFX01BWF9UWVBFIDMgLyogdHlwZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSAqLwogCiAjZGVmaW5lIENSWVBUX01OVF9NQUdJQyAweEQwQjVCMUM0CkBAIC05MCw3OCArOTksNzggQEAKICNkZWZpbmUgS0VZTUFTVEVSX0JMT0JfU0laRSAyMDQ4CiAKIC8qIF9fbGUzMiBhbmQgX19sZTE2IGRlZmluZWQgaW4gc3lzdGVtL2V4dHJhcy9leHQ0X3V0aWxzL2V4dDRfdXRpbHMuaCAqLwotI2RlZmluZSBfX2xlOCAgdW5zaWduZWQgY2hhcgorI2RlZmluZSBfX2xlOCB1bnNpZ25lZCBjaGFyCiAKICNpZiAhZGVmaW5lZChTSEEyNTZfRElHRVNUX0xFTkdUSCkKICNkZWZpbmUgU0hBMjU2X0RJR0VTVF9MRU5HVEggMzIKICNlbmRpZgogCiBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciB7Ci0gIF9fbGUzMiBtYWdpYzsgICAgICAgICAvKiBTZWUgYWJvdmUgKi8KLSAgX19sZTE2IG1ham9yX3ZlcnNpb247Ci0gIF9fbGUxNiBtaW5vcl92ZXJzaW9uOwotICBfX2xlMzIgZnRyX3NpemU7ICAgICAgLyogaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcga2V5IGZvbGxvd2luZyAqLwotICBfX2xlMzIgZmxhZ3M7ICAgICAgICAgLyogU2VlIGFib3ZlICovCi0gIF9fbGUzMiBrZXlzaXplOyAgICAgICAvKiBpbiBieXRlcyAqLwotICBfX2xlMzIgY3J5cHRfdHlwZTsgICAgLyogaG93IG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkLiBNdXN0IGJlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIENSWVBUX1RZUEVfWFhYIHZhbHVlICovCi0gIF9fbGU2NCBmc19zaXplOyAgICAgICAvKiBTaXplIG9mIHRoZSBlbmNyeXB0ZWQgZnMsIGluIDUxMiBieXRlIHNlY3RvcnMgKi8KLSAgX19sZTMyIGZhaWxlZF9kZWNyeXB0X2NvdW50OyAvKiBjb3VudCBvZiAjIG9mIGZhaWxlZCBhdHRlbXB0cyB0byBkZWNyeXB0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50LCBzZXQgdG8gMCBvbiBzdWNjZXNzZnVsIG1vdW50ICovCi0gIHVuc2lnbmVkIGNoYXIgY3J5cHRvX3R5cGVfbmFtZVtNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU5dOyAvKiBUaGUgdHlwZSBvZiBlbmNyeXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gZGVjcnlwdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24sIG51bGwgdGVybWluYXRlZCAqLwotICBfX2xlMzIgc3BhcmUyOyAgICAgICAgLyogaWdub3JlZCAqLwotICB1bnNpZ25lZCBjaGFyIG1hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOyAvKiBUaGUgZW5jcnlwdGVkIGtleSBmb3IgZGVjcnlwdGluZyB0aGUgZmlsZXN5c3RlbSAqLwotICB1bnNpZ25lZCBjaGFyIHNhbHRbU0FMVF9MRU5dOyAgIC8qIFRoZSBzYWx0IHVzZWQgZm9yIHRoaXMgZW5jcnlwdGlvbiAqLwotICBfX2xlNjQgcGVyc2lzdF9kYXRhX29mZnNldFsyXTsgIC8qIEFic29sdXRlIG9mZnNldCB0byBib3RoIGNvcGllcyBvZiBjcnlwdF9wZXJzaXN0X2RhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbiBkZXZpY2Ugd2l0aCB0aGF0IGluZm8sIGVpdGhlciB0aGUgZm9vdGVyIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWxfYmxrZGV2aWNlIG9yIHRoZSBtZXRhZGF0YSBwYXJ0aXRpb24uICovCisgICAgX19sZTMyIG1hZ2ljOyAvKiBTZWUgYWJvdmUgKi8KKyAgICBfX2xlMTYgbWFqb3JfdmVyc2lvbjsKKyAgICBfX2xlMTYgbWlub3JfdmVyc2lvbjsKKyAgICBfX2xlMzIgZnRyX3NpemU7ICAgICAgICAgICAgIC8qIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIGtleSBmb2xsb3dpbmcgKi8KKyAgICBfX2xlMzIgZmxhZ3M7ICAgICAgICAgICAgICAgIC8qIFNlZSBhYm92ZSAqLworICAgIF9fbGUzMiBrZXlzaXplOyAgICAgICAgICAgICAgLyogaW4gYnl0ZXMgKi8KKyAgICBfX2xlMzIgY3J5cHRfdHlwZTsgICAgICAgICAgIC8qIGhvdyBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZC4gTXVzdCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDUllQVF9UWVBFX1hYWCB2YWx1ZSAqLworICAgIF9fbGU2NCBmc19zaXplOyAgICAgICAgICAgICAgLyogU2l6ZSBvZiB0aGUgZW5jcnlwdGVkIGZzLCBpbiA1MTIgYnl0ZSBzZWN0b3JzICovCisgICAgX19sZTMyIGZhaWxlZF9kZWNyeXB0X2NvdW50OyAvKiBjb3VudCBvZiAjIG9mIGZhaWxlZCBhdHRlbXB0cyB0byBkZWNyeXB0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnQsIHNldCB0byAwIG9uIHN1Y2Nlc3NmdWwgbW91bnQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGNyeXB0b190eXBlX25hbWVbTUFYX0NSWVBUT19UWVBFX05BTUVfTEVOXTsgLyogVGhlIHR5cGUgb2YgZW5jcnlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gZGVjcnlwdCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiwgbnVsbCB0ZXJtaW5hdGVkICovCisgICAgX19sZTMyIHNwYXJlMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG1hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOyAvKiBUaGUgZW5jcnlwdGVkIGtleSBmb3IgZGVjcnlwdGluZyB0aGUgZmlsZXN5c3RlbSAqLworICAgIHVuc2lnbmVkIGNoYXIgc2FsdFtTQUxUX0xFTl07ICAgICAgICAgIC8qIFRoZSBzYWx0IHVzZWQgZm9yIHRoaXMgZW5jcnlwdGlvbiAqLworICAgIF9fbGU2NCBwZXJzaXN0X2RhdGFfb2Zmc2V0WzJdOyAgICAgICAgIC8qIEFic29sdXRlIG9mZnNldCB0byBib3RoIGNvcGllcyBvZiBjcnlwdF9wZXJzaXN0X2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbiBkZXZpY2Ugd2l0aCB0aGF0IGluZm8sIGVpdGhlciB0aGUgZm9vdGVyIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWxfYmxrZGV2aWNlIG9yIHRoZSBtZXRhZGF0YSBwYXJ0aXRpb24uICovCiAKLSAgX19sZTMyIHBlcnNpc3RfZGF0YV9zaXplOyAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCB0byBlYWNoIGNvcHkgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGVyc2lzdGVudCBkYXRhIHRhYmxlKi8KKyAgICBfX2xlMzIgcGVyc2lzdF9kYXRhX3NpemU7IC8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIHRvIGVhY2ggY29weSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBlcnNpc3RlbnQgZGF0YSB0YWJsZSovCiAKLSAgX19sZTggIGtkZl90eXBlOyAvKiBUaGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gdXNlZC4gKi8KKyAgICBfX2xlOCBrZGZfdHlwZTsgLyogVGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIHVzZWQuICovCiAKLSAgLyogc2NyeXB0IHBhcmFtZXRlcnMuIFNlZSB3d3cudGFyc25hcC5jb20vc2NyeXB0L3NjcnlwdC5wZGYgKi8KLSAgX19sZTggIE5fZmFjdG9yOyAvKiAoMSA8PCBOKSAqLwotICBfX2xlOCAgcl9mYWN0b3I7IC8qICgxIDw8IHIpICovCi0gIF9fbGU4ICBwX2ZhY3RvcjsgLyogKDEgPDwgcCkgKi8KLSAgX19sZTY0IGVuY3J5cHRlZF91cHRvOyAvKiBJZiB3ZSBhcmUgaW4gc3RhdGUgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHN0b3AgKGUuZy4gcG93ZXIgbG93KSB0aGlzIGlzIHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIDUxMiBieXRlIHNlY3Rvci4qLwotICBfX2xlOCAgaGFzaF9maXJzdF9ibG9ja1tTSEEyNTZfRElHRVNUX0xFTkdUSF07IC8qIFdoZW4gQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgaGFzaCBvZiBmaXJzdCBibG9jaywgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHZhbGlkYXRlIGJlZm9yZSBjb250aW51aW5nKi8KKyAgICAvKiBzY3J5cHQgcGFyYW1ldGVycy4gU2VlIHd3dy50YXJzbmFwLmNvbS9zY3J5cHQvc2NyeXB0LnBkZiAqLworICAgIF9fbGU4IE5fZmFjdG9yOyAgICAgICAgLyogKDEgPDwgTikgKi8KKyAgICBfX2xlOCByX2ZhY3RvcjsgICAgICAgIC8qICgxIDw8IHIpICovCisgICAgX19sZTggcF9mYWN0b3I7ICAgICAgICAvKiAoMSA8PCBwKSAqLworICAgIF9fbGU2NCBlbmNyeXB0ZWRfdXB0bzsgLyogSWYgd2UgYXJlIGluIHN0YXRlIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHN0b3AgKGUuZy4gcG93ZXIgbG93KSB0aGlzIGlzIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgNTEyIGJ5dGUgc2VjdG9yLiovCisgICAgX19sZTggaGFzaF9maXJzdF9ibG9ja1tTSEEyNTZfRElHRVNUX0xFTkdUSF07IC8qIFdoZW4gQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsIGhhc2ggb2YgZmlyc3QgYmxvY2ssIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdmFsaWRhdGUgYmVmb3JlIGNvbnRpbnVpbmcqLwogCi0gIC8qIGtleV9tYXN0ZXIga2V5LCB1c2VkIHRvIHNpZ24gdGhlIGRlcml2ZWQga2V5IHdoaWNoIGlzIHRoZW4gdXNlZCB0byBnZW5lcmF0ZQotICAgKiB0aGUgaW50ZXJtZWRpYXRlIGtleQotICAgKiBUaGlzIGtleSBzaG91bGQgYmUgdXNlZCBmb3Igbm8gb3RoZXIgcHVycG9zZXMhIFdlIHVzZSB0aGlzIGtleSB0byBzaWduIHVucGFkZGVkIAotICAgKiBkYXRhLCB3aGljaCBpcyBhY2NlcHRhYmxlIGJ1dCBvbmx5IGlmIHRoZSBrZXkgaXMgbm90IHJldXNlZCBlbHNld2hlcmUuICovCi0gIF9fbGU4IGtleW1hc3Rlcl9ibG9iW0tFWU1BU1RFUl9CTE9CX1NJWkVdOwotICBfX2xlMzIga2V5bWFzdGVyX2Jsb2Jfc2l6ZTsKKyAgICAvKiBrZXlfbWFzdGVyIGtleSwgdXNlZCB0byBzaWduIHRoZSBkZXJpdmVkIGtleSB3aGljaCBpcyB0aGVuIHVzZWQgdG8gZ2VuZXJhdGUKKyAgICAgKiB0aGUgaW50ZXJtZWRpYXRlIGtleQorICAgICAqIFRoaXMga2V5IHNob3VsZCBiZSB1c2VkIGZvciBubyBvdGhlciBwdXJwb3NlcyEgV2UgdXNlIHRoaXMga2V5IHRvIHNpZ24gdW5wYWRkZWQKKyAgICAgKiBkYXRhLCB3aGljaCBpcyBhY2NlcHRhYmxlIGJ1dCBvbmx5IGlmIHRoZSBrZXkgaXMgbm90IHJldXNlZCBlbHNld2hlcmUuICovCisgICAgX19sZTgga2V5bWFzdGVyX2Jsb2JbS0VZTUFTVEVSX0JMT0JfU0laRV07CisgICAgX19sZTMyIGtleW1hc3Rlcl9ibG9iX3NpemU7CiAKLSAgLyogU3RvcmUgc2NyeXB0IG9mIHNhbHRlZCBpbnRlcm1lZGlhdGUga2V5LiBXaGVuIGRlY3J5cHRpb24gZmFpbHMsIHdlIGNhbgotICAgICBjaGVjayBpZiB0aGlzIG1hdGNoZXMsIGFuZCBpZiBpdCBkb2VzLCB3ZSBrbm93IHRoYXQgdGhlIHByb2JsZW0gaXMgd2l0aCB0aGUKLSAgICAgZHJpdmUsIGFuZCB0aGVyZSBpcyBubyBwb2ludCBpbiBhc2tpbmcgdGhlIHVzZXIgZm9yIG1vcmUgcGFzc3dvcmRzLgorICAgIC8qIFN0b3JlIHNjcnlwdCBvZiBzYWx0ZWQgaW50ZXJtZWRpYXRlIGtleS4gV2hlbiBkZWNyeXB0aW9uIGZhaWxzLCB3ZSBjYW4KKyAgICAgICBjaGVjayBpZiB0aGlzIG1hdGNoZXMsIGFuZCBpZiBpdCBkb2VzLCB3ZSBrbm93IHRoYXQgdGhlIHByb2JsZW0gaXMgd2l0aCB0aGUKKyAgICAgICBkcml2ZSwgYW5kIHRoZXJlIGlzIG5vIHBvaW50IGluIGFza2luZyB0aGUgdXNlciBmb3IgbW9yZSBwYXNzd29yZHMuCiAKLSAgICAgTm90ZSB0aGF0IGlmIGFueSBwYXJ0IG9mIHRoaXMgc3RydWN0dXJlIGlzIGNvcnJ1cHQsIHRoaXMgd2lsbCBub3QgbWF0Y2ggYW5kCi0gICAgIHdlIHdpbGwgY29udGludWUgdG8gYmVsaWV2ZSB0aGUgdXNlciBlbnRlcmVkIHRoZSB3cm9uZyBwYXNzd29yZC4gSW4gdGhhdAotICAgICBjYXNlIHRoZSBvbmx5IHNvbHV0aW9uIGlzIGZvciB0aGUgdXNlciB0byBlbnRlciBhIHBhc3N3b3JkIGVub3VnaCB0aW1lcyB0bwotICAgICBmb3JjZSBhIHdpcGUuCisgICAgICAgTm90ZSB0aGF0IGlmIGFueSBwYXJ0IG9mIHRoaXMgc3RydWN0dXJlIGlzIGNvcnJ1cHQsIHRoaXMgd2lsbCBub3QgbWF0Y2ggYW5kCisgICAgICAgd2Ugd2lsbCBjb250aW51ZSB0byBiZWxpZXZlIHRoZSB1c2VyIGVudGVyZWQgdGhlIHdyb25nIHBhc3N3b3JkLiBJbiB0aGF0CisgICAgICAgY2FzZSB0aGUgb25seSBzb2x1dGlvbiBpcyBmb3IgdGhlIHVzZXIgdG8gZW50ZXIgYSBwYXNzd29yZCBlbm91Z2ggdGltZXMgdG8KKyAgICAgICBmb3JjZSBhIHdpcGUuCiAKLSAgICAgTm90ZSBhbHNvIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBtaWdyYXRpb24uIElmIHRoaXMgZGF0YSBpcwotICAgICB3cm9uZywgd2Ugc2ltcGx5IHdvbid0IHJlY29nbmlzZSBhIHJpZ2h0IHBhc3N3b3JkLCBhbmQgd2lsbCBjb250aW51ZSB0bwotICAgICBwcm9tcHQuIE9uIHRoZSBmaXJzdCBwYXNzd29yZCBjaGFuZ2UsIHRoaXMgdmFsdWUgd2lsbCBiZSBwb3B1bGF0ZWQgYW5kCi0gICAgIHRoZW4gd2Ugd2lsbCBiZSBPSy4KLSAgICovCi0gIHVuc2lnbmVkIGNoYXIgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleVtTQ1JZUFRfTEVOXTsKKyAgICAgICBOb3RlIGFsc28gdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IG1pZ3JhdGlvbi4gSWYgdGhpcyBkYXRhIGlzCisgICAgICAgd3JvbmcsIHdlIHNpbXBseSB3b24ndCByZWNvZ25pc2UgYSByaWdodCBwYXNzd29yZCwgYW5kIHdpbGwgY29udGludWUgdG8KKyAgICAgICBwcm9tcHQuIE9uIHRoZSBmaXJzdCBwYXNzd29yZCBjaGFuZ2UsIHRoaXMgdmFsdWUgd2lsbCBiZSBwb3B1bGF0ZWQgYW5kCisgICAgICAgdGhlbiB3ZSB3aWxsIGJlIE9LLgorICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleVtTQ1JZUFRfTEVOXTsKIAotICAvKiBzaGEgb2YgdGhpcyBzdHJ1Y3R1cmUgd2l0aCB0aGlzIGVsZW1lbnQgc2V0IHRvIHplcm8KLSAgICAgVXNlZCB3aGVuIGVuY3J5cHRpbmcgb24gcmVib290IHRvIHZhbGlkYXRlIHN0cnVjdHVyZSBiZWZvcmUgZG9pbmcgc29tZXRoaW5nCi0gICAgIGZhdGFsCi0gICAqLwotICB1bnNpZ25lZCBjaGFyIHNoYTI1NltTSEEyNTZfRElHRVNUX0xFTkdUSF07CisgICAgLyogc2hhIG9mIHRoaXMgc3RydWN0dXJlIHdpdGggdGhpcyBlbGVtZW50IHNldCB0byB6ZXJvCisgICAgICAgVXNlZCB3aGVuIGVuY3J5cHRpbmcgb24gcmVib290IHRvIHZhbGlkYXRlIHN0cnVjdHVyZSBiZWZvcmUgZG9pbmcgc29tZXRoaW5nCisgICAgICAgZmF0YWwKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNoYTI1NltTSEEyNTZfRElHRVNUX0xFTkdUSF07CiB9OwogCiAvKiBQZXJzaXN0YW50IGRhdGEgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGJlZm9yZSBkZWNyeXB0aW9uLgpAQCAtMTc4LDQ5ICsxODcsNDkgQEAKICAqIGFuZCBoaWdoZXIgY3J5cHRfbW50X2Z0ciBzdHJ1Y3R1cmVzLgogICovCiBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9lbnRyeSB7Ci0gIGNoYXIga2V5W1BST1BFUlRZX0tFWV9NQVhdOwotICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNoYXIga2V5W1BST1BFUlRZX0tFWV9NQVhdOworICAgIGNoYXIgdmFsW1BST1BFUlRZX1ZBTFVFX01BWF07CiB9OwogCiAvKiBTaG91bGQgYmUgZXhhY3RseSA0SyBpbiBzaXplICovCiBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhIHsKLSAgX19sZTMyIHBlcnNpc3RfbWFnaWM7Ci0gIF9fbGUzMiBwZXJzaXN0X3ZhbGlkX2VudHJpZXM7Ci0gIF9fbGUzMiBwZXJzaXN0X3NwYXJlWzMwXTsKLSAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZW50cnkgcGVyc2lzdF9lbnRyeVswXTsKKyAgICBfX2xlMzIgcGVyc2lzdF9tYWdpYzsKKyAgICBfX2xlMzIgcGVyc2lzdF92YWxpZF9lbnRyaWVzOworICAgIF9fbGUzMiBwZXJzaXN0X3NwYXJlWzMwXTsKKyAgICBzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9lbnRyeSBwZXJzaXN0X2VudHJ5WzBdOwogfTsKIAogI2RlZmluZSBEQVRBX01OVF9QT0lOVCAiL2RhdGEiCiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIGNyeXB0ZnNfY3J5cHRvX2NvbXBsZXRlICovCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEICAxCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9FTkNSWVBURUQgICAgICAwCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9CQURfTUVUQURBVEEgICgtMSkKLSNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX1BBUlRJQUwgICAgICAgKC0yKQotI2RlZmluZSBDUllQVE9fQ09NUExFVEVfSU5DT05TSVNURU5UICAoLTMpCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9DT1JSVVBUICAgICAgICgtNCkKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQgMQorI2RlZmluZSBDUllQVE9fQ09NUExFVEVfRU5DUllQVEVEIDAKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0JBRF9NRVRBREFUQSAoLTEpCisjZGVmaW5lIENSWVBUT19DT01QTEVURV9QQVJUSUFMICgtMikKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0lOQ09OU0lTVEVOVCAoLTMpCisjZGVmaW5lIENSWVBUT19DT01QTEVURV9DT1JSVVBUICgtNCkKIAogLyogUmV0dXJuIHZhbHVlcyBmb3IgY3J5cHRmc19lbmFibGVfaW5wbGFjZSooKSAqLwogI2RlZmluZSBFTkFCTEVfSU5QTEFDRV9PSyAwCiAjZGVmaW5lIEVOQUJMRV9JTlBMQUNFX0VSUl9PVEhFUiAoLTEpCi0jZGVmaW5lIEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYgKC0yKSAgLyogY3J5cHRvX2Jsa2RldiBpc3N1ZSAqLworI2RlZmluZSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWICgtMikgLyogY3J5cHRvX2Jsa2RldiBpc3N1ZSAqLwogCiAvKiBSZXR1cm4gdmFsdWVzIGZvciBjcnlwdGZzX2dldGZpZWxkICovCi0jZGVmaW5lIENSWVBUT19HRVRGSUVMRF9PSyAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIENSWVBUT19HRVRGSUVMRF9FUlJPUl9OT19GSUVMRCAgICAgICgtMSkKLSNkZWZpbmUgQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX09USEVSICAgICAgICAgKC0yKQorI2RlZmluZSBDUllQVE9fR0VURklFTERfT0sgMAorI2RlZmluZSBDUllQVE9fR0VURklFTERfRVJST1JfTk9fRklFTEQgKC0xKQorI2RlZmluZSBDUllQVE9fR0VURklFTERfRVJST1JfT1RIRVIgKC0yKQogI2RlZmluZSBDUllQVE9fR0VURklFTERfRVJST1JfQlVGX1RPT19TTUFMTCAoLTMpCiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIGNyeXB0ZnNfc2V0ZmllbGQgKi8KLSNkZWZpbmUgQ1JZUFRPX1NFVEZJRUxEX09LICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIENSWVBUT19TRVRGSUVMRF9FUlJPUl9PVEhFUiAgICAgICAgICAoLTEpCisjZGVmaW5lIENSWVBUT19TRVRGSUVMRF9PSyAwCisjZGVmaW5lIENSWVBUT19TRVRGSUVMRF9FUlJPUl9PVEhFUiAoLTEpCiAjZGVmaW5lIENSWVBUT19TRVRGSUVMRF9FUlJPUl9GSUVMRF9UT09fTE9ORyAoLTIpCiAjZGVmaW5lIENSWVBUT19TRVRGSUVMRF9FUlJPUl9WQUxVRV9UT09fTE9ORyAoLTMpCiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIHBlcnNpc3RfZGVsX2tleSAqLwotI2RlZmluZSBQRVJTSVNUX0RFTF9LRVlfT0sgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX0VSUk9SX09USEVSICAgICAgICgtMSkKLSNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX0VSUk9SX05PX0ZJRUxEICAgICgtMikKKyNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX09LIDAKKyNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX0VSUk9SX09USEVSICgtMSkKKyNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX0VSUk9SX05PX0ZJRUxEICgtMikKIAogaW50IG1hdGNoX211bHRpX2VudHJ5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogZmllbGQsIHVuc2lnbmVkIGluZGV4KTsKIGludCB3YWl0X2FuZF91bm1vdW50KGNvbnN0IGNoYXIqIG1vdW50cG9pbnQsIGJvb2wga2lsbCk7CmRpZmYgLS1naXQgYS9mcy9FeHQ0LmNwcCBiL2ZzL0V4dDQuY3BwCmluZGV4IDg5Yjg0MTQuLjdhYzQ4NTMgMTAwNjQ0Ci0tLSBhL2ZzL0V4dDQuY3BwCisrKyBiL2ZzL0V4dDQuY3BwCkBAIC0xNCwzMyArMTQsMjcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KIAotI2RlZmluZSBMT0dfVEFHICJWb2xkIgotCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxleHQ0X3V0aWxzL2V4dDRfY3J5cHQuaD4KICNpbmNsdWRlIDxsb2d3cmFwL2xvZ3dyYXAuaD4KQEAgLTYyLDkgKzU2LDggQEAKIHN0YXRpYyBjb25zdCBjaGFyKiBrRnNja1BhdGggPSAiL3N5c3RlbS9iaW4vZTJmc2NrIjsKIAogYm9vbCBJc1N1cHBvcnRlZCgpIHsKLSAgICByZXR1cm4gYWNjZXNzKGtNa2ZzUGF0aCwgWF9PSykgPT0gMAotICAgICAgICAgICAgJiYgYWNjZXNzKGtGc2NrUGF0aCwgWF9PSykgPT0gMAotICAgICAgICAgICAgJiYgSXNGaWxlc3lzdGVtU3VwcG9ydGVkKCJleHQ0Iik7CisgICAgcmV0dXJuIGFjY2VzcyhrTWtmc1BhdGgsIFhfT0spID09IDAgJiYgYWNjZXNzKGtGc2NrUGF0aCwgWF9PSykgPT0gMCAmJgorICAgICAgICAgICBJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKTsKIH0KIAogc3RhdHVzX3QgQ2hlY2soY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCkgewpAQCAtNzcsNyArNzAsNyBAQAogICAgIGludCBzdGF0dXM7CiAgICAgaW50IHJldDsKICAgICBsb25nIHRtcG1udF9mbGFncyA9IE1TX05PQVRJTUUgfCBNU19OT0VYRUMgfCBNU19OT1NVSUQ7Ci0gICAgY2hhciAqdG1wbW50X29wdHMgPSAoY2hhciopICJub21ibGtfaW9fc3VibWl0LGVycm9ycz1yZW1vdW50LXJvIjsKKyAgICBjaGFyKiB0bXBtbnRfb3B0cyA9IChjaGFyKikibm9tYmxrX2lvX3N1Ym1pdCxlcnJvcnM9cmVtb3VudC1ybyI7CiAKICAgICAvKgogICAgICAqIEZpcnN0IHRyeSB0byBtb3VudCBhbmQgdW5tb3VudCB0aGUgZmlsZXN5c3RlbS4gIFdlIGRvIHRoaXMgYmVjYXVzZQpAQCAtMTAyLDcgKzk1LDggQEAKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1coIiVzKCk6IHVtb3VudCglcyk9JWQ6ICVzXG4iLCBfX2Z1bmNfXywgY190YXJnZXQsIHJlc3VsdCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiKCk6IHVtb3VudCgiIDw8IGNfdGFyZ2V0IDw8ICIpPSIgPDwgcmVzdWx0IDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJlcnJvcihlcnJubyk7CiAgICAgICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgfQogICAgIH0KQEAgLTExMiwxMCArMTA2LDEwIEBACiAgICAgICogKGUuZy4gcmVjZW50IFNESyBzeXN0ZW0gaW1hZ2VzKS4gRGV0ZWN0IHRoZXNlIGFuZCBza2lwIHRoZSBjaGVjay4KICAgICAgKi8KICAgICBpZiAoYWNjZXNzKGtGc2NrUGF0aCwgWF9PSykpIHsKLSAgICAgICAgQUxPR0QoIk5vdCBydW5uaW5nICVzIG9uICVzIChleGVjdXRhYmxlIG5vdCBpbiBzeXN0ZW0gaW1hZ2UpXG4iLAotICAgICAgICAgICAgICAgIGtGc2NrUGF0aCwgY19zb3VyY2UpOworICAgICAgICBMT0coREVCVUcpIDw8ICJOb3QgcnVubmluZyAiIDw8IGtGc2NrUGF0aCA8PCAiIG9uICIgPDwgY19zb3VyY2UKKyAgICAgICAgICAgICAgICAgICA8PCAiIChleGVjdXRhYmxlIG5vdCBpbiBzeXN0ZW0gaW1hZ2UpIjsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiUnVubmluZyAlcyBvbiAlc1xuIiwga0ZzY2tQYXRoLCBjX3NvdXJjZSk7CisgICAgICAgIExPRyhERUJVRykgPDwgIlJ1bm5pbmcgIiA8PCBrRnNja1BhdGggPDwgIiBvbiAiIDw8IGNfc291cmNlOwogCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjbWQ7CiAgICAgICAgIGNtZC5wdXNoX2JhY2soa0ZzY2tQYXRoKTsKQEAgLTEyOSw4ICsxMjMsOCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLAotICAgICAgICBib29sIHJlbW91bnQsIGJvb2wgZXhlY3V0YWJsZSkgeworc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywgYm9vbCByZW1vdW50LAorICAgICAgICAgICAgICAgYm9vbCBleGVjdXRhYmxlKSB7CiAgICAgaW50IHJjOwogICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE2NCw4ICsxNTgsNyBAQAogICAgIHJldHVybiBGb3JrRXhlY3ZwKGNtZCk7CiB9CiAKLXN0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpIHsKK3N0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY21kOwogICAgIGNtZC5wdXNoX2JhY2soa01rZnNQYXRoKTsKIApkaWZmIC0tZ2l0IGEvZnMvRXh0NC5oIGIvZnMvRXh0NC5oCmluZGV4IGY3OGRjOTUuLjMyOWYzMDIgMTAwNjQ0Ci0tLSBhL2ZzL0V4dDQuaAorKysgYi9mcy9FeHQ0LmgKQEAgLTI4LDEwICsyOCw5IEBACiBib29sIElzU3VwcG9ydGVkKCk7CiAKIHN0YXR1c190IENoZWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpOwotc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywKLSAgICAgICAgYm9vbCByZW1vdW50LCBib29sIGV4ZWN1dGFibGUpOwotc3RhdHVzX3QgRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCk7CitzdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLCBib29sIHJlbW91bnQsCisgICAgICAgICAgICAgICBib29sIGV4ZWN1dGFibGUpOworc3RhdHVzX3QgRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCk7CiBzdGF0dXNfdCBSZXNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKTsKIAogfSAgLy8gbmFtZXNwYWNlIGV4dDQKZGlmZiAtLWdpdCBhL2ZzL0YyZnMuY3BwIGIvZnMvRjJmcy5jcHAKaW5kZXggZjI0ZmQ5MS4uOWQ3Mjk2MyAxMDA2NDQKLS0tIGEvZnMvRjJmcy5jcHAKKysrIGIvZnMvRjJmcy5jcHAKQEAgLTIyLDggKzIyLDggQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CiAKLSNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogCkBAIC0zNyw5ICszNyw4IEBACiBzdGF0aWMgY29uc3QgY2hhcioga0ZzY2tQYXRoID0gIi9zeXN0ZW0vYmluL2ZzY2suZjJmcyI7CiAKIGJvb2wgSXNTdXBwb3J0ZWQoKSB7Ci0gICAgcmV0dXJuIGFjY2VzcyhrTWtmc1BhdGgsIFhfT0spID09IDAKLSAgICAgICAgICAgICYmIGFjY2VzcyhrRnNja1BhdGgsIFhfT0spID09IDAKLSAgICAgICAgICAgICYmIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZjJmcyIpOworICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwICYmIGFjY2VzcyhrRnNja1BhdGgsIFhfT0spID09IDAgJiYKKyAgICAgICAgICAgSXNGaWxlc3lzdGVtU3VwcG9ydGVkKCJmMmZzIik7CiB9CiAKIHN0YXR1c190IENoZWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UpIHsKZGlmZiAtLWdpdCBhL2ZzL1ZmYXQuY3BwIGIvZnMvVmZhdC5jcHAKaW5kZXggNTM4MTc4ZS4uN2I4MzNkMSAxMDA2NDQKLS0tIGEvZnMvVmZhdC5jcHAKKysrIGIvZnMvVmZhdC5jcHAKQEAgLTE0LDI0ICsxNCwyMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9tb3VudC5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogCkBAIC00MSw4ICszOCw4IEBACiAKICNpbmNsdWRlIDxsb2d3cmFwL2xvZ3dyYXAuaD4KIAotI2luY2x1ZGUgIlZmYXQuaCIKICNpbmNsdWRlICJVdGlscy5oIgorI2luY2x1ZGUgIlZmYXQuaCIKICNpbmNsdWRlICJWb2xkVXRpbC5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CkBAIC01NSw5ICs1Miw4IEBACiBzdGF0aWMgY29uc3QgY2hhcioga0ZzY2tQYXRoID0gIi9zeXN0ZW0vYmluL2ZzY2tfbXNkb3MiOwogCiBib29sIElzU3VwcG9ydGVkKCkgewotICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoInZmYXQiKTsKKyAgICByZXR1cm4gYWNjZXNzKGtNa2ZzUGF0aCwgWF9PSykgPT0gMCAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwICYmCisgICAgICAgICAgIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgidmZhdCIpOwogfQogCiBzdGF0dXNfdCBDaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlKSB7CkBAIC03OSw0MyArNzUsNDIgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIHN3aXRjaChyYykgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgY29tcGxldGVkIE9LIjsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzd2l0Y2ggKHJjKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGNvbXBsZXRlZCBPSyI7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKG5vdCBhIEZBVCBmaWxlc3lzdGVtKSI7Ci0gICAgICAgICAgICBlcnJubyA9IEVOT0RBVEE7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKG5vdCBhIEZBVCBmaWxlc3lzdGVtKSI7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFTk9EQVRBOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBpZiAocGFzcysrIDw9IDMpIHsKLSAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkZpbGVzeXN0ZW0gbW9kaWZpZWQgLSByZWNoZWNraW5nIChwYXNzICIgPDwgcGFzcyA8PCAiKSI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsaW5nIGNoZWNrIGFmdGVyIHRvbyBtYW55IHJlY2hlY2tzIjsKLSAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGlmIChwYXNzKysgPD0gMykgeworICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkZpbGVzeXN0ZW0gbW9kaWZpZWQgLSByZWNoZWNraW5nIChwYXNzICIgPDwgcGFzcyA8PCAiKSI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsaW5nIGNoZWNrIGFmdGVyIHRvbyBtYW55IHJlY2hlY2tzIjsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKG5vIGZpbGVzeXN0ZW0pIjsKLSAgICAgICAgICAgIGVycm5vID0gRU5PREFUQTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCAobm8gZmlsZXN5c3RlbSkiOworICAgICAgICAgICAgICAgIGVycm5vID0gRU5PREFUQTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgZmFpbGVkICh1bmtub3duIGV4aXQgY29kZSAiIDw8IHJjIDw8ICIpIjsKLSAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCAodW5rbm93biBleGl0IGNvZGUgIiA8PCByYyA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfSB3aGlsZSAoMCk7CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywKLSAgICAgICAgYm9vbCByZW1vdW50LCBib29sIGV4ZWN1dGFibGUsIGludCBvd25lclVpZCwgaW50IG93bmVyR2lkLCBpbnQgcGVybU1hc2ssCi0gICAgICAgIGJvb2wgY3JlYXRlTG9zdCkgeworc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywgYm9vbCByZW1vdW50LAorICAgICAgICAgICAgICAgYm9vbCBleGVjdXRhYmxlLCBpbnQgb3duZXJVaWQsIGludCBvd25lckdpZCwgaW50IHBlcm1NYXNrLCBib29sIGNyZWF0ZUxvc3QpIHsKICAgICBpbnQgcmM7CiAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTI4LDkgKzEyMyw5IEBACiAgICAgZmxhZ3MgfD0gKHJvID8gTVNfUkRPTkxZIDogMCk7CiAgICAgZmxhZ3MgfD0gKHJlbW91bnQgPyBNU19SRU1PVU5UIDogMCk7CiAKLSAgICBhdXRvIG1vdW50RGF0YSA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICJ1dGY4LHVpZD0lZCxnaWQ9JWQsZm1hc2s9JW8sZG1hc2s9JW8sc2hvcnRuYW1lPW1peGVkIiwKLSAgICAgICAgICAgIG93bmVyVWlkLCBvd25lckdpZCwgcGVybU1hc2ssIHBlcm1NYXNrKTsKKyAgICBhdXRvIG1vdW50RGF0YSA9CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigidXRmOCx1aWQ9JWQsZ2lkPSVkLGZtYXNrPSVvLGRtYXNrPSVvLHNob3J0bmFtZT1taXhlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lclVpZCwgb3duZXJHaWQsIHBlcm1NYXNrLCBwZXJtTWFzayk7CiAKICAgICByYyA9IG1vdW50KGNfc291cmNlLCBjX3RhcmdldCwgInZmYXQiLCBmbGFncywgbW91bnREYXRhLmNfc3RyKCkpOwogCkBAIC0xNTksMTIgKzE1NCw4IEBACiBzdGF0dXNfdCBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKSB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZDsKICAgICBjbWQucHVzaF9iYWNrKGtNa2ZzUGF0aCk7Ci0gICAgY21kLnB1c2hfYmFjaygiLUYiKTsKLSAgICBjbWQucHVzaF9iYWNrKCIzMiIpOwogICAgIGNtZC5wdXNoX2JhY2soIi1PIik7CiAgICAgY21kLnB1c2hfYmFjaygiYW5kcm9pZCIpOwotICAgIGNtZC5wdXNoX2JhY2soIi1jIik7Ci0gICAgY21kLnB1c2hfYmFjaygiNjQiKTsKICAgICBjbWQucHVzaF9iYWNrKCItQSIpOwogCiAgICAgaWYgKG51bVNlY3RvcnMpIHsKZGlmZiAtLWdpdCBhL2ZzL1ZmYXQuaCBiL2ZzL1ZmYXQuaAppbmRleCA0MGJlNWY2Li4yMDMwMDY3IDEwMDY0NAotLS0gYS9mcy9WZmF0LmgKKysrIGIvZnMvVmZhdC5oCkBAIC0yOCw5ICsyOCw4IEBACiBib29sIElzU3VwcG9ydGVkKCk7CiAKIHN0YXR1c190IENoZWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UpOwotc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywKLSAgICAgICAgYm9vbCByZW1vdW50LCBib29sIGV4ZWN1dGFibGUsIGludCBvd25lclVpZCwgaW50IG93bmVyR2lkLCBpbnQgcGVybU1hc2ssCi0gICAgICAgIGJvb2wgY3JlYXRlTG9zdCk7CitzdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLCBib29sIHJlbW91bnQsCisgICAgICAgICAgICAgICBib29sIGV4ZWN1dGFibGUsIGludCBvd25lclVpZCwgaW50IG93bmVyR2lkLCBpbnQgcGVybU1hc2ssIGJvb2wgY3JlYXRlTG9zdCk7CiBzdGF0dXNfdCBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKTsKIAogfSAgLy8gbmFtZXNwYWNlIHZmYXQKZGlmZiAtLWdpdCBhL2hhc2guaCBiL2hhc2guaAppbmRleCAzYjQ4M2YxLi5jZDgxODA1IDEwMDY0NAotLS0gYS9oYXNoLmgKKysrIGIvaGFzaC5oCkBAIC0xLDE4ICsxLDE4IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAxOTk5IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgotICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKICAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSAKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAgKgogICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBLVEggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQogICogICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dApAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKChhKT4oYikpPyhiKTooYSkpCisjZGVmaW5lIG1pbihhLCBiKSAoKChhKSA+IChiKSkgPyAoYikgOiAoYSkpCiAjZW5kaWYKIAogLyogVmVjdG9yIENyYXlzIGRvZXNuJ3QgaGF2ZSBhIGdvb2QgMzItYml0IHR5cGUsIG9yIG1vcmUgcHJlY2lzZWx5LApAQCAtNTMsMTQgKzUzLDEyIEBACiAgICAqLwogCiAjaWZkZWYgX0NSQVkKLSNkZWZpbmUgQ1JBWUZJWChYKSAoKFgpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgQ1JBWUZJWChYKSAoKFgpJjB4ZmZmZmZmZmYpCiAjZWxzZQogI2RlZmluZSBDUkFZRklYKFgpIChYKQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdV9pbnQzMl90Ci1jc2hpZnQgKHVfaW50MzJfdCB4LCB1bnNpZ25lZCBpbnQgbikKLXsKK3N0YXRpYyBpbmxpbmUgdV9pbnQzMl90IGNzaGlmdCh1X2ludDMyX3QgeCwgdW5zaWduZWQgaW50IG4pIHsKICAgICB4ID0gQ1JBWUZJWCh4KTsKICAgICByZXR1cm4gQ1JBWUZJWCgoeCA8PCBuKSB8ICh4ID4+ICgzMiAtIG4pKSk7CiB9CmRpZmYgLS1naXQgYS9tYWluLmNwcCBiL21haW4uY3BwCmluZGV4IDU1MjVlODUuLmUxZjg0MDQgMTAwNjQ0Ci0tLSBhL21haW4uY3BwCisrKyBiL21haW4uY3BwCkBAIC0xNiw1NyArMTYsNTcgQEAKIAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfUEFDS0FHRV9NQU5BR0VSCiAKLSNpbmNsdWRlICJtb2RlbC9EaXNrLmgiCi0jaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogI2luY2x1ZGUgIk5ldGxpbmtNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiVm9sZE5hdGl2ZVNlcnZpY2UuaCIKICNpbmNsdWRlICJWb2xkVXRpbC5oIgorI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjcnlwdGZzLmgiCisjaW5jbHVkZSAibW9kZWwvRGlzay5oIgogI2luY2x1ZGUgInNlaGFuZGxlLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGN1dGlscy9rbG9nLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZnNfbWdyLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxmc19tZ3IuaD4KIAogc3RhdGljIGludCBwcm9jZXNzX2NvbmZpZyhWb2x1bWVNYW5hZ2VyKiB2bSwgYm9vbCogaGFzX2Fkb3B0YWJsZSwgYm9vbCogaGFzX3F1b3RhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBoYXNfcmVzZXJ2ZWQpOwotc3RhdGljIHZvaWQgY29sZGJvb3QoY29uc3QgY2hhciAqcGF0aCk7CitzdGF0aWMgdm9pZCBjb2xkYm9vdChjb25zdCBjaGFyKiBwYXRoKTsKIHN0YXRpYyB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKIAotc3RydWN0IHNlbGFiZWxfaGFuZGxlICpzZWhhbmRsZTsKK3N0cnVjdCBzZWxhYmVsX2hhbmRsZSogc2VoYW5kbGU7CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgYXRyYWNlX3NldF90cmFjaW5nX2VuYWJsZWQoZmFsc2UpOwotICAgIHNldGVudigiQU5EUk9JRF9MT0dfVEFHUyIsICIqOnYiLCAxKTsKKyAgICBzZXRlbnYoIkFORFJPSURfTE9HX1RBR1MiLCAiKjpkIiwgMSk7CiAgICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgYW5kcm9pZDo6YmFzZTo6TG9nZExvZ2dlcihhbmRyb2lkOjpiYXNlOjpTWVNURU0pKTsKIAogICAgIExPRyhJTkZPKSA8PCAiVm9sZCAzLjAgKHRoZSBhd2FrZW5pbmcpIGZpcmluZyB1cCI7CiAKICAgICBBVFJBQ0VfQkVHSU4oIm1haW4iKTsKIAorICAgIExPRyhERUJVRykgPDwgIkRldGVjdGVkIHN1cHBvcnQgZm9yOiIKKyAgICAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKSA/ICIgZXh0NCIgOiAiIikKKyAgICAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImYyZnMiKSA/ICIgZjJmcyIgOiAiIikKKyAgICAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoInZmYXQiKSA/ICIgdmZhdCIgOiAiIik7CiAKLSAgICBMT0coVkVSQk9TRSkgPDwgIkRldGVjdGVkIHN1cHBvcnQgZm9yOiIKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKSA/ICIgZXh0NCIgOiAiIikKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImYyZnMiKSA/ICIgZjJmcyIgOiAiIikKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoInZmYXQiKSA/ICIgdmZhdCIgOiAiIik7Ci0KLSAgICBWb2x1bWVNYW5hZ2VyICp2bTsKLSAgICBOZXRsaW5rTWFuYWdlciAqbm07CisgICAgVm9sdW1lTWFuYWdlciogdm07CisgICAgTmV0bGlua01hbmFnZXIqIG5tOwogCiAgICAgcGFyc2VfYXJncyhhcmdjLCBhcmd2KTsKIApAQCAtMTA4LDYgKzEwOCw4IEBACiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIGNvbmZpZ3VyYXRpb24uLi4gY29udGludWluZyBhbnl3YXlzIjsKICAgICB9CiAKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSAvKiBjYWxsZXJXaWxsSm9pbiAqLyk7CisKICAgICBBVFJBQ0VfQkVHSU4oIlZvbGROYXRpdmVTZXJ2aWNlOjpzdGFydCIpOwogICAgIGlmIChhbmRyb2lkOjp2b2xkOjpWb2xkTmF0aXZlU2VydmljZTo6c3RhcnQoKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc3RhcnQgVm9sZE5hdGl2ZVNlcnZpY2UiOwpAQCAtMTQ1LDE5ICsxNDcsMjEgQEAKIAogc3RhdGljIHZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7Ci0gICAgICAgIHsiYmxraWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYicgfSwKLSAgICAgICAgeyJibGtpZF91bnRydXN0ZWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQicgfSwKLSAgICAgICAgeyJmc2NrX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2YnIH0sCi0gICAgICAgIHsiZnNja191bnRydXN0ZWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRicgfSwKKyAgICAgICAgeyJibGtpZF9jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdiJ30sCisgICAgICAgIHsiYmxraWRfdW50cnVzdGVkX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0InfSwKKyAgICAgICAgeyJmc2NrX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2YnfSwKKyAgICAgICAgeyJmc2NrX3VudHJ1c3RlZF9jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCiAgICAgfTsKIAogICAgIGludCBjOwogICAgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICIiLCBvcHRzLCBudWxscHRyKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgIGNhc2UgJ2InOiBhbmRyb2lkOjp2b2xkOjpzQmxraWRDb250ZXh0ID0gb3B0YXJnOyBicmVhazsKICAgICAgICAgY2FzZSAnQic6IGFuZHJvaWQ6OnZvbGQ6OnNCbGtpZFVudHJ1c3RlZENvbnRleHQgPSBvcHRhcmc7IGJyZWFrOwogICAgICAgICBjYXNlICdmJzogYW5kcm9pZDo6dm9sZDo6c0ZzY2tDb250ZXh0ID0gb3B0YXJnOyBicmVhazsKICAgICAgICAgY2FzZSAnRic6IGFuZHJvaWQ6OnZvbGQ6OnNGc2NrVW50cnVzdGVkQ29udGV4dCA9IG9wdGFyZzsgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NywzMyArMTcxLDMwIEBACiAgICAgQ0hFQ0soYW5kcm9pZDo6dm9sZDo6c0ZzY2tVbnRydXN0ZWRDb250ZXh0ICE9IG51bGxwdHIpOwogfQogCi1zdGF0aWMgdm9pZCBkb19jb2xkYm9vdChESVIgKmQsIGludCBsdmwpIHsKLSAgICBzdHJ1Y3QgZGlyZW50ICpkZTsKK3N0YXRpYyB2b2lkIGRvX2NvbGRib290KERJUiogZCwgaW50IGx2bCkgeworICAgIHN0cnVjdCBkaXJlbnQqIGRlOwogICAgIGludCBkZmQsIGZkOwogCiAgICAgZGZkID0gZGlyZmQoZCk7CiAKICAgICBmZCA9IG9wZW5hdChkZmQsICJ1ZXZlbnQiLCBPX1dST05MWSB8IE9fQ0xPRVhFQyk7Ci0gICAgaWYoZmQgPj0gMCkgeworICAgIGlmIChmZCA+PSAwKSB7CiAgICAgICAgIHdyaXRlKGZkLCAiYWRkXG4iLCA0KTsKICAgICAgICAgY2xvc2UoZmQpOwogICAgIH0KIAotICAgIHdoaWxlKChkZSA9IHJlYWRkaXIoZCkpKSB7Ci0gICAgICAgIERJUiAqZDI7CisgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKSB7CisgICAgICAgIERJUiogZDI7CiAKLSAgICAgICAgaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykgY29udGludWU7CiAKLSAgICAgICAgaWYgKGRlLT5kX3R5cGUgIT0gRFRfRElSICYmIGx2bCA+IDApCi0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGRlLT5kX3R5cGUgIT0gRFRfRElSICYmIGx2bCA+IDApIGNvbnRpbnVlOwogCiAgICAgICAgIGZkID0gb3BlbmF0KGRmZCwgZGUtPmRfbmFtZSwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSB8IE9fQ0xPRVhFQyk7Ci0gICAgICAgIGlmKGZkIDwgMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoZmQgPCAwKSBjb250aW51ZTsKIAogICAgICAgICBkMiA9IGZkb3BlbmRpcihmZCk7Ci0gICAgICAgIGlmKGQyID09IDApCisgICAgICAgIGlmIChkMiA9PSAwKQogICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGRvX2NvbGRib290KGQyLCBsdmwgKyAxKTsKQEAgLTIwMiwxMCArMjAzLDEwIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb2xkYm9vdChjb25zdCBjaGFyICpwYXRoKSB7CitzdGF0aWMgdm9pZCBjb2xkYm9vdChjb25zdCBjaGFyKiBwYXRoKSB7CiAgICAgQVRSQUNFX05BTUUoImNvbGRib290Iik7Ci0gICAgRElSICpkID0gb3BlbmRpcihwYXRoKTsKLSAgICBpZihkKSB7CisgICAgRElSKiBkID0gb3BlbmRpcihwYXRoKTsKKyAgICBpZiAoZCkgewogICAgICAgICBkb19jb2xkYm9vdChkLCAwKTsKICAgICAgICAgY2xvc2VkaXIoZCk7CiAgICAgfQpAQCAtMjQ4LDEzICsyNDksMTMgQEAKICAgICAgICAgICAgICAgICBmbGFncyB8PSBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a0Fkb3B0YWJsZTsKICAgICAgICAgICAgICAgICAqaGFzX2Fkb3B0YWJsZSA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZnNfbWdyX2lzX25vZW11bGF0ZWRzZChyZWMpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgidm9sZC5kZWJ1Zy5kZWZhdWx0X3ByaW1hcnkiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIGlmIChmc19tZ3JfaXNfbm9lbXVsYXRlZHNkKHJlYykgfHwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInZvbGQuZGVidWcuZGVmYXVsdF9wcmltYXJ5IiwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtEZWZhdWx0UHJpbWFyeTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdm0tPmFkZERpc2tTb3VyY2Uoc3RkOjpzaGFyZWRfcHRyPFZvbHVtZU1hbmFnZXI6OkRpc2tTb3VyY2U+KAotICAgICAgICAgICAgICAgICAgICBuZXcgVm9sdW1lTWFuYWdlcjo6RGlza1NvdXJjZShzeXNQYXR0ZXJuLCBuaWNrbmFtZSwgZmxhZ3MpKSk7CisgICAgICAgICAgICAgICAgbmV3IFZvbHVtZU1hbmFnZXI6OkRpc2tTb3VyY2Uoc3lzUGF0dGVybiwgbmlja25hbWUsIGZsYWdzKSkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbW9kZWwvRGlzay5jcHAgYi9tb2RlbC9EaXNrLmNwcAppbmRleCBkN2IxOWFjLi4yYjY3NzNkIDEwMDY0NAotLS0gYS9tb2RlbC9EaXNrLmNwcAorKysgYi9tb2RlbC9EaXNrLmNwcApAQCAtMTUsMzYgKzE1LDM2IEBACiAgKi8KIAogI2luY2x1ZGUgIkRpc2suaCIKLSNpbmNsdWRlICJQdWJsaWNWb2x1bWUuaCIKKyNpbmNsdWRlICJFeHQ0Q3J5cHQuaCIKICNpbmNsdWRlICJQcml2YXRlVm9sdW1lLmgiCisjaW5jbHVkZSAiUHVibGljVm9sdW1lLmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVCYXNlLmgiCiAjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CiAKICNpbmNsdWRlICJjcnlwdGZzLmgiCiAKLSNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+Ci0jaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewpAQCAtNzYsNiArNzYsOCBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja01tYyA9IDE3OTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga01ham9yQmxvY2tFeHBlcmltZW50YWxNaW4gPSAyNDA7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4ID0gMjU0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja0R5bmFtaWNNaW4gPSAyMzQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRHluYW1pY01heCA9IDUxMjsKIAogc3RhdGljIGNvbnN0IGNoYXIqIGtHcHRCYXNpY0RhdGEgPSAiRUJEMEEwQTItQjlFNS00NDMzLTg3QzAtNjhCNkI3MjY5OUM3IjsKIHN0YXRpYyBjb25zdCBjaGFyKiBrR3B0QW5kcm9pZE1ldGEgPSAiMTlBNzEwQTItQjNDQS0xMUU0LUIwMjYtMTA2MDRCODg5RENGIjsKQEAgLTExMCwxNCArMTEyLDIyIEBACiAgICAgICogInJhbmNodSIsIHRoZSBkZXZpY2UncyBzeXNmcyBwYXRoIHNob3VsZCBlbmQgd2l0aCAiL2Jsb2NrL3ZkW2Qtel0iLCBldGMuCiAgICAgICogQnV0IGp1c3QgaGF2aW5nIGEpIGFuZCBiKSBpcyBlbm91Z2ggZm9yIG5vdy4KICAgICAgKi8KLSAgICByZXR1cm4gSXNSdW5uaW5nSW5FbXVsYXRvcigpICYmIG1ham9yID49IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluCi0gICAgICAgICAgICAmJiBtYWpvciA8PSBrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1heDsKKyAgICByZXR1cm4gSXNSdW5uaW5nSW5FbXVsYXRvcigpICYmIG1ham9yID49IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluICYmCisgICAgICAgICAgIG1ham9yIDw9IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4OwogfQogCi1EaXNrOjpEaXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFBhdGgsIGRldl90IGRldmljZSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5pY2tuYW1lLCBpbnQgZmxhZ3MpIDoKLSAgICAgICAgbURldmljZShkZXZpY2UpLCBtU2l6ZSgtMSksIG1OaWNrbmFtZShuaWNrbmFtZSksIG1GbGFncyhmbGFncyksIG1DcmVhdGVkKAotICAgICAgICAgICAgICAgIGZhbHNlKSwgbUp1c3RQYXJ0aXRpb25lZChmYWxzZSkgeworc3RhdGljIGJvb2wgaXNOdm1lQmxrRGV2aWNlKHVuc2lnbmVkIGludCBtYWpvciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5c1BhdGgpIHsKKyAgICByZXR1cm4gc3lzUGF0aC5maW5kKCJudm1lIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgbWFqb3IgPj0ga01ham9yQmxvY2tEeW5hbWljTWluICYmCisgICAgICAgICAgIG1ham9yIDw9IGtNYWpvckJsb2NrRHluYW1pY01heDsKK30KKworRGlzazo6RGlzayhjb25zdCBzdGQ6OnN0cmluZyYgZXZlbnRQYXRoLCBkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuaWNrbmFtZSwgaW50IGZsYWdzKQorICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgbVNpemUoLTEpLAorICAgICAgbU5pY2tuYW1lKG5pY2tuYW1lKSwKKyAgICAgIG1GbGFncyhmbGFncyksCisgICAgICBtQ3JlYXRlZChmYWxzZSksCisgICAgICBtSnVzdFBhcnRpdGlvbmVkKGZhbHNlKSB7CiAgICAgbUlkID0gU3RyaW5nUHJpbnRmKCJkaXNrOiV1LCV1IiwgbWFqb3IoZGV2aWNlKSwgbWlub3IoZGV2aWNlKSk7CiAgICAgbUV2ZW50UGF0aCA9IGV2ZW50UGF0aDsKICAgICBtU3lzUGF0aCA9IFN0cmluZ1ByaW50ZigiL3N5cy8lcyIsIGV2ZW50UGF0aC5jX3N0cigpKTsKQEAgLTIzMyw3MyArMjQzLDg0IEBACiAgICAgbVNpemUgPSAtMTsKICAgICBtTGFiZWwuY2xlYXIoKTsKIAotICAgIGludCBmZCA9IG9wZW4obURldlBhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwotICAgIGlmIChmZCAhPSAtMSkgewotICAgICAgICBpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkU2NCwgJm1TaXplKSkgewotICAgICAgICAgICAgbVNpemUgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBjbG9zZShmZCk7CisgICAgaWYgKEdldEJsb2NrRGV2U2l6ZShtRGV2UGF0aCwgJm1TaXplKSAhPSBPSykgeworICAgICAgICBtU2l6ZSA9IC0xOwogICAgIH0KIAogICAgIHVuc2lnbmVkIGludCBtYWpvcklkID0gbWFqb3IobURldmljZSk7CiAgICAgc3dpdGNoIChtYWpvcklkKSB7Ci0gICAgY2FzZSBrTWFqb3JCbG9ja0xvb3A6IHsKLSAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lBOiBjYXNlIGtNYWpvckJsb2NrU2NzaUI6IGNhc2Uga01ham9yQmxvY2tTY3NpQzogY2FzZSBrTWFqb3JCbG9ja1Njc2lEOgotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOiBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDoKLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUk6IGNhc2Uga01ham9yQmxvY2tTY3NpSjogY2FzZSBrTWFqb3JCbG9ja1Njc2lLOiBjYXNlIGtNYWpvckJsb2NrU2NzaUw6Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lNOiBjYXNlIGtNYWpvckJsb2NrU2NzaU46IGNhc2Uga01ham9yQmxvY2tTY3NpTzogY2FzZSBrTWFqb3JCbG9ja1Njc2lQOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS92ZW5kb3IiKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKLSAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIHZlbmRvciBmcm9tICIgPDwgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOwotICAgICAgICBtTGFiZWwgPSB0bXA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS9tYW5maWQiKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKLSAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIG1hbnVmYWN0dXJlciBmcm9tICIgPDwgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOwotICAgICAgICBpbnQ2NF90IG1hbmZpZDsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCh0bXAsICZtYW5maWQpKSB7Ci0gICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcGFyc2UgbWFudWZhY3R1cmVyICIgPDwgdG1wOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3VyIGdvYWwgaGVyZSBpcyB0byBnaXZlIHRoZSB1c2VyIGEgbWVhbmluZ2Z1bCBsYWJlbCwgaWRlYWxseQotICAgICAgICAvLyBtYXRjaGluZyB3aGF0ZXZlciBpcyBzaWxrLXNjcmVlbmVkIG9uIHRoZSBjYXJkLiAgVG8gcmVkdWNlCi0gICAgICAgIC8vIHVzZXIgY29uZnVzaW9uLCB0aGlzIGxpc3QgZG9lc24ndCBjb250YWluIHdoaXRlLWxhYmVsIG1hbmZpZC4KLSAgICAgICAgc3dpdGNoIChtYW5maWQpIHsKLSAgICAgICAgY2FzZSAweDAwMDAwMzogbUxhYmVsID0gIlNhbkRpc2siOyBicmVhazsKLSAgICAgICAgY2FzZSAweDAwMDAxYjogbUxhYmVsID0gIlNhbXN1bmciOyBicmVhazsKLSAgICAgICAgY2FzZSAweDAwMDAyODogbUxhYmVsID0gIkxleGFyIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgwMDAwNzQ6IG1MYWJlbCA9ICJUcmFuc2NlbmQiOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgICBpZiAoaXNWaXJ0aW9CbGtEZXZpY2UobWFqb3JJZCkpIHsKLSAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlJlY29nbml6ZWQgZXhwZXJpbWVudGFsIGJsb2NrIG1ham9yIElEICIgPDwgbWFqb3JJZAotICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIHZpcnRpby1ibGsgKGVtdWxhdG9yJ3MgdmlydHVhbCBTRCBjYXJkIGRldmljZSkiOworICAgICAgICBjYXNlIGtNYWpvckJsb2NrTG9vcDogewogICAgICAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBibG9jayBtYWpvciB0eXBlICIgPDwgbWFqb3JJZDsKLSAgICAgICAgcmV0dXJuIC1FTk9UU1VQOwotICAgIH0KKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUE6IGNhc2Uga01ham9yQmxvY2tTY3NpQjogY2FzZSBrTWFqb3JCbG9ja1Njc2lDOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUQ6IGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDogY2FzZSBrTWFqb3JCbG9ja1Njc2lJOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUo6IGNhc2Uga01ham9yQmxvY2tTY3NpSzogY2FzZSBrTWFqb3JCbG9ja1Njc2lMOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaU06IGNhc2Uga01ham9yQmxvY2tTY3NpTjogY2FzZSBrTWFqb3JCbG9ja1Njc2lPOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaVA6IHsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aChtU3lzUGF0aCArICIvZGV2aWNlL3ZlbmRvciIpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKHBhdGgsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHJlYWQgdmVuZG9yIGZyb20gIiA8PCBwYXRoOworICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAgPSBhbmRyb2lkOjpiYXNlOjpUcmltKHRtcCk7CisgICAgICAgICAgICBtTGFiZWwgPSB0bXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoKG1TeXNQYXRoICsgIi9kZXZpY2UvbWFuZmlkIik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0bXA7CisgICAgICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcmVhZCBtYW51ZmFjdHVyZXIgZnJvbSAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcCA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0odG1wKTsKKyAgICAgICAgICAgIGludDY0X3QgbWFuZmlkOworICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCh0bXAsICZtYW5maWQpKSB7CisgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHBhcnNlIG1hbnVmYWN0dXJlciAiIDw8IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE91ciBnb2FsIGhlcmUgaXMgdG8gZ2l2ZSB0aGUgdXNlciBhIG1lYW5pbmdmdWwgbGFiZWwsIGlkZWFsbHkKKyAgICAgICAgICAgIC8vIG1hdGNoaW5nIHdoYXRldmVyIGlzIHNpbGstc2NyZWVuZWQgb24gdGhlIGNhcmQuICBUbyByZWR1Y2UKKyAgICAgICAgICAgIC8vIHVzZXIgY29uZnVzaW9uLCB0aGlzIGxpc3QgZG9lc24ndCBjb250YWluIHdoaXRlLWxhYmVsIG1hbmZpZC4KKyAgICAgICAgICAgIHN3aXRjaCAobWFuZmlkKSB7CisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICAgICAgICAgIGNhc2UgMHgwMDAwMDM6IG1MYWJlbCA9ICJTYW5EaXNrIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDAxYjogbUxhYmVsID0gIlNhbXN1bmciOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDI4OiBtTGFiZWwgPSAiTGV4YXIiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDc0OiBtTGFiZWwgPSAiVHJhbnNjZW5kIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgaWYgKGlzVmlydGlvQmxrRGV2aWNlKG1ham9ySWQpKSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiUmVjb2duaXplZCBleHBlcmltZW50YWwgYmxvY2sgbWFqb3IgSUQgIiA8PCBtYWpvcklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIHZpcnRpby1ibGsgKGVtdWxhdG9yJ3MgdmlydHVhbCBTRCBjYXJkIGRldmljZSkiOworICAgICAgICAgICAgICAgIG1MYWJlbCA9ICJWaXJ0dWFsIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc052bWVCbGtEZXZpY2UobWFqb3JJZCwgbVN5c1BhdGgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aChtU3lzUGF0aCArICIvZGV2aWNlL21vZGVsIik7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhwYXRoLCAmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcmVhZCB2ZW5kb3IgZnJvbSAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1MYWJlbCA9IHRtcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYmxvY2sgbWFqb3IgdHlwZSAiIDw8IG1ham9ySWQ7CisgICAgICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgICAgIH0KICAgICB9CiAKICAgICBhdXRvIGxpc3RlbmVyID0gVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Z2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vbkRpc2tNZXRhZGF0YUNoYW5nZWQoZ2V0SWQoKSwKLSAgICAgICAgICAgIG1TaXplLCBtTGFiZWwsIG1TeXNQYXRoKTsKKyAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vbkRpc2tNZXRhZGF0YUNoYW5nZWQoZ2V0SWQoKSwgbVNpemUsIG1MYWJlbCwgbVN5c1BhdGgpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNTQ1LDM4ICs1NjYsNDkgQEAKICAgICAvLyBGaWd1cmUgb3V0IG1heGltdW0gcGFydGl0aW9uIGRldmljZXMgc3VwcG9ydGVkCiAgICAgdW5zaWduZWQgaW50IG1ham9ySWQgPSBtYWpvcihtRGV2aWNlKTsKICAgICBzd2l0Y2ggKG1ham9ySWQpIHsKLSAgICBjYXNlIGtNYWpvckJsb2NrTG9vcDogewotICAgICAgICBzdGQ6OnN0cmluZyB0bXA7Ci0gICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNMb29wTWF4TWlub3JzLCAmdG1wKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgbWF4IG1pbm9ycyI7Ci0gICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICBjYXNlIGtNYWpvckJsb2NrTG9vcDogeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGtTeXNmc0xvb3BNYXhNaW5vcnMsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgbWF4IG1pbm9ycyI7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0b2kodG1wKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RkOjpzdG9pKHRtcCk7Ci0gICAgfQotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpQTogY2FzZSBrTWFqb3JCbG9ja1Njc2lCOiBjYXNlIGtNYWpvckJsb2NrU2NzaUM6IGNhc2Uga01ham9yQmxvY2tTY3NpRDoKLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUU6IGNhc2Uga01ham9yQmxvY2tTY3NpRjogY2FzZSBrTWFqb3JCbG9ja1Njc2lHOiBjYXNlIGtNYWpvckJsb2NrU2NzaUg6Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lJOiBjYXNlIGtNYWpvckJsb2NrU2NzaUo6IGNhc2Uga01ham9yQmxvY2tTY3NpSzogY2FzZSBrTWFqb3JCbG9ja1Njc2lMOgotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpTTogY2FzZSBrTWFqb3JCbG9ja1Njc2lOOiBjYXNlIGtNYWpvckJsb2NrU2NzaU86IGNhc2Uga01ham9yQmxvY2tTY3NpUDogewotICAgICAgICAvLyBQZXIgRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCB0aGlzIGlzIHN0YXRpYwotICAgICAgICByZXR1cm4gMTU7Ci0gICAgfQotICAgIGNhc2Uga01ham9yQmxvY2tNbWM6IHsKLSAgICAgICAgLy8gUGVyIERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgdGhpcyBpcyBkeW5hbWljCi0gICAgICAgIHN0ZDo6c3RyaW5nIHRtcDsKLSAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGtTeXNmc01tY01heE1pbm9ycywgJnRtcCkgJiYKLSAgICAgICAgICAgICAgICAhUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNNbWNNYXhNaW5vcnNEZXByZWNhdGVkLCAmdG1wKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgbWF4IG1pbm9ycyI7Ci0gICAgICAgICAgICByZXR1cm4gLWVycm5vOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0b2kodG1wKTsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgICBpZiAoaXNWaXJ0aW9CbGtEZXZpY2UobWFqb3JJZCkpIHsKLSAgICAgICAgICAgIC8vIGRyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jIGhhcyAiI2RlZmluZSBQQVJUX0JJVFMgNCIsIHNvIG1heCBpcwotICAgICAgICAgICAgLy8gMl40IC0gMSA9IDE1CisgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lBOiBjYXNlIGtNYWpvckJsb2NrU2NzaUI6IGNhc2Uga01ham9yQmxvY2tTY3NpQzoKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lEOiBjYXNlIGtNYWpvckJsb2NrU2NzaUU6IGNhc2Uga01ham9yQmxvY2tTY3NpRjoKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lHOiBjYXNlIGtNYWpvckJsb2NrU2NzaUg6IGNhc2Uga01ham9yQmxvY2tTY3NpSToKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lKOiBjYXNlIGtNYWpvckJsb2NrU2NzaUs6IGNhc2Uga01ham9yQmxvY2tTY3NpTDoKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lNOiBjYXNlIGtNYWpvckJsb2NrU2NzaU46IGNhc2Uga01ham9yQmxvY2tTY3NpTzoKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lQOiB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgICAgICAgICAgIC8vIFBlciBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0IHRoaXMgaXMgc3RhdGljCiAgICAgICAgICAgICByZXR1cm4gMTU7CiAgICAgICAgIH0KLSAgICB9CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tNbWM6IHsKKyAgICAgICAgICAgIC8vIFBlciBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0IHRoaXMgaXMgZHluYW1pYworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGtTeXNmc01tY01heE1pbm9ycywgJnRtcCkgJiYKKyAgICAgICAgICAgICAgICAhUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNNbWNNYXhNaW5vcnNEZXByZWNhdGVkLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIG1heCBtaW5vcnMiOworICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdG9pKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgaWYgKGlzVmlydGlvQmxrRGV2aWNlKG1ham9ySWQpKSB7CisgICAgICAgICAgICAgICAgLy8gZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMgaGFzICIjZGVmaW5lIFBBUlRfQklUUyA0Iiwgc28gbWF4IGlzCisgICAgICAgICAgICAgICAgLy8gMl40IC0gMSA9IDE1CisgICAgICAgICAgICAgICAgcmV0dXJuIDE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzTnZtZUJsa0RldmljZShtYWpvcklkLCBtU3lzUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkZXNwaXRlIGtlcm5lbCBudm1lIGRyaXZlciBzdXBwb3J0cyB1cCB0byAxTSBtaW5vcnMsCisgICAgICAgICAgICAgICAgLy8gICAgICNkZWZpbmUgTlZNRV9NSU5PUlMgKDFVIDw8IE1JTk9SQklUUykKKyAgICAgICAgICAgICAgICAvLyBzZ2Rpc2sgY2FuIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAxMjcgcGFydGl0aW9ucywgZHVlIHRvCisgICAgICAgICAgICAgICAgLy8gICAgICNkZWZpbmUgTUFYX01CUl9QQVJUUyAxMjgKKyAgICAgICAgICAgICAgICByZXR1cm4gMTI3OworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYmxvY2sgbWFqb3IgdHlwZSAiIDw8IG1ham9ySWQ7CmRpZmYgLS1naXQgYS9tb2RlbC9EaXNrLmggYi9tb2RlbC9EaXNrLmgKaW5kZXggNjNhY2Y2YS4uMzE0MDE0NCAxMDA2NDQKLS0tIGEvbW9kZWwvRGlzay5oCisrKyBiL21vZGVsL0Rpc2suaApAQCAtMzYsNyArMzYsNyBAQAogICogaG93IHRvIHJlcGFydGl0aW9uIGl0c2VsZi4KICAqLwogY2xhc3MgRGlzayB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBEaXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFBhdGgsIGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5pY2tuYW1lLCBpbnQgZmxhZ3MpOwogICAgIHZpcnR1YWwgfkRpc2soKTsKIApAQCAtNzksNyArNzksNyBAQAogICAgIHN0YXR1c190IHBhcnRpdGlvblByaXZhdGUoKTsKICAgICBzdGF0dXNfdCBwYXJ0aXRpb25NaXhlZChpbnQ4X3QgcmF0aW8pOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIC8qIElEIHRoYXQgdW5pcXVlbHkgcmVmZXJlbmNlcyB0aGlzIGRpc2sgKi8KICAgICBzdGQ6OnN0cmluZyBtSWQ7CiAgICAgLyogT3JpZ2luYWwgZXZlbnQgcGF0aCAqLwpkaWZmIC0tZ2l0IGEvbW9kZWwvRW11bGF0ZWRWb2x1bWUuY3BwIGIvbW9kZWwvRW11bGF0ZWRWb2x1bWUuY3BwCmluZGV4IDMxYzM5MjQuLjhkOWFjNzQgMTAwNjQ0Ci0tLSBhL21vZGVsL0VtdWxhdGVkVm9sdW1lLmNwcAorKysgYi9tb2RlbC9FbXVsYXRlZFZvbHVtZS5jcHAKQEAgLTI3LDggKzI3LDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CkBAIC0zOCwyMiArMzgsMjEgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIqIGtGdXNlUGF0aCA9ICIvc3lzdGVtL2Jpbi9zZGNhcmQiOwogCi1FbXVsYXRlZFZvbHVtZTo6RW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgpIDoKLSAgICAgICAgVm9sdW1lQmFzZShUeXBlOjprRW11bGF0ZWQpLCBtRnVzZVBpZCgwKSB7CitFbXVsYXRlZFZvbHVtZTo6RW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgpCisgICAgOiBWb2x1bWVCYXNlKFR5cGU6OmtFbXVsYXRlZCksIG1GdXNlUGlkKDApIHsKICAgICBzZXRJZCgiZW11bGF0ZWQiKTsKICAgICBtUmF3UGF0aCA9IHJhd1BhdGg7CiAgICAgbUxhYmVsID0gImVtdWxhdGVkIjsKIH0KIAotRW11bGF0ZWRWb2x1bWU6OkVtdWxhdGVkVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdQYXRoLCBkZXZfdCBkZXZpY2UsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1V1aWQpIDogVm9sdW1lQmFzZShUeXBlOjprRW11bGF0ZWQpLCBtRnVzZVBpZCgwKSB7CitFbXVsYXRlZFZvbHVtZTo6RW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgsIGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCkKKyAgICA6IFZvbHVtZUJhc2UoVHlwZTo6a0VtdWxhdGVkKSwgbUZ1c2VQaWQoMCkgewogICAgIHNldElkKFN0cmluZ1ByaW50ZigiZW11bGF0ZWQ6JXUsJXUiLCBtYWpvcihkZXZpY2UpLCBtaW5vcihkZXZpY2UpKSk7CiAgICAgbVJhd1BhdGggPSByYXdQYXRoOwogICAgIG1MYWJlbCA9IGZzVXVpZDsKIH0KIAotRW11bGF0ZWRWb2x1bWU6On5FbXVsYXRlZFZvbHVtZSgpIHsKLX0KK0VtdWxhdGVkVm9sdW1lOjp+RW11bGF0ZWRWb2x1bWUoKSB7fQogCiBzdGF0dXNfdCBFbXVsYXRlZFZvbHVtZTo6ZG9Nb3VudCgpIHsKICAgICAvLyBXZSBjb3VsZCBoYXZlIG1pZ3JhdGVkIHN0b3JhZ2UgdG8gYW4gYWRvcHRlZCBwcml2YXRlIHZvbHVtZSwgc28gYWx3YXlzCkBAIC03MSw4ICs3MCw4IEBACiAgICAgc2V0UGF0aChTdHJpbmdQcmludGYoIi9zdG9yYWdlLyVzIiwgbGFiZWwuY19zdHIoKSkpOwogCiAgICAgaWYgKGZzX3ByZXBhcmVfZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8Ci0gICAgICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVJlYWQuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSB8fAotICAgICAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VXcml0ZS5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSB7CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlUmVhZC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlV3JpdGUuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGNyZWF0ZSBtb3VudCBwb2ludHMiOwogICAgICAgICByZXR1cm4gLWVycm5vOwogICAgIH0KQEAgLTgwLDYgKzc5LDcgQEAKICAgICBkZXZfdCBiZWZvcmUgPSBHZXREZXZpY2UobUZ1c2VXcml0ZSk7CiAKICAgICBpZiAoIShtRnVzZVBpZCA9IGZvcmsoKSkpIHsKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICBpZiAoZXhlY2woa0Z1c2VQYXRoLCBrRnVzZVBhdGgsCiAgICAgICAgICAgICAgICAgIi11IiwgIjEwMjMiLCAvLyBBSURfTUVESUFfUlcKICAgICAgICAgICAgICAgICAiLWciLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwpAQCAtOTAsNiArOTAsNyBAQAogICAgICAgICAgICAgICAgIG1SYXdQYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgbGFiZWwuY19zdHIoKSwKICAgICAgICAgICAgICAgICBOVUxMKSkgeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWMiOwogICAgICAgICB9CiAKQEAgLTEwNCw4ICsxMDUsOCBAQAogCiAgICAgbnNlY3NfdCBzdGFydCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpOwogICAgIHdoaWxlIChiZWZvcmUgPT0gR2V0RGV2aWNlKG1GdXNlV3JpdGUpKSB7Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiV2FpdGluZyBmb3IgRlVTRSB0byBzcGluIHVwLi4uIjsKLSAgICAgICAgdXNsZWVwKDUwMDAwKTsgLy8gNTBtcworICAgICAgICBMT0coREVCVUcpIDw8ICJXYWl0aW5nIGZvciBGVVNFIHRvIHNwaW4gdXAuLi4iOworICAgICAgICB1c2xlZXAoNTAwMDApOyAgLy8gNTBtcwogCiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CiAgICAgICAgIGlmIChuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMobm93IC0gc3RhcnQpID4gNTAwMCkgewpAQCAtMTE0LDggKzExNSw4IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgLyogc2RjYXJkZnMgd2lsbCBoYXZlIGV4aXRlZCBhbHJlYWR5LiBGVVNFIHdpbGwgc3RpbGwgYmUgcnVubmluZyAqLwotICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChtRnVzZVBpZCwgbnVsbHB0ciwgV05PSEFORykpID09IG1GdXNlUGlkKQotICAgICAgICBtRnVzZVBpZCA9IDA7CisgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQobUZ1c2VQaWQsIG51bGxwdHIsIDApKTsKKyAgICBtRnVzZVBpZCA9IDA7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMzAsMTIgKzEzMSw2IEBACiAgICAgRm9yY2VVbm1vdW50KG1GdXNlUmVhZCk7CiAgICAgRm9yY2VVbm1vdW50KG1GdXNlV3JpdGUpOwogCi0gICAgaWYgKG1GdXNlUGlkID4gMCkgewotICAgICAgICBraWxsKG1GdXNlUGlkLCBTSUdURVJNKTsKLSAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQobUZ1c2VQaWQsIG51bGxwdHIsIDApKTsKLSAgICAgICAgbUZ1c2VQaWQgPSAwOwotICAgIH0KLQogICAgIHJtZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpKTsKICAgICBybWRpcihtRnVzZVJlYWQuY19zdHIoKSk7CiAgICAgcm1kaXIobUZ1c2VXcml0ZS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL21vZGVsL0VtdWxhdGVkVm9sdW1lLmggYi9tb2RlbC9FbXVsYXRlZFZvbHVtZS5oCmluZGV4IDliMGMwNDkuLmY2MThjNTUgMTAwNjQ0Ci0tLSBhL21vZGVsL0VtdWxhdGVkVm9sdW1lLmgKKysrIGIvbW9kZWwvRW11bGF0ZWRWb2x1bWUuaApAQCAtMzYsMTYgKzM2LDE2IEBACiAgKiBzdG9yZSBkYXRhIGxvY2FsIHRvIHRoZWlyIGFwcC4KICAqLwogY2xhc3MgRW11bGF0ZWRWb2x1bWUgOiBwdWJsaWMgVm9sdW1lQmFzZSB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBleHBsaWNpdCBFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCk7CiAgICAgRW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgsIGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCk7CiAgICAgdmlydHVhbCB+RW11bGF0ZWRWb2x1bWUoKTsKIAotcHJvdGVjdGVkOgorICBwcm90ZWN0ZWQ6CiAgICAgc3RhdHVzX3QgZG9Nb3VudCgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvVW5tb3VudCgpIG92ZXJyaWRlOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIHN0ZDo6c3RyaW5nIG1SYXdQYXRoOwogICAgIHN0ZDo6c3RyaW5nIG1MYWJlbDsKIApkaWZmIC0tZ2l0IGEvbW9kZWwvT2JiVm9sdW1lLmNwcCBiL21vZGVsL09iYlZvbHVtZS5jcHAKaW5kZXggNzA5YzdhMy4uMjE0NzljNCAxMDA2NDQKLS0tIGEvbW9kZWwvT2JiVm9sdW1lLmNwcAorKysgYi9tb2RlbC9PYmJWb2x1bWUuY3BwCkBAIC0xNCwxNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJmcy9WZmF0LmgiCisjaW5jbHVkZSAiT2JiVm9sdW1lLmgiCiAjaW5jbHVkZSAiRGV2bWFwcGVyLmgiCiAjaW5jbHVkZSAiTG9vcC5oIgotI2luY2x1ZGUgIk9iYlZvbHVtZS5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sZFV0aWwuaCIKKyNpbmNsdWRlICJmcy9WZmF0LmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKQEAgLTMxLDI2ICszMCwyNSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewogCiBPYmJWb2x1bWU6Ok9iYlZvbHVtZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LAotICAgICAgICBnaWRfdCBvd25lckdpZCkgOiBWb2x1bWVCYXNlKFR5cGU6OmtPYmIpIHsKKyAgICAgICAgICAgICAgICAgICAgIGdpZF90IG93bmVyR2lkKQorICAgIDogVm9sdW1lQmFzZShUeXBlOjprT2JiKSB7CiAgICAgc2V0SWQoU3RyaW5nUHJpbnRmKCJvYmI6JWQiLCBpZCkpOwogICAgIG1Tb3VyY2VQYXRoID0gc291cmNlUGF0aDsKICAgICBtU291cmNlS2V5ID0gc291cmNlS2V5OwogICAgIG1Pd25lckdpZCA9IG93bmVyR2lkOwogfQogCi1PYmJWb2x1bWU6On5PYmJWb2x1bWUoKSB7Ci19CitPYmJWb2x1bWU6On5PYmJWb2x1bWUoKSB7fQogCiBzdGF0dXNfdCBPYmJWb2x1bWU6OmRvQ3JlYXRlKCkgewogICAgIGlmIChMb29wOjpjcmVhdGUobVNvdXJjZVBhdGgsIG1Mb29wUGF0aCkpIHsKQEAgLTU5LDI0ICs1NywxNSBAQAogICAgIH0KIAogICAgIGlmICghbVNvdXJjZUtleS5lbXB0eSgpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VjID0gMDsKLSAgICAgICAgewotICAgICAgICAgICAgdW5pcXVlX2ZkIGxvb3BfZmQob3BlbihtTG9vcFBhdGguY19zdHIoKSwgT19SRFdSIHwgT19DTE9FWEVDKSk7Ci0gICAgICAgICAgICBpZiAobG9vcF9mZC5nZXQoKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gb3BlbiBsb29wIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGdldF9ibGtkZXZfc2l6ZShsb29wX2ZkLmdldCgpLCAmbnJfc2VjKTsKLSAgICAgICAgICAgIGlmIChucl9zZWMgPT0gMCkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZ2V0IGxvb3Agc2l6ZSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQorICAgICAgICB1aW50NjRfdCBucl9zZWMgPSAwOworICAgICAgICBpZiAoR2V0QmxvY2tEZXY1MTJTZWN0b3JzKG1Mb29wUGF0aCwgJm5yX3NlYykgIT0gT0spIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZ2V0IGxvb3Agc2l6ZSI7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAogICAgICAgICBjaGFyIHRtcFtQQVRIX01BWF07Ci0gICAgICAgIGlmIChEZXZtYXBwZXI6OmNyZWF0ZShnZXRJZCgpLmNfc3RyKCksIG1Mb29wUGF0aC5jX3N0cigpLCBtU291cmNlS2V5LmNfc3RyKCksIG5yX3NlYywKLSAgICAgICAgICAgICAgICB0bXAsIFBBVEhfTUFYKSkgeworICAgICAgICBpZiAoRGV2bWFwcGVyOjpjcmVhdGUoZ2V0SWQoKS5jX3N0cigpLCBtTG9vcFBhdGguY19zdHIoKSwgbVNvdXJjZUtleS5jX3N0cigpLCBucl9zZWMsIHRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBVEhfTUFYKSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBjcmVhdGUgZG0iOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC0xMDgsOCArOTcsMTAgQEAKICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBjcmVhdGUgbW91bnQgcG9pbnQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChhbmRyb2lkOjp2b2xkOjp2ZmF0OjpNb3VudChtTW91bnRQYXRoLCBwYXRoLAotICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIHRydWUsIDAsIG1Pd25lckdpZCwgMDIyNywgZmFsc2UpKSB7CisgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgIGlmIChhbmRyb2lkOjp2b2xkOjp2ZmF0OjpNb3VudChtTW91bnRQYXRoLCBwYXRoLCB0cnVlLCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU93bmVyR2lkLCAwMjI3LCBmYWxzZSkpIHsKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gbW91bnQiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbW9kZWwvT2JiVm9sdW1lLmggYi9tb2RlbC9PYmJWb2x1bWUuaAppbmRleCA1ZWMwY2RlLi44ZjdlZTk0IDEwMDY0NAotLS0gYS9tb2RlbC9PYmJWb2x1bWUuaAorKysgYi9tb2RlbC9PYmJWb2x1bWUuaApAQCAtMjgsMTggKzI4LDE3IEBACiAgKiBPQkIgY29udGFpbmVyLgogICovCiBjbGFzcyBPYmJWb2x1bWUgOiBwdWJsaWMgVm9sdW1lQmFzZSB7Ci1wdWJsaWM6Ci0gICAgT2JiVm9sdW1lKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VLZXksCi0gICAgICAgICAgICBnaWRfdCBvd25lckdpZCk7CisgIHB1YmxpYzoKKyAgICBPYmJWb2x1bWUoaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwgZ2lkX3Qgb3duZXJHaWQpOwogICAgIHZpcnR1YWwgfk9iYlZvbHVtZSgpOwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkb1VubW91bnQoKSBvdmVycmlkZTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICBzdGQ6OnN0cmluZyBtU291cmNlUGF0aDsKICAgICBzdGQ6OnN0cmluZyBtU291cmNlS2V5OwogICAgIGdpZF90IG1Pd25lckdpZDsKZGlmZiAtLWdpdCBhL21vZGVsL1ByaXZhdGVWb2x1bWUuY3BwIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKaW5kZXggY2YyMTU3Ny4uZGUyYTA5ZiAxMDA2NDQKLS0tIGEvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKKysrIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAKQEAgLTE0LDI3ICsxNCwyNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgImZzL0V4dDQuaCIKLSNpbmNsdWRlICJmcy9GMmZzLmgiCiAjaW5jbHVkZSAiUHJpdmF0ZVZvbHVtZS5oIgogI2luY2x1ZGUgIkVtdWxhdGVkVm9sdW1lLmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY3J5cHRmcy5oIgorI2luY2x1ZGUgImZzL0V4dDQuaCIKKyNpbmNsdWRlICJmcy9GMmZzLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogCkBAIC00MywxNCArNDMsMTMgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja01tYyA9IDE3OTsKIAotUHJpdmF0ZVZvbHVtZTo6UHJpdmF0ZVZvbHVtZShkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSYXcpIDoKLSAgICAgICAgVm9sdW1lQmFzZShUeXBlOjprUHJpdmF0ZSksIG1SYXdEZXZpY2UoZGV2aWNlKSwgbUtleVJhdyhrZXlSYXcpIHsKK1ByaXZhdGVWb2x1bWU6OlByaXZhdGVWb2x1bWUoZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5UmF3KQorICAgIDogVm9sdW1lQmFzZShUeXBlOjprUHJpdmF0ZSksIG1SYXdEZXZpY2UoZGV2aWNlKSwgbUtleVJhdyhrZXlSYXcpIHsKICAgICBzZXRJZChTdHJpbmdQcmludGYoInByaXZhdGU6JXUsJXUiLCBtYWpvcihkZXZpY2UpLCBtaW5vcihkZXZpY2UpKSk7CiAgICAgbVJhd0RldlBhdGggPSBTdHJpbmdQcmludGYoIi9kZXYvYmxvY2svdm9sZC8lcyIsIGdldElkKCkuY19zdHIoKSk7CiB9CiAKLVByaXZhdGVWb2x1bWU6On5Qcml2YXRlVm9sdW1lKCkgewotfQorUHJpdmF0ZVZvbHVtZTo6flByaXZhdGVWb2x1bWUoKSB7fQogCiBzdGF0dXNfdCBQcml2YXRlVm9sdW1lOjpyZWFkTWV0YWRhdGEoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZE1ldGFkYXRhKG1EbURldlBhdGgsICZtRnNUeXBlLCAmbUZzVXVpZCwgJm1Gc0xhYmVsKTsKQEAgLTY2LDkgKzY1LDkgQEAKICAgICAgICAgcmV0dXJuIC1FSU87CiAgICAgfQogICAgIGlmIChtS2V5UmF3LnNpemUoKSAhPSBjcnlwdGZzX2dldF9rZXlzaXplKCkpIHsKLSAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBSYXcga2V5c2l6ZSAiIDw8IG1LZXlSYXcuc2l6ZSgpIDw8Ci0gICAgICAgICAgIiBkb2VzIG5vdCBtYXRjaCBjcnlwdCBrZXlzaXplICIgPDwgY3J5cHRmc19nZXRfa2V5c2l6ZSgpOwotICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBSYXcga2V5c2l6ZSAiIDw8IG1LZXlSYXcuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3QgbWF0Y2ggY3J5cHQga2V5c2l6ZSAiIDw8IGNyeXB0ZnNfZ2V0X2tleXNpemUoKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CiAgICAgfQogCiAgICAgLy8gUmVjb3ZlciBmcm9tIHN0YWxlIHZvbGQgYnkgdGVhcmluZyBkb3duIGFueSBvbGQgbWFwcGluZ3MKQEAgLTc2LDEwICs3NSw5IEBACiAKICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGJldHRlciBTRUxpbnV4IGxhYmVscyBmb3IgcHJpdmF0ZSB2b2x1bWVzCiAKLSAgICB1bnNpZ25lZCBjaGFyKiBrZXkgPSAodW5zaWduZWQgY2hhciopIG1LZXlSYXcuZGF0YSgpOworICAgIHVuc2lnbmVkIGNoYXIqIGtleSA9ICh1bnNpZ25lZCBjaGFyKiltS2V5UmF3LmRhdGEoKTsKICAgICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl07Ci0gICAgaW50IHJlcyA9IGNyeXB0ZnNfc2V0dXBfZXh0X3ZvbHVtZShnZXRJZCgpLmNfc3RyKCksIG1SYXdEZXZQYXRoLmNfc3RyKCksCi0gICAgICAgICAgICBrZXksIGNyeXB0b19ibGtkZXYpOworICAgIGludCByZXMgPSBjcnlwdGZzX3NldHVwX2V4dF92b2x1bWUoZ2V0SWQoKS5jX3N0cigpLCBtUmF3RGV2UGF0aC5jX3N0cigpLCBrZXksIGNyeXB0b19ibGtkZXYpOwogICAgIG1EbURldlBhdGggPSBjcnlwdG9fYmxrZGV2OwogICAgIGlmIChyZXMgIT0gMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHNldHVwIGNyeXB0ZnMiOwpAQCAtMTQ3LDEyICsxNDUsMTIgQEAKIAogICAgIC8vIFZlcmlmeSB0aGF0IGNvbW1vbiBkaXJlY3RvcmllcyBhcmUgcmVhZHkgdG8gcm9sbAogICAgIGlmIChQcmVwYXJlRGlyKG1QYXRoICsgIi9hcHAiLCAwNzcxLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSB8fAotICAgICAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvdXNlciIsIDA3MTEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi91c2VyX2RlIiwgMDcxMSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi9tZWRpYS8wIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi9sb2NhbCIsIDA3NTEsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL2xvY2FsL3RtcCIsIDA3NzEsIEFJRF9TSEVMTCwgQUlEX1NIRUxMKSkgeworICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi91c2VyIiwgMDcxMSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvdXNlcl9kZSIsIDA3MTEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhIiwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhLzAiLCAwNzcwLCBBSURfTUVESUFfUlcsIEFJRF9NRURJQV9SVykgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvbG9jYWwiLCAwNzUxLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL2xvY2FsL3RtcCIsIDA3NzEsIEFJRF9TSEVMTCwgQUlEX1NIRUxMKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHByZXBhcmUiOwogICAgICAgICByZXR1cm4gLUVJTzsKICAgICB9CkBAIC0xNjAsOCArMTU4LDcgQEAKICAgICAvLyBDcmVhdGUgYSBuZXcgZW11bGF0ZWQgdm9sdW1lIHN0YWNrZWQgYWJvdmUgdXMsIGl0IHdpbGwgYXV0b21hdGljYWxseQogICAgIC8vIGJlIGRlc3Ryb3llZCBkdXJpbmcgdW5tb3VudAogICAgIHN0ZDo6c3RyaW5nIG1lZGlhUGF0aChtUGF0aCArICIvbWVkaWEiKTsKLSAgICBhdXRvIHZvbCA9IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPigKLSAgICAgICAgICAgIG5ldyBFbXVsYXRlZFZvbHVtZShtZWRpYVBhdGgsIG1SYXdEZXZpY2UsIG1Gc1V1aWQpKTsKKyAgICBhdXRvIHZvbCA9IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPihuZXcgRW11bGF0ZWRWb2x1bWUobWVkaWFQYXRoLCBtUmF3RGV2aWNlLCBtRnNVdWlkKSk7CiAgICAgYWRkVm9sdW1lKHZvbCk7CiAgICAgdm9sLT5jcmVhdGUoKTsKIApkaWZmIC0tZ2l0IGEvbW9kZWwvUHJpdmF0ZVZvbHVtZS5oIGIvbW9kZWwvUHJpdmF0ZVZvbHVtZS5oCmluZGV4IDk1MDg2NzEuLjg1YWE0ZGMgMTAwNjQ0Ci0tLSBhL21vZGVsL1ByaXZhdGVWb2x1bWUuaAorKysgYi9tb2RlbC9Qcml2YXRlVm9sdW1lLmgKQEAgLTM2LDEzICszNiwxNCBAQAogICoga2V5cyBhcmUgdGlnaHRseSB0aWVkIHRvIHRoaXMgZGV2aWNlLgogICovCiBjbGFzcyBQcml2YXRlVm9sdW1lIDogcHVibGljIFZvbHVtZUJhc2UgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgUHJpdmF0ZVZvbHVtZShkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSYXcpOwogICAgIHZpcnR1YWwgflByaXZhdGVWb2x1bWUoKTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RnNUeXBlKCkgeyByZXR1cm4gbUZzVHlwZTsgfTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0UmF3RGV2UGF0aCgpIHsgcmV0dXJuIG1SYXdEZXZQYXRoOyB9OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRSYXdEbURldlBhdGgoKSB7IHJldHVybiBtRG1EZXZQYXRoOyB9OwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKQEAgLTUxLDcgKzUyLDcgQEAKIAogICAgIHN0YXR1c190IHJlYWRNZXRhZGF0YSgpOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIC8qIEtlcm5lbCBkZXZpY2Ugb2YgcmF3LCBlbmNyeXB0ZWQgcGFydGl0aW9uICovCiAgICAgZGV2X3QgbVJhd0RldmljZTsKICAgICAvKiBQYXRoIHRvIHJhdywgZW5jcnlwdGVkIGJsb2NrIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvbW9kZWwvUHVibGljVm9sdW1lLmNwcCBiL21vZGVsL1B1YmxpY1ZvbHVtZS5jcHAKaW5kZXggZmM3ZTk2Zi4uOGVkNDM1NiAxMDA2NDQKLS0tIGEvbW9kZWwvUHVibGljVm9sdW1lLmNwcAorKysgYi9tb2RlbC9QdWJsaWNWb2x1bWUuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSAiZnMvRXhmYXQuaCIKICNpbmNsdWRlICJmcy9WZmF0LmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CkBAIC0zMCw4ICszMCw4IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwpAQCAtNDMsMTQgKzQzLDEyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrQXNlY1BhdGggPSAiL21udC9zZWN1cmUvYXNlYyI7CiAKLVB1YmxpY1ZvbHVtZTo6UHVibGljVm9sdW1lKGRldl90IGRldmljZSkgOgotICAgICAgICBWb2x1bWVCYXNlKFR5cGU6OmtQdWJsaWMpLCBtRGV2aWNlKGRldmljZSksIG1GdXNlUGlkKDApIHsKK1B1YmxpY1ZvbHVtZTo6UHVibGljVm9sdW1lKGRldl90IGRldmljZSkgOiBWb2x1bWVCYXNlKFR5cGU6OmtQdWJsaWMpLCBtRGV2aWNlKGRldmljZSksIG1GdXNlUGlkKDApIHsKICAgICBzZXRJZChTdHJpbmdQcmludGYoInB1YmxpYzoldSwldSIsIG1ham9yKGRldmljZSksIG1pbm9yKGRldmljZSkpKTsKICAgICBtRGV2UGF0aCA9IFN0cmluZ1ByaW50ZigiL2Rldi9ibG9jay92b2xkLyVzIiwgZ2V0SWQoKS5jX3N0cigpKTsKIH0KIAotUHVibGljVm9sdW1lOjp+UHVibGljVm9sdW1lKCkgewotfQorUHVibGljVm9sdW1lOjp+UHVibGljVm9sdW1lKCkge30KIAogc3RhdHVzX3QgUHVibGljVm9sdW1lOjpyZWFkTWV0YWRhdGEoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZE1ldGFkYXRhVW50cnVzdGVkKG1EZXZQYXRoLCAmbUZzVHlwZSwgJm1Gc1V1aWQsICZtRnNMYWJlbCk7CkBAIC02Niw4ICs2NCw3IEBACiAgICAgc3RkOjpzdHJpbmcgc2VjdXJlUGF0aChtUmF3UGF0aCArICIvLmFuZHJvaWRfc2VjdXJlIik7CiAKICAgICAvLyBSZWNvdmVyIGxlZ2FjeSBzZWN1cmUgcGF0aAotICAgIGlmICghYWNjZXNzKGxlZ2FjeVBhdGguY19zdHIoKSwgUl9PSyB8IFhfT0spCi0gICAgICAgICAgICAmJiBhY2Nlc3Moc2VjdXJlUGF0aC5jX3N0cigpLCBSX09LIHwgWF9PSykpIHsKKyAgICBpZiAoIWFjY2VzcyhsZWdhY3lQYXRoLmNfc3RyKCksIFJfT0sgfCBYX09LKSAmJiBhY2Nlc3Moc2VjdXJlUGF0aC5jX3N0cigpLCBSX09LIHwgWF9PSykpIHsKICAgICAgICAgaWYgKHJlbmFtZShsZWdhY3lQYXRoLmNfc3RyKCksIHNlY3VyZVBhdGguY19zdHIoKSkpIHsKICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byByZW5hbWUgbGVnYWN5IEFTRUMgZGlyIjsKICAgICAgICAgfQpAQCAtMTU4LDggKzE1NSw4IEBACiAgICAgfQogCiAgICAgaWYgKGZzX3ByZXBhcmVfZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8Ci0gICAgICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVJlYWQuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSB8fAotICAgICAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VXcml0ZS5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSB7CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlUmVhZC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8CisgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlV3JpdGUuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGNyZWF0ZSBGVVNFIG1vdW50IHBvaW50cyI7CiAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgfQpAQCAtMTY4LDYgKzE2NSw3IEBACiAKICAgICBpZiAoIShtRnVzZVBpZCA9IGZvcmsoKSkpIHsKICAgICAgICAgaWYgKGdldE1vdW50RmxhZ3MoKSAmIE1vdW50RmxhZ3M6OmtQcmltYXJ5KSB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgICAgICBpZiAoZXhlY2woa0Z1c2VQYXRoLCBrRnVzZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgICItdSIsICIxMDIzIiwgLy8gQUlEX01FRElBX1JXCiAgICAgICAgICAgICAgICAgICAgICItZyIsICIxMDIzIiwgLy8gQUlEX01FRElBX1JXCkBAIC0xNzYsOSArMTc0LDExIEBACiAgICAgICAgICAgICAgICAgICAgIG1SYXdQYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0YWJsZU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWMiOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICAgICAgaWYgKGV4ZWNsKGtGdXNlUGF0aCwga0Z1c2VQYXRoLAogICAgICAgICAgICAgICAgICAgICAiLXUiLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwogICAgICAgICAgICAgICAgICAgICAiLWciLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwpAQCAtMTg2LDYgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1SYXdQYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0YWJsZU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWMiOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMDEsOCArMjAyLDggQEAKIAogICAgIG5zZWNzX3Qgc3RhcnQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKICAgICB3aGlsZSAoYmVmb3JlID09IEdldERldmljZShtRnVzZVdyaXRlKSkgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgIldhaXRpbmcgZm9yIEZVU0UgdG8gc3BpbiB1cC4uLiI7Ci0gICAgICAgIHVzbGVlcCg1MDAwMCk7IC8vIDUwbXMKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiV2FpdGluZyBmb3IgRlVTRSB0byBzcGluIHVwLi4uIjsKKyAgICAgICAgdXNsZWVwKDUwMDAwKTsgIC8vIDUwbXMKIAogICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpOwogICAgICAgICBpZiAobmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKG5vdyAtIHN0YXJ0KSA+IDUwMDApIHsKQEAgLTIxMSw4ICsyMTIsOCBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8qIHNkY2FyZGZzIHdpbGwgaGF2ZSBleGl0ZWQgYWxyZWFkeS4gRlVTRSB3aWxsIHN0aWxsIGJlIHJ1bm5pbmcgKi8KLSAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQobUZ1c2VQaWQsIG51bGxwdHIsIFdOT0hBTkcpKSA9PSBtRnVzZVBpZCkKLSAgICAgICAgbUZ1c2VQaWQgPSAwOworICAgIFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0cGlkKG1GdXNlUGlkLCBudWxscHRyLCAwKSk7CisgICAgbUZ1c2VQaWQgPSAwOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjMxLDEyICsyMzIsNiBAQAogICAgIEZvcmNlVW5tb3VudChtRnVzZVdyaXRlKTsKICAgICBGb3JjZVVubW91bnQobVJhd1BhdGgpOwogCi0gICAgaWYgKG1GdXNlUGlkID4gMCkgewotICAgICAgICBraWxsKG1GdXNlUGlkLCBTSUdURVJNKTsKLSAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQobUZ1c2VQaWQsIG51bGxwdHIsIDApKTsKLSAgICAgICAgbUZ1c2VQaWQgPSAwOwotICAgIH0KLQogICAgIHJtZGlyKG1GdXNlRGVmYXVsdC5jX3N0cigpKTsKICAgICBybWRpcihtRnVzZVJlYWQuY19zdHIoKSk7CiAgICAgcm1kaXIobUZ1c2VXcml0ZS5jX3N0cigpKTsKQEAgLTI1MSwyOCArMjQ2LDUzIEBACiB9CiAKIHN0YXR1c190IFB1YmxpY1ZvbHVtZTo6ZG9Gb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSkgewotICAgIGlmICgoZnNUeXBlID09ICJ2ZmF0IiB8fCBmc1R5cGUgPT0gImF1dG8iKSAmJiB2ZmF0OjpJc1N1cHBvcnRlZCgpKSB7Ci0gICAgICAgIGlmIChXaXBlQmxvY2tEZXZpY2UobURldlBhdGgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byB3aXBlIjsKKyAgICBib29sIHVzZVZmYXQgPSB2ZmF0OjpJc1N1cHBvcnRlZCgpOworICAgIGJvb2wgdXNlRXhmYXQgPSBleGZhdDo6SXNTdXBwb3J0ZWQoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIFJlc29sdmUgdGhlIHRhcmdldCBmaWxlc3lzdGVtIHR5cGUKKyAgICBpZiAoZnNUeXBlID09ICJhdXRvIiAmJiB1c2VWZmF0ICYmIHVzZUV4ZmF0KSB7CisgICAgICAgIHVpbnQ2NF90IHNpemUgPSAwOworCisgICAgICAgIHJlcyA9IEdldEJsb2NrRGV2U2l6ZShtRGV2UGF0aCwgJnNpemUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZG4ndCBnZXQgZGV2aWNlIHNpemUgIiA8PCBtRGV2UGF0aDsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHZmYXQ6OkZvcm1hdChtRGV2UGF0aCwgMCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBmb3JtYXQiOwotICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICAvLyBJZiBib3RoIHZmYXQgJiBleGZhdCBhcmUgc3VwcG9ydGVkIHVzZSBleGZhdCBmb3IgU0RYQyAoPn4zMkdpQikgY2FyZHMKKyAgICAgICAgaWYgKHNpemUgPiAzMjg5NkxMICogMTAyNCAqIDEwMjQpIHsKKyAgICAgICAgICAgIHVzZVZmYXQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZUV4ZmF0ID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKChmc1R5cGUgPT0gImV4ZmF0IiB8fCBmc1R5cGUgPT0gImF1dG8iKSAmJiBleGZhdDo6SXNTdXBwb3J0ZWQoKSkgewotICAgICAgICBpZiAoV2lwZUJsb2NrRGV2aWNlKG1EZXZQYXRoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gd2lwZSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4ZmF0OjpGb3JtYXQobURldlBhdGgpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZm9ybWF0IjsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoZnNUeXBlID09ICJ2ZmF0IikgeworICAgICAgICB1c2VFeGZhdCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoZnNUeXBlID09ICJleGZhdCIpIHsKKyAgICAgICAgdXNlVmZhdCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghdXNlVmZhdCAmJiAhdXNlRXhmYXQpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgZmlsZXN5c3RlbSAiIDw8IGZzVHlwZTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIGlmIChXaXBlQmxvY2tEZXZpY2UobURldlBhdGgpICE9IE9LKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHdpcGUiOworICAgIH0KKworICAgIGlmICh1c2VWZmF0KSB7CisgICAgICAgIHJlcyA9IHZmYXQ6OkZvcm1hdChtRGV2UGF0aCwgMCk7CisgICAgfSBlbHNlIGlmICh1c2VFeGZhdCkgeworICAgICAgICByZXMgPSBleGZhdDo6Rm9ybWF0KG1EZXZQYXRoKTsKKyAgICB9CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBmb3JtYXQiOworICAgICAgICByZXMgPSAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKZGlmZiAtLWdpdCBhL21vZGVsL1B1YmxpY1ZvbHVtZS5oIGIvbW9kZWwvUHVibGljVm9sdW1lLmgKaW5kZXggM2FhN2E3My4uYzkxOGY1MiAxMDA2NDQKLS0tIGEvbW9kZWwvUHVibGljVm9sdW1lLmgKKysrIGIvbW9kZWwvUHVibGljVm9sdW1lLmgKQEAgLTM4LDExICszOCwxMSBAQAogICogYXdheSB0aGUgQW5kcm9pZCBkaXJlY3RvcnkgZm9yIHNlY29uZGFyeSB1c2Vycy4KICAqLwogY2xhc3MgUHVibGljVm9sdW1lIDogcHVibGljIFZvbHVtZUJhc2UgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgZXhwbGljaXQgUHVibGljVm9sdW1lKGRldl90IGRldmljZSk7CiAgICAgdmlydHVhbCB+UHVibGljVm9sdW1lKCk7CiAKLXByb3RlY3RlZDoKKyAgcHJvdGVjdGVkOgogICAgIHN0YXR1c190IGRvQ3JlYXRlKCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZG9EZXN0cm95KCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZG9Nb3VudCgpIG92ZXJyaWRlOwpAQCAtNTIsNyArNTIsNyBAQAogICAgIHN0YXR1c190IHJlYWRNZXRhZGF0YSgpOwogICAgIHN0YXR1c190IGluaXRBc2VjU3RhZ2UoKTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICAvKiBLZXJuZWwgZGV2aWNlIHJlcHJlc2VudGluZyBwYXJ0aXRpb24gKi8KICAgICBkZXZfdCBtRGV2aWNlOwogICAgIC8qIEJsb2NrIGRldmljZSBwYXRoICovCmRpZmYgLS1naXQgYS9tb2RlbC9Wb2x1bWVCYXNlLmNwcCBiL21vZGVsL1ZvbHVtZUJhc2UuY3BwCmluZGV4IDQyOWYxMzQuLjMwMGFkZDEgMTAwNjQ0Ci0tLSBhL21vZGVsL1ZvbHVtZUJhc2UuY3BwCisrKyBiL21vZGVsL1ZvbHVtZUJhc2UuY3BwCkBAIC0xNCwxMiArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJVdGlscy5oIgogI2luY2x1ZGUgIlZvbHVtZUJhc2UuaCIKKyNpbmNsdWRlICJVdGlscy5oIgogI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KIAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0zMiwxMCArMzIsMTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB2b2xkIHsKIAotVm9sdW1lQmFzZTo6Vm9sdW1lQmFzZShUeXBlIHR5cGUpIDoKLSAgICAgICAgbVR5cGUodHlwZSksIG1Nb3VudEZsYWdzKDApLCBtTW91bnRVc2VySWQoLTEpLCBtQ3JlYXRlZChmYWxzZSksIG1TdGF0ZSgKLSAgICAgICAgICAgICAgICBTdGF0ZTo6a1VubW91bnRlZCksIG1TaWxlbnQoZmFsc2UpIHsKLX0KK1ZvbHVtZUJhc2U6OlZvbHVtZUJhc2UoVHlwZSB0eXBlKQorICAgIDogbVR5cGUodHlwZSksCisgICAgICBtTW91bnRGbGFncygwKSwKKyAgICAgIG1Nb3VudFVzZXJJZCgtMSksCisgICAgICBtQ3JlYXRlZChmYWxzZSksCisgICAgICBtU3RhdGUoU3RhdGU6OmtVbm1vdW50ZWQpLAorICAgICAgbVNpbGVudChmYWxzZSkge30KIAogVm9sdW1lQmFzZTo6flZvbHVtZUJhc2UoKSB7CiAgICAgQ0hFQ0soIW1DcmVhdGVkKTsKQEAgLTQ1LDcgKzQ4LDkgQEAKICAgICBtU3RhdGUgPSBzdGF0ZTsKIAogICAgIGF1dG8gbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uVm9sdW1lU3RhdGVDaGFuZ2VkKGdldElkKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdGF0ZSkpOworICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lci0+b25Wb2x1bWVTdGF0ZUNoYW5nZWQoZ2V0SWQoKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obVN0YXRlKSk7CisgICAgfQogfQogCiBzdGF0dXNfdCBWb2x1bWVCYXNlOjpzZXREaXNrSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGRpc2tJZCkgewpAQCAtMTMxLDcgKzEzNiw5IEBACiAgICAgbUludGVybmFsUGF0aCA9IGludGVybmFsUGF0aDsKIAogICAgIGF1dG8gbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uVm9sdW1lSW50ZXJuYWxQYXRoQ2hhbmdlZChnZXRJZCgpLCBtSW50ZXJuYWxQYXRoKTsKKyAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uVm9sdW1lSW50ZXJuYWxQYXRoQ2hhbmdlZChnZXRJZCgpLCBtSW50ZXJuYWxQYXRoKTsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNjgsOCArMTc1LDkgQEAKICAgICBzdGF0dXNfdCByZXMgPSBkb0NyZWF0ZSgpOwogCiAgICAgYXV0byBsaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7Ci0gICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lci0+b25Wb2x1bWVDcmVhdGVkKGdldElkKCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihtVHlwZSksIG1EaXNrSWQsIG1QYXJ0R3VpZCk7CisgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgIGxpc3RlbmVyLT5vblZvbHVtZUNyZWF0ZWQoZ2V0SWQoKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obVR5cGUpLCBtRGlza0lkLCBtUGFydEd1aWQpOworICAgIH0KIAogICAgIHNldFN0YXRlKFN0YXRlOjprVW5tb3VudGVkKTsKICAgICByZXR1cm4gcmVzOwpAQCAtMTg5LDkgKzE5NywxMCBAQAogICAgICAgICBzZXRTdGF0ZShTdGF0ZTo6a1JlbW92ZWQpOwogICAgIH0KIAotCiAgICAgYXV0byBsaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7Ci0gICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lci0+b25Wb2x1bWVEZXN0cm95ZWQoZ2V0SWQoKSk7CisgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgIGxpc3RlbmVyLT5vblZvbHVtZURlc3Ryb3llZChnZXRJZCgpKTsKKyAgICB9CiAKICAgICBzdGF0dXNfdCByZXMgPSBkb0Rlc3Ryb3koKTsKICAgICBtQ3JlYXRlZCA9IGZhbHNlOwpAQCAtMjI4LDggKzIzNyw3IEBACiAgICAgc2V0U3RhdGUoU3RhdGU6OmtFamVjdGluZyk7CiAgICAgZm9yIChjb25zdCBhdXRvJiB2b2wgOiBtVm9sdW1lcykgewogICAgICAgICBpZiAodm9sLT5kZXN0cm95KCkpIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGRlc3Ryb3kgIiA8PCB2b2wtPmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBzdGFja2VkIGFib3ZlIjsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGRlc3Ryb3kgIiA8PCB2b2wtPmdldElkKCkgPDwgIiBzdGFja2VkIGFib3ZlIjsKICAgICAgICAgfQogICAgIH0KICAgICBtVm9sdW1lcy5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvbW9kZWwvVm9sdW1lQmFzZS5oIGIvbW9kZWwvVm9sdW1lQmFzZS5oCmluZGV4IDRhYThiMDIuLjY1MzJhODAgMTAwNjQ0Ci0tLSBhL21vZGVsL1ZvbHVtZUJhc2UuaAorKysgYi9tb2RlbC9Wb2x1bWVCYXNlLmgKQEAgLTE3LDggKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9WT0xEX1ZPTFVNRV9CQVNFX0gKICNkZWZpbmUgQU5EUk9JRF9WT0xEX1ZPTFVNRV9CQVNFX0gKIAotI2luY2x1ZGUgImFuZHJvaWQvb3MvSVZvbGRMaXN0ZW5lci5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9vcy9JVm9sZExpc3RlbmVyLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC00NSw3ICs0NSw3IEBACiAgKiB2b2x1bWVzIGFuZCByZW1vdmVzIGFueSBiaW5kIG1vdW50cyBiZWZvcmUgZmluYWxseSB1bm1vdW50aW5nIGl0c2VsZi4KICAqLwogY2xhc3MgVm9sdW1lQmFzZSB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5Wb2x1bWVCYXNlKCk7CiAKICAgICBlbnVtIGNsYXNzIFR5cGUgewpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgc3RhdHVzX3QgdW5tb3VudCgpOwogICAgIHN0YXR1c190IGZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlKTsKIAotcHJvdGVjdGVkOgorICBwcm90ZWN0ZWQ6CiAgICAgZXhwbGljaXQgVm9sdW1lQmFzZShUeXBlIHR5cGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkb0NyZWF0ZSgpOwpAQCAtMTE3LDcgKzExNyw3IEBACiAKICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXIoKTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICAvKiBJRCB0aGF0IHVuaXF1ZWx5IHJlZmVyZW5jZXMgdm9sdW1lIHdoaWxlIGFsaXZlICovCiAgICAgc3RkOjpzdHJpbmcgbUlkOwogICAgIC8qIElEIHRoYXQgdW5pcXVlbHkgcmVmZXJlbmNlcyBwYXJlbnQgZGlzayB3aGlsZSBhbGl2ZSAqLwpkaWZmIC0tZ2l0IGEvc2VjZGlzY2FyZC5jcHAgYi9zZWNkaXNjYXJkLmNwcAppbmRleCBmOTUzMmVhLi4yZDlkYzM1IDEwMDY0NAotLS0gYS9zZWNkaXNjYXJkLmNwcAorKysgYi9zZWNkaXNjYXJkLmNwcApAQCAtMTgsMTUgKzE4LDE1IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPG1udGVudC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KLSNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgpAQCAtNDIsMjIgKzQyLDQ3IEBACiAKIGNvbnN0ZXhwciB1aW50MzJfdCBtYXhfZXh0ZW50cyA9IDMyOwogCi1ib29sIHJlYWRfY29tbWFuZF9saW5lKGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgYXJndltdLCBPcHRpb25zICZvcHRpb25zKTsKLXZvaWQgdXNhZ2UoY29uc3QgY2hhciAqcHJvZ25hbWUpOwotYm9vbCBzZWNkaXNjYXJkX3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpOwotYm9vbCBjaGVja19maWVtYXAoY29uc3Qgc3RydWN0IGZpZW1hcCAmZmllbWFwLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCk7Citib29sIHJlYWRfY29tbWFuZF9saW5lKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10sIE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCB1c2FnZShjb25zdCBjaGFyKiBwcm9nbmFtZSk7Citib29sIHNlY2Rpc2NhcmRfcGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7Citib29sIGNoZWNrX2ZpZW1hcChjb25zdCBzdHJ1Y3QgZmllbWFwJiBmaWVtYXAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIGJvb2wgb3ZlcndyaXRlX3dpdGhfemVyb3MoaW50IGZkLCBvZmY2NF90IHN0YXJ0LCBvZmY2NF90IGxlbmd0aCk7CiAKLX0KK30gIC8vIG5hbWVzcGFjZQogCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGNvbnN0IGFyZ3ZbXSkgewotICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGNvbnN0X2Nhc3Q8Y2hhciAqKj4oYXJndikpOworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSkgeworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGNvbnN0X2Nhc3Q8Y2hhcioqPihhcmd2KSk7CiAgICAgT3B0aW9ucyBvcHRpb25zOwogICAgIGlmICghcmVhZF9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgb3B0aW9ucykpIHsKICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0cykgeworCisgICAgZm9yIChhdXRvIGNvbnN0JiB0YXJnZXQgOiBvcHRpb25zLnRhcmdldHMpIHsKKy8vIEYyRlMtc3BlY2lmaWMgaW9jdGwKKy8vIEl0IHJlcXVpcmVzIHRoZSBiZWxvdyBrZXJuZWwgY29tbWl0IG1lcmdlZCBpbiB2NC4xNi1yYzEuCisvLyAgIDFhZDcxYTI3MTI0YyAoImYyZnM6IGFkZCBhbiBpb2N0bCB0byBkaXNhYmxlIEdDIGZvciBzcGVjaWZpYyBmaWxlIikKKy8vIEluIGFuZHJvaWQtNC40LAorLy8gICA1NmVlMWU4MTc5MDggKCJmMmZzOiB1cGRhdGVzIG9uIHY0LjE2LXJjMSIpCisvLyBJbiBhbmRyb2lkLTQuOSwKKy8vICAgMmYxN2UzNDY3MmE4ICgiZjJmczogdXBkYXRlcyBvbiB2NC4xNi1yYzEiKQorLy8gSW4gYW5kcm9pZC00LjE0LAorLy8gICBjZTc2N2Q5YTU1YmMgKCJmMmZzOiB1cGRhdGVzIG9uIHY0LjE2LXJjMSIpCisjaWZuZGVmIEYyRlNfSU9DX1NFVF9QSU5fRklMRQorI2lmbmRlZiBGMkZTX0lPQ1RMX01BR0lDCisjZGVmaW5lIEYyRlNfSU9DVExfTUFHSUMgMHhmNQorI2VuZGlmCisjZGVmaW5lIEYyRlNfSU9DX1NFVF9QSU5fRklMRSBfSU9XKEYyRlNfSU9DVExfTUFHSUMsIDEzLCBfX3UzMikKKyNkZWZpbmUgRjJGU19JT0NfR0VUX1BJTl9GSUxFIF9JT1IoRjJGU19JT0NUTF9NQUdJQywgMTQsIF9fdTMyKQorI2VuZGlmCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3Blbih0YXJnZXQuY19zdHIoKSwgT19XUk9OTFksIDApKSk7CisgICAgICAgIGlmIChmZCA9PSAtMSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2VjdXJlIGRpc2NhcmQgb3BlbiBmYWlsZWQgZm9yOiAiIDw8IHRhcmdldDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIF9fdTMyIHNldCA9IDE7CisgICAgICAgIGlvY3RsKGZkLCBGMkZTX0lPQ19TRVRfUElOX0ZJTEUsICZzZXQpOworCiAgICAgICAgIExPRyhERUJVRykgPDwgIlNlY3VyZWx5IGRpc2NhcmRpbmcgJyIgPDwgdGFyZ2V0IDw8ICInIHVubGluaz0iIDw8IG9wdGlvbnMudW5saW5rOwogICAgICAgICBpZiAoIXNlY2Rpc2NhcmRfcGF0aCh0YXJnZXQpKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTZWN1cmUgZGlzY2FyZCBmYWlsZWQgZm9yOiAiIDw8IHRhcmdldDsKQEAgLTY3LDYgKzkyLDggQEAKICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHVubGluazogIiA8PCB0YXJnZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgc2V0ID0gMDsKKyAgICAgICAgaW9jdGwoZmQsIEYyRlNfSU9DX1NFVF9QSU5fRklMRSwgJnNldCk7CiAgICAgICAgIExPRyhERUJVRykgPDwgIkRpc2NhcmRlZDogIiA8PCB0YXJnZXQ7CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtNzQsMjkgKzEwMSwyOSBAQAogCiBuYW1lc3BhY2UgewogCi1ib29sIHJlYWRfY29tbWFuZF9saW5lKGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgYXJndltdLCBPcHRpb25zICZvcHRpb25zKSB7Citib29sIHJlYWRfY29tbWFuZF9saW5lKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10sIE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBpZiAoIXN0cmNtcCgiLS1uby11bmxpbmsiLCBhcmd2W2ldKSkgewogICAgICAgICAgICAgb3B0aW9ucy51bmxpbmsgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLSIsIGFyZ3ZbaV0pKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaSsxOyBqIDwgYXJnYzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ3Zbal1bMF0gIT0gJy8nKSByZXR1cm4gZmFsc2U7IC8vIE11c3QgYmUgYWJzb2x1dGUgcGF0aAorICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgYXJnYzsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3Zbal1bMF0gIT0gJy8nKSByZXR1cm4gZmFsc2U7ICAvLyBNdXN0IGJlIGFic29sdXRlIHBhdGgKICAgICAgICAgICAgICAgICBvcHRpb25zLnRhcmdldHMuZW1wbGFjZV9iYWNrKGFyZ3Zbal0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMudGFyZ2V0cy5zaXplKCkgPiAwOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBVbmtub3duIG9wdGlvbgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gVW5rbm93biBvcHRpb24KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7IC8vICItLSIgbm90IGZvdW5kCisgICAgcmV0dXJuIGZhbHNlOyAgLy8gIi0tIiBub3QgZm91bmQKIH0KIAotdm9pZCB1c2FnZShjb25zdCBjaGFyICpwcm9nbmFtZSkgewordm9pZCB1c2FnZShjb25zdCBjaGFyKiBwcm9nbmFtZSkgewogICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstLW5vLXVubGlua10gLS0gPGFic29sdXRlIHBhdGg+IC4uLlxuIiwgcHJvZ25hbWUpOwogfQogCiAvLyBCTEtTRUNESVNDQVJEIGFsbCBjb250ZW50IGluICJwYXRoIiwgaWYgaXQncyBzbWFsbCBlbm91Z2guCi1ib29sIHNlY2Rpc2NhcmRfcGF0aChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkgeworYm9vbCBzZWNkaXNjYXJkX3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICBhdXRvIGZpZW1hcCA9IGFuZHJvaWQ6OnZvbGQ6OlBhdGhGaWVtYXAocGF0aCwgbWF4X2V4dGVudHMpOwogICAgIGlmICghZmllbWFwIHx8ICFjaGVja19maWVtYXAoKmZpZW1hcCwgcGF0aCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA1LDggKzEzMiw4IEBACiAgICAgaWYgKGJsb2NrX2RldmljZS5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZzX2ZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKAotICAgICAgICBibG9ja19kZXZpY2UuY19zdHIoKSwgT19SRFdSIHwgT19MQVJHRUZJTEUgfCBPX0NMT0VYRUMsIDApKSk7CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZzX2ZkKAorICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihibG9ja19kZXZpY2UuY19zdHIoKSwgT19SRFdSIHwgT19MQVJHRUZJTEUgfCBPX0NMT0VYRUMsIDApKSk7CiAgICAgaWYgKGZzX2ZkID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBkZXZpY2UgIiA8PCBibG9ja19kZXZpY2U7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEyNSwxMCArMTUyLDEwIEBACiB9CiAKIC8vIEVuc3VyZSB0aGF0IHRoZSBGSUVNQVAgY292ZXJzIHRoZSBmaWxlIGFuZCBpcyBPSyB0byBkaXNjYXJkCi1ib29sIGNoZWNrX2ZpZW1hcChjb25zdCBzdHJ1Y3QgZmllbWFwICZmaWVtYXAsIGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKSB7Citib29sIGNoZWNrX2ZpZW1hcChjb25zdCBzdHJ1Y3QgZmllbWFwJiBmaWVtYXAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CiAgICAgYXV0byBtYXBwZWQgPSBmaWVtYXAuZm1fbWFwcGVkX2V4dGVudHM7CiAgICAgaWYgKCEoZmllbWFwLmZtX2V4dGVudHNbbWFwcGVkIC0gMV0uZmVfZmxhZ3MgJiBGSUVNQVBfRVhURU5UX0xBU1QpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkV4dGVudCAiIDw8IG1hcHBlZCAtMSA8PCAiIHdhcyBub3QgdGhlIGxhc3QgaW4gIiA8PCBwYXRoOworICAgICAgICBMT0coRVJST1IpIDw8ICJFeHRlbnQgIiA8PCBtYXBwZWQgLSAxIDw8ICIgd2FzIG5vdCB0aGUgbGFzdCBpbiAiIDw8IHBhdGg7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1hcHBlZDsgaSsrKSB7CkBAIC0xNjAsNCArMTg3LDQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotfQorfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zZWNvbnRleHQuY3BwIGIvc2Vjb250ZXh0LmNwcAppbmRleCAwNTI5YTMwLi5iYzIxZmMyIDEwMDY0NAotLS0gYS9zZWNvbnRleHQuY3BwCisrKyBiL3NlY29udGV4dC5jcHAKQEAgLTEzLDEwICsxMyw5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotI2luY2x1ZGUgPFV0aWxzLmg+CiAjaW5jbHVkZSAic2Vjb250ZXh0LmgiCisjaW5jbHVkZSA8VXRpbHMuaD4KIAotc2VjdXJpdHlfY29udGV4dF90IHNlY29udGV4dEZzY2soKQoteworc2VjdXJpdHlfY29udGV4dF90IHNlY29udGV4dEZzY2soKSB7CiAgICAgcmV0dXJuIGFuZHJvaWQ6OnZvbGQ6OnNGc2NrQ29udGV4dDsKIH0KZGlmZiAtLWdpdCBhL3NlaGFuZGxlLmggYi9zZWhhbmRsZS5oCmluZGV4IGY1OWQ3ZWIuLjg5MjFkYjUgMTAwNjQ0Ci0tLSBhL3NlaGFuZGxlLmgKKysrIGIvc2VoYW5kbGUuaApAQCAtMTksNiArMTksNiBAQAogCiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CiAKLWV4dGVybiBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaGFuZGxlOworZXh0ZXJuIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSogc2VoYW5kbGU7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvQ3J5cHRmc1NjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VfdGVzdC5jcHAgYi90ZXN0cy9DcnlwdGZzU2NyeXB0SGlkbGl6YXRpb25FcXVpdmFsZW5jZV90ZXN0LmNwcAppbmRleCAyOTA1YWYyLi43MjE3MGUzIDEwMDY0NAotLS0gYS90ZXN0cy9DcnlwdGZzU2NyeXB0SGlkbGl6YXRpb25FcXVpdmFsZW5jZV90ZXN0LmNwcAorKysgYi90ZXN0cy9DcnlwdGZzU2NyeXB0SGlkbGl6YXRpb25FcXVpdmFsZW5jZV90ZXN0LmNwcApAQCAtMTgsMTMgKzE4LDEzIEBACiAjZGVmaW5lIExPR19UQUcgInNjcnlwdF90ZXN0IgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUva2V5bWFzdGVyMC5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2tleW1hc3RlcjEuaD4KICNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICIuLi9jcnlwdGZzLmgiCiAjaW5jbHVkZSAiLi4vS2V5bWFzdGVyLmgiCisjaW5jbHVkZSAiLi4vY3J5cHRmcy5oIgogCiAjaWZkZWYgQ09ORklHX0hXX0RJU0tfRU5DUllQVElPTgogI2luY2x1ZGUgImNyeXB0ZnNfaHcuaCIKQEAgLTUwLDkgKzUwLDggQEAKICNkZWZpbmUgUlNBX0VYUE9ORU5UIDB4MTAwMDEKICNkZWZpbmUgS0VZTUFTVEVSX0NSWVBURlNfUkFURV9MSU1JVCAxICAvLyBNYXhpbXVtIG9uZSB0cnkgcGVyIHNlY29uZAogCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9pbml0KGtleW1hc3RlcjBfZGV2aWNlX3QgKiprZXltYXN0ZXIwX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bWFzdGVyMV9kZXZpY2VfdCAqKmtleW1hc3RlcjFfZGV2KQoteworc3RhdGljIGludCBrZXltYXN0ZXJfaW5pdChrZXltYXN0ZXIwX2RldmljZV90Kioga2V5bWFzdGVyMF9kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW1hc3RlcjFfZGV2aWNlX3QqKiBrZXltYXN0ZXIxX2RldikgewogICAgIGludCByYzsKIAogICAgIGNvbnN0IGh3X21vZHVsZV90KiBtb2Q7CkBAIC03Niw4ICs3NSw4IEBACiAgICAgfQogCiAgICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZCBub3Qgb3BlbiBrZXltYXN0ZXIgZGV2aWNlIGluICVzICglcykiLAotICAgICAgICAgICAgICBLRVlTVE9SRV9IQVJEV0FSRV9NT0RVTEVfSUQsIHN0cmVycm9yKC1yYykpOworICAgICAgICBBTE9HRSgiY291bGQgbm90IG9wZW4ga2V5bWFzdGVyIGRldmljZSBpbiAlcyAoJXMpIiwgS0VZU1RPUkVfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgICAgICAgICAgICBzdHJlcnJvcigtcmMpKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC05MCwxMCArODksOSBAQAogfQogCiAvKiBTaG91bGQgd2UgdXNlIGtleW1hc3Rlcj8gKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHlfb2xkKCkKLXsKLSAgICBrZXltYXN0ZXIwX2RldmljZV90ICprZXltYXN0ZXIwX2RldiA9IDA7Ci0gICAga2V5bWFzdGVyMV9kZXZpY2VfdCAqa2V5bWFzdGVyMV9kZXYgPSAwOworc3RhdGljIGludCBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eV9vbGQoKSB7CisgICAga2V5bWFzdGVyMF9kZXZpY2VfdCoga2V5bWFzdGVyMF9kZXYgPSAwOworICAgIGtleW1hc3RlcjFfZGV2aWNlX3QqIGtleW1hc3RlcjFfZGV2ID0gMDsKICAgICBpbnQgcmMgPSAwOwogCiAgICAgaWYgKGtleW1hc3Rlcl9pbml0KCZrZXltYXN0ZXIwX2RldiwgJmtleW1hc3RlcjFfZGV2KSkgewpAQCAtMTE0LDggKzExMiw3IEBACiAKICAgICAvLyBUT0RPKHN3aWxsZGVuKTogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYW55IHJlYXNvbiB0byByZXF1aXJlIHYwLjMuICBJIHRoaW5rIHYwLjEgYW5kIHYwLjIKICAgICAvLyBzaG91bGQgd29yay4KLSAgICBpZiAoa2V5bWFzdGVyMF9kZXYtPmNvbW1vbi5tb2R1bGUtPm1vZHVsZV9hcGlfdmVyc2lvbgotICAgICAgICAgICAgPCBLRVlNQVNURVJfTU9EVUxFX0FQSV9WRVJTSU9OXzBfMykgeworICAgIGlmIChrZXltYXN0ZXIwX2Rldi0+Y29tbW9uLm1vZHVsZS0+bW9kdWxlX2FwaV92ZXJzaW9uIDwgS0VZTUFTVEVSX01PRFVMRV9BUElfVkVSU0lPTl8wXzMpIHsKICAgICAgICAgcmMgPSAwOwogICAgICAgICBnb3RvIG91dDsKICAgICB9CkBAIC0xMzYsMTEgKzEzMywxMCBAQAogfQogCiAvKiBDcmVhdGUgYSBuZXcga2V5bWFzdGVyIGtleSBhbmQgc3RvcmUgaXQgaW4gdGhpcyBmb290ZXIgKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX2NyZWF0ZV9rZXlfb2xkKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9jcmVhdGVfa2V5X29sZChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyKSB7CiAgICAgdWludDhfdCoga2V5ID0gMDsKLSAgICBrZXltYXN0ZXIwX2RldmljZV90ICprZXltYXN0ZXIwX2RldiA9IDA7Ci0gICAga2V5bWFzdGVyMV9kZXZpY2VfdCAqa2V5bWFzdGVyMV9kZXYgPSAwOworICAgIGtleW1hc3RlcjBfZGV2aWNlX3QqIGtleW1hc3RlcjBfZGV2ID0gMDsKKyAgICBrZXltYXN0ZXIxX2RldmljZV90KiBrZXltYXN0ZXIxX2RldiA9IDA7CiAKICAgICBpZiAoZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplKSB7CiAgICAgICAgIFNMT0dJKCJBbHJlYWR5IGhhdmUga2V5Iik7CkBAIC0xNzcsMTEgKzE3MywxMCBAQAogICAgICAgICAgICAgLyogUmF0ZS1saW1pdCBrZXkgdXNhZ2UgYXR0ZW1wdHMsIHRvIHJhdGUtbGltaXQgYnJ1dGUgZm9yY2UgKi8KICAgICAgICAgICAgIGtleW1hc3Rlcl9wYXJhbV9pbnQoS01fVEFHX01JTl9TRUNPTkRTX0JFVFdFRU5fT1BTLCBLRVlNQVNURVJfQ1JZUFRGU19SQVRFX0xJTUlUKSwKICAgICAgICAgfTsKLSAgICAgICAga2V5bWFzdGVyX2tleV9wYXJhbV9zZXRfdCBwYXJhbV9zZXQgPSB7IHBhcmFtcywgc2l6ZW9mKHBhcmFtcykvc2l6ZW9mKCpwYXJhbXMpIH07CisgICAgICAgIGtleW1hc3Rlcl9rZXlfcGFyYW1fc2V0X3QgcGFyYW1fc2V0ID0ge3BhcmFtcywgc2l6ZW9mKHBhcmFtcykgLyBzaXplb2YoKnBhcmFtcyl9OwogICAgICAgICBrZXltYXN0ZXJfa2V5X2Jsb2JfdCBrZXlfYmxvYjsKLSAgICAgICAga2V5bWFzdGVyX2Vycm9yX3QgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+Z2VuZXJhdGVfa2V5KGtleW1hc3RlcjFfZGV2LCAmcGFyYW1fc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV9ibG9iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBjaGFyYWN0ZXJpc3RpY3MgKi8pOworICAgICAgICBrZXltYXN0ZXJfZXJyb3JfdCBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5nZW5lcmF0ZV9rZXkoCisgICAgICAgICAgICBrZXltYXN0ZXIxX2RldiwgJnBhcmFtX3NldCwgJmtleV9ibG9iLCBOVUxMIC8qIGNoYXJhY3RlcmlzdGljcyAqLyk7CiAgICAgICAgIGlmIChlcnJvciAhPSBLTV9FUlJPUl9PSykgewogICAgICAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBnZW5lcmF0ZSBrZXltYXN0ZXIxIGtleSwgZXJyb3IgJWQiLCBlcnJvcik7CiAgICAgICAgICAgICByYyA9IC0xOwpAQCAtMTkwLDE1ICsxODUsMTMgQEAKIAogICAgICAgICBrZXkgPSAodWludDhfdCopa2V5X2Jsb2Iua2V5X21hdGVyaWFsOwogICAgICAgICBrZXlfc2l6ZSA9IGtleV9ibG9iLmtleV9tYXRlcmlhbF9zaXplOwotICAgIH0KLSAgICBlbHNlIGlmIChrZXltYXN0ZXIwX2RldikgeworICAgIH0gZWxzZSBpZiAoa2V5bWFzdGVyMF9kZXYpIHsKICAgICAgICAga2V5bWFzdGVyX3JzYV9rZXlnZW5fcGFyYW1zX3QgcGFyYW1zOwogICAgICAgICBtZW1zZXQoJnBhcmFtcywgJ1wwJywgc2l6ZW9mKHBhcmFtcykpOwogICAgICAgICBwYXJhbXMucHVibGljX2V4cG9uZW50ID0gUlNBX0VYUE9ORU5UOwogICAgICAgICBwYXJhbXMubW9kdWx1c19zaXplID0gUlNBX0tFWV9TSVpFOwogCi0gICAgICAgIGlmIChrZXltYXN0ZXIwX2Rldi0+Z2VuZXJhdGVfa2V5cGFpcihrZXltYXN0ZXIwX2RldiwgVFlQRV9SU0EsICZwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LCAma2V5X3NpemUpKSB7CisgICAgICAgIGlmIChrZXltYXN0ZXIwX2Rldi0+Z2VuZXJhdGVfa2V5cGFpcihrZXltYXN0ZXIwX2RldiwgVFlQRV9SU0EsICZwYXJhbXMsICZrZXksICZrZXlfc2l6ZSkpIHsKICAgICAgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gZ2VuZXJhdGUga2V5cGFpciIpOwogICAgICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgICAgIGdvdG8gb3V0OwpAQCAtMjE5LDI0ICsyMTIsMTkgQEAKICAgICBmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUgPSBrZXlfc2l6ZTsKIAogb3V0OgotICAgIGlmIChrZXltYXN0ZXIwX2RldikKLSAgICAgICAga2V5bWFzdGVyMF9jbG9zZShrZXltYXN0ZXIwX2Rldik7Ci0gICAgaWYgKGtleW1hc3RlcjFfZGV2KQotICAgICAgICBrZXltYXN0ZXIxX2Nsb3NlKGtleW1hc3RlcjFfZGV2KTsKKyAgICBpZiAoa2V5bWFzdGVyMF9kZXYpIGtleW1hc3RlcjBfY2xvc2Uoa2V5bWFzdGVyMF9kZXYpOworICAgIGlmIChrZXltYXN0ZXIxX2Rldikga2V5bWFzdGVyMV9jbG9zZShrZXltYXN0ZXIxX2Rldik7CiAgICAgZnJlZShrZXkpOwogICAgIHJldHVybiByYzsKIH0KIAogLyogVGhpcyBzaWducyB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIHRoZSBrZXltYXN0ZXIga2V5LiAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3Rfb2xkKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgb2JqZWN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqc2lnbmF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaWduYXR1cmVfc2l6ZSkKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX3NpZ25fb2JqZWN0X29sZChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLCB1bnNpZ25lZCBjaGFyKiogc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogc2lnbmF0dXJlX3NpemUpIHsKICAgICBpbnQgcmMgPSAwOwotICAgIGtleW1hc3RlcjBfZGV2aWNlX3QgKmtleW1hc3RlcjBfZGV2ID0gMDsKLSAgICBrZXltYXN0ZXIxX2RldmljZV90ICprZXltYXN0ZXIxX2RldiA9IDA7CisgICAga2V5bWFzdGVyMF9kZXZpY2VfdCoga2V5bWFzdGVyMF9kZXYgPSAwOworICAgIGtleW1hc3RlcjFfZGV2aWNlX3QqIGtleW1hc3RlcjFfZGV2ID0gMDsKIAogICAgIHVuc2lnbmVkIGNoYXIgdG9fc2lnbltSU0FfS0VZX1NJWkVfQllURVNdOwogICAgIHNpemVfdCB0b19zaWduX3NpemUgPSBzaXplb2YodG9fc2lnbik7CkBAIC0yODQsMzIgKzI3MiwyNSBAQAogICAgICAgICBwYXJhbXMuZGlnZXN0X3R5cGUgPSBESUdFU1RfTk9ORTsKICAgICAgICAgcGFyYW1zLnBhZGRpbmdfdHlwZSA9IFBBRERJTkdfTk9ORTsKIAotICAgICAgICByYyA9IGtleW1hc3RlcjBfZGV2LT5zaWduX2RhdGEoa2V5bWFzdGVyMF9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ci0+a2V5bWFzdGVyX2Jsb2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fc2lnbl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZV9zaXplKTsKKyAgICAgICAgcmMgPSBrZXltYXN0ZXIwX2Rldi0+c2lnbl9kYXRhKGtleW1hc3RlcjBfZGV2LCAmcGFyYW1zLCBmdHItPmtleW1hc3Rlcl9ibG9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplLCB0b19zaWduLCB0b19zaWduX3NpemUsIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZV9zaXplKTsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfSBlbHNlIGlmIChrZXltYXN0ZXIxX2RldikgewotICAgICAgICBrZXltYXN0ZXJfa2V5X2Jsb2JfdCBrZXkgPSB7IGZ0ci0+a2V5bWFzdGVyX2Jsb2IsIGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSB9OworICAgICAgICBrZXltYXN0ZXJfa2V5X2Jsb2JfdCBrZXkgPSB7ZnRyLT5rZXltYXN0ZXJfYmxvYiwgZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplfTsKICAgICAgICAga2V5bWFzdGVyX2tleV9wYXJhbV90IHBhcmFtc1tdID0gewogICAgICAgICAgICAga2V5bWFzdGVyX3BhcmFtX2VudW0oS01fVEFHX1BBRERJTkcsIEtNX1BBRF9OT05FKSwKICAgICAgICAgICAgIGtleW1hc3Rlcl9wYXJhbV9lbnVtKEtNX1RBR19ESUdFU1QsIEtNX0RJR0VTVF9OT05FKSwKICAgICAgICAgfTsKLSAgICAgICAga2V5bWFzdGVyX2tleV9wYXJhbV9zZXRfdCBwYXJhbV9zZXQgPSB7IHBhcmFtcywgc2l6ZW9mKHBhcmFtcykvc2l6ZW9mKCpwYXJhbXMpIH07CisgICAgICAgIGtleW1hc3Rlcl9rZXlfcGFyYW1fc2V0X3QgcGFyYW1fc2V0ID0ge3BhcmFtcywgc2l6ZW9mKHBhcmFtcykgLyBzaXplb2YoKnBhcmFtcyl9OwogICAgICAgICBrZXltYXN0ZXJfb3BlcmF0aW9uX2hhbmRsZV90IG9wX2hhbmRsZTsKLSAgICAgICAga2V5bWFzdGVyX2Vycm9yX3QgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+YmVnaW4oa2V5bWFzdGVyMV9kZXYsIEtNX1BVUlBPU0VfU0lHTiwgJmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtX3NldCwgTlVMTCAvKiBvdXRfcGFyYW1zICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BfaGFuZGxlKTsKKyAgICAgICAga2V5bWFzdGVyX2Vycm9yX3QgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+YmVnaW4oCisgICAgICAgICAgICBrZXltYXN0ZXIxX2RldiwgS01fUFVSUE9TRV9TSUdOLCAma2V5LCAmcGFyYW1fc2V0LCBOVUxMIC8qIG91dF9wYXJhbXMgKi8sICZvcF9oYW5kbGUpOwogICAgICAgICBpZiAoZXJyb3IgPT0gS01fRVJST1JfS0VZX1JBVEVfTElNSVRfRVhDRUVERUQpIHsKICAgICAgICAgICAgIC8vIEtleSB1c2FnZSBoYXMgYmVlbiByYXRlLWxpbWl0ZWQuICBXYWl0IGEgYml0IGFuZCB0cnkgYWdhaW4uCiAgICAgICAgICAgICBzbGVlcChLRVlNQVNURVJfQ1JZUFRGU19SQVRFX0xJTUlUKTsKLSAgICAgICAgICAgIGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmJlZ2luKGtleW1hc3RlcjFfZGV2LCBLTV9QVVJQT1NFX1NJR04sICZrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1fc2V0LCBOVUxMIC8qIG91dF9wYXJhbXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BfaGFuZGxlKTsKKyAgICAgICAgICAgIGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmJlZ2luKGtleW1hc3RlcjFfZGV2LCBLTV9QVVJQT1NFX1NJR04sICZrZXksICZwYXJhbV9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIG91dF9wYXJhbXMgKi8sICZvcF9oYW5kbGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlcnJvciAhPSBLTV9FUlJPUl9PSykgewogICAgICAgICAgICAgU0xPR0UoIkVycm9yIHN0YXJ0aW5nIGtleW1hc3RlciBzaWduYXR1cmUgdHJhbnNhY3Rpb246ICVkIiwgZXJyb3IpOwpAQCAtMzE3LDExICsyOTgsMTAgQEAKICAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgICB9CiAKLSAgICAgICAga2V5bWFzdGVyX2Jsb2JfdCBpbnB1dCA9IHsgdG9fc2lnbiwgdG9fc2lnbl9zaXplIH07CisgICAgICAgIGtleW1hc3Rlcl9ibG9iX3QgaW5wdXQgPSB7dG9fc2lnbiwgdG9fc2lnbl9zaXplfTsKICAgICAgICAgc2l6ZV90IGlucHV0X2NvbnN1bWVkOwotICAgICAgICBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT51cGRhdGUoa2V5bWFzdGVyMV9kZXYsIG9wX2hhbmRsZSwgTlVMTCAvKiBpbl9wYXJhbXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsICZpbnB1dF9jb25zdW1lZCwgTlVMTCAvKiBvdXRfcGFyYW1zICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBvdXRwdXQgKi8pOworICAgICAgICBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT51cGRhdGUoa2V5bWFzdGVyMV9kZXYsIG9wX2hhbmRsZSwgTlVMTCAvKiBpbl9wYXJhbXMgKi8sICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dF9jb25zdW1lZCwgTlVMTCAvKiBvdXRfcGFyYW1zICovLCBOVUxMIC8qIG91dHB1dCAqLyk7CiAgICAgICAgIGlmIChlcnJvciAhPSBLTV9FUlJPUl9PSykgewogICAgICAgICAgICAgU0xPR0UoIkVycm9yIHNlbmRpbmcgZGF0YSB0byBrZXltYXN0ZXIgc2lnbmF0dXJlIHRyYW5zYWN0aW9uOiAlZCIsIGVycm9yKTsKICAgICAgICAgICAgIHJjID0gLTE7CkBAIC0zMzcsOCArMzE3LDcgQEAKIAogICAgICAgICBrZXltYXN0ZXJfYmxvYl90IHRtcF9zaWc7CiAgICAgICAgIGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmZpbmlzaChrZXltYXN0ZXIxX2Rldiwgb3BfaGFuZGxlLCBOVUxMIC8qIGluX3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogdmVyaWZ5IHNpZ25hdHVyZSAqLywgTlVMTCAvKiBvdXRfcGFyYW1zICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9zaWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiB2ZXJpZnkgc2lnbmF0dXJlICovLCBOVUxMIC8qIG91dF9wYXJhbXMgKi8sICZ0bXBfc2lnKTsKICAgICAgICAgaWYgKGVycm9yICE9IEtNX0VSUk9SX09LKSB7CiAgICAgICAgICAgICBTTE9HRSgiRXJyb3IgZmluaXNoaW5nIGtleW1hc3RlciBzaWduYXR1cmUgdHJhbnNhY3Rpb246ICVkIiwgZXJyb3IpOwogICAgICAgICAgICAgcmMgPSAtMTsKQEAgLTM1MywxOSArMzMyLDE1IEBACiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAgIG91dDoKLSAgICAgICAgaWYgKGtleW1hc3RlcjFfZGV2KQotICAgICAgICAgICAga2V5bWFzdGVyMV9jbG9zZShrZXltYXN0ZXIxX2Rldik7Ci0gICAgICAgIGlmIChrZXltYXN0ZXIwX2RldikKLSAgICAgICAgICAgIGtleW1hc3RlcjBfY2xvc2Uoa2V5bWFzdGVyMF9kZXYpOworb3V0OgorICAgIGlmIChrZXltYXN0ZXIxX2Rldikga2V5bWFzdGVyMV9jbG9zZShrZXltYXN0ZXIxX2Rldik7CisgICAgaWYgKGtleW1hc3RlcjBfZGV2KSBrZXltYXN0ZXIwX2Nsb3NlKGtleW1hc3RlcjBfZGV2KTsKIAotICAgICAgICByZXR1cm4gcmM7CisgICAgcmV0dXJuIHJjOwogfQogCi0KIC8qIFNob3VsZCB3ZSB1c2Uga2V5bWFzdGVyPyAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eV9uZXcoKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eV9uZXcoKSB7CiAgICAgcmV0dXJuIGtleW1hc3Rlcl9jb21wYXRpYmlsaXR5X2NyeXB0ZnNfc2NyeXB0KCk7CiB9CiAKQEAgLTM5NCwxMiArMzY5LDkgQEAKICNlbmRpZgogCiAvKiBUaGlzIHNpZ25zIHRoZSBnaXZlbiBvYmplY3QgdXNpbmcgdGhlIGtleW1hc3RlciBrZXkuICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9zaWduX29iamVjdF9uZXcoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmplY3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnNpZ25hdHVyZV9zaXplKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3RfbmV3KHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgb2JqZWN0X3NpemUsIHVuc2lnbmVkIGNoYXIqKiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBzaWduYXR1cmVfc2l6ZSkgewogICAgIHVuc2lnbmVkIGNoYXIgdG9fc2lnbltSU0FfS0VZX1NJWkVfQllURVNdOwogICAgIHNpemVfdCB0b19zaWduX3NpemUgPSBzaXplb2YodG9fc2lnbik7CiAgICAgbWVtc2V0KHRvX3NpZ24sIDAsIFJTQV9LRVlfU0laRV9CWVRFUyk7CkBAIC00NDMsMTIgKzQxNSwxMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBDcnlwdEZzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgfQorICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkge30KIAotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICB9CisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkge30KIH07CiAKIFRFU1RfRihDcnlwdEZzVGVzdCwgU2NyeXB0SGlkbGl6YXRpb25FcXVpdmFsZW5jZVRlc3QpIHsKQEAgLTQ1OCw4ICs0MjgsOCBAQAogCiAgICAgQVNTRVJUX0VRKDAsIGtleW1hc3Rlcl9jcmVhdGVfa2V5X29sZCgmZnRyKSk7CiAKLSAgICB1aW50OF90ICpzaWcxID0gbnVsbHB0cjsKLSAgICB1aW50OF90ICpzaWcyID0gbnVsbHB0cjsKKyAgICB1aW50OF90KiBzaWcxID0gbnVsbHB0cjsKKyAgICB1aW50OF90KiBzaWcyID0gbnVsbHB0cjsKICAgICBzaXplX3Qgc2lnX3NpemUxID0gMTIzNDU2Nzg5OwogICAgIHNpemVfdCBzaWdfc2l6ZTIgPSAxMjM0NTY3ODk7CiAgICAgdWludDhfdCBvYmplY3RbXSA9ICJ0aGUgb2JqZWN0IjsKQEAgLTQ3Nyw0ICs0NDcsNCBAQAogICAgIGZyZWUoc2lnMik7CiB9CiAKLX0KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9VdGlsc190ZXN0LmNwcCBiL3Rlc3RzL1V0aWxzX3Rlc3QuY3BwCmluZGV4IGFiOTgwOWUuLmUxNmNiYWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1V0aWxzX3Rlc3QuY3BwCisrKyBiL3Rlc3RzL1V0aWxzX3Rlc3QuY3BwCkBAIC0yMSw4ICsyMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKLWNsYXNzIFV0aWxzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLX07CitjbGFzcyBVdGlsc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7fTsKIAogVEVTVF9GKFV0aWxzVGVzdCwgRmluZFZhbHVlVGVzdCkgewogICAgIHN0ZDo6c3RyaW5nIHRtcDsKQEAgLTQwLDUgKzM5LDUgQEAKICAgICBBU1NFUlRfRVEoIkJBWiIsIHRtcCk7CiB9CiAKLX0KLX0KK30gIC8vIG5hbWVzcGFjZSB2b2xkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvY3J5cHRmc190ZXN0LmNwcCBiL3Rlc3RzL2NyeXB0ZnNfdGVzdC5jcHAKaW5kZXggNjg3NWMwZi4uMjA5Mzc2OCAxMDA2NDQKLS0tIGEvdGVzdHMvY3J5cHRmc190ZXN0LmNwcAorKysgYi90ZXN0cy9jcnlwdGZzX3Rlc3QuY3BwCkBAIC0yMSwxMiArMjEsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQ3J5cHRmc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgfQorICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHt9CiB9OwogCiBURVNUX0YoQ3J5cHRmc1Rlc3QsIE1hdGNoTXVsdGlFbnRyeVRlc3QpIHsKQEAgLTUxLDQgKzQ5LDQgQEAKICAgICBBU1NFUlRfRVEoMCwgbWF0Y2hfbXVsdGlfZW50cnkoImZvb18yIiwgImJhciIsIDApKTsKIH0KIAotfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3ZkYy5jcHAgYi92ZGMuY3BwCmluZGV4IDNjNDQ5YWUuLmU5NzFkNTIgMTAwNjQ0Ci0tLSBhL3ZkYy5jcHAKKysrIGIvdmRjLmNwcApAQCAtMTQsMTUgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTMyLDEzICszMSwxNCBAQAogI2luY2x1ZGUgImFuZHJvaWQvb3MvSVZvbGQuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CiAKICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAotc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqcHJvZ25hbWUpOworc3RhdGljIHZvaWQgdXNhZ2UoY2hhciogcHJvZ25hbWUpOwogCiBzdGF0aWMgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SUJpbmRlcj4gZ2V0U2VydmljZUFnZ3Jlc3NpdmUoKSB7CiAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SUJpbmRlcj4gcmVzOwpAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJXYWl0ZWQgIiA8PCAoaSAqIDEwKSA8PCAibXMgZm9yIHZvbGQiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgdXNsZWVwKDEwMDAwKTsgLy8gMTBtcworICAgICAgICB1c2xlZXAoMTAwMDApOyAgLy8gMTBtcwogICAgIH0KICAgICByZXR1cm4gcmVzOwogfQpAQCAtMTA1LDYgKzEwNSwyOCBAQAogICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5tb3VudEZzdGFiKGFyZ3NbMl0pKTsKICAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNyeXB0ZnMiICYmIGFyZ3NbMV0gPT0gImVuY3J5cHRGc3RhYiIgJiYgYXJncy5zaXplKCkgPT0gMykgewogICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5lbmNyeXB0RnN0YWIoYXJnc1syXSkpOworICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY2hlY2twb2ludCIgJiYgYXJnc1sxXSA9PSAic3RhcnRDaGVja3BvaW50IiAmJiBhcmdzLnNpemUoKSA9PSAzKSB7CisgICAgICAgIGludCByZXRyeTsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludChhcmdzWzJdLCAmcmV0cnkpKSBleGl0KEVJTlZBTCk7CisgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPnN0YXJ0Q2hlY2twb2ludChyZXRyeSkpOworICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY2hlY2twb2ludCIgJiYgYXJnc1sxXSA9PSAibmVlZHNDaGVja3BvaW50IiAmJiBhcmdzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5uZWVkc0NoZWNrcG9pbnQoJmVuYWJsZWQpKTsKKyAgICAgICAgcmV0dXJuIGVuYWJsZWQgPyAxIDogMDsKKyAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNoZWNrcG9pbnQiICYmIGFyZ3NbMV0gPT0gIm5lZWRzUm9sbGJhY2siICYmIGFyZ3Muc2l6ZSgpID09IDIpIHsKKyAgICAgICAgYm9vbCBlbmFibGVkID0gZmFsc2U7CisgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPm5lZWRzUm9sbGJhY2soJmVuYWJsZWQpKTsKKyAgICAgICAgcmV0dXJuIGVuYWJsZWQgPyAxIDogMDsKKyAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNoZWNrcG9pbnQiICYmIGFyZ3NbMV0gPT0gImNvbW1pdENoYW5nZXMiICYmIGFyZ3Muc2l6ZSgpID09IDIpIHsKKyAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+Y29tbWl0Q2hhbmdlcygpKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNoZWNrcG9pbnQiICYmIGFyZ3NbMV0gPT0gInByZXBhcmVDaGVja3BvaW50IiAmJiBhcmdzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPnByZXBhcmVDaGVja3BvaW50KCkpOworICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY2hlY2twb2ludCIgJiYgYXJnc1sxXSA9PSAicmVzdG9yZUNoZWNrcG9pbnQiICYmIGFyZ3Muc2l6ZSgpID09IDMpIHsKKyAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+cmVzdG9yZUNoZWNrcG9pbnQoYXJnc1syXSkpOworICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PSAiY2hlY2twb2ludCIgJiYgYXJnc1sxXSA9PSAibWFya0Jvb3RBdHRlbXB0IiAmJiBhcmdzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPm1hcmtCb290QXR0ZW1wdCgpKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNoZWNrcG9pbnQiICYmIGFyZ3NbMV0gPT0gImFib3J0Q2hhbmdlcyIgJiYgYXJncy5zaXplKCkgPT0gMikgeworICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5hYm9ydENoYW5nZXMoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmF3IGNvbW1hbmRzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIjsKICAgICAgICAgZXhpdChFSU5WQUwpOwpAQCAtMTEyLDYgKzEzNCw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYWdlKGNoYXIgKnByb2duYW1lKSB7CitzdGF0aWMgdm9pZCB1c2FnZShjaGFyKiBwcm9nbmFtZSkgewogICAgIExPRyhJTkZPKSA8PCAiVXNhZ2U6ICIgPDwgcHJvZ25hbWUgPDwgIiBbLS13YWl0XSA8c3lzdGVtPiA8c3ViY29tbWFuZD4gW2FyZ3MuLi5dIjsKIH0KZGlmZiAtLWdpdCBhL3ZvbGQucmMgYi92b2xkLnJjCmluZGV4IDdkMTQ0NTMuLjkzZDg3ODYgMTAwNjQ0Ci0tLSBhL3ZvbGQucmMKKysrIGIvdm9sZC5yYwpAQCAtNSw0ICs1LDQgQEAKICAgICBpb3ByaW8gYmUgMgogICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKICAgICBzaHV0ZG93biBjcml0aWNhbAotICAgIGdyb3VwIHJlc2VydmVkX2Rpc2sKKyAgICBncm91cCByb290IHJlc2VydmVkX2Rpc2sKZGlmZiAtLWdpdCBhL3ZvbGRfcHJlcGFyZV9zdWJkaXJzLmNwcCBiL3ZvbGRfcHJlcGFyZV9zdWJkaXJzLmNwcAppbmRleCAxYjQ2NmU5Li44YzNkZjMwIDEwMDY0NAotLS0gYS92b2xkX3ByZXBhcmVfc3ViZGlycy5jcHAKKysrIGIvdm9sZF9wcmVwYXJlX3N1YmRpcnMuY3BwCkBAIC02Myw3ICs2Myw4IEBACiAgICAgICAgIHNlY29udGV4dC5yZXNldCh0bXBfc2Vjb250ZXh0KTsKICAgICB9CiAgICAgTE9HKERFQlVHKSA8PCAiU2V0dGluZyB1cCBtb2RlICIgPDwgc3RkOjpvY3QgPDwgbW9kZSA8PCBzdGQ6OmRlYyA8PCAiIHVpZCAiIDw8IHVpZCA8PCAiIGdpZCAiCi0gICAgICAgICAgICAgICA8PCBnaWQgPDwgIiBjb250ZXh0ICIgPDwgc2Vjb250ZXh0LmdldCgpIDw8ICIgb24gcGF0aDogIiA8PCBwYXRoOworICAgICAgICAgICAgICAgPDwgZ2lkIDw8ICIgY29udGV4dCAiIDw8IChzZWNvbnRleHQgPyBzZWNvbnRleHQuZ2V0KCkgOiAibnVsbCIpCisgICAgICAgICAgICAgICA8PCAiIG9uIHBhdGg6ICIgPDwgcGF0aDsKICAgICBpZiAoc2Vjb250ZXh0KSB7CiAgICAgICAgIGlmIChzZXRmc2NyZWF0ZWNvbihzZWNvbnRleHQuZ2V0KCkpICE9IDApIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmVhZCBzZXRmc2NyZWF0ZWNvbiBmb3I6ICIgPDwgcGF0aDsK